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 
getInstance()49 QCameraThermalAdapter& QCameraThermalAdapter::getInstance()
50 {
51     static QCameraThermalAdapter instance;
52     return instance;
53 }
54 
QCameraThermalAdapter()55 QCameraThermalAdapter::QCameraThermalAdapter() :
56                                         mCallback(NULL),
57                                         mHandle(NULL),
58                                         mRegister(NULL),
59                                         mUnregister(NULL),
60                                         mCameraHandle(0),
61                                         mCamcorderHandle(0)
62 {
63 }
64 
init(QCameraThermalCallback * thermalCb)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 
deinit()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 
thermalCallback(int level,void * userdata,void * data)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 
getThermalLevel()170 qcamera_thermal_level_enum_t *QCameraThermalCallback::getThermalLevel() {
171     return &mLevel;
172 }
173 
setThermalLevel(qcamera_thermal_level_enum_t level)174 void QCameraThermalCallback::setThermalLevel(qcamera_thermal_level_enum_t level) {
175     mLevel = level;
176 }
177 }; //namespace qcamera
178