1
0
Fork 0
USBStrip/index.js

406 lines
7.3 KiB
JavaScript

var express = require("express");
var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var serialPort = new SerialPort(process.argv[2], {
baudrate: 115200,
flowControl: false
});
/*serialport.list((err, ports) => {
console.log(ports);
});*/
var lightstate = true;
var tT;
var leds = 16;//273;
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 = 3;//42;
var lightness = 0.8;
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);
tT = setTimeout(function () {
writeLED(i, c[0], c[1], c[2], function () {
update(loop);
});
}, time || 30);
}
else {
cb();
}
};
loop();
};
var fade = function (color, cb) {
};
var isdone = true;
serialPort.on("open", function () {
serialPort.on("data", function (d) {
var i = 0;
var read = () => {
if (d.length == i)
return null;
return d[i++];
};
var cmd;
while (cmd = read()) {
if (cmd == 0x17) {
var n = read();
if (n === null) {
break;
}
var lstate = n == 0xff;
// lstate
//lstate slide(() => { return [0, 0, 0]; }, () => {}, 20);
if (lstate) {
//console.log("Tapped");
//var a = () => {
// if (isdone) {
lightstate = !lightstate;
// isdone = false;
//setLightness(lightstate ? 0 : 0.8, () => {
// isdone = true;
//});
var color = hslToRgb(toHue(state) / 256, 1, lightstate ? lightness : 0);
flash(() => {
return color;
}, () => {
// isdone = true;
});
// }
// else {
// setTimeout(a, 10);
// }
//};
//a();
}
else {
//console.log("down");
}
}
}
});
/*
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) {
res.end(state + "");
});
app.get("/set/:i", function (req, res) {
state = req.params.i * 1;
//console.log("3," + Math.floor(state / 64 * 256 % 256));
res.status(200).end();
if (h) {
clearInterval(h);
}
h = setInterval(function () {
if (i - toHue(state) > toHue(state) - i + 255) {
i += sp;
}
else if (toHue(state) - i > i - toHue(state) + 255) {
i -= sp;
}
else if (toHue(state) < i) {
i -= sp;
}
else if (toHue(state) > i) {
i += sp;
}
if (i > 255) {
i = 0;
}
else if (i < 0) {
i = 255;
}
if (Math.floor(toHue(state) / sp * 2) == Math.floor(i / sp * 2)) {
i = toHue(state);
clearInterval(h);
}
flash(function (la) {
return hslToRgb(i / 256, 1, lightness);
}, function () {
});
}, 20);
});
var lightnessT;
var setLightness = (l, done, delay) => {
//clearTimeout(lightnessT);
//clearTimeout(tT);
var from = lightness;
var to = l * 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) {
lightnessT = setTimeout(function () {
a();
}, delay == undefined ? 16 : delay);
}
else {
lightness = to;
lightnessT = setTimeout(() => {
flash(() => {
return hslToRgb(toHue(state) / 256, 1, lightness);
}, () => {
done && done();
});
}, delay == undefined ? 16 : delay);
}
});
};
a();
};
app.get("/lightness/set/:i", function (req, res) {
res.status(200).end();
setLightness(req.params.i);
});
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);