diff options
| author | Tom Marshall <tdm.code@gmail.com> | 2020-11-13 14:30:23 -0800 |
|---|---|---|
| committer | Tom Marshall <tdm.code@gmail.com> | 2022-06-04 08:17:22 -0700 |
| commit | 42453691719fb9e3c168e924b8b757127f4ac26a (patch) | |
| tree | 4100c39037af23651557223bb737942bd9bb6173 | |
| parent | 3dc8171cb2ce720dce2fe67acc504f36ba99c8c0 (diff) | |
Revert "pro1: lights: Enable support for keyboard brightness control"
This reverts commit cb7cc707eb3d2ac6dfa8281dd6dd3c30a01c5922.
Backlight support has _not_ been added to Android frameworks in AICP.
| -rw-r--r-- | light/Light.cpp | 108 | ||||
| -rw-r--r-- | light/Light.h | 7 | ||||
| -rw-r--r-- | light/android.hardware.light@2.0-service.pro1.rc | 2 | ||||
| -rw-r--r-- | sepolicy/vendor/hal_light_default.te | 2 |
4 files changed, 106 insertions, 13 deletions
diff --git a/light/Light.cpp b/light/Light.cpp index f2ed9d1..b04a783 100644 --- a/light/Light.cpp +++ b/light/Light.cpp @@ -18,7 +18,11 @@ #include "Light.h" +#include <fcntl.h> +#include <sys/inotify.h> + #include <android-base/logging.h> +#include <linux/input.h> namespace { @@ -52,6 +56,40 @@ static std::string getScaledDutyPcts(int brightness) { return buf; } +static int openInputDeviceByName(const char* name) { + int fd; + unsigned int n; + char pathname[PATH_MAX]; + char devname[256]; + + fd = -1; + n = 0; + while (fd < 0) { + sprintf(pathname, "/dev/input/event%u", n++); + fd = TEMP_FAILURE_RETRY(open(pathname, O_RDONLY | O_CLOEXEC)); + if (fd < 0) { + // Fail: out of devices to try + break; + } + memset(devname, 0, sizeof(devname)); + if (ioctl(fd, EVIOCGNAME(sizeof(devname) - 1), &devname) > 0) { + if (!strcmp(devname, name)) { + // Success + break; + } + } + close(fd); + fd = -1; + } + + return fd; +} + +static bool readEvent(int fd, input_event& ev) { + ssize_t len = TEMP_FAILURE_RETRY(read(fd, &ev, sizeof(ev))); + return (len == sizeof(ev)); +} + } // anonymous namespace namespace android { @@ -60,6 +98,39 @@ namespace light { namespace V2_0 { namespace implementation { +static void* sliderMonitorThread(void* arg) { + Light* owner = (Light*)arg; + int fd; + +restart: + fd = openInputDeviceByName("gpio-keys"); + if (fd < 0) { + LOG(ERROR) << "Cannot open slider input device"; + sleep(1); + goto restart; + } + + LOG(INFO) << "sliderMonitorThread enter loop"; + while (1) { + struct input_event ev; + if (!readEvent(fd, ev)) { + LOG(ERROR) << "Failed to read slider event"; + close(fd); + sleep(1); + goto restart; + } + // Ignore unwanted event types and codes (eg. EV_SYN) + if (ev.type != EV_SW || ev.code != SW_LID) { + continue; + } + bool open = (ev.value == 0); + owner->onSliderChanged(open); + } + close(fd); + + return nullptr; +} + static const std::string kSysLedPath = "/sys/class/leds"; Led::Led(int index, const std::string& name) : @@ -126,17 +197,20 @@ Light::Light(std::pair<std::ofstream, uint32_t>&& lcd_backlight, mRedLed(std::move(red_led)), mGreenLed(std::move(green_led)), mBlueLed(std::move(blue_led)), - mRgbBlink(std::move(rgb_blink)) { + mRgbBlink(std::move(rgb_blink)), + mLcdBacklightOn(false), + mSliderOpen(false) { auto attnFn(std::bind(&Light::setAttentionLight, this, std::placeholders::_1)); - auto keyboardBacklightFn(std::bind(&Light::setKeyboardBacklight, this, std::placeholders::_1)); - auto lcdBacklightFn(std::bind(&Light::setLcdBacklight, this, std::placeholders::_1)); + auto backlightFn(std::bind(&Light::setLcdBacklight, this, std::placeholders::_1)); auto batteryFn(std::bind(&Light::setBatteryLight, this, std::placeholders::_1)); auto notifFn(std::bind(&Light::setNotificationLight, this, std::placeholders::_1)); mLights.emplace(std::make_pair(Type::ATTENTION, attnFn)); - mLights.emplace(std::make_pair(Type::BACKLIGHT, lcdBacklightFn)); + mLights.emplace(std::make_pair(Type::BACKLIGHT, backlightFn)); mLights.emplace(std::make_pair(Type::BATTERY, batteryFn)); - mLights.emplace(std::make_pair(Type::KEYBOARD, keyboardBacklightFn)); mLights.emplace(std::make_pair(Type::NOTIFICATIONS, notifFn)); + + pthread_t th; + (void)pthread_create(&th, nullptr, sliderMonitorThread, this); } // Methods from ::android::hardware::light::V2_0::ILight follow. @@ -164,6 +238,12 @@ Return<void> Light::getSupportedTypes(getSupportedTypes_cb _hidl_cb) { return Void(); } +void Light::onSliderChanged(bool open) { + std::lock_guard<std::mutex> lock(mLock); + mSliderOpen = open; + setKeyboardBacklightLocked(); +} + void Light::setAttentionLight(const LightState& state) { std::lock_guard<std::mutex> lock(mLock); mAttentionState = state; @@ -173,6 +253,8 @@ void Light::setAttentionLight(const LightState& state) { void Light::setLcdBacklight(const LightState& state) { std::lock_guard<std::mutex> lock(mLock); + mLcdBacklightOn = (state.color != 0); + uint32_t brightness = rgbToBrightness(state); // If max panel brightness is not the default (255), @@ -184,14 +266,18 @@ void Light::setLcdBacklight(const LightState& state) { } mLcdBacklight.first << brightness << std::endl; -} -void Light::setKeyboardBacklight(const LightState& state) { - std::lock_guard<std::mutex> lock(mLock); - - uint32_t brightness = isLit(state) ? MAX_BRIGHTNESS : 0; + setKeyboardBacklightLocked(); +} - mKeyboardBacklight.first << brightness << std::endl; +void Light::setKeyboardBacklightLocked() { + mKeyboardBacklight.second = (mSliderOpen && mLcdBacklightOn) + ? MAX_BRIGHTNESS + : 0; + LOG(INFO) << "setKeyboardBacklightLocked:" << + " mSliderOpen=" << (mSliderOpen ? "true" : "false") << + " mLcdBacklightOn=" << (mLcdBacklightOn ? "true" : "false"); + mKeyboardBacklight.first << mKeyboardBacklight.second << std::endl; } void Light::setBatteryLight(const LightState& state) { diff --git a/light/Light.h b/light/Light.h index a5884e2..72a6d76 100644 --- a/light/Light.h +++ b/light/Light.h @@ -69,11 +69,13 @@ struct Light : public ILight { Return<Status> setLight(Type type, const LightState& state) override; Return<void> getSupportedTypes(getSupportedTypes_cb _hidl_cb) override; + void onSliderChanged(bool open); + private: void setAttentionLight(const LightState& state); void setBatteryLight(const LightState& state); - void setKeyboardBacklight(const LightState& state); void setLcdBacklight(const LightState& state); + void setKeyboardBacklightLocked(); void setNotificationLight(const LightState& state); void setSpeakerBatteryLightLocked(); void setSpeakerLightLocked(const LightState& state); @@ -91,6 +93,9 @@ struct Light : public ILight { std::unordered_map<Type, std::function<void(const LightState&)>> mLights; std::mutex mLock; + + bool mLcdBacklightOn; + bool mSliderOpen; }; } // namespace implementation diff --git a/light/android.hardware.light@2.0-service.pro1.rc b/light/android.hardware.light@2.0-service.pro1.rc index a607a79..90d2914 100644 --- a/light/android.hardware.light@2.0-service.pro1.rc +++ b/light/android.hardware.light@2.0-service.pro1.rc @@ -57,6 +57,6 @@ service vendor.light-hal-2-0 /vendor/bin/hw/android.hardware.light@2.0-service.p interface android.hardware.light@2.0::ILight default class hal user system - group system + group system input # shutting off lights while powering-off shutdown critical diff --git a/sepolicy/vendor/hal_light_default.te b/sepolicy/vendor/hal_light_default.te new file mode 100644 index 0000000..72fe06d --- /dev/null +++ b/sepolicy/vendor/hal_light_default.te @@ -0,0 +1,2 @@ +allow hal_light_default input_device:dir search; +allow hal_light_default input_device:chr_file rw_file_perms; |
