/* * Copyright (C) 2018 The LineageOS 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 "LightsService" #include "Light.h" #include #include #include namespace android { namespace hardware { namespace light { namespace V2_0 { namespace implementation { /* * Write value to path and close file. */ template static void set(const std::string& path, const T& value) { std::ofstream file(path); file << value; } /* * Read from path and close file. * Return def in case of any failure. */ template static T get(const std::string& path, const T& def) { std::ifstream file(path); T result; file >> result; return file.fail() ? def : result; } static constexpr int kDefaultMaxBrightness = 255; static uint32_t rgbToBrightness(const LightState& state) { uint32_t color = state.color & 0x00ffffff; return ((77 * ((color >> 16) & 0xff)) + (150 * ((color >> 8) & 0xff)) + (29 * (color & 0xff))) >> 8; } Light::Light() { mLights.emplace(Type::BACKLIGHT, std::bind(&Light::handleBacklight, this, std::placeholders::_1)); } void Light::handleBacklight(const LightState& state) { int maxBrightness = get("/sys/class/backlight/panel0-backlight/max_brightness", -1); if (maxBrightness < 0) { maxBrightness = kDefaultMaxBrightness; } uint32_t sentBrightness = rgbToBrightness(state); uint32_t brightness = sentBrightness * maxBrightness / kDefaultMaxBrightness; LOG(DEBUG) << "Writing backlight brightness " << brightness << " (orig " << sentBrightness << ")"; set("/sys/class/backlight/panel0-backlight/brightness", brightness); } Return Light::setLight(Type type, const LightState& state) { auto it = mLights.find(type); if (it == mLights.end()) { return Status::LIGHT_NOT_SUPPORTED; } // Lock global mutex until light state is updated. std::lock_guard lock(mLock); it->second(state); return Status::SUCCESS; } Return Light::getSupportedTypes(getSupportedTypes_cb _hidl_cb) { std::vector types; for (auto const& light : mLights) { types.push_back(light.first); } _hidl_cb(types); return Void(); } } // namespace implementation } // namespace V2_0 } // namespace light } // namespace hardware } // namespace android