diff --git a/configs/framework_compatibility_matrix.xml b/configs/framework_compatibility_matrix.xml index 5087813..c3f418f 100644 --- a/configs/framework_compatibility_matrix.xml +++ b/configs/framework_compatibility_matrix.xml @@ -167,6 +167,10 @@ IAdaptiveBacklight default + + IDisplayColorCalibration + default + IDisplayModes default diff --git a/configs/manifest.xml b/configs/manifest.xml index 98260c5..b8eacc3 100644 --- a/configs/manifest.xml +++ b/configs/manifest.xml @@ -300,6 +300,10 @@ IAdaptiveBacklight default + + IDisplayColorCalibration + default + IDisplayModes default @@ -309,6 +313,7 @@ default @2.0::IAdaptiveBacklight/default + @2.0::IDisplayColorCalibration/default @2.0::IDisplayModes/default @2.0::ISunlightEnhancement/default diff --git a/livedisplay/Android.bp b/livedisplay/Android.bp index 93ec875..88bcafa 100644 --- a/livedisplay/Android.bp +++ b/livedisplay/Android.bp @@ -21,6 +21,7 @@ cc_binary { "AdaptiveBacklight.cpp", "DisplayModes.cpp", "SunlightEnhancement.cpp", + "DisplayColorCalibration.cpp", "service.cpp", ], shared_libs: [ diff --git a/livedisplay/DisplayColorCalibration.cpp b/livedisplay/DisplayColorCalibration.cpp new file mode 100644 index 0000000..9ce3d44 --- /dev/null +++ b/livedisplay/DisplayColorCalibration.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2019 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. + */ + +#include +#include + +#include + +#include "DisplayColorCalibration.h" + +using android::base::ReadFileToString; +using android::base::Split; +using android::base::Trim; +using android::base::WriteStringToFile; + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +static constexpr const char* kColorPath = "/sys/class/mdnie/mdnie/sensorRGB"; + +bool DisplayColorCalibration::isSupported() { + std::fstream rgb(kColorPath, rgb.in | rgb.out); + return rgb.good(); +} + +Return DisplayColorCalibration::getMaxValue() { + return 255; +} + +Return DisplayColorCalibration::getMinValue() { + return 1; +} + +Return DisplayColorCalibration::getCalibration(getCalibration_cb resultCb) { + std::vector rgb; + std::string tmp; + + if (ReadFileToString(kColorPath, &tmp)) { + std::vector colors = Split(Trim(tmp), " "); + for (const std::string& color : colors) { + rgb.push_back(std::stoi(color)); + } + } + + resultCb(rgb); + return Void(); +} + +Return DisplayColorCalibration::setCalibration(const hidl_vec& rgb) { + std::string contents; + for (const int32_t& color : rgb) { + contents += std::to_string(color) + " "; + } + return WriteStringToFile(Trim(contents), kColorPath, true); +} + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/livedisplay/DisplayColorCalibration.h b/livedisplay/DisplayColorCalibration.h new file mode 100644 index 0000000..94188c0 --- /dev/null +++ b/livedisplay/DisplayColorCalibration.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2019-2022 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. + */ + +#pragma once + +#include +#include +#include + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +class DisplayColorCalibration : public IDisplayColorCalibration { + public: + bool isSupported(); + + // Methods from ::vendor::lineage::livedisplay::V2_0::IDisplayColorCalibration follow. + Return getMaxValue() override; + Return getMinValue() override; + Return getCalibration(getCalibration_cb resultCb) override; + Return setCalibration(const hidl_vec& rgb) override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. +}; + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/livedisplay/service.cpp b/livedisplay/service.cpp index e13c7f6..c1ee7bc 100644 --- a/livedisplay/service.cpp +++ b/livedisplay/service.cpp @@ -27,6 +27,7 @@ #include "AdaptiveBacklight.h" #include "DisplayModes.h" #include "SunlightEnhancement.h" +#include "DisplayColorCalibration.h" using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; @@ -37,11 +38,13 @@ using android::OK; using vendor::lineage::livedisplay::V2_0::samsung::AdaptiveBacklight; using vendor::lineage::livedisplay::V2_0::samsung::DisplayModes; using vendor::lineage::livedisplay::V2_0::samsung::SunlightEnhancement; +using vendor::lineage::livedisplay::V2_0::samsung::DisplayColorCalibration; int main() { sp adaptiveBacklight; sp displayModes; sp sunlightEnhancement; + sp displayColorCalibration; status_t status; LOG(INFO) << "LiveDisplay HAL service is starting."; @@ -66,6 +69,13 @@ int main() { goto shutdown; } + displayColorCalibration = new DisplayColorCalibration(); + if (displayColorCalibration == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL DisplayColorCalibration " + "Iface, exiting."; + goto shutdown; + } + configureRpcThreadpool(1, true /*callerWillJoin*/); if (adaptiveBacklight->isSupported()) { @@ -96,6 +106,16 @@ int main() { } } + if (displayColorCalibration->isSupported()) { + status = displayColorCalibration->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL DisplayColorCalibration Iface (" + << status << ")"; + goto shutdown; + } + } + LOG(INFO) << "LiveDisplay HAL service is ready."; joinRpcThreadpool(); // Should not pass this line