1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Copyright (c) 2013-2014 The Linux Foundation. All rights reserved.
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* Redistribution and use in source and binary forms, with or without
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* modification, are permitted provided that the following conditions are
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* met:
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*    * Redistributions of source code must retain the above copyright
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      notice, this list of conditions and the following disclaimer.
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*    * Redistributions in binary form must reproduce the above
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      copyright notice, this list of conditions and the following
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      disclaimer in the documentation and/or other materials provided
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      with the distribution.
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*    * Neither the name of The Linux Foundation. nor the names of its
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      contributors may be used to endorse or promote products derived
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*      from this software without specific prior written permission.
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin*/
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <display_config.h>
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#include <QServiceUtils.h>
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace android;
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinusing namespace qService;
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinnamespace qdutils {
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint isExternalConnected(void) {
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int ret;
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    sp<IQService> binder = getBinder();
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Parcel inParcel, outParcel;
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(binder != NULL) {
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = binder->dispatch(IQService::CHECK_EXTERNAL_STATUS,
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                &inParcel , &outParcel);
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(err) {
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err);
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ret = err;
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    } else {
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ret = outParcel.readInt32();
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return ret;
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint getDisplayAttributes(int dpy, DisplayAttributes_t& dpyattr) {
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    sp<IQService> binder = getBinder();
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Parcel inParcel, outParcel;
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(dpy);
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(binder != NULL) {
62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = binder->dispatch(IQService::GET_DISPLAY_ATTRIBUTES,
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                &inParcel, &outParcel);
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!err) {
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        dpyattr.vsync_period = outParcel.readInt32();
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        dpyattr.xres = outParcel.readInt32();
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        dpyattr.yres = outParcel.readInt32();
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        dpyattr.xdpi = outParcel.readFloat();
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        dpyattr.ydpi = outParcel.readFloat();
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        dpyattr.panel_type = (char) outParcel.readInt32();
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    } else {
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Failed to get display attributes err=%d", __FUNCTION__, err);
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint setHSIC(int dpy, const HSICData_t& hsic_data) {
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    sp<IQService> binder = getBinder();
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Parcel inParcel, outParcel;
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(dpy);
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(hsic_data.hue);
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeFloat(hsic_data.saturation);
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(hsic_data.intensity);
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeFloat(hsic_data.contrast);
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(binder != NULL) {
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = binder->dispatch(IQService::SET_HSIC_DATA, &inParcel, &outParcel);
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(err)
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err);
92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint getDisplayVisibleRegion(int dpy, hwc_rect_t &rect) {
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    sp<IQService> binder = getBinder();
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Parcel inParcel, outParcel;
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(dpy);
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(binder != NULL) {
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = binder->dispatch(IQService::GET_DISPLAY_VISIBLE_REGION,
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                &inParcel, &outParcel);
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(!err) {
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        rect.left = outParcel.readInt32();
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        rect.top = outParcel.readInt32();
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        rect.right = outParcel.readInt32();
108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        rect.bottom = outParcel.readInt32();
109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    } else {
110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Failed to getVisibleRegion for dpy =%d: err = %d",
111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin              __FUNCTION__, dpy, err);
112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint setViewFrame(int dpy, int l, int t, int r, int b) {
117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    sp<IQService> binder = getBinder();
119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Parcel inParcel, outParcel;
120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(dpy);
121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(l);
122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(t);
123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(r);
124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(b);
125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(binder != NULL) {
127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = binder->dispatch(IQService::SET_VIEW_FRAME,
128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                &inParcel, &outParcel);
129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(err)
131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Failed to set view frame for dpy %d err=%d",
132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                            __FUNCTION__, dpy, err);
133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint setSecondaryDisplayStatus(int dpy, uint32_t status) {
138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    sp<IQService> binder = getBinder();
140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Parcel inParcel, outParcel;
141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(dpy);
142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(status);
143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(binder != NULL) {
145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = binder->dispatch(IQService::SET_SECONDARY_DISPLAY_STATUS,
146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                &inParcel, &outParcel);
147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(err)
149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Failed for dpy %d status = %d err=%d", __FUNCTION__, dpy,
150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                                        status, err);
151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinint configureDynRefreshRate(uint32_t op, uint32_t refreshRate) {
156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    status_t err = (status_t) FAILED_TRANSACTION;
157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    sp<IQService> binder = getBinder();
158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    Parcel inParcel, outParcel;
159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(op);
160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    inParcel.writeInt32(refreshRate);
161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(binder != NULL) {
163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        err = binder->dispatch(IQService::CONFIGURE_DYN_REFRESH_RATE,
164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                               &inParcel, &outParcel);
165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    }
166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    if(err)
168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin        ALOGE("%s: Failed setting op %d err=%d", __FUNCTION__, op, err);
169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return err;
171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}; //namespace
174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// ----------------------------------------------------------------------------
176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// Screen refresh for native daemons linking dynamically to libqdutils
177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin// ----------------------------------------------------------------------------
178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinextern "C" int refreshScreen() {
179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int ret = 0;
180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    ret = screenRefresh();
181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    return ret;
182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
183