This commit is contained in:
Lewis Diamond 2020-10-21 19:56:24 -04:00
parent d7e01322a1
commit 290a37fd02

View File

@ -1,84 +1,11 @@
#!/bin/env node #!/bin/env node
const { execSync, spawnSync } = require("child_process"); const { execSync, spawnSync } = require("child_process");
const chroma = require("chroma-js");
const suncalc = require("suncalc"); const suncalc = require("suncalc");
const util = require("util"); const dbus = require("./dbus");
const dbus = require("dbus"); const { colors, brightness } = require("./colors");
const bus = dbus.getBus("session");
const SERVICE_NAME = "org.razer";
const OBJECT_PATH_DEVICES = "/org/razer";
const OBJECT_PATH_DEVICE = "/org/razer/device/";
const DEVICE = "IO2033F28201257";
const DANGEROUS_VOLUME = 40; const DANGEROUS_VOLUME = 40;
const BASE_COLOR = [186, 81, 0];
const WARNING_COLOR = [150, 30, 30];
const ALERT_COLOR = [250, 10, 10];
const SAFE_COLOR = [10, 220, 30];
const BLUE = [10, 20, 200];
const AUDIO_NAME = "analog-surround-51"; const AUDIO_NAME = "analog-surround-51";
const MIC_NAME = "C-Media_Electronics_Inc._USB_PnP_Sound_Device"; const MIC_NAME = "C-Media_Electronics_Inc._USB_PnP_Sound_Device";
const INTERFACES = {
DEVICES: {
iface: "razer.devices",
methods: ["getDevices"],
path: OBJECT_PATH_DEVICES,
},
BRIGHTNESS: {
iface: "razer.device.lighting.brightness",
methods: ["setBrightness", "getBrightness"],
path: OBJECT_PATH_DEVICE + DEVICE,
},
CHROMA: {
iface: "razer.device.lighting.chroma",
methods: [
"setBreathDual",
"setBreathRandom",
"setBreathSingle",
"setCustom",
"setKeyRow",
"setNone",
"setReactive",
"setSpectrum",
"setStarlightDual",
"setStarlightRandom",
"setStarlightSingle",
"setStatic",
"setWave",
],
path: OBJECT_PATH_DEVICE + DEVICE,
},
CUSTOM: {
iface: "razer.device.lighting.custom",
methods: ["setRipple", "setRippleRandomColour"],
path: OBJECT_PATH_DEVICE + DEVICE,
},
MACRO: {
iface: "razer.device.macro",
methods: ["addMacro", "deleteMacro", "getMacros"],
path: OBJECT_PATH_DEVICE + DEVICE,
},
MISC: {
iface: "razer.device.misc",
methods: [
"getDeviceMode",
"getDeviceName",
"getDeviceType",
"getDriverVersion",
"getFirmware",
"getKeyboardLayout",
"getMatrixDimensions",
"getRazerUrls",
"getSerial",
"getVidPid",
"hasDedicatedMacroKeys",
"hasMatrix",
"resumeDevice",
"setDeviceMode",
"suspendDevice",
],
path: OBJECT_PATH_DEVICE + DEVICE,
},
};
function isNight() { function isNight() {
const now = new Date(); const now = new Date();
@ -87,52 +14,19 @@ function isNight() {
return isnight; return isnight;
} }
const getInterface = util.promisify(bus.getInterface).bind(bus);
const interfaces = {};
function bindPromisify(obj, ...fn) {
fn.forEach(fn => (obj[fn] = util.promisify(obj[fn]).bind(obj)));
}
async function initializeDeviceInterfaces() {
const p = Object.entries(INTERFACES).map(
async ([label, { iface, path, methods }]) => {
const interface = await getInterface(SERVICE_NAME, path, iface);
bindPromisify(interface, ...methods);
interfaces[label.toLowerCase()] = interface;
},
);
await Promise.all(p);
}
async function initialize() {
await initializeDeviceInterfaces();
}
function staticMatrix(r, g, b, rows, cols) {
const color = [r, g, b];
const row = [].concat(00, 0x15, ...new Array(cols).fill(color));
const matrix = [];
for (let i = 0; i < rows; ++i) {
matrix.push(...[i, ...row]);
}
matrix.rows = rows;
matrix.cols = cols;
return matrix;
}
function setKey(matrix, row, col, r, g, b) {
const idx = row * (col + 1) * 3 + (col + 1) * 3;
matrix[idx] = r;
matrix[idx + 1] = g;
matrix[idx + 2] = b;
}
function setPlaying(matrix) { function setPlaying(matrix) {
const playing = !spawnSync("mpc | grep playing", { shell: true }).status; const playing = !spawnSync("mpc | grep playing", { shell: true }).status;
[18, 19, 20].forEach(x => [18, 19, 20].forEach(x =>
setKey(matrix, 0, x, ...(playing ? ALERT_COLOR : BASE_COLOR)), dbus.setKey(
matrix,
0,
x,
...(playing ? colors.ALERT_COLOR.rgb() : colors.BASE_COLOR.rgb()),
),
); );
} }
function getBrightness() { function getBrightness() {
console.log(isNight());
return isNight() ? 60 : 100; return isNight() ? 60 : 100;
} }
const volume = const volume =
@ -152,8 +46,14 @@ async function setMutedMic() {
`pacmd dump | grep ^set-source-mute.*${MIC_NAME}.*yes`, `pacmd dump | grep ^set-source-mute.*${MIC_NAME}.*yes`,
{ shell: true }, { shell: true },
).status; ).status;
await interfaces.brightness.setBrightness(muted ? getBrightness() : 100); const b = muted ? getBrightness() : 100;
return staticMatrix(...(muted ? BASE_COLOR : ALERT_COLOR), 6, 22); return dbus.staticMatrix(
...(muted
? brightness(colors.BASE_COLOR, b).rgb()
: brightness(colors.ALERT_COLOR, b).rgb()),
6,
22,
);
} }
async function setAudio(matrix) { async function setAudio(matrix) {
@ -163,9 +63,11 @@ async function setAudio(matrix) {
{ shell: true }, { shell: true },
).status; ).status;
if (muted) { if (muted) {
keys.forEach(x => setKey(matrix, 0, x, ...SAFE_COLOR)); keys.forEach(x =>
dbus.setKey(matrix, 0, x, ...colors.SAFE_COLOR.rgb()),
);
} else if (volume === 0) { } else if (volume === 0) {
keys.forEach(x => setKey(matrix, 0, x, ...BLUE)); keys.forEach(x => dbus.setKey(matrix, 0, x, ...colors.BLUE.rgb()));
} else { } else {
const volume = parseInt( const volume = parseInt(
spawnSync( spawnSync(
@ -173,21 +75,25 @@ async function setAudio(matrix) {
{ shell: true }, { shell: true },
).stdout, ).stdout,
); );
const c = chroma(volume < DANGEROUS_VOLUME ? BASE_COLOR : ALERT_COLOR) const c = brightness(
.set("hsv.v", volume / 50) volume < DANGEROUS_VOLUME
.rgb(); ? colors.BASE_COLOR.rgb()
keys.forEach(x => setKey(matrix, 0, x, ...c)); : colors.ALERT_COLOR.rgb(),
volume / 50,
);
keys.forEach(x => dbus.setKey(matrix, 0, x, ...c.rgb()));
} }
} }
async function run() { async function run() {
await initialize(); const interfaces = await dbus.connect();
const matrix = await setMutedMic(); const matrix = await setMutedMic();
setAudio(matrix); setAudio(matrix);
setPlaying(matrix); setPlaying(matrix);
await interfaces.brightness.setBrightness(100);
await interfaces.chroma.setKeyRow(matrix); await interfaces.chroma.setKeyRow(matrix);
bus.disconnect(); dbus.disconnect();
} }
run(); run();