From dd9dcbd46ea9b0efb8ef08fc2877a5a1c55e7c53 Mon Sep 17 00:00:00 2001 From: Ambrose Chua Date: Sun, 17 Jan 2016 14:20:14 +0800 Subject: [PATCH] New protocol, revert back to Arduino --- USBStrip/USBStrip.ino | 31 +++-- index.js | 301 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 301 insertions(+), 31 deletions(-) diff --git a/USBStrip/USBStrip.ino b/USBStrip/USBStrip.ino index 9852ac0..efc0934 100644 --- a/USBStrip/USBStrip.ino +++ b/USBStrip/USBStrip.ino @@ -1,39 +1,44 @@ #include -#include #define LEDCount 37 -#define outputPin 1 +#define outputPin 11 WS2812 LED(LEDCount); cRGB value; void setup() { - SerialUSB.begin(); + //Serial.begin(230400); + Serial.begin(115200); LED.setOutput(outputPin); } void loop() { - if (SerialUSB.available() > 0) { - byte command = SerialUSB.read(); + if (Serial.available() > 0) { + byte command = Serial.read(); + //Serial.write(command); if (command == 0x11) { LED.sync(); - SerialUSB.write(0x1f); + Serial.write(0x1a); } else if (command == 0x12) { - while (SerialUSB.available() < 4) { + while (Serial.available() < 4) { } - int pos = SerialUSB.read(); - value.r = SerialUSB.read(); - value.g = SerialUSB.read(); - value.b = SerialUSB.read(); + int pos = Serial.read(); + value.r = Serial.read(); + value.g = Serial.read(); + value.b = Serial.read(); LED.set_crgb_at(pos, value); - SerialUSB.write(0x1f); + //Serial.write(pos); + //Serial.write(value.r); + //Serial.write(value.g); + //Serial.write(value.b); + Serial.write(0x1b); } else { - SerialUSB.write(0x1e); + Serial.write(0x1e); } } } diff --git a/index.js b/index.js index 341e3b1..ba59116 100644 --- a/index.js +++ b/index.js @@ -1,32 +1,154 @@ var express = require("express"); + var SerialPort = require("serialport").SerialPort; -var serialPort = new SerialPort("/dev/ttyACM0", { - baudrate: 9600 -}); -serialPort.on("open", function () { - /*serialPort.on('data', function(data) { - process.stderr.write(data); - });*/ - setTimeout(function () { - serialPort.write("2,3\n", function (err, results) { - setTimeout(function () { - serialPort.write("1,255\n", function (err, results) { - }); - }, 500); - }); - }, 2000); +var serialPort = new SerialPort(process.argv[2], { + baudrate: 115200 }); +var leds = 37; + var toHue = function (s) { return Math.floor(s / 64 * 256 % 256); }; +var hslToRgb = function (h, s, l) { + var r, g, b; + if (s == 0) { + r = g = b = l; // achromatic + } else { + var hue2rgb = function (p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; +}; + var state = 42; +var lightness = 0.5; var h; var i = toHue(state); var sp = 1; +var writeLED = function (i, r, g, b, cb) { + serialPort.write(new Buffer([0x12, i, r, g, b]), function () { + //serialPort.drain(function (err) { + // cb(err); + cb(); + //}); + }); +}; + +var update = function (cb) { + serialPort.write(new Buffer([0x11]), function () { + //serialPort.drain(function (err) { + // cb(err); + cb(); + //}); + }); +}; + +var writeAllLED = function (color, cb) { + var buff = []; + for (var i = 0; i < leds; i++) { + var c = color(i); + buff.push(0x12, i, c[0], c[1], c[2]); + } + var chunksize = 5; + var j = 0; + var loop = function () { + serialPort.write(new Buffer(buff.slice(j, j + chunksize)), function () { + //serialPort.drain(function (err) { + j += chunksize; + if (j < buff.length) { + loop(); + } + else { + cb(); + } + //}); + }); + }; + loop(); +}; + +var flash = function (color, cb) { + writeAllLED(color, function () { + update(cb); + }); +}; + +var slide = function (color, cb, time) { + var i = -1; + var loop = function () { + i++; + if (i < leds) { + var c = color(i); + setTimeout(function () { + writeLED(i, c[0], c[1], c[2], function () { + update(loop); + }); + }, time || 30); + } + else { + cb(); + } + }; + loop(); +}; + +var fade = function (color, cb) { + +}; + +serialPort.on("open", function () { + serialPort.on("data", function (d) { + //console.log(d); + }); + /* + setTimeout(function () { + var bytes = []; + bytes.push(); + for (var i = 0; i < leds; i++) { + bytes.push(0x12, i, 0, 0, 255); + } + bytes.push(0x11); + var data = new Buffer(bytes); + console.log(data); + serialPort.write(data); + serialPort.drain(function (err, results) { + console.log("all blue"); + }); + }, 5000); + */ + var a = function () { + slide(function (i) { + return [0, 0, 255]; + }, function () { + slide(function (i) { + return [255, 0, 0]; + }, function () { + slide(function (i) { + return [0, 255, 0]; + }, function () { + a(); + }); + }); + }); + }; + //a(); +}); + var app = express(); app.get("/get", function (req, res) { @@ -35,7 +157,7 @@ app.get("/get", function (req, res) { app.get("/set/:i", function (req, res) { - state = req.params.i; + state = req.params.i * 1; //console.log("3," + Math.floor(state / 64 * 256 % 256)); res.status(200).end(); @@ -66,10 +188,153 @@ app.get("/set/:i", function (req, res) { console.log(i); clearInterval(h); } - serialPort.write("3," + Math.floor(i) + "\n", function (err, results) { + flash(function (la) { + return hslToRgb(i / 256, 1, lightness); + }, function () { + }); - }, 50) + }, 20); }); +app.get("/lightness/set/:i", function (req, res) { + res.status(200).end(); + + var from = lightness; + var to = req.params.i * 1; + + var a = function () { + flash(function (la) { + return hslToRgb(toHue(state) / 256, 1, lightness); + }, function () { + lightness = lightness + (to - from) * 0.02; + if ((to - from) < 0 ? lightness > to : lightness < to) { + setTimeout(function () { + a(); + }, 16); + } + else { + lightness = to; + } + }); + }; + + a(); +}); + +app.get("/demo1/start", function (req, res) { + res.status(200).end(); + + var a = function () { + slide(function (la) { + return hslToRgb(0, 1, 0); + }, function () { + setTimeout(b, 500); + }, Math.floor(1000 / leds)); + }; + + var b = function () { + slide(function (la) { + return hslToRgb(la / leds, 1, 0.5); + }, function () { + c(0); + }, Math.floor(1000 / leds)); + }; + + var c = function (i) { + flash(function (la) { + return hslToRgb((la / leds + i / 150) % 1 , 1, 0.5); + }, function () { + if (i < 400) { + setTimeout(function () { + c(i + 1); + }, 16); + } + else { + d(0); + } + }); + }; + + var d = function () { + slide(function (la) { + return hslToRgb(0, 1, 0); + }, function () { + e(0); + }, Math.floor(1000 / leds)); + }; + + var e = function (i) { + slide(function (la) { + return hslToRgb((la / leds / 16 + i / 10) % 1, 1, 0.5); + }, function () { + if (i < 199) { + e(i + 1); + } + else { + f(); + } + }, 50 / (i / 200 * 50)); + }; + + var f = function () { + slide(function (la) { + return hslToRgb(i / 256, 1, 0.5); + }, function () { + + }, Math.floor(1000 / leds)); + }; + + a(); +}); + +var demo2 = false; + +app.get("/demo2/start", function (req, res) { + res.status(200).end(); + + demo2 = true; + + var a = function () { + slide(function (la) { + return hslToRgb(la / leds, 1, 0.5); + }, function () { + b(0); + }, Math.floor(1000 / leds)); + }; + + var b = function (i) { + flash(function (la) { + return hslToRgb((la / leds + i / 150) % 1 , 1, 0.5); + }, function () { + if (demo2) { + setTimeout(function () { + b(i + 1); + if (i == 30000) { + i = 0; + } + }, 16); + } + else { + c(); + } + }); + }; + + var c = function () { + slide(function (la) { + return hslToRgb(i / 256, 1, 0.5); + }, function () { + + }, Math.floor(1000 / leds)); + }; + + a(); +}); +app.get("/demo2/stop", function (req, res) { + res.status(200).end(); + + demo2 = false; +}); + app.listen(8026);