UNPKG

rgb-led-matrix

Version:

Universal RGB Matrix controller for Node.js. Supports realtime frame streaming (eg. Ambilight). BlinkStick RGB LED controller given as example.

122 lines (99 loc) 2.84 kB
//Very simple websocket server to switch between shaders //eg. http://localhost:5000 for the client UI //eg. http://localhost:5000/?shader=ambilight for a specific shader var DEBUG = false; module.exports = { send: function(method,params) { send(method, params); } } const rgb_led_matrix = require('../rgb_led_matrix.js'); const express = require('express'); const http = require('http'); const url = require('url'); const path = require('path'); const WebSocket = require('ws'); const unicorn = require("../shaders/unicorn.js"); const fireplace = require("../shaders/fireplace.js"); const aurora = require("../shaders/aurora.js"); const timesquare = require("../shaders/timesquare.js"); const cpu_meter = require("../shaders/cpu_meter.js"); const signature = require("../shaders/signature.js"); var app = express(); var server = http.createServer(app); var socket = null; //REST API app.get('/', function (req, res) { params = {}; params.width=8; params.height=1; params.name=req.query.shader; params.shader=req.query.shader; set_shader(params); res.end(); }); //WEBSOCKET API const wss = new WebSocket.Server({ server }); wss.on('connection', function connection(ws, req) { socket = ws; //GOT MESSAGE FROM CLIENT socket.on('message', function incoming(message) { DEBUG && console.log("WEBSOCKET: GOT MESSAGE FROM CLIENT: "+message.toString()); interpret(message.toString()); }); //ERRORS FROM WEBSOCKET socket.on('error', function () { DEBUG && console.log("WEBSOCKET: ERROR"); }); }); function send(method, params) { //SEND MESSAGE TO CLIENT DEBUG && console.log("WEBSOCKET: SENT MESSAGE TO CLIENT: "+json(method, params)); if (socket && socket.readyState === WebSocket.OPEN) socket.send(json(method, params)); } function set_shader(params) { switch(params.shader) { case "cpu_meter": rgb_led_matrix.setShader(cpu_meter, params); break; case "aurora": rgb_led_matrix.setShader(aurora, params); break; case "unicorn": rgb_led_matrix.setShader(unicorn, params); break; case "fireplace": rgb_led_matrix.setShader(fireplace, params); break; case "timesquare": rgb_led_matrix.setShader(timesquare, params); break; case "signature": rgb_led_matrix.setShader(signature, params); break; default: } } function interpret(message) { var json = JSON.parse(message); var method = json.method; var params = json.params; switch(method) { case "set_shader": set_shader(params); break; default: } } function json(method, params) { var message = {"method": method, "params": params}; return JSON.stringify(message); } rgb_led_matrix.setShader(signature, {"width": 8, "height": 1}); server.listen(8080, function listening() { console.log('Listening on %d', server.address().port); });