UNPKG

obniz

Version:

obniz sdk for javascript

130 lines (111 loc) 2.82 kB
class WS2812B { constructor() { this.keys = ['din', 'vcc', 'gnd']; this.requiredKeys = ['din']; } static info() { return { name: 'WS2812B', }; } wired(obniz) { this.obniz = obniz; obniz.setVccGnd(this.params.vcc, this.params.gnd, '5v'); this.params.mode = 'master'; this.params.frequency = parseInt(3.33 * 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.35us+-0.15us // T1H 0.9us+-0.15us // T0L 0.9us+-0.15us // T1L 0.35us+-0.15us // 0.3-0.9 and 0.9-0.3 at 3.33Mhz 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 = WS2812B._generateFromByte(g); array = array.concat(WS2812B._generateFromByte(r)); array = array.concat(WS2812B._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); return WS2812B._generateColor(R, G, B); } rgb(r, g, b) { this.spi.write(WS2812B._generateColor(r, g, b)); } hsv(h, s, v) { this.spi.write(WS2812B._generateHsvColor(h, s, v)); } rgbs(array) { let bytes = []; for (let i = 0; i < array.length; i++) { const oneArray = array[i]; bytes = bytes.concat( WS2812B._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( WS2812B._generateHsvColor(oneArray[0], oneArray[1], oneArray[2]) ); } this.spi.write(bytes); } } if (typeof module === 'object') { module.exports = WS2812B; }