UNPKG

obniz

Version:

obniz sdk for javascript

131 lines (113 loc) 2.88 kB
class WS2811 { constructor() { this.keys = ['din', 'vcc', 'gnd']; this.requiredKeys = ['din']; } static info() { return { name: 'WS2811', }; } wired(obniz) { this.obniz = obniz; obniz.setVccGnd(this.params.vcc, this.params.gnd, '5v'); this.params.mode = 'master'; this.params.frequency = 2 * 1000 * 1000; this.params.mosi = this.params.din; this.params.drive = '5v'; // It over spec for frequency. But VIN-HI require 0.7VCC<=. this.spi = this.obniz.getSpiWithConfig(this.params); } static _generateFromByte(val) { // T0H 0.5us+-0.15us // T1H 1.2us+-0.15us // T0L 2.0us+-0.15us // T1L 1.3us+-0.15us val = parseInt(val); const zero = 0x8; const one = 0xe; let ret = []; for (let i = 0; i < 8; i += 2) { let byte = 0; if (val & (0x80 >> i)) { byte = one << 4; } else { byte = zero << 4; } if (val & (0x80 >> (i + 1))) { byte |= one; } else { byte |= zero; } ret.push(byte); } return ret; } static _generateColor(r, g, b) { let array = WS2811._generateFromByte(r); array = array.concat(WS2811._generateFromByte(g)); array = array.concat(WS2811._generateFromByte(b)); return array; } static _generateHsvColor(h, s, v) { let C = v * s; let Hp = h / 60; let X = C * (1 - Math.abs((Hp % 2) - 1)); let R, G, B; if (0 <= Hp && Hp < 1) { [R, G, B] = [C, X, 0]; } if (1 <= Hp && Hp < 2) { [R, G, B] = [X, C, 0]; } if (2 <= Hp && Hp < 3) { [R, G, B] = [0, C, X]; } if (3 <= Hp && Hp < 4) { [R, G, B] = [0, X, C]; } if (4 <= Hp && Hp < 5) { [R, G, B] = [X, 0, C]; } if (5 <= Hp && Hp < 6) { [R, G, B] = [C, 0, X]; } let m = v - C; [R, G, B] = [R + m, G + m, B + m]; R = Math.floor(R * 255); G = Math.floor(G * 255); B = Math.floor(B * 255); let array = WS2811._generateFromByte(R); array = array.concat(WS2811._generateFromByte(G)); array = array.concat(WS2811._generateFromByte(B)); return array; } rgb(r, g, b) { this.spi.write(WS2811._generateColor(r, g, b)); } hsv(h, s, v) { this.spi.write(WS2811._generateHsvColor(h, s, v)); } rgbs(array) { let bytes = []; for (let i = 0; i < array.length; i++) { const oneArray = array[i]; bytes = bytes.concat( WS2811._generateColor(oneArray[0], oneArray[1], oneArray[2]) ); } this.spi.write(bytes); } hsvs(array) { let bytes = []; for (let i = 0; i < array.length; i++) { const oneArray = array[i]; bytes = bytes.concat( WS2811._generateHsvColor(oneArray[0], oneArray[1], oneArray[2]) ); } this.spi.write(bytes); } } if (typeof module === 'object') { module.exports = WS2811; }