1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "infrared_emitter_controller.h"
17
18 #include <dlfcn.h>
19
20 #include "mmi_log.h"
21
22 #undef MMI_LOG_DOMAIN
23 #define MMI_LOG_DOMAIN MMI_LOG_SERVER
24 #undef MMI_LOG_TAG
25 #define MMI_LOG_TAG "InfraredEmitterController"
26
27 namespace OHOS {
28 namespace MMI {
29 namespace {
30 const char* INFRARED_ADAPTER_PATH = "libinfrared_emitter_adapter.z.so";
31 }
32 using namespace OHOS::HDI::Consumerir::V1_0;
33 InfraredEmitterController *InfraredEmitterController::instance_ = new (std::nothrow) InfraredEmitterController();
InfraredEmitterController()34 InfraredEmitterController::InfraredEmitterController() {}
35
~InfraredEmitterController()36 InfraredEmitterController::~InfraredEmitterController()
37 {
38 CALL_DEBUG_ENTER;
39 if (soIrHandle_ != nullptr) {
40 typedef void (*funDestroyPtr) (IInfraredEmitterAdapter*);
41 funDestroyPtr fnDestroy = (funDestroyPtr)dlsym(soIrHandle_, "DestroyInstance");
42 if (fnDestroy != nullptr) {
43 fnDestroy(irInterface_);
44 irInterface_ = nullptr;
45 }
46 dlclose(soIrHandle_);
47 soIrHandle_ = nullptr;
48 }
49 }
50
GetInstance()51 InfraredEmitterController *InfraredEmitterController::GetInstance()
52 {
53 return instance_;
54 }
55
InitInfraredEmitter()56 void InfraredEmitterController::InitInfraredEmitter()
57 {
58 CALL_DEBUG_ENTER;
59 if (irInterface_ != nullptr) {
60 return;
61 }
62 if (soIrHandle_ == nullptr) {
63 soIrHandle_ = dlopen(INFRARED_ADAPTER_PATH, RTLD_NOW);
64 if (soIrHandle_ == nullptr) {
65 MMI_HILOGE("Loaded %{private}s failed:%{public}s", INFRARED_ADAPTER_PATH, dlerror());
66 return;
67 }
68 }
69 typedef IInfraredEmitterAdapter* (*funCreatePtr) (void);
70 funCreatePtr fnCreate = nullptr;
71 fnCreate = (funCreatePtr)dlsym(soIrHandle_, "ConsumerIrImplGetInstance");
72 const char *dlsymError = dlerror();
73 if (dlsymError != nullptr) {
74 MMI_HILOGE("Loaded ConsumerIrImplGetInstance failed:%{public}s", dlsymError);
75 dlclose(soIrHandle_);
76 soIrHandle_ = nullptr;
77 return;
78 }
79 if (fnCreate == nullptr) {
80 MMI_HILOGE("Loaded ConsumerIrImplGetInstance is null");
81 dlclose(soIrHandle_);
82 soIrHandle_ = nullptr;
83 return;
84 }
85 MMI_HILOGI("Infrared emitter call IInfraredEmitterAdapter:fnCreate begin");
86 irInterface_ = (IInfraredEmitterAdapter *)fnCreate();
87 if (irInterface_ == nullptr) {
88 MMI_HILOGE("Infrared emitter init fail irInterface_ is nullptr");
89 dlclose(soIrHandle_);
90 soIrHandle_ = nullptr;
91 return;
92 }
93 }
94
Transmit(int64_t carrierFreq,const std::vector<int64_t> pattern)95 bool InfraredEmitterController::Transmit(int64_t carrierFreq, const std::vector<int64_t> pattern)
96 {
97 CALL_DEBUG_ENTER;
98 InitInfraredEmitter();
99 CHKPF(irInterface_);
100 int32_t tempCarrierFreq = carrierFreq;
101 std::vector<int32_t> tempPattern;
102 std::string context = "infraredFrequency:" + std::to_string(tempCarrierFreq) + ";";
103 for (size_t i = 0; i < pattern.size(); i++) {
104 int32_t per = pattern[i];
105 context = context + "index:" + std::to_string(i) + ": pattern:" + std::to_string(per) + ";";
106 tempPattern.push_back(per);
107 }
108 MMI_HILOGI("irInterface_->Transmit params:%{public}s", context.c_str());
109
110 bool outRet = false;
111 int32_t ret = irInterface_->Transmit(tempCarrierFreq, tempPattern, outRet);
112 MMI_HILOGI("irInterface_->Transmit ret:%{public}d", ret);
113 if (ret < 0) {
114 MMI_HILOGE("Infrared emitter transmit failed:%{public}d", ret);
115 return false;
116 }
117 if (!outRet) {
118 MMI_HILOGE("Infrared emitter transmit out false");
119 return false;
120 }
121 return true;
122 }
123
GetFrequencies(std::vector<InfraredFrequencyInfo> & frequencyInfo)124 bool InfraredEmitterController::GetFrequencies(std::vector<InfraredFrequencyInfo> &frequencyInfo)
125 {
126 CALL_DEBUG_ENTER;
127 InitInfraredEmitter();
128 if (!irInterface_) {
129 MMI_HILOGE("Infrared emitter not init");
130 return false;
131 }
132 bool outRet = false;
133 std::vector<ConsumerIrFreqRange> outRange;
134 MMI_HILOGI("irInterface_->GetCarrierFreqs");
135 int32_t ret = irInterface_->GetCarrierFreqs(outRet, outRange);
136 MMI_HILOGI("irInterface_->GetCarrierFreqs ret:%{public}d", ret);
137 if (ret < 0) {
138 MMI_HILOGE("Infrared emitter GetCarrierFreqs failed:%{public}d", ret);
139 return false;
140 }
141 if (!outRet) {
142 MMI_HILOGE("Infrared emitter GetCarrierFreqs out false");
143 return false;
144 }
145 std::string context = "size:" + std::to_string(outRange.size()) + ";";
146 for (size_t i = 0; i < outRange.size(); i++) {
147 InfraredFrequencyInfo item;
148 context = context + "index:" + std::to_string(i) + ": per.max:" + std::to_string(outRange[i].max) +
149 ": per.min:" + std::to_string(outRange[i].min) + ";;";
150 item.max_ = outRange[i].max;
151 item.min_ = outRange[i].min;
152 frequencyInfo.push_back(item);
153 }
154 return true;
155 }
156 } // namespace MMI
157 } // namespace OHOS
158
159