Skip to content

Instantly share code, notes, and snippets.

@zeffii
Forked from kgleeson/gist:9493653
Last active August 29, 2015 13:57
Show Gist options
  • Save zeffii/9493663 to your computer and use it in GitHub Desktop.
Save zeffii/9493663 to your computer and use it in GitHub Desktop.
const BYTESPERPIXEL = 27;
const BYTESPERCOLOR = 9; // BYTESPERPIXEL / 3
const SPICLK = 7500; // SPI clock speed in kHz
const bits = "\xE0\x70\x38\x1C\x0E\x07\x03\x81\xC0\xE0\x70\x38\x1C\x0E\x07\x03\x81\xF8\xE0\x70\x38\x1C\x0E\x07\x03\xF1\xC0\xE0\x70\x38\x1C\x0E\x07\x03\xF1\xF8\xE0\x70\x38\x1C\x0E\x07\xE3\x81\xC0\xE0\x70\x38\x1C\x0E\x07\xE3\x81\xF8\xE0\x70\x38\x1C\x0E\x07\xE3\xF1\xC0\xE0\x70\x38\x1C\x0E\x07\xE3\xF1\xF8\xE0\x70\x38\x1C\x0F\xC7\x03\x81\xC0\xE0\x70\x38\x1C\x0F\xC7\x03\x81\xF8\xE0\x70\x38\x1C\x0F\xC7\x03\xF1\xC0\xE0\x70\x38\x1C\x0F\xC7\x03\xF1\xF8\xE0\x70\x38\x1C\x0F\xC7\xE3\x81\xC0\xE0\x70\x38\x1C\x0F\xC7\xE3\x81\xF8\xE0\x70\x38\x1C\x0F\xC7\xE3\xF1\xC0\xE0\x70\x38\x1C\x0F\xC7\xE3\xF1\xF8\xE0\x70\x38\x1F\x8E\x07\x03\x81\xC0\xE0\x70\x38\x1F\x8E\x07\x03\x81\xF8\xE0\x70\x38\x1F\x8E\x07\x03\xF1\xC0\xE0\x70\x38\x1F\x8E\x07\x03\xF1\xF8\xE0\x70\x38\x1F\x8E\x07\xE3\x81\xC0\xE0\x70\x38\x1F\x8E\x07\xE3\x81\xF8\xE0\x70\x38\x1F\x8E\x07\xE3\xF1\xC0\xE0\x70\x38\x1F\x8E\x07\xE3\xF1\xF8\xE0\x70\x38\x1F\x8F\xC7\x03\x81\xC0\xE0\x70\x38\x1F\x8F\xC7\x03\x81\xF8\xE0\x70\x38\x1F\x8F\xC7\x03\xF1\xC0\xE0\x70\x38\x1F\x8F\xC7\x03\xF1\xF8\xE0\x70\x38\x1F\x8F\xC7\xE3\x81\xC0\xE0\x70\x38\x1F\x8F\xC7\xE3\x81\xF8\xE0\x70\x38\x1F\x8F\xC7\xE3\xF1\xC0\xE0\x70\x38\x1F\x8F\xC7\xE3\xF1\xF8\xE0\x70\x3F\x1C\x0E\x07\x03\x81\xC0\xE0\x70\x3F\x1C\x0E\x07\x03\x81\xF8\xE0\x70\x3F\x1C\x0E\x07\x03\xF1\xC0\xE0\x70\x3F\x1C\x0E\x07\x03\xF1\xF8\xE0\x70\x3F\x1C\x0E\x07\xE3\x81\xC0\xE0\x70\x3F\x1C\x0E\x07\xE3\x81\xF8\xE0\x70\x3F\x1C\x0E\x07\xE3\xF1\xC0\xE0\x70\x3F\x1C\x0E\x07\xE3\xF1\xF8\xE0\x70\x3F\x1C\x0F\xC7\x03\x81\xC0\xE0\x70\x3F\x1C\x0F\xC7\x03\x81\xF8\xE0\x70\x3F\x1C\x0F\xC7\x03\xF1\xC0\xE0\x70\x3F\x1C\x0F\xC7\x03\xF1\xF8\xE0\x70\x3F\x1C\x0F\xC7\xE3\x81\xC0\xE0\x70\x3F\x1C\x0F\xC7\xE3\x81\xF8\xE0\x70\x3F\x1C\x0F\xC7\xE3\xF1\xC0\xE0\x70\x3F\x1C\x0F\xC7\xE3\xF1\xF8\xE0\x70\x3F\x1F\x8E\x07\x03\x81\xC0\xE0\x70\x3F\x1F\x8E\x07\x03\x81\xF8\xE0\x70\x3F\x1F\x8E\x07\x03\xF1\xC0\xE0\x70\x3F\x1F\x8E\x07\x03\xF1\xF8\xE0\x70\x3F\x1F\x8E\x07\xE3\x81\xC0\xE0\x70\x3F\x1F\x8E\x07\xE3\x81\xF8\xE0\x70\x3F\x1F\x8E\x07\xE3\xF1\xC0\xE0\x70\x3F\x1F\x8E\x07\xE3\xF1\xF8\xE0\x70\x3F\x1F\x8F\xC7\x03\x81\xC0\xE0\x70\x3F\x1F\x8F\xC7\x03\x81\xF8\xE0\x70\x3F\x1F\x8F\xC7\x03\xF1\xC0\xE0\x70\x3F\x1F\x8F\xC7\x03\xF1\xF8\xE0\x70\x3F\x1F\x8F\xC7\xE3\x81\xC0\xE0\x70\x3F\x1F\x8F\xC7\xE3\x81\xF8\xE0\x70\x3F\x1F\x8F\xC7\xE3\xF1\xC0\xE0\x70\x3F\x1F\x8F\xC7\xE3\xF1\xF8\xE0\x7E\x38\x1C\x0E\x07\x03\x81\xC0\xE0\x7E\x38\x1C\x0E\x07\x03\x81\xF8\xE0\x7E\x38\x1C\x0E\x07\x03\xF1\xC0\xE0\x7E\x38\x1C\x0E\x07\x03\xF1\xF8\xE0\x7E\x38\x1C\x0E\x07\xE3\x81\xC0\xE0\x7E\x38\x1C\x0E\x07\xE3\x81\xF8\xE0\x7E\x38\x1C\x0E\x07\xE3\xF1\xC0\xE0\x7E\x38\x1C\x0E\x07\xE3\xF1\xF8\xE0\x7E\x38\x1C\x0F\xC7\x03\x81\xC0\xE0\x7E\x38\x1C\x0F\xC7\x03\x81\xF8\xE0\x7E\x38\x1C\x0F\xC7\x03\xF1\xC0\xE0\x7E\x38\x1C\x0F\xC7\x03\xF1\xF8\xE0\x7E\x38\x1C\x0F\xC7\xE3\x81\xC0\xE0\x7E\x38\x1C\x0F\xC7\xE3\x81\xF8\xE0\x7E\x38\x1C\x0F\xC7\xE3\xF1\xC0\xE0\x7E\x38\x1C\x0F\xC7\xE3\xF1\xF8\xE0\x7E\x38\x1F\x8E\x07\x03\x81\xC0\xE0\x7E\x38\x1F\x8E\x07\x03\x81\xF8\xE0\x7E\x38\x1F\x8E\x07\x03\xF1\xC0\xE0\x7E\x38\x1F\x8E\x07\x03\xF1\xF8\xE0\x7E\x38\x1F\x8E\x07\xE3\x81\xC0\xE0\x7E\x38\x1F\x8E\x07\xE3\x81\xF8\xE0\x7E\x38\x1F\x8E\x07\xE3\xF1\xC0\xE0\x7E\x38\x1F\x8E\x07\xE3\xF1\xF8\xE0\x7E\x38\x1F\x8F\xC7\x03\x81\xC0\xE0\x7E\x38\x1F\x8F\xC7\x03\x81\xF8\xE0\x7E\x38\x1F\x8F\xC7\x03\xF1\xC0\xE0\x7E\x38\x1F\x8F\xC7\x03\xF1\xF8\xE0\x7E\x38\x1F\x8F\xC7\xE3\x81\xC0\xE0\x7E\x38\x1F\x8F\xC7\xE3\x81\xF8\xE0\x7E\x38\x1F\x8F\xC7\xE3\xF1\xC0\xE0\x7E\x38\x1F\x8F\xC7\xE3\xF1\xF8\xE0\x7E\x3F\x1C\x0E\x07\x03\x81\xC0\xE0\x7E\x3F\x1C\x0E\x07\x03\x81\xF8\xE0\x7E\x3F\x1C\x0E\x07\x03\xF1\xC0\xE0\x7E\x3F\x1C\x0E\x07\x03\xF1\xF8\xE0\x7E\x3F\x1C\x0E\x07\xE3\x81\xC0\xE0\x7E\x3F\x1C\x0E\x07\xE3\x81\xF8\xE0\x7E\x3F\x1C\x0E\x07\xE3\xF1\xC0\xE0\x7E\x3F\x1C\x0E\x07\xE3\xF1\xF8\xE0\x7E\x3F\x1C\x0F\xC7\x03\x81\xC0\xE0\x7E\x3F\x1C\x0F\xC7\x03\x81\xF8\xE0\x7E\x3F\x1C\x0F\xC7\x03\xF1\xC0\xE0\x7E\x3F\x1C\x0F\xC7\x03\xF1\xF8\xE0\x7E\x3F\x1C\x0F\xC7\xE3\x81\xC0\xE0\x7E\x3F\x1C\x0F\xC7\xE3\x81\xF8\xE0\x7E\x3F\x1C\x0F\xC7\xE3\xF1\xC0\xE0\x7E\x3F\x1C\x0F\xC7\xE3\xF1\xF8\xE0\x7E\x3F\x1F\x8E\x07\x03\x81\xC0\xE0\x7E\x3F\x1F\x8E\x07\x03\x81\xF8\xE0\x7E\x3F\x1F\x8E\x07\x03\xF1\xC0\xE0\x7E\x3F\x1F\x8E\x07\x03\xF1\xF8\xE0\x7E\x3F\x1F\x8E\x07\xE3\x81\xC0\xE0\x7E\x3F\x1F\x8E\x07\xE3\x81\xF8\xE0\x7E\x3F\x1F\x8E\x07\xE3\xF1\xC0\xE0\x7E\x3F\x1F\x8E\x07\xE3\xF1\xF8\xE0\x7E\x3F\x1F\x8F\xC7\x03\x81\xC0\xE0\x7E\x3F\x1F\x8F\xC7\x03\x81\xF8\xE0\x7E\x3F\x1F\x8F\xC7\x03\xF1\xC0\xE0\x7E\x3F\x1F\x8F\xC7\x03\xF1\xF8\xE0\x7E\x3F\x1F\x8F\xC7\xE3\x81\xC0\xE0\x7E\x3F\x1F\x8F\xC7\xE3\x81\xF8\xE0\x7E\x3F\x1F\x8F\xC7\xE3\xF1\xC0\xE0\x7E\x3F\x1F\x8F\xC7\xE3\xF1\xF8\xFC\x70\x38\x1C\x0E\x07\x03\x81\xC0\xFC\x70\x38\x1C\x0E\x07\x03\x81\xF8\xFC\x70\x38\x1C\x0E\x07\x03\xF1\xC0\xFC\x70\x38\x1C\x0E\x07\x03\xF1\xF8\xFC\x70\x38\x1C\x0E\x07\xE3\x81\xC0\xFC\x70\x38\x1C\x0E\x07\xE3\x81\xF8\xFC\x70\x38\x1C\x0E\x07\xE3\xF1\xC0\xFC\x70\x38\x1C\x0E\x07\xE3\xF1\xF8\xFC\x70\x38\x1C\x0F\xC7\x03\x81\xC0\xFC\x70\x38\x1C\x0F\xC7\x03\x81\xF8\xFC\x70\x38\x1C\x0F\xC7\x03\xF1\xC0\xFC\x70\x38\x1C\x0F\xC7\x03\xF1\xF8\xFC\x70\x38\x1C\x0F\xC7\xE3\x81\xC0\xFC\x70\x38\x1C\x0F\xC7\xE3\x81\xF8\xFC\x70\x38\x1C\x0F\xC7\xE3\xF1\xC0\xFC\x70\x38\x1C\x0F\xC7\xE3\xF1\xF8\xFC\x70\x38\x1F\x8E\x07\x03\x81\xC0\xFC\x70\x38\x1F\x8E\x07\x03\x81\xF8\xFC\x70\x38\x1F\x8E\x07\x03\xF1\xC0\xFC\x70\x38\x1F\x8E\x07\x03\xF1\xF8\xFC\x70\x38\x1F\x8E\x07\xE3\x81\xC0\xFC\x70\x38\x1F\x8E\x07\xE3\x81\xF8\xFC\x70\x38\x1F\x8E\x07\xE3\xF1\xC0\xFC\x70\x38\x1F\x8E\x07\xE3\xF1\xF8\xFC\x70\x38\x1F\x8F\xC7\x03\x81\xC0\xFC\x70\x38\x1F\x8F\xC7\x03\x81\xF8\xFC\x70\x38\x1F\x8F\xC7\x03\xF1\xC0\xFC\x70\x38\x1F\x8F\xC7\x03\xF1\xF8\xFC\x70\x38\x1F\x8F\xC7\xE3\x81\xC0\xFC\x70\x38\x1F\x8F\xC7\xE3\x81\xF8\xFC\x70\x38\x1F\x8F\xC7\xE3\xF1\xC0\xFC\x70\x38\x1F\x8F\xC7\xE3\xF1\xF8\xFC\x70\x3F\x1C\x0E\x07\x03\x81\xC0\xFC\x70\x3F\x1C\x0E\x07\x03\x81\xF8\xFC\x70\x3F\x1C\x0E\x07\x03\xF1\xC0\xFC\x70\x3F\x1C\x0E\x07\x03\xF1\xF8\xFC\x70\x3F\x1C\x0E\x07\xE3\x81\xC0\xFC\x70\x3F\x1C\x0E\x07\xE3\x81\xF8\xFC\x70\x3F\x1C\x0E\x07\xE3\xF1\xC0\xFC\x70\x3F\x1C\x0E\x07\xE3\xF1\xF8\xFC\x70\x3F\x1C\x0F\xC7\x03\x81\xC0\xFC\x70\x3F\x1C\x0F\xC7\x03\x81\xF8\xFC\x70\x3F\x1C\x0F\xC7\x03\xF1\xC0\xFC\x70\x3F\x1C\x0F\xC7\x03\xF1\xF8\xFC\x70\x3F\x1C\x0F\xC7\xE3\x81\xC0\xFC\x70\x3F\x1C\x0F\xC7\xE3\x81\xF8\xFC\x70\x3F\x1C\x0F\xC7\xE3\xF1\xC0\xFC\x70\x3F\x1C\x0F\xC7\xE3\xF1\xF8\xFC\x70\x3F\x1F\x8E\x07\x03\x81\xC0\xFC\x70\x3F\x1F\x8E\x07\x03\x81\xF8\xFC\x70\x3F\x1F\x8E\x07\x03\xF1\xC0\xFC\x70\x3F\x1F\x8E\x07\x03\xF1\xF8\xFC\x70\x3F\x1F\x8E\x07\xE3\x81\xC0\xFC\x70\x3F\x1F\x8E\x07\xE3\x81\xF8\xFC\x70\x3F\x1F\x8E\x07\xE3\xF1\xC0\xFC\x70\x3F\x1F\x8E\x07\xE3\xF1\xF8\xFC\x70\x3F\x1F\x8F\xC7\x03\x81\xC0\xFC\x70\x3F\x1F\x8F\xC7\x03\x81\xF8\xFC\x70\x3F\x1F\x8F\xC7\x03\xF1\xC0\xFC\x70\x3F\x1F\x8F\xC7\x03\xF1\xF8\xFC\x70\x3F\x1F\x8F\xC7\xE3\x81\xC0\xFC\x70\x3F\x1F\x8F\xC7\xE3\x81\xF8\xFC\x70\x3F\x1F\x8F\xC7\xE3\xF1\xC0\xFC\x70\x3F\x1F\x8F\xC7\xE3\xF1\xF8\xFC\x7E\x38\x1C\x0E\x07\x03\x81\xC0\xFC\x7E\x38\x1C\x0E\x07\x03\x81\xF8\xFC\x7E\x38\x1C\x0E\x07\x03\xF1\xC0\xFC\x7E\x38\x1C\x0E\x07\x03\xF1\xF8\xFC\x7E\x38\x1C\x0E\x07\xE3\x81\xC0\xFC\x7E\x38\x1C\x0E\x07\xE3\x81\xF8\xFC\x7E\x38\x1C\x0E\x07\xE3\xF1\xC0\xFC\x7E\x38\x1C\x0E\x07\xE3\xF1\xF8\xFC\x7E\x38\x1C\x0F\xC7\x03\x81\xC0\xFC\x7E\x38\x1C\x0F\xC7\x03\x81\xF8\xFC\x7E\x38\x1C\x0F\xC7\x03\xF1\xC0\xFC\x7E\x38\x1C\x0F\xC7\x03\xF1\xF8\xFC\x7E\x38\x1C\x0F\xC7\xE3\x81\xC0\xFC\x7E\x38\x1C\x0F\xC7\xE3\x81\xF8\xFC\x7E\x38\x1C\x0F\xC7\xE3\xF1\xC0\xFC\x7E\x38\x1C\x0F\xC7\xE3\xF1\xF8\xFC\x7E\x38\x1F\x8E\x07\x03\x81\xC0\xFC\x7E\x38\x1F\x8E\x07\x03\x81\xF8\xFC\x7E\x38\x1F\x8E\x07\x03\xF1\xC0\xFC\x7E\x38\x1F\x8E\x07\x03\xF1\xF8\xFC\x7E\x38\x1F\x8E\x07\xE3\x81\xC0\xFC\x7E\x38\x1F\x8E\x07\xE3\x81\xF8\xFC\x7E\x38\x1F\x8E\x07\xE3\xF1\xC0\xFC\x7E\x38\x1F\x8E\x07\xE3\xF1\xF8\xFC\x7E\x38\x1F\x8F\xC7\x03\x81\xC0\xFC\x7E\x38\x1F\x8F\xC7\x03\x81\xF8\xFC\x7E\x38\x1F\x8F\xC7\x03\xF1\xC0\xFC\x7E\x38\x1F\x8F\xC7\x03\xF1\xF8\xFC\x7E\x38\x1F\x8F\xC7\xE3\x81\xC0\xFC\x7E\x38\x1F\x8F\xC7\xE3\x81\xF8\xFC\x7E\x38\x1F\x8F\xC7\xE3\xF1\xC0\xFC\x7E\x38\x1F\x8F\xC7\xE3\xF1\xF8\xFC\x7E\x3F\x1C\x0E\x07\x03\x81\xC0\xFC\x7E\x3F\x1C\x0E\x07\x03\x81\xF8\xFC\x7E\x3F\x1C\x0E\x07\x03\xF1\xC0\xFC\x7E\x3F\x1C\x0E\x07\x03\xF1\xF8\xFC\x7E\x3F\x1C\x0E\x07\xE3\x81\xC0\xFC\x7E\x3F\x1C\x0E\x07\xE3\x81\xF8\xFC\x7E\x3F\x1C\x0E\x07\xE3\xF1\xC0\xFC\x7E\x3F\x1C\x0E\x07\xE3\xF1\xF8\xFC\x7E\x3F\x1C\x0F\xC7\x03\x81\xC0\xFC\x7E\x3F\x1C\x0F\xC7\x03\x81\xF8\xFC\x7E\x3F\x1C\x0F\xC7\x03\xF1\xC0\xFC\x7E\x3F\x1C\x0F\xC7\x03\xF1\xF8\xFC\x7E\x3F\x1C\x0F\xC7\xE3\x81\xC0\xFC\x7E\x3F\x1C\x0F\xC7\xE3\x81\xF8\xFC\x7E\x3F\x1C\x0F\xC7\xE3\xF1\xC0\xFC\x7E\x3F\x1C\x0F\xC7\xE3\xF1\xF8\xFC\x7E\x3F\x1F\x8E\x07\x03\x81\xC0\xFC\x7E\x3F\x1F\x8E\x07\x03\x81\xF8\xFC\x7E\x3F\x1F\x8E\x07\x03\xF1\xC0\xFC\x7E\x3F\x1F\x8E\x07\x03\xF1\xF8\xFC\x7E\x3F\x1F\x8E\x07\xE3\x81\xC0\xFC\x7E\x3F\x1F\x8E\x07\xE3\x81\xF8\xFC\x7E\x3F\x1F\x8E\x07\xE3\xF1\xC0\xFC\x7E\x3F\x1F\x8E\x07\xE3\xF1\xF8\xFC\x7E\x3F\x1F\x8F\xC7\x03\x81\xC0\xFC\x7E\x3F\x1F\x8F\xC7\x03\x81\xF8\xFC\x7E\x3F\x1F\x8F\xC7\x03\xF1\xC0\xFC\x7E\x3F\x1F\x8F\xC7\x03\xF1\xF8\xFC\x7E\x3F\x1F\x8F\xC7\xE3\x81\xC0\xFC\x7E\x3F\x1F\x8F\xC7\xE3\x81\xF8\xFC\x7E\x3F\x1F\x8F\xC7\xE3\xF1\xC0\xFC\x7E\x3F\x1F\x8F\xC7\xE3\xF1\xF8";
imp.enableblinkup(false);
const clearString = "\xE0\x70\x38\x1C\x0E\x07\x03\x81\xC0\xE0\x70\x38\x1C\x0E\x07\x03\x81\xC0\xE0\x70\x38\x1C\x0E\x07\x03\x81\xC0";
class neoPixels
{
spi = null;
frameSize = null;
frame = null;
constructor(_spi, _frameSize)
{
this.spi = _spi;
this.frameSize = _frameSize;
this.frame = blob(frameSize*27 + 1);
clearFrame();
writeFrame();
}
function writePixel(p, color)
{
frame.seek(p*BYTESPERPIXEL);
local r = color[0] * BYTESPERCOLOR;
local g = color[1] * BYTESPERCOLOR;
local b = color[2] * BYTESPERCOLOR;
frame.writestring(bits.slice(g, g+BYTESPERCOLOR));
frame.writestring(bits.slice(r, r+BYTESPERCOLOR));
frame.writestring(bits.slice(b, b+BYTESPERCOLOR));
}
function clearFrame(color = null)
{
local colorString = clearString;
if (color)
{
colorString = blob(BYTESPERPIXEL);
local r = color[0] * BYTESPERCOLOR;
local g = color[1] * BYTESPERCOLOR;
local b = color[2] * BYTESPERCOLOR;
colorString.writestring(bits.slice(g, g+BYTESPERCOLOR));
colorString.writestring(bits.slice(r, r+BYTESPERCOLOR));
colorString.writestring(bits.slice(b, b+BYTESPERCOLOR));
}
frame.seek(0);
for (local p = 0; p < frameSize; p++) {
frame.writestring(colorString.tostring());
}
frame.writen(0x00,'c');
}
function writeFrame()
{
spi.write(frame);
}
}
RED <- [255,0,0];
const NUMPIXELS = 60;
const DELAY = 0.2;
// const DELAY = 1;
spi <- hardware.spi257;
spi.configure(MSB_FIRST, SPICLK);
pixelStrip <- neoPixels(spi, NUMPIXELS);
class Mode
{
constructor() { }
function draw()
{
pixelStrip.clearFrame();
update();
pixelStrip.writeFrame();
imp.wakeup(DELAY, setMode);
}
}
class Kitt extends Mode
{
length = null;
direction = 1;
offset = 0;
constructor(_length) { this.length = _length; }
function update()
{
if(offset+length == NUMPIXELS) direction = -1;
if(offset == 0) direction = 1;
for(local i = offset; i < offset+length; i++) {
pixelStrip.writePixel(i, RED);
}
offset = offset + direction;
if(offset == NUMPIXELS) offset = 0;
}
}
function setMode() { kitt.draw(); }
kitt <- Kitt(6);
setMode();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment