12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/*
22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2013-2014, 2016, The Linux Foundation. All rights reserved.
32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without
52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* modification, are permitted provided that the following conditions are
62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* met:
72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions of source code must retain the above copyright
82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      notice, this list of conditions and the following disclaimer.
92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions in binary form must reproduce the above
102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      copyright notice, this list of conditions and the following
112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      disclaimer in the documentation and/or other materials provided
122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      with the distribution.
132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Neither the name of The Linux Foundation. nor the names of its
142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      contributors may be used to endorse or promote products derived
152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      from this software without specific prior written permission.
162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/
292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <fcntl.h>
312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <stdio.h>
322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <sys/types.h>
332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <sys/stat.h>
342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <unistd.h>
352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <display_config.h>
362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <QServiceUtils.h>
372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <qd_utils.h>
382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelusing namespace android;
402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelusing namespace qService;
412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace qdutils {
432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel//=============================================================================
452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// The functions below run in the client process and wherever necessary
462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// do a binder call to HWC to get/set data.
472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint isExternalConnected(void) {
492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    int ret;
502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::CHECK_EXTERNAL_STATUS,
552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel , &outParcel);
562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(err) {
582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err);
592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ret = err;
602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    } else {
612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ret = outParcel.readInt32();
622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return ret;
642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getDisplayAttributes(int dpy, DisplayAttributes_t& dpyattr) {
672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(dpy);
712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::GET_DISPLAY_ATTRIBUTES,
732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(!err) {
762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        dpyattr.vsync_period = outParcel.readInt32();
772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        dpyattr.xres = outParcel.readInt32();
782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        dpyattr.yres = outParcel.readInt32();
792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        dpyattr.xdpi = outParcel.readFloat();
802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        dpyattr.ydpi = outParcel.readFloat();
819e9ad6589a3244caa2b310b0a7a115210c6ab235Thierry Strudel        dpyattr.panel_type = outParcel.readInt32();
822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    } else {
832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s() failed with err %d", __FUNCTION__, err);
842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setHSIC(int dpy, const HSICData_t& hsic_data) {
892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(dpy);
932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(hsic_data.hue);
942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeFloat(hsic_data.saturation);
952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(hsic_data.intensity);
962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeFloat(hsic_data.contrast);
972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::SET_HSIC_DATA, &inParcel, &outParcel);
992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(err)
1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s: Failed to get external status err=%d", __FUNCTION__, err);
1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getDisplayVisibleRegion(int dpy, hwc_rect_t &rect) {
1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(dpy);
1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::GET_DISPLAY_VISIBLE_REGION,
1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(!err) {
1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        rect.left = outParcel.readInt32();
1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        rect.top = outParcel.readInt32();
1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        rect.right = outParcel.readInt32();
1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        rect.bottom = outParcel.readInt32();
1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    } else {
1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s: Failed to getVisibleRegion for dpy =%d: err = %d",
1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel              __FUNCTION__, dpy, err);
1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setViewFrame(int dpy, int l, int t, int r, int b) {
1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(dpy);
1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(l);
1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(t);
1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(r);
1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(b);
1352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::SET_VIEW_FRAME,
1382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(err)
1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s: Failed to set view frame for dpy %d err=%d",
1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                            __FUNCTION__, dpy, err);
1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
1452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setSecondaryDisplayStatus(int dpy, uint32_t status) {
1482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
1492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
1502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
1512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(dpy);
1522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(status);
1532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
1552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::SET_SECONDARY_DISPLAY_STATUS,
1562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
1572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(err)
1592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s: Failed for dpy %d status = %d err=%d", __FUNCTION__, dpy,
1602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                                        status, err);
1612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
1632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint configureDynRefreshRate(uint32_t op, uint32_t refreshRate) {
1662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
1672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
1682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
1692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(op);
1702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(refreshRate);
1712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
1732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::CONFIGURE_DYN_REFRESH_RATE,
1742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                               &inParcel, &outParcel);
1752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(err)
1782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s: Failed setting op %d err=%d", __FUNCTION__, op, err);
1792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
1812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
1822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getConfigCount(int /*dpy*/) {
1842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    int numConfigs = -1;
1852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
1862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
1872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        Parcel inParcel, outParcel;
1882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(DISPLAY_PRIMARY);
1892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        status_t err = binder->dispatch(IQService::GET_CONFIG_COUNT,
1902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
1912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(!err) {
1922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            numConfigs = outParcel.readInt32();
1932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGI("%s() Received num configs %d", __FUNCTION__, numConfigs);
1942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        } else {
1952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
1962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
1972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
1982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return numConfigs;
1992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getActiveConfig(int /*dpy*/) {
2022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    int configIndex = -1;
2032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
2042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
2052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        Parcel inParcel, outParcel;
2062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(DISPLAY_PRIMARY);
2072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        status_t err = binder->dispatch(IQService::GET_ACTIVE_CONFIG,
2082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
2092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(!err) {
2102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            configIndex = outParcel.readInt32();
2112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGI("%s() Received active config index %d", __FUNCTION__,
2122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                    configIndex);
2132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        } else {
2142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
2152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
2162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return configIndex;
2182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setActiveConfig(int configIndex, int /*dpy*/) {
2212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
2222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
2232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
2242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        Parcel inParcel, outParcel;
2252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(configIndex);
2262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(DISPLAY_PRIMARY);
2272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::SET_ACTIVE_CONFIG,
2282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
2292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(!err) {
2302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGI("%s() Successfully set active config index %d", __FUNCTION__,
2312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                    configIndex);
2322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        } else {
2332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
2342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
2352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
2372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayAttributes getDisplayAttributes(int configIndex, int /*dpy*/) {
2409e9ad6589a3244caa2b310b0a7a115210c6ab235Thierry Strudel    DisplayAttributes dpyattr = {};
2412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
2422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
2432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        Parcel inParcel, outParcel;
2442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(configIndex);
2452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(DISPLAY_PRIMARY);
2462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        status_t err = binder->dispatch(
2472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                IQService::GET_DISPLAY_ATTRIBUTES_FOR_CONFIG, &inParcel,
2482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &outParcel);
2492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(!err) {
2502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            dpyattr.vsync_period = outParcel.readInt32();
2512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            dpyattr.xres = outParcel.readInt32();
2522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            dpyattr.yres = outParcel.readInt32();
2532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            dpyattr.xdpi = outParcel.readFloat();
2542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            dpyattr.ydpi = outParcel.readFloat();
2559e9ad6589a3244caa2b310b0a7a115210c6ab235Thierry Strudel            dpyattr.panel_type = outParcel.readInt32();
2562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            dpyattr.is_yuv = outParcel.readInt32();
2572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGI("%s() Received attrs for index %d: xres %d, yres %d",
2582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                    __FUNCTION__, configIndex, dpyattr.xres, dpyattr.yres);
2592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        } else {
2602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
2612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
2622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return dpyattr;
2642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setPanelMode(int mode) {
2672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
2682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
2692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
2702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        Parcel inParcel, outParcel;
2712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(mode);
2722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::SET_DISPLAY_MODE,
2732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                               &inParcel, &outParcel);
2742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(!err) {
2752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGI("%s() Successfully set the display mode to %d", __FUNCTION__,
2762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                  mode);
2772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        } else {
2782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
2792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
2802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
2822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint setPanelBrightness(int level) {
2852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
2862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
2872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
2882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
2892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
2902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(level);
2912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        status_t err = binder->dispatch(IQService::SET_PANEL_BRIGHTNESS,
2922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
2932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(err) {
2942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
2952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
2962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
2972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
2982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
2992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelint getPanelBrightness() {
3012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    int panel_brightness = -1;
3022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
3032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
3042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
3062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        status_t err = binder->dispatch(IQService::GET_PANEL_BRIGHTNESS,
3072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
3082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(!err) {
3092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            panel_brightness = outParcel.readInt32();
3102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGI("%s() Current panel brightness value %d", __FUNCTION__,
3112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                    panel_brightness);
3122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        } else {
3132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
3142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
3152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
3162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return panel_brightness;
3172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}// namespace
3202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// ----------------------------------------------------------------------------
3222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Functions for linking dynamically to libqdutils
3232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// ----------------------------------------------------------------------------
3242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelextern "C" int minHdcpEncryptionLevelChanged(int dpy, int min_enc_level) {
3252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
3262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
3272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    Parcel inParcel, outParcel;
3282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(dpy);
3292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    inParcel.writeInt32(min_enc_level);
3302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
3322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED,
3332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                &inParcel, &outParcel);
3342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
3352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(err) {
3372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        ALOGE("%s: Failed for dpy %d err=%d", __FUNCTION__, dpy, err);
3382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    } else {
3392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = outParcel.readInt32();
3402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
3412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
3432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelextern "C" int refreshScreen() {
3462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    int ret = 0;
3472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    ret = screenRefresh();
3482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return ret;
3492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelextern "C" int controlPartialUpdate(int dpy, int mode) {
3522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    status_t err = (status_t) FAILED_TRANSACTION;
3532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    sp<IQService> binder = getBinder();
3542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if(binder != NULL) {
3552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        Parcel inParcel, outParcel;
3562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(dpy);
3572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        inParcel.writeInt32(mode);
3582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        err = binder->dispatch(IQService::CONTROL_PARTIAL_UPDATE, &inParcel, &outParcel);
3592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        if(err != 0) {
3602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            ALOGE("%s() failed with err %d", __FUNCTION__, err);
3612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        } else {
3622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel            return outParcel.readInt32();
3632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        }
3642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
3652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
3662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return err;
3672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
3682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
369