diff --git a/example_config.json b/example_config.json index 50adfc9..fae7721 100644 --- a/example_config.json +++ b/example_config.json @@ -27,19 +27,27 @@ "host": "192.168.1.31", "port": 3000, "colors": { - "BigMuffPi": { - "enabled": "#008800", - "bypassed": "002200" + "pedalboards": { + "Default": "#0F0F0F", + "FUZZ": "0F0F00" }, - "Overdrive": { - "enabled": "#888800", - "bypassed": "#222200" + "pedals": { + "BigMuffPi": { + "enabled": "#008800", + "bypassed": "002200" + }, + "Overdrive": { + "enabled": "#888800", + "bypassed": "#222200" + }, + "StompBox_fuzz": { + "enabled": "#7700AA", + "bypassed": "#220022" + } }, - "StompBox_fuzz": { - "enabled": "#7700AA", - "bypassed": "#220022" + "systemd": { + "jack-capture": "#660066" } - }, - "Bypass": "#333333" + } } } \ No newline at end of file diff --git a/libs/api.js b/libs/api.js index b4c6f00..3b63186 100644 --- a/libs/api.js +++ b/libs/api.js @@ -20,7 +20,7 @@ function setEndpoint(url, get, post) { endpoint.POST = post; } endpoints.set(url, endpoint); - logger.debug('set up endpoint \'' + url + '\' > ' + JSON.stringify(endpoint)); + logger.debug('set up endpoint \'' + url + '\' > GET: ' + (endpoint.GET !== undefined) + ', POST ' + (endpoint.POST !== undefined)); } function getEndpoints() { diff --git a/libs/blinky.js b/libs/blinky.js index 1a6050d..67d2ada 100644 --- a/libs/blinky.js +++ b/libs/blinky.js @@ -1,9 +1,17 @@ const logger = require('./logger.js'); -const { CONTROL_BYPASS } = require('./constants.js'); -const { httpPOST } = require('./util.js'); +const { CONTROL_BYPASS, SYSTEMD_STATE_ACTIVE } = require('./constants.js'); +const { httpPOST, httpGET } = require('./util.js'); + +const BLINKSTICK_SQUARE = 'square'; +const BLINKSTICK_STRIP = 'strip'; + +const COLOR_RANDOM = 'random'; +const COLOR_DEFAULT = '#333333'; let enabled; -let isBypassActive; +let fnIsBypassActive; + +let animationsInProgress = {}; async function initialize() { enabled = global.config.blinky !== undefined && @@ -12,36 +20,60 @@ async function initialize() { global.config.blinky.port !== undefined; } -async function setActive(active) { +async function getColor() { if (!enabled) { return; } - logger.info('handling blinky event \'setActive\' (argument: \'' + active + '\')...'); try { - if (active) { + return await httpGET( + global.config.blinky.host, + global.config.blinky.port, + 'color' + ); + } catch (err) { + logger.error('[blinky] ' + err); + } +} + +async function poweroff(...blinksticks) { + if (!enabled) { + return; + } + if (blinksticks === undefined || blinksticks.length === 0) { + blinksticks = [BLINKSTICK_SQUARE, BLINKSTICK_STRIP]; + } + for (let index = 0; index < blinksticks.length; index++) { + try { await httpPOST( global.config.blinky.host, global.config.blinky.port, - '/set', - { blinkstick: 'square', color: '#0f0f0f' } + 'poweroff', + { blinkstick: blinksticks[index] } ); + logger.debug('[blinky] powered off blinkstick \'' + blinksticks[index]); + } catch (err) { + logger.error('[blinky] ' + err); + } + } +} + +async function setPedalboardStatus(pedalboard) { + try { + if (!enabled || pedalboard === undefined) { return; } - let mode = '/poweroff'; await httpPOST( global.config.blinky.host, global.config.blinky.port, - mode, - { blinkstick: 'square' } - ); - await httpPOST( - global.config.blinky.host, - global.config.blinky.port, - mode, - { blinkstick: 'strip' } + 'set', + { + blinkstick: BLINKSTICK_SQUARE, + color: getPedalboardColor(pedalboard.title) + } ); + logger.debug('[blinky] set status for pedalboard \'' + pedalboard.title + '\''); } catch (err) { - logger.error('[BLINKY] ' + err); + logger.error('[blinky] ' + err); } } @@ -50,8 +82,8 @@ async function setPedalStatus(pedal) { if (!enabled || pedal === undefined || pedal.controls === undefined) { return; } - if (isBypassActive === undefined) { - isBypassActive = require('./modep.js').isBypassActive; + if (fnIsBypassActive === undefined) { + fnIsBypassActive = require('./modep.js').isBypassActive; } for (let index = 0; index < pedal.controls.length; index++) { const bypass = pedal.controls[index]; @@ -63,23 +95,25 @@ async function setPedalStatus(pedal) { global.config.blinky.port, 'set', { - blinkstick: 'strip', + blinkstick: BLINKSTICK_STRIP, index: pedal.id, - color: getPedalColor(pedal.name, isBypassActive(bypass)) + color: getPedalColor(pedal.name, fnIsBypassActive(bypass)) } ); + logger.debug('[blinky] set status for pedal \'' + pedal.name + '\''); } } catch (err) { - logger.error('[BLINKY] ' + err); + logger.error('[blinky] ' + err); } } -async function setStatus(pedals) { +async function setStatus(pedalboard, pedals) { if (!enabled) { return; } try { - await httpPOST(global.config.blinky.host, global.config.blinky.port, '/poweroff', { blinkstick: 'strip' }); + setPedalboardStatus(pedalboard); + await poweroff([BLINKSTICK_STRIP]); if (pedals === undefined || pedals.length === 0) { return; } @@ -98,38 +132,58 @@ async function setStatus(pedals) { } } } catch (err) { - logger.error('[BLINKY] ' + err); + logger.error('[blinky] ' + err); } } -async function setBypass(bypassActive) { - if (!enabled) { +async function setSystemdStatus(name, state) { + if (name === undefined || state === undefined) { return; } - try { - if (!bypassActive) { - return await setActive(true); + let mode = 'set'; + let options = { + blinkstick: BLINKSTICK_STRIP, + color: animationsInProgress[name] || COLOR_DEFAULT + }; + if (state === SYSTEMD_STATE_ACTIVE) { + const result = await getColor([BLINKSTICK_SQUARE]); + for (let index = 0; index < result.length; index++) { + if (result[index].blinkstick !== options.blinkstick) { + continue; + } + animationsInProgress[name] = result[index].leds[0]?.color || COLOR_RANDOM; + mode = 'pulse'; + options.color = getSystemdColor(name); + break; } - await httpPOST(global.config.blinky.host, global.config.blinky.port, 'pulse', { blinkstick: 'square', color: '#660000' }); - } catch (err) { - logger.error('[BLINKY] ' + err); } + return await httpPOST( + global.config.blinky.host, + global.config.blinky.port, + mode, + options + ); +} + +function getPedalboardColor(name) { + return global.config?.blinky?.colors?.pedalboards[name] || COLOR_RANDOM; } function getPedalColor(name, bypassed) { - let color; if (bypassed) { - color = global.config.blinky?.colors[name]?.bypassed || global.config.blinky?.colors['Bypass'] || '#333333'; - } else { - color = global.config.blinky?.colors[name]?.enabled || 'random'; + return global.config?.blinky?.colors?.pedals[name]?.bypassed || COLOR_DEFAULT; } - return color; + return global.config?.blinky?.colors?.pedals[name]?.enabled || COLOR_RANDOM; +} + +function getSystemdColor(name) { + return global.config?.blinky?.colors?.systemd[name] || COLOR_RANDOM; } module.exports = { initialize, - setActive, - setBypass, + poweroff, setStatus, - setPedalStatus + setPedalStatus, + setSystemdStatus } \ No newline at end of file diff --git a/libs/modep.js b/libs/modep.js index ea30c03..689447b 100644 --- a/libs/modep.js +++ b/libs/modep.js @@ -146,7 +146,7 @@ async function parseCurrentPedalboard(currentPedalboard) { const defaultPedalboard = await getDefaultPedalboard(); if (defaultPedalboard.id === currentPedalboard.id) { cache.setCurrentPedals(pedals); - blinky.setStatus(pedals); + blinky.setStatus(currentPedalboard, pedals); return pedals; } let startTime = new Date(); @@ -155,8 +155,8 @@ async function parseCurrentPedalboard(currentPedalboard) { throw new Error('could not determine current pedalboard config file'); } // FAKE DATA - // let file = path.resolve(path.dirname(__dirname) + '/dev/' + currentPedalboard.uri.substring(currentPedalboard.uri.lastIndexOf('/') + 1)); - let file = path.resolve(currentPedalboard.uri.replace('file://', '')); + let file = path.resolve(path.dirname(__dirname) + '/dev/' + currentPedalboard.uri.substring(currentPedalboard.uri.lastIndexOf('/') + 1)); + // let file = path.resolve(currentPedalboard.uri.replace('file://', '')); const data = await new Promise((resolve, reject) => { fs.readFile(file, (err, data) => { if (err) { @@ -210,7 +210,7 @@ async function parseCurrentPedalboard(currentPedalboard) { } logger.debug('parsing current pedalboard file \'' + file + '\' took ' + util.timeDiff(startTime) + 'ms') cache.setCurrentPedals(pedals); - blinky.setStatus(pedals); + blinky.setStatus(currentPedalboard, pedals); return pedals; } @@ -241,6 +241,7 @@ async function setControl(control, value) { } control.midi.value = await osc.send(control.midi.controller, control.midi.channel, value); cache.updateControl(control); + logger.info('set value for control \'' + control.name + '\' to \'' + value + '\''); } async function setPedalboardById(pedalboardId) { @@ -263,6 +264,7 @@ async function setPedalboard(pedalboard) { await reset(); await util.httpPOST(global.config.modep.host, global.config.modep.port, '/pedalboard/load_bundle/?bundlepath=' + pedalboard.bundle); cache.setCurrentPedalboard(pedalboard); + logger.info('set current pedalboard to \'' + pedalboard.title + '\''); return await parseCurrentPedalboard(pedalboard); } @@ -316,7 +318,6 @@ async function toggleBypass(pedalId) { pedalboardIdBypassOrigin = undefined; } await setPedalboardById(pedalboardId); - blinky.setBypass(pedalboardId === defaultPedalboard.id); } catch (err) { throw new Error(err); } @@ -334,6 +335,7 @@ async function toggleBypass(pedalId) { } catch (err) { throw new Error('could not toggle bypass for pedal ' + pedal.name + ' with id \'' + pedal.id + '\' > ' + err); } + logger.info('toggled bypass for pedal \'' + pedal.name + '\''); } module.exports = { diff --git a/libs/server.js b/libs/server.js index de89df5..0c19d98 100644 --- a/libs/server.js +++ b/libs/server.js @@ -1,6 +1,5 @@ const logger = require('./logger.js'); const api = require('./api.js'); -const blinky = require('./blinky.js'); const http = require('http'); const ID = require('./constants.js').VARIABLE_ID; @@ -13,7 +12,6 @@ async function start() { } server.listen(global.config.server.port, global.config.server.listen).on('listening', () => { logger.debug('server listening on ' + global.config.server.listen + ':' + global.config.server.port + '...'); - blinky.setActive(true); handleRequests(); }); } diff --git a/libs/systemd.js b/libs/systemd.js index d1d8916..1a6806a 100644 --- a/libs/systemd.js +++ b/libs/systemd.js @@ -1,6 +1,7 @@ const logger = require('./logger.js'); const commands = require('./commands.js'); const constants = require('./constants.js'); +const blinky = require('./blinky.js'); async function getServiceState(name) { if (name === undefined) { @@ -42,7 +43,9 @@ async function setServiceState(name, args) { state = constants.SYSTEMD_STATE_ACTIVE; } logger.debug('setting state of service \'' + name + '\' to \'' + state + '\'...'); - return { service: name, state: state, result: await commands.execute('systemctl', [command, name], true)}; + const result = await commands.execute('systemctl', [command, name], true); + blinky.setSystemdStatus(name, state); + return { service: name, state: state, result: result}; } module.exports = { diff --git a/pbc.js b/pbc.js index 9a6c007..5f1e1ea 100644 --- a/pbc.js +++ b/pbc.js @@ -40,7 +40,7 @@ function handleExit() { } async function exit(err, code) { - await blinky.setActive(false); + await blinky.poweroff(); if (code === undefined) { code = 0; if (err !== undefined) {