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