diff --git a/lineagehw/hidl/livedisplay/AdaptiveBacklight.cpp b/lineagehw/hidl/livedisplay/AdaptiveBacklight.cpp new file mode 100644 index 0000000..bccd387 --- /dev/null +++ b/lineagehw/hidl/livedisplay/AdaptiveBacklight.cpp @@ -0,0 +1,52 @@ +/* + * 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 "AdaptiveBacklight.h" + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +bool AdaptiveBacklight::isSupported() { + std::ofstream file("/sys/class/lcd/panel/power_reduce"); + return file.good(); +} + +// Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow. +Return AdaptiveBacklight::isEnabled() { + std::ifstream file("/sys/class/lcd/panel/power_reduce"); + int value; + + file >> value; + + return !file.fail() && value == 1; +} + +Return AdaptiveBacklight::setEnabled(bool enabled) { + std::ofstream file("/sys/class/lcd/panel/power_reduce"); + file << (enabled ? "1" : "0"); + return true; +} + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/AdaptiveBacklight.h b/lineagehw/hidl/livedisplay/AdaptiveBacklight.h new file mode 100644 index 0000000..35502ba --- /dev/null +++ b/lineagehw/hidl/livedisplay/AdaptiveBacklight.h @@ -0,0 +1,56 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H + +#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 AdaptiveBacklight : public IAdaptiveBacklight { + public: + bool isSupported(); + + // Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow. + Return isEnabled() override; + Return setEnabled(bool enabled) override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. + +}; + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_ADAPTIVEBACKLIGHT_H diff --git a/lineagehw/hidl/livedisplay/Android.bp b/lineagehw/hidl/livedisplay/Android.bp new file mode 100644 index 0000000..8de096d --- /dev/null +++ b/lineagehw/hidl/livedisplay/Android.bp @@ -0,0 +1,42 @@ +// 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. + +cc_binary { + name: "vendor.lineage.livedisplay@2.0-service.samsung", + init_rc: ["vendor.lineage.livedisplay@2.0-service.samsung.rc"], + defaults: ["hidl_defaults"], + relative_install_path: "hw", + // FIXME: this should be 'vendor: true' for modules that will eventually be + // on AOSP. + proprietary: true, + srcs: [ + "AdaptiveBacklight.cpp", + "DisplayColorCalibration.cpp", + "DisplayColorCalibrationExynos.cpp", + "DisplayModes.cpp", + "ReadingEnhancement.cpp", + "ReadingEnhancementExynos.cpp", + "SunlightEnhancement.cpp", + "SunlightEnhancementExynos.cpp", + "service.cpp", + ], + shared_libs: [ + "libbase", + "libbinder", + "libhidlbase", + "libhidltransport", + "libutils", + "vendor.lineage.livedisplay@2.0", + ], +} diff --git a/lineagehw/hidl/livedisplay/DisplayColorCalibration.cpp b/lineagehw/hidl/livedisplay/DisplayColorCalibration.cpp new file mode 100644 index 0000000..9ecace6 --- /dev/null +++ b/lineagehw/hidl/livedisplay/DisplayColorCalibration.cpp @@ -0,0 +1,70 @@ +/* + * 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 "DisplayColorCalibration.h" + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +static constexpr const char *kColorPath = "/sys/class/graphics/fb0/rgb"; + +bool DisplayColorCalibration::isSupported() { + std::ofstream file(kColorPath); + return file.good(); +} + +Return DisplayColorCalibration::getMaxValue() { + return 32768; +} + +Return DisplayColorCalibration::getMinValue() { + return 255; +} + +Return DisplayColorCalibration::getCalibration(getCalibration_cb resultCb) { + std::ifstream file(kColorPath); + int r, g, b; + + file >> r >> g >> b; + if (file.fail()) { + resultCb(std::vector()); + } else { + resultCb(std::vector({ r, g, b })); + } + + return Void(); +} + +Return DisplayColorCalibration::setCalibration(const hidl_vec& rgb) { + std::ofstream file(kColorPath); + if (rgb.size() != 3) { + return false; + } + + file << rgb[0] << " " << rgb[1] << " " << rgb[2]; + return !file.fail(); +} + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/DisplayColorCalibration.h b/lineagehw/hidl/livedisplay/DisplayColorCalibration.h new file mode 100644 index 0000000..131444d --- /dev/null +++ b/lineagehw/hidl/livedisplay/DisplayColorCalibration.h @@ -0,0 +1,58 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H + +#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 + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATION_H diff --git a/lineagehw/hidl/livedisplay/DisplayColorCalibrationExynos.cpp b/lineagehw/hidl/livedisplay/DisplayColorCalibrationExynos.cpp new file mode 100644 index 0000000..1958ecc --- /dev/null +++ b/lineagehw/hidl/livedisplay/DisplayColorCalibrationExynos.cpp @@ -0,0 +1,70 @@ +/* + * 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 "DisplayColorCalibrationExynos.h" + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +static constexpr const char *kColorPath = "/sys/class/mdnie/mdnie/sensorRGB"; + +bool DisplayColorCalibrationExynos::isSupported() { + std::ofstream file(kColorPath); + return file.good(); +} + +Return DisplayColorCalibrationExynos::getMaxValue() { + return 255; +} + +Return DisplayColorCalibrationExynos::getMinValue() { + return 1; +} + +Return DisplayColorCalibrationExynos::getCalibration(getCalibration_cb resultCb) { + std::ifstream file(kColorPath); + int r, g, b; + + file >> r >> g >> b; + if (file.fail()) { + resultCb(std::vector()); + } else { + resultCb(std::vector({ r, g, b })); + } + + return Void(); +} + +Return DisplayColorCalibrationExynos::setCalibration(const hidl_vec& rgb) { + std::ofstream file(kColorPath); + if (rgb.size() != 3) { + return false; + } + + file << rgb[0] << " " << rgb[1] << " " << rgb[2]; + return !file.fail(); +} + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/DisplayColorCalibrationExynos.h b/lineagehw/hidl/livedisplay/DisplayColorCalibrationExynos.h new file mode 100644 index 0000000..c00e577 --- /dev/null +++ b/lineagehw/hidl/livedisplay/DisplayColorCalibrationExynos.h @@ -0,0 +1,58 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATIONEXYNOS_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATIONEXYNOS_H + +#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 DisplayColorCalibrationExynos : 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 + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYCOLORCALIBRATIONEXYNOS_H diff --git a/lineagehw/hidl/livedisplay/DisplayModes.cpp b/lineagehw/hidl/livedisplay/DisplayModes.cpp new file mode 100644 index 0000000..0202be6 --- /dev/null +++ b/lineagehw/hidl/livedisplay/DisplayModes.cpp @@ -0,0 +1,135 @@ +/* + * 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. + */ + +#define LOG_TAG "DisplayModesService" + +#include "DisplayModes.h" +#include +#include + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + + +static constexpr const char* kModePath = "/sys/class/mdnie/mdnie/mode"; +static constexpr const char* kModeMaxPath = "/sys/class/mdnie/mdnie/mode_max"; +static constexpr const char* kDefaultPath = "/data/misc/.displaymodedefault"; + +const std::map DisplayModes::kModeMap = { + {0, "Dynamic"}, + {1, "Standard"}, + {2, "Natural"}, + {3, "Cinema"}, + {4, "Adaptive"}, + {5, "Reading"}, +}; + +DisplayModes::DisplayModes() : mDefaultModeId(0) { + std::ifstream defaultFile(kDefaultPath); + int value; + + defaultFile >> value; + LOG(DEBUG) << "Default file read result " << value << " fail " << defaultFile.fail(); + if (defaultFile.fail()) { + return; + } + + for (const auto& entry : kModeMap) { + if (value == entry.first) { + mDefaultModeId = entry.first; + break; + } + } +} + +bool DisplayModes::isSupported() { + std::ofstream modeFile(kModePath); + return modeFile.good(); +} + +// Methods from ::vendor::lineage::livedisplay::V2_0::IDisplayModes follow. +Return DisplayModes::getDisplayModes(getDisplayModes_cb resultCb) { + std::ifstream maxModeFile(kModeMaxPath); + int value; + std::vector modes; + if (!maxModeFile.fail()) { + maxModeFile >> value; + } else { + value = kModeMap.size(); + } + for (const auto& entry : kModeMap) { + if (entry.first < value) + modes.push_back({entry.first, entry.second}); + } + resultCb(modes); + return Void(); +} + +Return DisplayModes::getCurrentDisplayMode(getCurrentDisplayMode_cb resultCb) { + int32_t currentModeId = mDefaultModeId; + std::ifstream modeFile(kModePath); + int value; + modeFile >> value; + if (!modeFile.fail()) { + for (const auto& entry : kModeMap) { + if (value == entry.first) { + currentModeId = entry.first; + break; + } + } + } + resultCb({currentModeId, kModeMap.at(currentModeId)}); + return Void(); +} + +Return DisplayModes::getDefaultDisplayMode(getDefaultDisplayMode_cb resultCb) { + resultCb({mDefaultModeId, kModeMap.at(mDefaultModeId)}); + return Void(); +} + +Return DisplayModes::setDisplayMode(int32_t modeID, bool makeDefault) { + const auto iter = kModeMap.find(modeID); + if (iter == kModeMap.end()) { + return false; + } + std::ofstream modeFile(kModePath); + modeFile << iter->first; + if (modeFile.fail()) { + return false; + } + + if (makeDefault) { + std::ofstream defaultFile(kDefaultPath); + defaultFile << iter->first; + if (defaultFile.fail()) { + return false; + } + mDefaultModeId = iter->first; + } + return true; +} + + +// Methods from ::android::hidl::base::V1_0::IBase follow. + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/DisplayModes.h b/lineagehw/hidl/livedisplay/DisplayModes.h new file mode 100644 index 0000000..ef539fc --- /dev/null +++ b/lineagehw/hidl/livedisplay/DisplayModes.h @@ -0,0 +1,61 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYMODES_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYMODES_H + +#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 DisplayModes : public IDisplayModes { + public: + DisplayModes(); + bool isSupported(); + + // Methods from ::vendor::lineage::livedisplay::V2_0::IDisplayModes follow. + Return getDisplayModes(getDisplayModes_cb resultCb) override; + Return getCurrentDisplayMode(getCurrentDisplayMode_cb resultCb) override; + Return getDefaultDisplayMode(getDefaultDisplayMode_cb resultCb) override; + Return setDisplayMode(int32_t modeID, bool makeDefault) override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. + private: + static const std::map kModeMap; + int32_t mDefaultModeId; +}; + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_DISPLAYMODES_H diff --git a/lineagehw/hidl/livedisplay/ReadingEnhancement.cpp b/lineagehw/hidl/livedisplay/ReadingEnhancement.cpp new file mode 100644 index 0000000..a811075 --- /dev/null +++ b/lineagehw/hidl/livedisplay/ReadingEnhancement.cpp @@ -0,0 +1,61 @@ +/* + * 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 "ReadingEnhancement.h" + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +// Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow. +bool ReadingEnhancement::isSupported() { + std::ofstream file("/sys/devices/virtual/mdnie/mdnie/accessibility"); + return file.good(); +} + +// Methods from ::vendor::lineage::livedisplay::V2_0::IReadingEnhancement follow. +Return ReadingEnhancement::isEnabled() { + std::ifstream file("/sys/devices/virtual/mdnie/mdnie/accessibility"); + std::string line; + + if (file.is_open()) { + file >> line; + } + + return !line.compare("Current accessibility : DSI0 : GRAYSCALE "); +} + +Return ReadingEnhancement::setEnabled(bool enabled) { + std::ofstream file("/sys/devices/virtual/mdnie/mdnie/accessibility"); + if (file.is_open()) { + file << (enabled ? "4" : "0"); + } + + return true; +} + + +// Methods from ::android::hidl::base::V1_0::IBase follow. + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/ReadingEnhancement.h b/lineagehw/hidl/livedisplay/ReadingEnhancement.h new file mode 100644 index 0000000..6fa7084 --- /dev/null +++ b/lineagehw/hidl/livedisplay/ReadingEnhancement.h @@ -0,0 +1,56 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H + +#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 ReadingEnhancement : public IReadingEnhancement { + public: + bool isSupported(); + + // Methods from ::vendor::lineage::livedisplay::V2_0::IReadingEnhancement follow. + Return isEnabled() override; + Return setEnabled(bool) override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. + +}; + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENT_H diff --git a/lineagehw/hidl/livedisplay/ReadingEnhancementExynos.cpp b/lineagehw/hidl/livedisplay/ReadingEnhancementExynos.cpp new file mode 100644 index 0000000..a51672e --- /dev/null +++ b/lineagehw/hidl/livedisplay/ReadingEnhancementExynos.cpp @@ -0,0 +1,61 @@ +/* + * 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 "ReadingEnhancementExynos.h" + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +// Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow. +bool ReadingEnhancementExynos::isSupported() { + std::ofstream file("/sys/class/mdnie/mdnie/accessibility"); + return file.good(); +} + +// Methods from ::vendor::lineage::livedisplay::V2_0::IReadingEnhancement follow. +Return ReadingEnhancementExynos::isEnabled() { + std::ifstream file("/sys/class/mdnie/mdnie/accessibility"); + int status; + + if (file.is_open()) { + file >> status; + } + + return file.good() && status == 4; +} + +Return ReadingEnhancementExynos::setEnabled(bool enabled) { + std::ofstream file("/sys/class/mdnie/mdnie/accessibility"); + if (file.is_open()) { + file << (enabled ? "4" : "0"); + } + + return true; +} + + +// Methods from ::android::hidl::base::V1_0::IBase follow. + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/ReadingEnhancementExynos.h b/lineagehw/hidl/livedisplay/ReadingEnhancementExynos.h new file mode 100644 index 0000000..8791ecd --- /dev/null +++ b/lineagehw/hidl/livedisplay/ReadingEnhancementExynos.h @@ -0,0 +1,56 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENTEXYNOS_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENTEXYNOS_H + +#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 ReadingEnhancementExynos : public IReadingEnhancement { + public: + bool isSupported(); + + // Methods from ::vendor::lineage::livedisplay::V2_0::IReadingEnhancement follow. + Return isEnabled() override; + Return setEnabled(bool) override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. + +}; + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_READINGENHANCEMENTEXYNOS_H diff --git a/lineagehw/hidl/livedisplay/SunlightEnhancement.cpp b/lineagehw/hidl/livedisplay/SunlightEnhancement.cpp new file mode 100644 index 0000000..851b8e3 --- /dev/null +++ b/lineagehw/hidl/livedisplay/SunlightEnhancement.cpp @@ -0,0 +1,69 @@ +/* + * 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 "SunlightEnhancement.h" + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +// Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow. +bool SunlightEnhancement::isSupported() { + std::ofstream fileSRE("/sys/class/mdnie/mdnie/outdoor"); + std::ofstream fileHBM("/sys/class/lcd/panel/panel/auto_brightness"); + return fileSRE.good() || fileHBM.good(); +} + +// Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow. +Return SunlightEnhancement::isEnabled() { + std::ifstream fileSRE("/sys/class/mdnie/mdnie/outdoor"); + std::ifstream fileHBM("/sys/class/lcd/panel/panel/auto_brightness"); + int statusSRE = -1; + int statusHBM = -1; + + if (fileSRE.is_open()) { + fileSRE >> statusSRE; + } + if (fileHBM.is_open()) { + fileHBM >> statusHBM; + } + + return (fileSRE.good() || fileHBM.good()) && ((statusSRE == 1 && statusHBM == 6) || statusSRE == 1); +} + +Return SunlightEnhancement::setEnabled(bool enabled) { + std::ofstream fileSRE("/sys/class/mdnie/mdnie/outdoor"); + std::ofstream fileHBM("/sys/class/lcd/panel/panel/auto_brightness"); + + if (fileSRE.is_open()) { + fileSRE << (enabled ? "1" : "0"); + } + if (fileHBM.is_open()) { + fileHBM << (enabled ? "6" : "0"); + } + + return true; +} + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/SunlightEnhancement.h b/lineagehw/hidl/livedisplay/SunlightEnhancement.h new file mode 100644 index 0000000..eb70f8e --- /dev/null +++ b/lineagehw/hidl/livedisplay/SunlightEnhancement.h @@ -0,0 +1,56 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H + +#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 SunlightEnhancement : public ISunlightEnhancement { + public: + bool isSupported(); + + // Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow. + Return isEnabled() override; + Return setEnabled(bool enabled) override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. + +}; + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENT_H diff --git a/lineagehw/hidl/livedisplay/SunlightEnhancementExynos.cpp b/lineagehw/hidl/livedisplay/SunlightEnhancementExynos.cpp new file mode 100644 index 0000000..8ff2ec4 --- /dev/null +++ b/lineagehw/hidl/livedisplay/SunlightEnhancementExynos.cpp @@ -0,0 +1,59 @@ +/* + * 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 "SunlightEnhancementExynos.h" + +namespace vendor { +namespace lineage { +namespace livedisplay { +namespace V2_0 { +namespace samsung { + +// Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow. +bool SunlightEnhancementExynos::isSupported() { + std::ofstream file("/sys/class/mdnie/mdnie/lux"); + return file.good(); +} + +// Methods from ::vendor::lineage::livedisplay::V2_0::IAdaptiveBacklight follow. +Return SunlightEnhancementExynos::isEnabled() { + std::ifstream file("/sys/class/mdnie/mdnie/lux"); + int status = -1; + + if (file.is_open()) { + file >> status; + } + + return file.good() && status > 0; +} + +Return SunlightEnhancementExynos::setEnabled(bool enabled) { + std::ofstream file("/sys/class/mdnie/mdnie/lux"); + if (file.is_open()) { + /* see drivers/video/fbdev/exynos/decon_7880/panels/mdnie_lite_table*, get_hbm_index */ + file << (enabled ? "40000" : "0"); + } + + return true; +} + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor diff --git a/lineagehw/hidl/livedisplay/SunlightEnhancementExynos.h b/lineagehw/hidl/livedisplay/SunlightEnhancementExynos.h new file mode 100644 index 0000000..5bf9798 --- /dev/null +++ b/lineagehw/hidl/livedisplay/SunlightEnhancementExynos.h @@ -0,0 +1,56 @@ +/* + * 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. + */ + +#ifndef VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENTEXYNOS_H +#define VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENTEXYNOS_H + +#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 SunlightEnhancementExynos : public ISunlightEnhancement { + public: + bool isSupported(); + + // Methods from ::vendor::lineage::livedisplay::V2_0::ISunlightEnhancement follow. + Return isEnabled() override; + Return setEnabled(bool enabled) override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. + +}; + +} // namespace samsung +} // namespace V2_0 +} // namespace livedisplay +} // namespace lineage +} // namespace vendor + +#endif // VENDOR_LINEAGE_LIVEDISPLAY_V2_0_SUNLIGHTENHANCEMENTEXYNOS_H diff --git a/lineagehw/hidl/livedisplay/service.cpp b/lineagehw/hidl/livedisplay/service.cpp new file mode 100644 index 0000000..5ba2646 --- /dev/null +++ b/lineagehw/hidl/livedisplay/service.cpp @@ -0,0 +1,198 @@ +/* + * 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. + */ + +#define LOG_TAG "vendor.lineage.livedisplay@2.0-service.samsung" + +#include +#include +#include + +#include "AdaptiveBacklight.h" +#include "DisplayColorCalibration.h" +#include "DisplayColorCalibrationExynos.h" +#include "DisplayModes.h" +#include "ReadingEnhancement.h" +#include "ReadingEnhancementExynos.h" +#include "SunlightEnhancement.h" +#include "SunlightEnhancementExynos.h" + +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; +using android::sp; +using android::status_t; +using android::OK; + +using vendor::lineage::livedisplay::V2_0::samsung::AdaptiveBacklight; +using vendor::lineage::livedisplay::V2_0::samsung::DisplayColorCalibration; +using vendor::lineage::livedisplay::V2_0::samsung::DisplayColorCalibrationExynos; +using vendor::lineage::livedisplay::V2_0::samsung::DisplayModes; +using vendor::lineage::livedisplay::V2_0::samsung::ReadingEnhancement; +using vendor::lineage::livedisplay::V2_0::samsung::ReadingEnhancementExynos; +using vendor::lineage::livedisplay::V2_0::samsung::SunlightEnhancement; +using vendor::lineage::livedisplay::V2_0::samsung::SunlightEnhancementExynos; + +int main() { + sp adaptiveBacklight; + sp displayColorCalibration; + sp displayColorCalibrationExynos; + sp displayModes; + sp readingEnhancement; + sp readingEnhancementExynos; + sp sunlightEnhancement; + sp sunlightEnhancementExynos; + status_t status; + + LOG(INFO) << "LiveDisplay HAL service is starting."; + + adaptiveBacklight = new AdaptiveBacklight(); + if (adaptiveBacklight == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL AdaptiveBacklight Iface, exiting."; + goto shutdown; + } + + displayColorCalibration = new DisplayColorCalibration(); + if (displayColorCalibration == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL DisplayColorCalibration Iface, exiting."; + goto shutdown; + } + + displayColorCalibrationExynos = new DisplayColorCalibrationExynos(); + if (displayColorCalibrationExynos == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL DisplayColorCalibration Iface, exiting."; + goto shutdown; + } + + displayModes = new DisplayModes(); + if (displayModes == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL DisplayModes Iface, exiting."; + goto shutdown; + } + + readingEnhancement = new ReadingEnhancement(); + if (readingEnhancement == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL ReadingEnhancement Iface, exiting."; + goto shutdown; + } + + readingEnhancementExynos = new ReadingEnhancementExynos(); + if (readingEnhancementExynos == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL ReadingEnhancement Iface, exiting."; + goto shutdown; + } + + sunlightEnhancement = new SunlightEnhancement(); + if (sunlightEnhancement == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL SunlightEnhancement Iface, exiting."; + goto shutdown; + } + + sunlightEnhancementExynos = new SunlightEnhancementExynos(); + if (sunlightEnhancementExynos == nullptr) { + LOG(ERROR) << "Can not create an instance of LiveDisplay HAL SunlightEnhancement Iface, exiting."; + goto shutdown; + } + + configureRpcThreadpool(1, true /*callerWillJoin*/); + + if (adaptiveBacklight->isSupported()) { + status = adaptiveBacklight->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL AdaptiveBacklight Iface (" + << status << ")"; + goto shutdown; + } + } + + if (displayColorCalibration->isSupported()) { + status = displayColorCalibration->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL DisplayColorCalibration Iface (" + << status << ")"; + goto shutdown; + } + } + + if (displayColorCalibrationExynos->isSupported()) { + status = displayColorCalibrationExynos->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL DisplayColorCalibration Iface (" + << status << ")"; + goto shutdown; + } + } + + if (displayModes->isSupported()) { + status = displayModes->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL DisplayModes Iface (" + << status << ")"; + goto shutdown; + } + } + + if (readingEnhancement->isSupported()) { + status = readingEnhancement->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL ReadingEnhancement Iface (" + << status << ")"; + goto shutdown; + } + } + + if (readingEnhancementExynos->isSupported()) { + status = readingEnhancementExynos->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL ReadingEnhancement Iface (" + << status << ")"; + goto shutdown; + } + } + + if (sunlightEnhancement->isSupported()) { + status = sunlightEnhancement->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL SunlightEnhancement Iface (" + << status << ")"; + goto shutdown; + } + } + + if (sunlightEnhancementExynos->isSupported()) { + status = sunlightEnhancementExynos->registerAsService(); + if (status != OK) { + LOG(ERROR) + << "Could not register service for LiveDisplay HAL SunlightEnhancement Iface (" + << status << ")"; + goto shutdown; + } + } + + LOG(INFO) << "LiveDisplay HAL service is ready."; + joinRpcThreadpool(); + // Should not pass this line + +shutdown: + // In normal operation, we don't expect the thread pool to shutdown + LOG(ERROR) << "LiveDisplay HAL service is shutting down."; + return 1; +} diff --git a/lineagehw/hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.samsung.rc b/lineagehw/hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.samsung.rc new file mode 100644 index 0000000..a7e41d7 --- /dev/null +++ b/lineagehw/hidl/livedisplay/vendor.lineage.livedisplay@2.0-service.samsung.rc @@ -0,0 +1,4 @@ +service vendor.livedisplay-hal-2-0-samsung /vendor/bin/hw/vendor.lineage.livedisplay@2.0-service.samsung + class hal + user system + group system \ No newline at end of file