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