/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "android.hardware.thermal@2.0-service-mock" #include #include #include #include #include "Thermal.h" namespace android { namespace hardware { namespace thermal { namespace V2_0 { namespace implementation { using ::android::sp; using ::android::hardware::interfacesEqual; using ::android::hardware::thermal::V1_0::ThermalStatus; using ::android::hardware::thermal::V1_0::ThermalStatusCode; std::set> gCallbacks; static const Temperature_1_0 kTemp_1_0 = { .type = static_cast<::android::hardware::thermal::V1_0::TemperatureType>( TemperatureType::SKIN), .name = "test temperature sensor", .currentValue = 30.8, .throttlingThreshold = 48.0, .shutdownThreshold = 60.0, .vrThrottlingThreshold = 49.0, }; static const Temperature_2_0 kTemp_2_0 = { .type = TemperatureType::SKIN, .name = "test temperature sensor", .value = 30.8, .throttlingStatus = ThrottlingSeverity::NONE, }; static const TemperatureThreshold kTempThreshold = { .type = TemperatureType::SKIN, .name = "test temperature sensor", .hotThrottlingThresholds = {{NAN, NAN, NAN, 48.0, NAN, NAN, 60.0}}, .coldThrottlingThresholds = {{NAN, NAN, NAN, NAN, NAN, NAN, NAN}}, .vrThrottlingThreshold = 49.0, }; static const CoolingDevice_1_0 kCooling_1_0 = { .type = ::android::hardware::thermal::V1_0::CoolingType::FAN_RPM, .name = "test cooling device", .currentValue = 100.0, }; static const CoolingDevice_2_0 kCooling_2_0 = { .type = CoolingType::FAN, .name = "test cooling device", .value = 100, }; static const CpuUsage kCpuUsage = { .name = "cpu_name", .active = 0, .total = 0, .isOnline = true, }; // Methods from ::android::hardware::thermal::V1_0::IThermal follow. Return Thermal::getTemperatures(getTemperatures_cb _hidl_cb) { ThermalStatus status; status.code = ThermalStatusCode::SUCCESS; std::vector temperatures = {kTemp_1_0}; _hidl_cb(status, temperatures); return Void(); } Return Thermal::getCpuUsages(getCpuUsages_cb _hidl_cb) { ThermalStatus status; status.code = ThermalStatusCode::SUCCESS; std::vector cpu_usages = {kCpuUsage}; _hidl_cb(status, cpu_usages); return Void(); } Return Thermal::getCoolingDevices(getCoolingDevices_cb _hidl_cb) { ThermalStatus status; status.code = ThermalStatusCode::SUCCESS; std::vector cooling_devices = {kCooling_1_0}; _hidl_cb(status, cooling_devices); return Void(); } // Methods from ::android::hardware::thermal::V2_0::IThermal follow. Return Thermal::getCurrentTemperatures(bool filterType, TemperatureType type, getCurrentTemperatures_cb _hidl_cb) { ThermalStatus status; status.code = ThermalStatusCode::SUCCESS; std::vector temperatures; if (filterType && type != kTemp_2_0.type) { status.code = ThermalStatusCode::FAILURE; status.debugMessage = "Failed to read data"; } else { temperatures = {kTemp_2_0}; } _hidl_cb(status, temperatures); return Void(); } Return Thermal::getTemperatureThresholds(bool filterType, TemperatureType type, getTemperatureThresholds_cb _hidl_cb) { ThermalStatus status; status.code = ThermalStatusCode::SUCCESS; std::vector temperature_thresholds; if (filterType && type != kTempThreshold.type) { status.code = ThermalStatusCode::FAILURE; status.debugMessage = "Failed to read data"; } else { temperature_thresholds = {kTempThreshold}; } _hidl_cb(status, temperature_thresholds); return Void(); } Return Thermal::getCurrentCoolingDevices(bool filterType, CoolingType type, getCurrentCoolingDevices_cb _hidl_cb) { ThermalStatus status; status.code = ThermalStatusCode::SUCCESS; std::vector cooling_devices; if (filterType && type != kCooling_2_0.type) { status.code = ThermalStatusCode::FAILURE; status.debugMessage = "Failed to read data"; } else { cooling_devices = {kCooling_2_0}; } _hidl_cb(status, cooling_devices); return Void(); } Return Thermal::registerThermalChangedCallback(const sp& callback, bool filterType, TemperatureType type, registerThermalChangedCallback_cb _hidl_cb) { ThermalStatus status; if (callback == nullptr) { status.code = ThermalStatusCode::FAILURE; status.debugMessage = "Invalid nullptr callback"; LOG(ERROR) << status.debugMessage; _hidl_cb(status); return Void(); } else { status.code = ThermalStatusCode::SUCCESS; } std::lock_guard _lock(thermal_callback_mutex_); if (std::any_of(callbacks_.begin(), callbacks_.end(), [&](const CallbackSetting& c) { return interfacesEqual(c.callback, callback); })) { status.code = ThermalStatusCode::FAILURE; status.debugMessage = "Same callback interface registered already"; LOG(ERROR) << status.debugMessage; } else { callbacks_.emplace_back(callback, filterType, type); LOG(INFO) << "A callback has been registered to ThermalHAL, isFilter: " << filterType << " Type: " << android::hardware::thermal::V2_0::toString(type); } _hidl_cb(status); return Void(); } Return Thermal::unregisterThermalChangedCallback( const sp& callback, unregisterThermalChangedCallback_cb _hidl_cb) { ThermalStatus status; if (callback == nullptr) { status.code = ThermalStatusCode::FAILURE; status.debugMessage = "Invalid nullptr callback"; LOG(ERROR) << status.debugMessage; _hidl_cb(status); return Void(); } else { status.code = ThermalStatusCode::SUCCESS; } bool removed = false; std::lock_guard _lock(thermal_callback_mutex_); callbacks_.erase( std::remove_if(callbacks_.begin(), callbacks_.end(), [&](const CallbackSetting& c) { if (interfacesEqual(c.callback, callback)) { LOG(INFO) << "A callback has been unregistered from ThermalHAL, isFilter: " << c.is_filter_type << " Type: " << android::hardware::thermal::V2_0::toString(c.type); removed = true; return true; } return false; }), callbacks_.end()); if (!removed) { status.code = ThermalStatusCode::FAILURE; status.debugMessage = "The callback was not registered before"; LOG(ERROR) << status.debugMessage; } _hidl_cb(status); return Void(); } } // namespace implementation } // namespace V2_0 } // namespace thermal } // namespace hardware } // namespace android