Home | History | Annotate | Download | only in HAL
      1 /* Copyright (c) 2013-2016, The Linux Foundation. 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 // System dependencies
     33 #include <dlfcn.h>
     34 #include <utils/Errors.h>
     35 
     36 // Camera dependencies
     37 #include "QCamera2HWI.h"
     38 #include "QCameraThermalAdapter.h"
     39 
     40 extern "C" {
     41 #include "mm_camera_dbg.h"
     42 }
     43 
     44 using namespace android;
     45 
     46 namespace qcamera {
     47 
     48 
     49 QCameraThermalAdapter& QCameraThermalAdapter::getInstance()
     50 {
     51     static QCameraThermalAdapter instance;
     52     return instance;
     53 }
     54 
     55 QCameraThermalAdapter::QCameraThermalAdapter() :
     56                                         mCallback(NULL),
     57                                         mHandle(NULL),
     58                                         mRegister(NULL),
     59                                         mUnregister(NULL),
     60                                         mCameraHandle(0),
     61                                         mCamcorderHandle(0)
     62 {
     63 }
     64 
     65 int QCameraThermalAdapter::init(QCameraThermalCallback *thermalCb)
     66 {
     67     const char *error = NULL;
     68     int rc = NO_ERROR;
     69 
     70     LOGD("E");
     71     mHandle = dlopen("/vendor/lib/libthermalclient.so", RTLD_NOW);
     72     if (!mHandle) {
     73         error = dlerror();
     74         LOGE("dlopen failed with error %s",
     75                      error ? error : "");
     76         rc = UNKNOWN_ERROR;
     77         goto error;
     78     }
     79     *(void **)&mRegister = dlsym(mHandle, "thermal_client_register_callback");
     80     if (!mRegister) {
     81         error = dlerror();
     82         LOGE("dlsym failed with error code %s",
     83                      error ? error: "");
     84         rc = UNKNOWN_ERROR;
     85         goto error2;
     86     }
     87     *(void **)&mUnregister = dlsym(mHandle, "thermal_client_unregister_callback");
     88     if (!mUnregister) {
     89         error = dlerror();
     90         LOGE("dlsym failed with error code %s",
     91                      error ? error: "");
     92         rc = UNKNOWN_ERROR;
     93         goto error2;
     94     }
     95 
     96     mCallback = thermalCb;
     97 
     98     // Register camera and camcorder callbacks
     99     mCameraHandle = mRegister(mStrCamera, thermalCallback, NULL);
    100     if (mCameraHandle < 0) {
    101         LOGE("thermal_client_register_callback failed %d",
    102                          mCameraHandle);
    103         rc = UNKNOWN_ERROR;
    104         goto error2;
    105     }
    106     mCamcorderHandle = mRegister(mStrCamcorder, thermalCallback, NULL);
    107     if (mCamcorderHandle < 0) {
    108         LOGE("thermal_client_register_callback failed %d",
    109                          mCamcorderHandle);
    110         rc = UNKNOWN_ERROR;
    111         goto error3;
    112     }
    113 
    114     LOGD("X");
    115     return rc;
    116 
    117 error3:
    118     mCamcorderHandle = 0;
    119     mUnregister(mCameraHandle);
    120 error2:
    121     mCameraHandle = 0;
    122     dlclose(mHandle);
    123     mHandle = NULL;
    124 error:
    125     LOGD("X");
    126     return rc;
    127 }
    128 
    129 void QCameraThermalAdapter::deinit()
    130 {
    131     LOGD("E");
    132     if (mUnregister) {
    133         if (mCameraHandle) {
    134             mUnregister(mCameraHandle);
    135             mCameraHandle = 0;
    136         }
    137         if (mCamcorderHandle) {
    138             mUnregister(mCamcorderHandle);
    139             mCamcorderHandle = 0;
    140         }
    141     }
    142     if (mHandle)
    143         dlclose(mHandle);
    144 
    145     mHandle = NULL;
    146     mRegister = NULL;
    147     mUnregister = NULL;
    148     mCallback = NULL;
    149     LOGD("X");
    150 }
    151 
    152 char QCameraThermalAdapter::mStrCamera[] = "camera";
    153 char QCameraThermalAdapter::mStrCamcorder[] = "camcorder";
    154 
    155 int QCameraThermalAdapter::thermalCallback(int level,
    156                 void *userdata, void *data)
    157 {
    158     int rc = 0;
    159     LOGD("E");
    160     QCameraThermalCallback *mcb = getInstance().mCallback;
    161 
    162     if (mcb) {
    163         mcb->setThermalLevel((qcamera_thermal_level_enum_t) level);
    164         rc = mcb->thermalEvtHandle(mcb->getThermalLevel(), userdata, data);
    165     }
    166     LOGD("X");
    167     return rc;
    168 }
    169 
    170 qcamera_thermal_level_enum_t *QCameraThermalCallback::getThermalLevel() {
    171     return &mLevel;
    172 }
    173 
    174 void QCameraThermalCallback::setThermalLevel(qcamera_thermal_level_enum_t level) {
    175     mLevel = level;
    176 }
    177 }; //namespace qcamera
    178