1 /*
2 * Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *    * Redistributions of source code must retain the above copyright
8 *      notice, this list of conditions and the following disclaimer.
9 *    * Redistributions in binary form must reproduce the above
10 *      copyright notice, this list of conditions and the following
11 *      disclaimer in the documentation and/or other materials provided
12 *      with the distribution.
13 *    * Neither the name of The Linux Foundation. nor the names of its
14 *      contributors may be used to endorse or promote products derived
15 *      from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 
30 #include <display_config.h>
31 #include <QServiceUtils.h>
32 
33 using namespace android;
34 using namespace qService;
35 
36 namespace qdutils {
37 
isExternalConnected(void)38 int isExternalConnected(void) {
39     int ret;
40     status_t err = (status_t) FAILED_TRANSACTION;
41     sp<IQService> binder = getBinder();
42     Parcel inParcel, outParcel;
43     if(binder != NULL) {
44         err = binder->dispatch(IQService::CHECK_EXTERNAL_STATUS,
45                 &inParcel , &outParcel);
46     }
47     if(err) {
48         ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err);
49         ret = err;
50     } else {
51         ret = outParcel.readInt32();
52     }
53     return ret;
54 }
55 
getDisplayAttributes(int dpy,DisplayAttributes_t & dpyattr)56 int getDisplayAttributes(int dpy, DisplayAttributes_t& dpyattr) {
57     status_t err = (status_t) FAILED_TRANSACTION;
58     sp<IQService> binder = getBinder();
59     Parcel inParcel, outParcel;
60     inParcel.writeInt32(dpy);
61     if(binder != NULL) {
62         err = binder->dispatch(IQService::GET_DISPLAY_ATTRIBUTES,
63                 &inParcel, &outParcel);
64     }
65     if(!err) {
66         dpyattr.vsync_period = outParcel.readInt32();
67         dpyattr.xres = outParcel.readInt32();
68         dpyattr.yres = outParcel.readInt32();
69         dpyattr.xdpi = outParcel.readFloat();
70         dpyattr.ydpi = outParcel.readFloat();
71         dpyattr.panel_type = (char) outParcel.readInt32();
72     } else {
73         ALOGE("%s: Failed to get display attributes err=%d", __FUNCTION__, err);
74     }
75     return err;
76 }
77 
setHSIC(int dpy,const HSICData_t & hsic_data)78 int setHSIC(int dpy, const HSICData_t& hsic_data) {
79     status_t err = (status_t) FAILED_TRANSACTION;
80     sp<IQService> binder = getBinder();
81     Parcel inParcel, outParcel;
82     inParcel.writeInt32(dpy);
83     inParcel.writeInt32(hsic_data.hue);
84     inParcel.writeFloat(hsic_data.saturation);
85     inParcel.writeInt32(hsic_data.intensity);
86     inParcel.writeFloat(hsic_data.contrast);
87     if(binder != NULL) {
88         err = binder->dispatch(IQService::SET_HSIC_DATA, &inParcel, &outParcel);
89     }
90     if(err)
91         ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err);
92     return err;
93 }
94 
getDisplayVisibleRegion(int dpy,hwc_rect_t & rect)95 int getDisplayVisibleRegion(int dpy, hwc_rect_t &rect) {
96     status_t err = (status_t) FAILED_TRANSACTION;
97     sp<IQService> binder = getBinder();
98     Parcel inParcel, outParcel;
99     inParcel.writeInt32(dpy);
100     if(binder != NULL) {
101         err = binder->dispatch(IQService::GET_DISPLAY_VISIBLE_REGION,
102                 &inParcel, &outParcel);
103     }
104     if(!err) {
105         rect.left = outParcel.readInt32();
106         rect.top = outParcel.readInt32();
107         rect.right = outParcel.readInt32();
108         rect.bottom = outParcel.readInt32();
109     } else {
110         ALOGE("%s: Failed to getVisibleRegion for dpy =%d: err = %d",
111               __FUNCTION__, dpy, err);
112     }
113     return err;
114 }
115 
setViewFrame(int dpy,int l,int t,int r,int b)116 int setViewFrame(int dpy, int l, int t, int r, int b) {
117     status_t err = (status_t) FAILED_TRANSACTION;
118     sp<IQService> binder = getBinder();
119     Parcel inParcel, outParcel;
120     inParcel.writeInt32(dpy);
121     inParcel.writeInt32(l);
122     inParcel.writeInt32(t);
123     inParcel.writeInt32(r);
124     inParcel.writeInt32(b);
125 
126     if(binder != NULL) {
127         err = binder->dispatch(IQService::SET_VIEW_FRAME,
128                 &inParcel, &outParcel);
129     }
130     if(err)
131         ALOGE("%s: Failed to set view frame for dpy %d err=%d",
132                             __FUNCTION__, dpy, err);
133 
134     return err;
135 }
136 
setSecondaryDisplayStatus(int dpy,uint32_t status)137 int setSecondaryDisplayStatus(int dpy, uint32_t status) {
138     status_t err = (status_t) FAILED_TRANSACTION;
139     sp<IQService> binder = getBinder();
140     Parcel inParcel, outParcel;
141     inParcel.writeInt32(dpy);
142     inParcel.writeInt32(status);
143 
144     if(binder != NULL) {
145         err = binder->dispatch(IQService::SET_SECONDARY_DISPLAY_STATUS,
146                 &inParcel, &outParcel);
147     }
148     if(err)
149         ALOGE("%s: Failed for dpy %d status = %d err=%d", __FUNCTION__, dpy,
150                                                         status, err);
151 
152     return err;
153 }
154 
configureDynRefreshRate(uint32_t op,uint32_t refreshRate)155 int configureDynRefreshRate(uint32_t op, uint32_t refreshRate) {
156     status_t err = (status_t) FAILED_TRANSACTION;
157     sp<IQService> binder = getBinder();
158     Parcel inParcel, outParcel;
159     inParcel.writeInt32(op);
160     inParcel.writeInt32(refreshRate);
161 
162     if(binder != NULL) {
163         err = binder->dispatch(IQService::CONFIGURE_DYN_REFRESH_RATE,
164                                &inParcel, &outParcel);
165     }
166 
167     if(err)
168         ALOGE("%s: Failed setting op %d err=%d", __FUNCTION__, op, err);
169 
170     return err;
171 }
172 
173 }; //namespace
174 
175 // ----------------------------------------------------------------------------
176 // Screen refresh for native daemons linking dynamically to libqdutils
177 // ----------------------------------------------------------------------------
refreshScreen()178 extern "C" int refreshScreen() {
179     int ret = 0;
180     ret = screenRefresh();
181     return ret;
182 }
183 
184 // ----------------------------------------------------------------------------
185 // Native daemons needs to send enable partial update ack for PU to enable
186 // ----------------------------------------------------------------------------
setPartialUpdateState()187 extern "C" int setPartialUpdateState() {
188     int ret = 0;
189     ret = setPartialUpdate(IQService::ENABLE_PARTIAL_UPDATE);
190     return ret;
191 }
192