import ws281x from 'rpi-ws281x' import * as fs from 'fs' const cfg = JSON.parse(fs.readFileSync('./config.json')); const fade_ticks = cfg.fade_ticks || 20; var pixels = new Uint32Array(cfg.leds); var pixel_cache = new Uint32Array(cfg.leds); var next_pattern = new Uint32Array(cfg.leds); var pattern = {} function rgb_to_int(r, g, b) { return ((r << 8) + g) << 8 + b; } function int_to_rgb(int) { var r = int >> 16 & 0xFF; var g = int >> 8 & 0xFF; var b = int & 0xFF; return { r: r, g: g, b: b }; } ws281x.configure({ leds: cfg.leds || 300, brightness: cfg.brightness || 200, gpio: cfg.gpio || 18, stripType: cfg.type || 'grb' }); export function set_pattern(pat) { pattern = pat } function tick_pattern() { // do the parsing stuff here console.log("TICKING PATTERN") for (let i = 0; i < cfg.leds; i++) { var r = Math.floor(Math.random() * 100) var g = Math.floor(Math.random() * 100); var b = Math.floor(Math.random() * 100); next_pattern[i] = ((r << 8) + g) << 8 + b; } } export function tick() { var changed = false; for (let i = 0; i < cfg.leds; i++) { if (next_pattern[i] != pixels[i]) { if (next_pattern[i] == pixel_cache[i]) { console.log("INCONGRUENCE WITH " + i); pixels[i] = next_pattern[i] } else { changed = true; fade(i); } } } if (!changed) { tick_pattern(); } ws281x.render(pixels); ws281x.sleep(cfg.sleep_time || 500); } function fade(index) { var original = int_to_rgb(pixel_cache[index]); var current = int_to_rgb(pixels[index]); var final = int_to_rgb(next_pattern[index]); var diff_r = final.r - original.r; var diff_cr = current.r - original.r; var diff_g = final.g - original.g; var diff_b = final.b - original.b; var interval_r = diff_r / fade_ticks; var interval_g = diff_g / fade_ticks; var interval_b = diff_b / fade_ticks; var current_tick = Math.floor((diff_cr / diff_r) * fade_ticks); if (diff_r == 0 || diff_cr == 0) { current_tick = fade_ticks; } // console.log(`original: ${original.r} ${original.g} ${original.b}\n` + // `current: ${current.r} ${current.g} ${current.b}\n` + // `final: ${final.r} ${final.g} ${final.b}\n` + // `interval: ${interval_r} ${interval_g} ${interval_b}\n`) if (current_tick + 1 >= fade_ticks) { pixels[index] = next_pattern[index]; pixel_cache[index] = next_pattern[index]; } else { pixels[index] = rgb_to_int(current.r + interval_r, current.g + interval_g, current.b + interval_b); } }