Support brightness control on Linux fbdev

This commit is contained in:
Kuba Szczodrzyński 2024-02-08 22:44:39 +01:00
parent f36dd66a05
commit a7d900ed7b
No known key found for this signature in database
GPG Key ID: 43037AC62A600562
3 changed files with 53 additions and 1 deletions

View File

@ -25,6 +25,7 @@
#include "display/fbdev.h"
#endif
#include <fstream>
#include <unistd.h>
// extern monitor_t monitor;
@ -153,7 +154,31 @@ void PosixDevice::update_backlight()
#if USE_MONITOR
monitor_backlight(level);
#elif USE_FBDEV
// set display backlight, if possible
// set display backlight, if possible
if(backlight_device != "") {
if(backlight_max == 0) {
std::ifstream f;
f.open("/sys/class/backlight/" + backlight_device + "/max_brightness");
if(!f.fail()) {
f >> backlight_max;
f.close();
} else {
perror("Max brightness read failed");
}
}
int brightness = map(level, 0, 255, 0, backlight_max);
LOG_VERBOSE(0, "Setting brightness to %d/255 (%d)", level, brightness);
std::ofstream f;
f.open("/sys/class/backlight/" + backlight_device + "/brightness");
if(!f.fail()) {
f << brightness;
f.close();
} else {
perror("Brightness write failed");
}
}
#endif
}

View File

@ -56,6 +56,10 @@ class PosixDevice : public BaseDevice {
bool is_system_pin(uint8_t pin) override;
public:
std::string backlight_device;
int backlight_max = 0;
private:
std::string _hostname;
std::string _core_version;

View File

@ -119,6 +119,10 @@ void usage(const char* progName, const char* version)
<< " (default: 'AppData\\hasp\\hasp')" << std::endl
#elif defined(POSIX)
<< " (default: '~/.local/share/hasp/hasp')" << std::endl
#endif
#if USE_FBDEV && defined(POSIX)
<< " -b | --backlight Backlight device name (in /sys/class/backlight/)" << std::endl
<< " -B | --bl-max Backlight brightness limit (default: max_brightness)" << std::endl
#endif
<< std::endl;
fflush(stdout);
@ -138,6 +142,25 @@ int main(int argc, char* argv[])
for(int arg = 1; arg < argc; arg++) {
if(strncmp(argv[arg], "--help", 6) == 0 || strncmp(argv[arg], "-h", 2) == 0) {
showhelp = true;
#if USE_FBDEV && defined(POSIX)
} else if(strncmp(argv[arg], "--backlight", 11) == 0 || strncmp(argv[arg], "-b", 2) == 0) {
if(arg + 1 < argc) {
haspDevice.backlight_device = argv[arg + 1];
arg++;
} else {
std::cout << "Missing device name" << std::endl;
showhelp = true;
}
} else if(strncmp(argv[arg], "--bl-max", 9) == 0 || strncmp(argv[arg], "-B", 2) == 0) {
if(arg + 1 < argc) {
int bl_max = atoi(argv[arg + 1]);
if(bl_max > 0) haspDevice.backlight_max = bl_max;
arg++;
} else {
std::cout << "Missing backlight level" << std::endl;
showhelp = true;
}
#endif
} else if(strncmp(argv[arg], "--width", 7) == 0 || strncmp(argv[arg], "-W", 2) == 0) {
if(arg + 1 < argc) {
int w = atoi(argv[arg + 1]);