1683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda/* Copyright (c) 2013-2014, The Linux Foundataion. All rights reserved.
2584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *
3584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * Redistribution and use in source and binary forms, with or without
4584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * modification, are permitted provided that the following conditions are
5584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * met:
6584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *     * Redistributions of source code must retain the above copyright
7584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *       notice, this list of conditions and the following disclaimer.
8584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *     * Redistributions in binary form must reproduce the above
9584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *       copyright notice, this list of conditions and the following
10584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *       disclaimer in the documentation and/or other materials provided
11584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *       with the distribution.
12584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *     * Neither the name of The Linux Foundation nor the names of its
13584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *       contributors may be used to endorse or promote products derived
14584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *       from this software without specific prior written permission.
15584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *
16584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang *
28584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang */
29584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
30584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#define LOG_TAG "QCameraThermalAdapter"
31584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
32584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include <dlfcn.h>
33584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include <stdlib.h>
34584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include <utils/Errors.h>
35584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
3677e92b071f7205f74322e3afe3d60814e7bd22ceEmilian Peev#include "QCamera2HWI.h"
37584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include "QCameraThermalAdapter.h"
38584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
39584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangusing namespace android;
40584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
41584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangnamespace qcamera {
42584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
43584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
44584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen WangQCameraThermalAdapter& QCameraThermalAdapter::getInstance()
45584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{
46584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    static QCameraThermalAdapter instance;
47584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    return instance;
48584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang}
49584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
50584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen WangQCameraThermalAdapter::QCameraThermalAdapter() :
51584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang                                        mCallback(NULL),
52584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang                                        mHandle(NULL),
53584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang                                        mRegister(NULL),
540825db66074e616f12933dc3499685555fc837ecShuzhen Wang                                        mUnregister(NULL),
550825db66074e616f12933dc3499685555fc837ecShuzhen Wang                                        mCameraHandle(0),
560825db66074e616f12933dc3499685555fc837ecShuzhen Wang                                        mCamcorderHandle(0)
57584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{
58584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang}
59584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
60584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangint QCameraThermalAdapter::init(QCameraThermalCallback *thermalCb)
61584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{
62584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    const char *error = NULL;
630825db66074e616f12933dc3499685555fc837ecShuzhen Wang    int rc = NO_ERROR;
64584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
65683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda    CDBG("%s E", __func__);
669ec8a88d88712c52c7f8c6ef0e757a856ca620c9Satya Durga Srinivasu Prabhala    mHandle = dlopen("/vendor/lib/libthermalclient.so", RTLD_NOW);
67584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    if (!mHandle) {
68584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        error = dlerror();
69584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        ALOGE("%s: dlopen failed with error %s",
70584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang                    __func__, error ? error : "");
71584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        rc = UNKNOWN_ERROR;
72584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        goto error;
73584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    }
740825db66074e616f12933dc3499685555fc837ecShuzhen Wang    *(void **)&mRegister = dlsym(mHandle, "thermal_client_register_callback");
75584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    if (!mRegister) {
76584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        error = dlerror();
77584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        ALOGE("%s: dlsym failed with error code %s",
78584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang                    __func__, error ? error: "");
79584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        rc = UNKNOWN_ERROR;
80584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        goto error2;
81584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    }
820825db66074e616f12933dc3499685555fc837ecShuzhen Wang    *(void **)&mUnregister = dlsym(mHandle, "thermal_client_unregister_callback");
83584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    if (!mUnregister) {
84584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        error = dlerror();
85584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        ALOGE("%s: dlsym failed with error code %s",
86584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang                    __func__, error ? error: "");
87584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        rc = UNKNOWN_ERROR;
88584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        goto error2;
89584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    }
90584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
91e47699dd33bcd1c7c594c4efbb6ed2241968982bEmilian Peev    mCallback = thermalCb;
92e47699dd33bcd1c7c594c4efbb6ed2241968982bEmilian Peev
93584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    // Register camera and camcorder callbacks
940825db66074e616f12933dc3499685555fc837ecShuzhen Wang    mCameraHandle = mRegister(mStrCamera, thermalCallback, NULL);
950825db66074e616f12933dc3499685555fc837ecShuzhen Wang    if (mCameraHandle < 0) {
960825db66074e616f12933dc3499685555fc837ecShuzhen Wang        ALOGE("%s: thermal_client_register_callback failed %d",
970825db66074e616f12933dc3499685555fc837ecShuzhen Wang                        __func__, mCameraHandle);
980825db66074e616f12933dc3499685555fc837ecShuzhen Wang        rc = UNKNOWN_ERROR;
99584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        goto error2;
100584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    }
1010825db66074e616f12933dc3499685555fc837ecShuzhen Wang    mCamcorderHandle = mRegister(mStrCamcorder, thermalCallback, NULL);
1020825db66074e616f12933dc3499685555fc837ecShuzhen Wang    if (mCamcorderHandle < 0) {
1030825db66074e616f12933dc3499685555fc837ecShuzhen Wang        ALOGE("%s: thermal_client_register_callback failed %d",
1040825db66074e616f12933dc3499685555fc837ecShuzhen Wang                        __func__, mCamcorderHandle);
1050825db66074e616f12933dc3499685555fc837ecShuzhen Wang        rc = UNKNOWN_ERROR;
106584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        goto error3;
107584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    }
108584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
109683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda    CDBG("%s X", __func__);
110584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    return rc;
111584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
112584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangerror3:
1130825db66074e616f12933dc3499685555fc837ecShuzhen Wang    mCamcorderHandle = 0;
1140825db66074e616f12933dc3499685555fc837ecShuzhen Wang    mUnregister(mCameraHandle);
115584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangerror2:
1160825db66074e616f12933dc3499685555fc837ecShuzhen Wang    mCameraHandle = 0;
117584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    dlclose(mHandle);
118e248dceae7a5ba50bbf72f60e04d1dad8f095346David Ng    mHandle = NULL;
119584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangerror:
120683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda    CDBG("%s X", __func__);
121584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    return rc;
122584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang}
123584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
124584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangvoid QCameraThermalAdapter::deinit()
125584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{
126683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda    CDBG("%s E", __func__);
127584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    if (mUnregister) {
1280825db66074e616f12933dc3499685555fc837ecShuzhen Wang        if (mCameraHandle) {
1290825db66074e616f12933dc3499685555fc837ecShuzhen Wang            mUnregister(mCameraHandle);
1300825db66074e616f12933dc3499685555fc837ecShuzhen Wang            mCameraHandle = 0;
1310825db66074e616f12933dc3499685555fc837ecShuzhen Wang        }
1320825db66074e616f12933dc3499685555fc837ecShuzhen Wang        if (mCamcorderHandle) {
1330825db66074e616f12933dc3499685555fc837ecShuzhen Wang            mUnregister(mCamcorderHandle);
1340825db66074e616f12933dc3499685555fc837ecShuzhen Wang            mCamcorderHandle = 0;
1350825db66074e616f12933dc3499685555fc837ecShuzhen Wang        }
136584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    }
137584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    if (mHandle)
138584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang        dlclose(mHandle);
139584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
140584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    mHandle = NULL;
141584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    mRegister = NULL;
142584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    mUnregister = NULL;
143584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    mCallback = NULL;
144683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda    CDBG("%s X", __func__);
145584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang}
146584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
147584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangchar QCameraThermalAdapter::mStrCamera[] = "camera";
148584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangchar QCameraThermalAdapter::mStrCamcorder[] = "camcorder";
149584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
1500825db66074e616f12933dc3499685555fc837ecShuzhen Wangint QCameraThermalAdapter::thermalCallback(int level,
1510825db66074e616f12933dc3499685555fc837ecShuzhen Wang                void *userdata, void *data)
152584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{
153584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    int rc = 0;
154683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda    CDBG("%s E", __func__);
155584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    QCameraThermalAdapter& instance = getInstance();
156c1b98233ec8545ed96ac13378e251118127561a9Emilian Peev    qcamera_thermal_level_enum_t lvl = (qcamera_thermal_level_enum_t) level;
157584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    if (instance.mCallback)
1580825db66074e616f12933dc3499685555fc837ecShuzhen Wang        rc = instance.mCallback->thermalEvtHandle(lvl, userdata, data);
159683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda    CDBG("%s X", __func__);
160584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang    return rc;
161584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang}
162584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang
163584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang}; //namespace qcamera
164