diff options
Diffstat (limited to 'light/Light.cpp')
| -rw-r--r-- | light/Light.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/light/Light.cpp b/light/Light.cpp new file mode 100644 index 0000000..41d49e3 --- /dev/null +++ b/light/Light.cpp @@ -0,0 +1,98 @@ +/* + * Copyright 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 "Light" + +#include "Light.h" + +#include <android-base/logging.h> + +namespace { +using android::hardware::light::V2_0::LightState; + +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; +} + +static bool isLit(const LightState& state) { + return (state.color & 0x00ffffff); +} +} // anonymous namespace + +namespace android { +namespace hardware { +namespace light { +namespace V2_0 { +namespace implementation { + +Light::Light(std::ofstream&& backlight, std::ofstream&& led) + : mBacklight(std::move(backlight)), mLed(std::move(led)) { + auto backlightFn(std::bind(&Light::setBacklight, this, std::placeholders::_1)); + auto notifFn(std::bind(&Light::setNotificationLight, this, std::placeholders::_1)); + mLights.emplace(std::make_pair(Type::BACKLIGHT, backlightFn)); + mLights.emplace(std::make_pair(Type::NOTIFICATIONS, notifFn)); +} + +// Methods from ::android::hardware::light::V2_0::ILight follow. +Return<Status> Light::setLight(Type type, const LightState& state) { + auto it = mLights.find(type); + + if (it == mLights.end()) { + return Status::LIGHT_NOT_SUPPORTED; + } + + it->second(state); + + return Status::SUCCESS; +} + +Return<void> Light::getSupportedTypes(getSupportedTypes_cb _hidl_cb) { + std::vector<Type> types; + + for (auto const& light : mLights) { + types.push_back(light.first); + } + + _hidl_cb(types); + + return Void(); +} + +void Light::setBacklight(const LightState& state) { + std::lock_guard<std::mutex> lock(mLock); + uint32_t brightness = rgbToBrightness(state); + + mBacklight << brightness << std::endl; +} + +void Light::setNotificationLight(const LightState& state) { + std::lock_guard<std::mutex> lock(mLock); + uint32_t color = state.color & 0x00ffffff; + + if (isLit(state)) { + mLed << color << std::endl; + } else { + mLed << 0 << std::endl; + } +} + +} // namespace implementation +} // namespace V2_0 +} // namespace light +} // namespace hardware +} // namespace android |
