80 lines
1.5 KiB
JavaScript
80 lines
1.5 KiB
JavaScript
// sysfs functions
|
|
const fs = require('node:fs');
|
|
|
|
const LED_PATH = fs.existsSync('/sys/class/leds/ACT')
|
|
? '/sys/class/leds/ACT'
|
|
: '/sys/class/leds/led0';
|
|
|
|
// detach kernel trigger once at startup
|
|
try {
|
|
fs.writeFileSync(`${LED_PATH}/trigger`, 'none');
|
|
} catch (err) {
|
|
console.error(`[LED] failed to claim sysfs led:`, err.message);
|
|
}
|
|
|
|
let blinkTimer = null;
|
|
|
|
function setBrightness(val) {
|
|
try {
|
|
fs.writeFileSync(`${LED_PATH}/brightness`, val.toString());
|
|
} catch (err) {
|
|
console.error(`[LED] error writing brightness:`, err.message);
|
|
}
|
|
}
|
|
|
|
function turnOff() {
|
|
stopBlink();
|
|
setBrightness(0);
|
|
}
|
|
|
|
function turnOn() {
|
|
stopBlink();
|
|
setBrightness(1);
|
|
}
|
|
|
|
function getState() {
|
|
try {
|
|
return parseInt(fs.readFileSync(`${LED_PATH}/brightness`, 'utf8').trim(), 10);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function toggle() {
|
|
setBrightness(getState() === 1 ? 0 : 1);
|
|
}
|
|
|
|
function startBlink(interval = 500) {
|
|
stopBlink();
|
|
let state = 1;
|
|
setBrightness(state);
|
|
|
|
blinkTimer = setInterval(() => {
|
|
state = state === 1 ? 0 : 1;
|
|
setBrightness(state);
|
|
}, interval);
|
|
}
|
|
|
|
function stopBlink() {
|
|
if (blinkTimer) {
|
|
clearInterval(blinkTimer);
|
|
blinkTimer = null;
|
|
}
|
|
}
|
|
|
|
function restoreDefault() {
|
|
stopBlink();
|
|
try {
|
|
fs.writeFileSync(`${LED_PATH}/trigger`, 'mmc0');
|
|
} catch {}
|
|
}
|
|
|
|
module.exports = {
|
|
turnOff,
|
|
turnOn,
|
|
toggle,
|
|
getState,
|
|
startBlink,
|
|
stopBlink,
|
|
restoreDefault
|
|
}; |