Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2013-2015, The Linux Foundataion. All rights reserved.
      2  *
      3  * Redistribution and use in source and binary forms, with or without
      4  * modification, are permitted provided that the following conditions are
      5  * met:
      6  *     * Redistributions of source code must retain the above copyright
      7  *       notice, this list of conditions and the following disclaimer.
      8  *     * Redistributions in binary form must reproduce the above
      9  *       copyright notice, this list of conditions and the following
     10  *       disclaimer in the documentation and/or other materials provided
     11  *       with the distribution.
     12  *     * Neither the name of The Linux Foundation nor the names of its
     13  *       contributors may be used to endorse or promote products derived
     14  *       from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
     26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  *
     28  */
     29 
     30 #define LOG_TAG "QCameraThermalAdapter"
     31 
     32 #include <dlfcn.h>
     33 #include <stdlib.h>
     34 #include <utils/Errors.h>
     35 
     36 #include "QCamera2HWI.h"
     37 #include "QCameraThermalAdapter.h"
     38 
     39 using namespace android;
     40 
     41 namespace qcamera {
     42 
     43 
     44 QCameraThermalAdapter& QCameraThermalAdapter::getInstance()
     45 {
     46     static QCameraThermalAdapter instance;
     47     return instance;
     48 }
     49 
     50 QCameraThermalAdapter::QCameraThermalAdapter() :
     51                                         mCallback(NULL),
     52                                         mHandle(NULL),
     53                                         mRegister(NULL),
     54                                         mUnregister(NULL),
     55                                         mCameraHandle(0),
     56                                         mCamcorderHandle(0)
     57 {
     58 }
     59 
     60 int QCameraThermalAdapter::init(QCameraThermalCallback *thermalCb)
     61 {
     62     const char *error = NULL;
     63     int rc = NO_ERROR;
     64 
     65     CDBG("%s E", __func__);
     66     mHandle = dlopen("/vendor/lib/libthermalclient.so", RTLD_NOW);
     67     if (!mHandle) {
     68         error = dlerror();
     69         ALOGE("%s: dlopen failed with error %s",
     70                     __func__, error ? error : "");
     71         rc = UNKNOWN_ERROR;
     72         goto error;
     73     }
     74     *(void **)&mRegister = dlsym(mHandle, "thermal_client_register_callback");
     75     if (!mRegister) {
     76         error = dlerror();
     77         ALOGE("%s: dlsym failed with error code %s",
     78                     __func__, error ? error: "");
     79         rc = UNKNOWN_ERROR;
     80         goto error2;
     81     }
     82     *(void **)&mUnregister = dlsym(mHandle, "thermal_client_unregister_callback");
     83     if (!mUnregister) {
     84         error = dlerror();
     85         ALOGE("%s: dlsym failed with error code %s",
     86                     __func__, error ? error: "");
     87         rc = UNKNOWN_ERROR;
     88         goto error2;
     89     }
     90 
     91     mCallback = thermalCb;
     92 
     93     // Register camera and camcorder callbacks
     94     mCameraHandle = mRegister(mStrCamera, thermalCallback, NULL);
     95     if (mCameraHandle < 0) {
     96         ALOGE("%s: thermal_client_register_callback failed %d",
     97                         __func__, mCameraHandle);
     98         rc = UNKNOWN_ERROR;
     99         goto error2;
    100     }
    101     mCamcorderHandle = mRegister(mStrCamcorder, thermalCallback, NULL);
    102     if (mCamcorderHandle < 0) {
    103         ALOGE("%s: thermal_client_register_callback failed %d",
    104                         __func__, mCamcorderHandle);
    105         rc = UNKNOWN_ERROR;
    106         goto error3;
    107     }
    108 
    109     CDBG("%s X", __func__);
    110     return rc;
    111 
    112 error3:
    113     mCamcorderHandle = 0;
    114     mUnregister(mCameraHandle);
    115 error2:
    116     mCameraHandle = 0;
    117     dlclose(mHandle);
    118     mHandle = NULL;
    119 error:
    120     CDBG("%s X", __func__);
    121     return rc;
    122 }
    123 
    124 void QCameraThermalAdapter::deinit()
    125 {
    126     CDBG("%s E", __func__);
    127     if (mUnregister) {
    128         if (mCameraHandle) {
    129             mUnregister(mCameraHandle);
    130             mCameraHandle = 0;
    131         }
    132         if (mCamcorderHandle) {
    133             mUnregister(mCamcorderHandle);
    134             mCamcorderHandle = 0;
    135         }
    136     }
    137     if (mHandle)
    138         dlclose(mHandle);
    139 
    140     mHandle = NULL;
    141     mRegister = NULL;
    142     mUnregister = NULL;
    143     mCallback = NULL;
    144     CDBG("%s X", __func__);
    145 }
    146 
    147 char QCameraThermalAdapter::mStrCamera[] = "camera";
    148 char QCameraThermalAdapter::mStrCamcorder[] = "camcorder";
    149 
    150 int QCameraThermalAdapter::thermalCallback(int level,
    151                 void *userdata, void *data)
    152 {
    153     int rc = 0;
    154     CDBG("%s E", __func__);
    155     QCameraThermalCallback *mcb = getInstance().mCallback;
    156 
    157     if (mcb) {
    158         mcb->setThermalLevel((qcamera_thermal_level_enum_t) level);
    159         rc = mcb->thermalEvtHandle(mcb->getThermalLevel(), userdata, data);
    160     }
    161     CDBG("%s X", __func__);
    162     return rc;
    163 }
    164 
    165 qcamera_thermal_level_enum_t *QCameraThermalCallback::getThermalLevel() {
    166     return &mLevel;
    167 }
    168 
    169 void QCameraThermalCallback::setThermalLevel(qcamera_thermal_level_enum_t level) {
    170     mLevel = level;
    171 }
    172 }; //namespace qcamera
    173