shift-shell/quicksettings/flashlight/flashlightutil.cpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

163 lines
4 KiB
C++
Raw Normal View History

/*
2022-03-20 18:35:57 +00:00
* SPDX-FileCopyrightText: 2020 Han Young <hanyoung@protonmail.com>
* SPDX-FileCopyrightText: 2022 by Devin Lin <devin@kde.org>
* SPDX-FileCopyrightText: 2024-2025 Florian RICHER <florian.richer@protonmail.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "flashlightutil.h"
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
#include <cstring>
#include <fcntl.h>
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
#include <libudev.h>
#include <unistd.h>
#include <QDebug>
#include <QFileInfo>
#include <KAuth/Action>
#include <KAuth/ExecuteJob>
using namespace Qt::StringLiterals;
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
#define TORCH_SUBSYSTEM "leds"
FlashlightUtil::FlashlightUtil(QObject *parent)
: QObject{parent}
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
, m_device{nullptr}
, m_isAvailable{false}
{
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
findTorchDevice();
}
FlashlightUtil::~FlashlightUtil()
{
if (m_device != nullptr) {
udev_device_unref(m_device);
}
}
void FlashlightUtil::toggleTorch()
{
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
if (!isAvailable()) {
qWarning() << "Flashlight not available";
return;
}
const QString sysPath = udev_device_get_syspath(m_device);
const QString brightness = m_torchEnabled ? "0" : m_maxBrightness;
const QVariantMap args = {
{u"sysPath"_s, sysPath},
{u"brightness"_s, brightness},
};
KAuth::Action writeAction(u"org.kde.plasma.mobileshell.flashlighthelper.setbrightness"_s);
writeAction.setHelperId(u"org.kde.plasma.mobileshell.flashlighthelper"_s);
writeAction.setArguments(args);
KAuth::ExecuteJob *job = writeAction.execute();
if (!job->exec()) {
qDebug() << "Flashlight can't be toggled: kauth returned an error code:" << job->error() << " message: " << job->errorString();
return;
}
m_torchEnabled = !m_torchEnabled;
Q_EMIT torchChanged(m_torchEnabled);
}
bool FlashlightUtil::torchEnabled() const
{
return m_torchEnabled;
}
bool FlashlightUtil::isAvailable() const
{
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
return m_isAvailable;
}
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
void FlashlightUtil::findTorchDevice()
{
if (m_device != nullptr) {
udev_device_unref(m_device);
}
m_device = nullptr;
m_isAvailable = false;
struct udev *udev = udev_new();
struct udev_enumerate *enumerate = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM);
udev_enumerate_add_match_sysname(enumerate, "*:torch");
udev_enumerate_add_match_sysname(enumerate, "*:flash");
udev_enumerate_scan_devices(enumerate);
struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
2024-01-13 17:24:47 +00:00
struct udev_list_entry *entry = nullptr;
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
2024-01-13 17:24:47 +00:00
struct udev_device *device = nullptr;
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
2024-01-13 17:24:47 +00:00
udev_list_entry_foreach(entry, devices)
{
const char *path = udev_list_entry_get_name(entry);
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
2024-01-13 17:24:47 +00:00
if (path == nullptr) {
continue;
}
if (device != nullptr) {
udev_device_unref(device); // Use to free memory from previous loop iteration
}
device = udev_device_new_from_syspath(udev, path);
if (device == nullptr) {
continue;
}
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
2024-01-13 17:24:47 +00:00
qInfo() << "Found flashlight device : " << path;
const char *color = udev_device_get_sysattr_value(device, "color");
if (color == nullptr) {
continue;
}
qInfo() << "Flash color : " << color;
if (std::strcmp(color, "white") == 0) {
break;
}
}
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
if (device == nullptr) {
2024-01-13 17:24:47 +00:00
qWarning() << "No flashlight device found";
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
return;
}
const char *maxBrightness = udev_device_get_sysattr_value(device, "max_brightness");
if (maxBrightness == nullptr) {
qWarning() << "Failed to read max_brightness from udev device";
return;
}
2024-01-13 17:24:47 +00:00
qInfo() << "Flash maxBrightness : " << maxBrightness;
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
const char *brightness = udev_device_get_sysattr_value(device, "brightness");
if (brightness == nullptr) {
qWarning() << "Failed to read brightness from udev device";
return;
}
2024-01-13 17:24:47 +00:00
qInfo() << "Flash brightness : " << brightness;
Flashlight : Use udev instead of hardcoded pinephone device file # Goal of this patch Use udev to change or detect flash device instead of hardcoded pinephone device file. Inspired by phosh flash manager because it works in many devices. https://gitlab.gnome.org/World/Phosh/phosh/-/blob/main/src/torch-manager.c?ref_type=heads#L168-198 # Remaining work - [x] Minimal project for testing - [x] Try to build for pmOS to test in my device (OP6) - [x] Need udev rules to work (Require write permission in brightness) # Stabilization - [x] read permission removed in max_brightness to check if no crash > "Failed to read max_brightness from udev device" in log - [x] read permission removed in brightness to check if no crash > "Failed to read brightness from udev device" in log - [x] "Break" match in my side to check if no crash occured when no device found > "No flashlight found" in log # Minimal project It run in my device perfectly, it find device, get current value and max value and toggle flashlight. It require **root** permissions to write in device file. ```cpp #include <iostream> #include <cstring> #include <libudev.h> #define TORCH_SUBSYSTEM "leds" int main() { struct udev* udev = udev_new(); struct udev_enumerate* enumerate = udev_enumerate_new(udev); // Use to find all devices in subsystem "leds" // And use match sysname to filter only flash or torch // Example: // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/white:flash On OP6 // - /sys/devices/platform/soc@0/c440000.spmi/spmi-0/0-03/c440000.spmi:pmic@3:led-controller@d300/leds/yellow:flash On OP6 // - /sys/devices/platform/led-controller/leds/white:flash/brightness On pinephone udev_enumerate_add_match_subsystem(enumerate, TORCH_SUBSYSTEM); udev_enumerate_add_match_sysname(enumerate, "*:torch"); udev_enumerate_add_match_sysname(enumerate, "*:flash"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *entry = udev_list_entry_get_next(devices); if (entry == nullptr) { std::cout << "No flashlight found" << std::endl; return 1; } const char *path = udev_list_entry_get_name(entry); struct udev_device *torch = udev_device_new_from_syspath(udev, path); const char *max_brightness = udev_device_get_sysattr_value(torch, "max_brightness"); const char *brightness = udev_device_get_sysattr_value(torch, "brightness"); bool enabled = std::strcmp(brightness, "0") != 0; udev_device_set_sysattr_value(torch, "brightness", const_cast<char*>(enabled ? "0" : max_brightness)); udev_device_unref(torch); udev_enumerate_unref(enumerate); udev_unref(udev); return 0; } ``` Build with `g++ torch.cpp -ludev -o torch` Run with `sudo ./torch` # Important info - **udev** dependencies added - destructor for flashlightutil added to unref udev_device # Require udev rules Files `/etc/udev/rules.d/99-flashlight.rules` ```bash # Allow everyone to set brightness of flashlight (Required for plasma-mobile flashlightplugin) SUBSYSTEMS=="leds", KERNEL=="*:flash|*:torch", RUN+="/bin/chmod 666 %S%p/brightness" ``` pmOS : See to add depends `eudev` and makedepends `eudev-dev`
2023-12-31 17:11:28 +00:00
m_maxBrightness = maxBrightness;
m_device = device;
m_isAvailable = true;
m_torchEnabled = std::strcmp(brightness, "0") != 0;
udev_enumerate_unref(enumerate);
udev_unref(udev);
}