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