Compare commits

..

No commits in common. "master" and "struct-rain" have entirely different histories.

24 changed files with 249 additions and 1073 deletions

View File

@ -1,30 +1,11 @@
# lumagrid
Drives a 64x32 HUB75 panel using an Adafruit Matrix Portal S3.
Drives a 64x32 HUB75 panel using an ESP32.
## Applications
Currently plays Bad Apple!!
### nametag
Ideas:
Displays my name.
Upper button changes visibility level, lower button changes display style.
|Style|Description|Visibility 0|Visibility 1|Visibility 2|
|--|--|--|--|--|
|Rain|Matrix-style digital rain|No highlights|Overlay is highlighted|Highlights do not fade|
|38C3|38C3 themed font and background|Show only "38C3"|Show only "Panki"|Rotating text with name and DECT extension|
|Supercomputer|Inspired by a [BigClive video](https://www.youtube.com/watch?v=7f8jgvvJe-Q)|Red only|Rainbow, inverted name|Rainbow name, no background|
|Cyber|The classic CYBER Sticker|Static|Moving text|Moving text|
### gifplayer
Plays included GIF files. Buttons skip forward/backward.
### organism
Approximation of a Physarum (aka slime mold) transport network.
To learn more about this, read [this blog post](https://www.moll.dev/projects/physarum/) by Thomas Moll which helped a lot in getting started on this.
The original paper on which this is based on is titled "Pattern Formation and Evolution in Approximations of Physarum Transport Networks" by Jeff Jones and can be found [here](https://uwe-repository.worktribe.com/js/pdfjs/web/viewer.html?file=https://uwe-repository.worktribe.com/previewfile/980585/artl.2010.16.2.pdf).
CYBER Absperrband
Nyancat
Matrix Digital Rain

View File

@ -0,0 +1,184 @@
const uint8_t CaveatBrush_Regular9pt7bBitmaps[] PROGMEM = {
0x00, 0x25, 0xB6, 0xDB, 0x6D, 0x81, 0xD8, 0xDE, 0xF5, 0x29, 0x48, 0x06,
0x40, 0x4E, 0x0C, 0xC0, 0xDF, 0x0F, 0xC7, 0xD8, 0xF1, 0xE1, 0xFE, 0xFF,
0x0F, 0x30, 0x23, 0x06, 0x20, 0x62, 0x00, 0x10, 0x47, 0xF7, 0xDF, 0x5F,
0x1E, 0x3C, 0xBA, 0xFF, 0x78, 0x82, 0x00, 0x60, 0x03, 0x80, 0x34, 0x01,
0xB1, 0x8D, 0x98, 0x68, 0x83, 0x4C, 0x0C, 0xCC, 0x06, 0xF0, 0x66, 0x82,
0x24, 0x31, 0xA1, 0x0F, 0x08, 0x30, 0x18, 0x1E, 0x0B, 0x05, 0x83, 0x81,
0xD9, 0xED, 0xF6, 0xCF, 0x67, 0x33, 0xDF, 0xF7, 0x38, 0xFE, 0xA0, 0x3B,
0x99, 0xCE, 0x63, 0x18, 0xC6, 0x30, 0x86, 0x10, 0xC3, 0x30, 0x41, 0x86,
0x18, 0x61, 0xC7, 0x18, 0x61, 0x84, 0x33, 0x80, 0x30, 0x5F, 0xCE, 0xF1,
0x40, 0x10, 0x10, 0x10, 0xFE, 0xFF, 0x18, 0x18, 0x18, 0xFF, 0x80, 0xFF,
0xE0, 0xBD, 0x0C, 0x21, 0x86, 0x10, 0xC3, 0x08, 0x61, 0x84, 0x30, 0xC3,
0x08, 0x00, 0x3C, 0x3C, 0x7E, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6E,
0x7C, 0x3C, 0x08, 0x73, 0x9E, 0xF8, 0x61, 0x86, 0x18, 0x61, 0x86, 0x38,
0xF9, 0xDB, 0x34, 0xE3, 0x87, 0x1C, 0x70, 0xC3, 0xF3, 0xF0, 0x1C, 0xFD,
0xFA, 0x30, 0xE1, 0x8F, 0x1F, 0x06, 0x0F, 0xF7, 0xE7, 0x00, 0x0E, 0x0F,
0x07, 0x86, 0xC7, 0x63, 0x23, 0xBD, 0xFF, 0xFC, 0x76, 0x03, 0x01, 0x80,
0xC0, 0x7E, 0x7F, 0x60, 0x60, 0x7C, 0xFE, 0x03, 0x07, 0x1E, 0x7C, 0xF8,
0x40, 0x0C, 0x1C, 0x38, 0x38, 0x30, 0x7E, 0x7F, 0x73, 0x67, 0xE6, 0x6E,
0x78, 0x10, 0xFD, 0xFD, 0xF8, 0xE1, 0x87, 0x0C, 0x18, 0x70, 0xC1, 0x83,
0x00, 0x1C, 0x3E, 0x72, 0x72, 0x36, 0x3C, 0x1C, 0x3E, 0x6E, 0x67, 0xE7,
0x47, 0x6E, 0x3C, 0x1E, 0x3E, 0x77, 0x67, 0xE7, 0xEF, 0xFE, 0x76, 0x0E,
0x0E, 0x0C, 0x1C, 0x08, 0xFC, 0x2F, 0xC0, 0xFC, 0x0F, 0xF8, 0x0E, 0x38,
0xE7, 0x06, 0x06, 0x06, 0x06, 0xFF, 0xE0, 0x00, 0xEF, 0xE0, 0xE0, 0xE0,
0xE0, 0x70, 0xE3, 0x0C, 0x30, 0x11, 0xF6, 0xF3, 0xDC, 0x63, 0x8C, 0x71,
0x80, 0x00, 0x61, 0x80, 0x03, 0x01, 0xF0, 0x71, 0x18, 0x33, 0x72, 0xDB,
0xDA, 0xDA, 0x56, 0xDD, 0xD9, 0x81, 0x00, 0x21, 0x83, 0xF0, 0x3C, 0x00,
0x1C, 0x1C, 0x3E, 0x36, 0x36, 0x66, 0x7E, 0x7E, 0x66, 0x67, 0xE3, 0xE3,
0x71, 0xFB, 0xB6, 0x2C, 0xDB, 0x3F, 0x63, 0xC7, 0x8F, 0x3F, 0xE7, 0x80,
0x38, 0xFB, 0xBF, 0x6C, 0xD8, 0x30, 0x60, 0xC1, 0x83, 0xB3, 0xE3, 0x80,
0x7C, 0xFE, 0xF7, 0x73, 0x63, 0x63, 0x63, 0x63, 0x66, 0x66, 0x7C, 0x78,
0x20, 0x7D, 0xE6, 0x38, 0xE3, 0x2F, 0xB8, 0xC3, 0x0C, 0x3F, 0x78, 0x0E,
0xFF, 0xE0, 0x60, 0x60, 0x7C, 0xFC, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
0x3E, 0x7A, 0x60, 0xE0, 0xC2, 0xCE, 0xCB, 0xC3, 0xC7, 0xEE, 0xFE, 0x16,
0x06, 0xE1, 0xE3, 0xE3, 0xE3, 0xC3, 0xFF, 0xFB, 0xC7, 0xC6, 0xC6, 0xE7,
0x43, 0x08, 0xFD, 0xE0, 0xC3, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC3, 0xEF,
0x80, 0x1E, 0xFC, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0D, 0x99, 0x33, 0xC1,
0x00, 0x60, 0x67, 0x66, 0x6C, 0xF8, 0xF0, 0xF0, 0xF0, 0xF8, 0xDC, 0xCE,
0xCF, 0xC0, 0x63, 0x39, 0x8C, 0x63, 0x18, 0xC6, 0x76, 0xF0, 0x00, 0x0C,
0x77, 0x1D, 0xC7, 0x71, 0xDE, 0xFF, 0xBF, 0x6F, 0xDF, 0xF7, 0xBD, 0xCF,
0x33, 0x40, 0x40, 0x63, 0x63, 0xF3, 0xF3, 0xF2, 0xF2, 0xDA, 0xDA, 0xDE,
0xDE, 0xCE, 0xC6, 0x38, 0xF9, 0xB7, 0x7C, 0xF8, 0xF1, 0xE3, 0xC7, 0x8F,
0x37, 0xE7, 0x80, 0x7C, 0xFE, 0x31, 0x31, 0x31, 0x33, 0x37, 0x3E, 0x7C,
0x30, 0x30, 0x30, 0x10, 0x10, 0x3C, 0x7C, 0x66, 0xE6, 0xE6, 0xE6, 0xC6,
0xC6, 0xC6, 0xD4, 0xDC, 0x7C, 0x06, 0x03, 0x7C, 0xFE, 0x62, 0x66, 0xDC,
0xF8, 0xF0, 0xD8, 0xD8, 0xDC, 0xCE, 0xC3, 0x3C, 0x7D, 0xBB, 0x36, 0x4E,
0x0E, 0x0E, 0x0E, 0x8F, 0x9B, 0xF3, 0xC0, 0x03, 0x8F, 0xFF, 0x01, 0x80,
0xC0, 0x60, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x80, 0xE2, 0xE6,
0xE6, 0xC6, 0xC6, 0xC6, 0xCE, 0xCE, 0xCE, 0xDE, 0xFE, 0x76, 0x00, 0x01,
0xB1, 0xD8, 0xCC, 0x66, 0x33, 0x11, 0x98, 0xEC, 0x34, 0x1E, 0x0F, 0x07,
0x81, 0x80, 0x66, 0xF9, 0xBE, 0x6F, 0x9B, 0xE6, 0xF3, 0xBC, 0xEF, 0x7F,
0xDF, 0xBD, 0xEF, 0x31, 0x80, 0x61, 0xB1, 0xCC, 0xC6, 0xE1, 0xE0, 0xE0,
0x70, 0x78, 0x36, 0x3B, 0x39, 0xCC, 0x60, 0x66, 0x66, 0x66, 0x67, 0x67,
0x76, 0x36, 0x3E, 0x0E, 0x0E, 0xCC, 0x7C, 0x38, 0x7F, 0xBF, 0xC1, 0xC0,
0xC0, 0xE0, 0xE0, 0x60, 0x60, 0x70, 0x30, 0xBF, 0xDF, 0x84, 0x00, 0x79,
0xF6, 0x10, 0x41, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x1E, 0x7C,
0x83, 0x0C, 0x18, 0x60, 0x83, 0x0C, 0x10, 0x61, 0x86, 0x08, 0x30, 0xC0,
0xF9, 0xE0, 0x82, 0x0C, 0x20, 0x82, 0x08, 0x20, 0x82, 0x18, 0x61, 0xBE,
0x78, 0x00, 0x63, 0x9F, 0x4E, 0x30, 0x40, 0xFF, 0xFF, 0xE0, 0xC6, 0x30,
0x79, 0xF3, 0x66, 0xCD, 0xDB, 0xBF, 0x33, 0x43, 0x0C, 0x30, 0xC3, 0x0F,
0xFB, 0xEF, 0x3C, 0xF3, 0xDB, 0xC0, 0x77, 0xB7, 0xBC, 0x67, 0xCE, 0x0C,
0x30, 0xC3, 0x0D, 0xFF, 0xF7, 0xDF, 0x7D, 0xF7, 0xFF, 0xB0, 0x00, 0x73,
0xF7, 0xBF, 0x7B, 0x3F, 0x70, 0x1E, 0x3C, 0xC1, 0x83, 0x1F, 0xBF, 0x38,
0x70, 0xE1, 0xC3, 0x87, 0x06, 0x00, 0x7F, 0xF7, 0xBD, 0xED, 0xE3, 0x18,
0xFC, 0xE0, 0xC3, 0x0C, 0x30, 0xC3, 0x6D, 0xFF, 0xEB, 0xAE, 0xB2, 0xDB,
0x30, 0xF4, 0xBF, 0xFD, 0x0C, 0x70, 0x80, 0x00, 0x61, 0x86, 0x18, 0x61,
0x86, 0x18, 0x6B, 0x3C, 0x00, 0x41, 0x83, 0x06, 0x0C, 0x59, 0xB6, 0x7C,
0xE1, 0xE3, 0xE6, 0xF4, 0x00, 0x6B, 0x6D, 0xB6, 0xDB, 0x64, 0xC0, 0x6D,
0xBF, 0xDD, 0xEE, 0xD7, 0x6B, 0xB6, 0x93, 0xC9, 0xBB, 0xF7, 0xEE, 0xDD,
0xB3, 0x66, 0x77, 0xF7, 0xBC, 0xEF, 0xEE, 0x01, 0x0D, 0xFF, 0xEF, 0x3C,
0xB6, 0xF3, 0x0C, 0x30, 0xC1, 0x00, 0x71, 0xF3, 0x36, 0xE9, 0xD7, 0xBB,
0x16, 0x0C, 0x18, 0x38, 0x60, 0x46, 0xFD, 0xCC, 0x63, 0x18, 0x40, 0x67,
0xB7, 0x86, 0x1A, 0x52, 0xF0, 0x10, 0x30, 0x61, 0xCF, 0xE6, 0x0C, 0x18,
0x30, 0x60, 0xC1, 0x81, 0x00, 0x4F, 0xBC, 0xF7, 0xDF, 0x7F, 0xD9, 0x8E,
0x39, 0xB6, 0xDB, 0xCF, 0x3C, 0x70, 0x80, 0xD3, 0xDB, 0xDA, 0xDA, 0xDE,
0xFE, 0x7E, 0x20, 0x64, 0xFC, 0xE1, 0x87, 0x8F, 0x13, 0x66, 0x04, 0x4E,
0xF7, 0xBD, 0xEF, 0xFD, 0x18, 0xFE, 0xE0, 0x7C, 0xF8, 0x38, 0xE7, 0x0C,
0x30, 0xBF, 0x70, 0x10, 0xF3, 0xCC, 0x30, 0xC3, 0x0C, 0x30, 0xCE, 0x0C,
0x30, 0xC7, 0x1C, 0x30, 0x70, 0x55, 0x7F, 0xFF, 0xF4, 0x61, 0x8C, 0x63,
0x18, 0xC4, 0x31, 0xCC, 0x63, 0x18, 0xC6, 0xE0, 0xE3, 0xFC, 0x38 };
const GFXglyph CaveatBrush_Regular9pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 4, 0, 0 }, // 0x20 ' '
{ 1, 3, 15, 4, 0, -13 }, // 0x21 '!'
{ 7, 5, 6, 6, 1, -12 }, // 0x22 '"'
{ 11, 12, 13, 10, -1, -11 }, // 0x23 '#'
{ 31, 6, 15, 8, 1, -12 }, // 0x24 '$'
{ 43, 13, 14, 14, 1, -12 }, // 0x25 '%'
{ 66, 9, 13, 9, 0, -11 }, // 0x26 '&'
{ 81, 2, 6, 3, 1, -12 }, // 0x27 '''
{ 83, 5, 16, 5, 1, -13 }, // 0x28 '('
{ 93, 6, 14, 5, -1, -12 }, // 0x29 ')'
{ 104, 6, 6, 7, 0, -12 }, // 0x2A '*'
{ 109, 8, 8, 9, 1, -8 }, // 0x2B '+'
{ 117, 2, 5, 4, 1, -1 }, // 0x2C ','
{ 119, 6, 2, 7, 1, -4 }, // 0x2D '-'
{ 121, 2, 4, 4, 1, -2 }, // 0x2E '.'
{ 122, 6, 15, 5, 0, -11 }, // 0x2F '/'
{ 134, 8, 12, 8, 0, -11 }, // 0x30 '0'
{ 146, 6, 12, 6, 0, -11 }, // 0x31 '1'
{ 155, 7, 12, 7, 0, -11 }, // 0x32 '2'
{ 166, 7, 13, 8, 0, -11 }, // 0x33 '3'
{ 178, 9, 13, 8, 0, -11 }, // 0x34 '4'
{ 193, 8, 12, 8, 0, -11 }, // 0x35 '5'
{ 205, 8, 13, 8, 0, -11 }, // 0x36 '6'
{ 218, 7, 12, 7, 0, -11 }, // 0x37 '7'
{ 229, 8, 14, 8, 0, -12 }, // 0x38 '8'
{ 243, 8, 13, 8, 0, -11 }, // 0x39 '9'
{ 256, 2, 9, 4, 1, -7 }, // 0x3A ':'
{ 259, 2, 11, 4, 1, -7 }, // 0x3B ';'
{ 262, 7, 8, 9, 1, -8 }, // 0x3C '<'
{ 269, 7, 5, 7, 0, -5 }, // 0x3D '='
{ 274, 7, 8, 9, 1, -8 }, // 0x3E '>'
{ 281, 6, 14, 8, 1, -12 }, // 0x3F '?'
{ 292, 11, 14, 12, 0, -10 }, // 0x40 '@'
{ 312, 8, 12, 8, 0, -11 }, // 0x41 'A'
{ 324, 7, 13, 9, 1, -11 }, // 0x42 'B'
{ 336, 7, 13, 8, 1, -11 }, // 0x43 'C'
{ 348, 8, 13, 10, 1, -11 }, // 0x44 'D'
{ 361, 6, 13, 7, 1, -11 }, // 0x45 'E'
{ 371, 8, 13, 8, 1, -11 }, // 0x46 'F'
{ 384, 8, 13, 9, 1, -10 }, // 0x47 'G'
{ 397, 8, 12, 10, 1, -12 }, // 0x48 'H'
{ 409, 7, 13, 7, 0, -11 }, // 0x49 'I'
{ 421, 7, 13, 7, 0, -12 }, // 0x4A 'J'
{ 433, 8, 13, 9, 1, -11 }, // 0x4B 'K'
{ 446, 5, 12, 7, 1, -11 }, // 0x4C 'L'
{ 454, 10, 13, 12, 1, -11 }, // 0x4D 'M'
{ 471, 8, 12, 10, 1, -11 }, // 0x4E 'N'
{ 483, 7, 13, 9, 1, -11 }, // 0x4F 'O'
{ 495, 8, 14, 8, 0, -12 }, // 0x50 'P'
{ 509, 8, 14, 9, 1, -11 }, // 0x51 'Q'
{ 523, 8, 12, 9, 1, -11 }, // 0x52 'R'
{ 535, 7, 13, 8, 0, -11 }, // 0x53 'S'
{ 547, 9, 13, 9, 0, -12 }, // 0x54 'T'
{ 562, 8, 13, 9, 1, -11 }, // 0x55 'U'
{ 575, 9, 13, 9, 0, -12 }, // 0x56 'V'
{ 590, 10, 12, 12, 1, -10 }, // 0x57 'W'
{ 605, 9, 12, 9, 0, -12 }, // 0x58 'X'
{ 619, 8, 13, 8, 0, -11 }, // 0x59 'Y'
{ 632, 9, 13, 9, 0, -11 }, // 0x5A 'Z'
{ 647, 6, 17, 5, 1, -13 }, // 0x5B '['
{ 660, 6, 15, 5, 0, -11 }, // 0x5C '\'
{ 672, 6, 17, 5, -1, -12 }, // 0x5D ']'
{ 685, 6, 7, 9, 1, -12 }, // 0x5E '^'
{ 691, 10, 2, 12, 1, 2 }, // 0x5F '_'
{ 694, 4, 3, 6, 1, -12 }, // 0x60 '`'
{ 696, 7, 8, 8, 1, -7 }, // 0x61 'a'
{ 703, 6, 14, 8, 1, -12 }, // 0x62 'b'
{ 714, 5, 8, 6, 1, -7 }, // 0x63 'c'
{ 719, 6, 15, 8, 1, -12 }, // 0x64 'd'
{ 731, 5, 9, 7, 1, -7 }, // 0x65 'e'
{ 737, 7, 14, 6, 0, -12 }, // 0x66 'f'
{ 750, 5, 12, 7, 1, -7 }, // 0x67 'g'
{ 758, 6, 14, 8, 1, -12 }, // 0x68 'h'
{ 769, 2, 12, 4, 1, -11 }, // 0x69 'i'
{ 772, 6, 17, 4, -2, -11 }, // 0x6A 'j'
{ 785, 7, 13, 7, 1, -12 }, // 0x6B 'k'
{ 797, 3, 13, 4, 1, -11 }, // 0x6C 'l'
{ 802, 9, 8, 11, 1, -7 }, // 0x6D 'm'
{ 811, 7, 8, 8, 1, -7 }, // 0x6E 'n'
{ 818, 5, 8, 7, 1, -7 }, // 0x6F 'o'
{ 823, 6, 14, 8, 1, -8 }, // 0x70 'p'
{ 834, 7, 12, 8, 1, -7 }, // 0x71 'q'
{ 845, 5, 9, 6, 1, -7 }, // 0x72 'r'
{ 851, 5, 9, 6, 1, -7 }, // 0x73 's'
{ 857, 7, 13, 6, 0, -11 }, // 0x74 't'
{ 869, 6, 8, 8, 1, -7 }, // 0x75 'u'
{ 875, 6, 9, 7, 1, -7 }, // 0x76 'v'
{ 882, 8, 9, 9, 1, -7 }, // 0x77 'w'
{ 891, 7, 9, 7, 0, -7 }, // 0x78 'x'
{ 899, 5, 12, 7, 1, -7 }, // 0x79 'y'
{ 907, 7, 9, 7, 0, -7 }, // 0x7A 'z'
{ 915, 6, 18, 5, 0, -13 }, // 0x7B '{'
{ 929, 2, 15, 5, 1, -11 }, // 0x7C '|'
{ 933, 5, 17, 5, 0, -13 }, // 0x7D '}'
{ 944, 7, 3, 9, 1, -6 } }; // 0x7E '~'
const GFXfont CaveatBrush_Regular9pt7b PROGMEM = {
(uint8_t *)CaveatBrush_Regular9pt7bBitmaps,
(GFXglyph *)CaveatBrush_Regular9pt7bGlyphs,
0x20, 0x7E, 22 };
// Approx. 1619 bytes

View File

@ -1,26 +0,0 @@
#include <Arduino.h>
#include "constants.h"
#include "enums.h"
#include "cyber.h"
#include "stalker111pt7b.h"
int default_x = 5;
int default_y = 22;
int offset = 0;
void draw_cyber(MatrixPanel_I2S_DMA *matrix, Mode mode) {
matrix->fillScreenRGB888(255, 255, 0);
matrix->setFont(&stalker111pt7b);
matrix->setTextColor(matrix->color444(0, 0, 1));
if (mode == Stealth) {
matrix->setCursor(default_x, default_y);
} else {
matrix->setCursor(default_x - offset, default_y);
offset++;
}
matrix->print("CYBER CYBER");
if (offset == 59) {
offset = 0;
}
}

View File

@ -1,3 +0,0 @@
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include "enums.h"
void draw_cyber(MatrixPanel_I2S_DMA *matrix, Mode mode);

View File

@ -8,8 +8,6 @@ enum Mode {
enum DisplayStyle {
Rain,
Congress,
Supercomputer,
Cyber
Congress
};
#endif

View File

@ -6,15 +6,13 @@
#include "constants.h"
#include "congress.h"
#include "rain.h"
#include "supercomputer.h"
#include "cyber.h"
#include "pillowlava8pt7b.h"
MatrixPanel_I2S_DMA *matrix = nullptr;
Mode mode = HighVis;
DisplayStyle style = Supercomputer;
DisplayStyle style = Congress;
void setup(){
pinMode(ONBOARD_LED, OUTPUT);
@ -38,7 +36,6 @@ void setup(){
matrix->begin();
matrix->setBrightness8(64);
matrix->fillScreenRGB888(0, 0, 0);
matrix->setTextWrap(false);
matrix->setFont(&Pilowlava_Regular8pt7b);
}
@ -66,21 +63,14 @@ void loop() {
switch(style) {
case Rain:
style = Congress;
matrix->setFont(&Pilowlava_Regular8pt7b);
break;
case Congress:
style = Supercomputer;
break;
case Supercomputer:
style = Cyber;
break;
case Cyber:
style = Rain;
break;
}
while(!digitalRead(NEXT_BUTTON)); // Wait for release
}
switch(style) {
case Rain:
draw_rain(matrix, mode);
@ -88,12 +78,6 @@ void loop() {
case Congress:
draw_congress(matrix, mode);
break;
case Supercomputer:
draw_supercomputer(matrix, mode);
break;
case Cyber:
draw_cyber(matrix, mode);
break;
}
}

View File

@ -1,114 +1,87 @@
#include "rain.h"
#include "constants.h"
#include "overlay.h"
#include <vector>
#define COLOR_HIGHLIGHT_R 128
#define COLOR_HIGHLIGHT_G 255
#define COLOR_HIGHLIGHT_B 128
#define COLOR_DEFAULT_R 0
#define COLOR_DEFAULT_G 255
#define COLOR_DEFAULT_B 0
//typedef struct {
struct Raindrop {
//bool reached_bottom = false;
bool reached_bottom;
int x;
typedef struct {
bool reached_bottom = false;
int y;
int length;
int speed;
unsigned long last_moved;
} ;
} Raindrop;
Raindrop raindrops[PANEL_WIDTH];
bool rain_initialized = false;
uint16_t color_highlight;
uint16_t color_default;
std::vector<Raindrop> raindrops;
void setup_rain(MatrixPanel_I2S_DMA *matrix) {
color_highlight = matrix->color565(
COLOR_HIGHLIGHT_R,
COLOR_HIGHLIGHT_G,
COLOR_HIGHLIGHT_B
);
color_default = matrix->color565(
COLOR_DEFAULT_R,
COLOR_DEFAULT_B,
COLOR_DEFAULT_G
);
for (int x = 0; x<PANEL_WIDTH; x++) {
raindrops.push_back({
false,
x,
0 - random(24),
random(20, 28),
random(25, 100),
millis()
});
void setup_rain() {
for (int i = 0; i<PANEL_WIDTH; i++) {
raindrops[i].y = 0 - random(24);
raindrops[i].length = random(20, 28);
raindrops[i].speed = random(25, 100);
raindrops[i].last_moved = millis();
}
}
void draw_rain(MatrixPanel_I2S_DMA *matrix, Mode mode) {
//matrix ->drawBitmap(0, 0, overlay, 64, 32, matrix->color565(64, 0, 0));
if (!rain_initialized) {
setup_rain(matrix);
setup_rain();
rain_initialized = true;
}
unsigned long timestamp = millis();
int r = 0;
while(r < raindrops.size()) {
if ((timestamp - raindrops[r].last_moved) > raindrops[r].speed) {
for (int x = 0; x < PANEL_WIDTH; x++) {
if ((timestamp - raindrops[x].last_moved) > raindrops[x].speed) {
// step down a pixel
raindrops[r].y++;
raindrops[r].last_moved = timestamp;
raindrops[x].y++;
raindrops[x].last_moved = timestamp;
}
if (raindrops[r].y > PANEL_HEIGHT + raindrops[r].length) {
raindrops.push_back({
false,
raindrops[r].x,
0 - random(8),
random(20, 28),
random(0, 76),
millis()
});
raindrops.erase(raindrops.begin() + r);
continue;
}
if (raindrops[r].y >= 0) {
if (raindrops[x].y > PANEL_HEIGHT) {
raindrops[x].y = 0;
raindrops[x].reached_bottom = true;
}
if (raindrops[x].y >= 0) {
//draw our pixel
matrix->drawPixel(raindrops[r].x, raindrops[r].y, matrix->color565(128, 255, 128));
matrix->drawPixel(x, raindrops[x].y, matrix->color565(128, 255, 128));
// draw our trail
for (int trail_offset = 1; trail_offset < raindrops[r].length; trail_offset++) {
int trail_y = raindrops[r].y - trail_offset;
float brightness = ((raindrops[r].length - trail_offset) / (float)raindrops[r].length);
uint16_t fade_color = matrix->color565(
COLOR_DEFAULT_R * brightness,
COLOR_DEFAULT_G * brightness,
COLOR_DEFAULT_B * brightness
);
if (trail_y < 0) {
break;
}
int pixel_num = (trail_y * PANEL_WIDTH) + raindrops[r].x;
if (overlay[pixel_num / 8] & (1 << (7 - (pixel_num % 8))) and mode != Stealth) {
if (mode == HighVis) {
matrix->drawPixel(raindrops[r].x, trail_y, color_highlight);
for (int trail_offset = 1; trail_offset < raindrops[x].length; trail_offset++) {
int trail_y = raindrops[x].y - trail_offset;
if (trail_y >= 0) {
int pixel_num = (trail_y * PANEL_WIDTH) + x;
if (overlay[ pixel_num / 8 ] & (1 << (7 - (pixel_num % 8)) ) and mode != Stealth) {
if (mode == HighVis) {
matrix->drawPixel(x, trail_y, matrix->color565(128, 255, 128));
} else {
matrix->drawPixel(x, trail_y, matrix->color565(
(128 / raindrops[x].length) * (raindrops[x].length - trail_offset),
(255 / raindrops[x].length) * (raindrops[x].length - trail_offset),
(128 / raindrops[x].length) * (raindrops[x].length - trail_offset))
);
}
} else {
matrix->drawPixel(raindrops[r].x, trail_y, matrix->color565(
COLOR_HIGHLIGHT_R * brightness,
COLOR_HIGHLIGHT_G * brightness,
COLOR_HIGHLIGHT_B * brightness
));
matrix->drawPixel(x, trail_y, matrix->color565(0, (255 / raindrops[x].length) * (raindrops[x].length - trail_offset), 0));
}
} else if (raindrops[x].reached_bottom) {
int pixel_num = ((PANEL_HEIGHT + trail_y) * PANEL_WIDTH) + x;
if (raindrops[x].y >= 0) {
if (overlay[ pixel_num / 8 ] & (1 << (7 - (pixel_num % 8)) ) and mode != Stealth) {
if (mode == HighVis) {
matrix->drawPixel(x, PANEL_HEIGHT + trail_y, matrix->color565(128, 255, 128));
} else {
matrix->drawPixel(x, PANEL_HEIGHT + trail_y, matrix->color565(
(128 / raindrops[x].length) * (raindrops[x].length - trail_offset),
(255 / raindrops[x].length) * (raindrops[x].length - trail_offset),
(128 / raindrops[x].length) * (raindrops[x].length - trail_offset))
);
}
} else {
matrix->drawPixel(x, PANEL_HEIGHT + trail_y, matrix->color565(0,(255 / raindrops[x].length) * (raindrops[x].length - trail_offset), 0));
}
} else {
break;
}
} else {
matrix->drawPixel(raindrops[r].x, trail_y, fade_color);
}
}
}
r++;
}
}

View File

@ -1,210 +0,0 @@
const uint8_t stalker111pt7bBitmaps[] PROGMEM = {
0x00, 0xFF, 0xF6, 0xDB, 0x00, 0x06, 0xC0, 0xFF, 0xFF, 0xF8, 0xFC, 0x76,
0x33, 0x19, 0x84, 0x36, 0x1B, 0x0D, 0x9F, 0xFF, 0xF9, 0xB3, 0xFF, 0xFF,
0x36, 0x1B, 0x0D, 0x86, 0xC0, 0x18, 0x0C, 0x06, 0x1F, 0xFF, 0xFE, 0x03,
0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xE1, 0x80, 0xC0, 0x60, 0xF0, 0x78, 0x7C,
0x60, 0x70, 0x70, 0x70, 0x30, 0x30, 0x38, 0x38, 0x18, 0x18, 0xF0, 0x78,
0x3C, 0x00, 0xFE, 0xEE, 0xEC, 0x40, 0x37, 0x6E, 0xCC, 0xCC, 0xCC, 0xE6,
0x33, 0xCC, 0x67, 0x33, 0x33, 0x33, 0x76, 0xCC, 0x0C, 0x26, 0x1B, 0xEF,
0xE3, 0xE0, 0xE0, 0xF9, 0xFF, 0x4D, 0x86, 0x03, 0x00, 0x0C, 0x03, 0x00,
0xC3, 0xFF, 0xFF, 0xC3, 0x00, 0xC0, 0x30, 0xFD, 0xB6, 0xC0, 0xFF, 0xFF,
0xFF, 0xF0, 0x00, 0x80, 0xC0, 0xE0, 0x60, 0x70, 0x30, 0x30, 0x38, 0x18,
0x18, 0x1C, 0x0C, 0x0E, 0x06, 0x00, 0xFF, 0xFF, 0xF0, 0x78, 0x3C, 0x1E,
0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xFF, 0xFC, 0xFC, 0x7E,
0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0D, 0x86, 0xC3, 0x61, 0xBF,
0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0x60, 0x30, 0x18, 0x0D, 0xFF, 0xFF, 0xC0,
0x60, 0x30, 0x18, 0x0F, 0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0x60, 0x30, 0x18,
0x0C, 0xFE, 0x7F, 0x01, 0x80, 0xC0, 0x60, 0x3F, 0xFF, 0xFC, 0xC0, 0xC6,
0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFF, 0xFF, 0x06, 0x06, 0x06, 0x06, 0x06,
0x3F, 0x9F, 0xCC, 0x06, 0x03, 0x01, 0x80, 0xFE, 0x7F, 0x01, 0x80, 0xC0,
0x60, 0x3F, 0xFB, 0xFC, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01,
0xFF, 0xFF, 0xE0, 0xF0, 0x78, 0x3F, 0xFF, 0xFC, 0xFF, 0xFF, 0xC0, 0x60,
0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60,
0x3E, 0x1F, 0x0D, 0x86, 0xC3, 0x61, 0xB1, 0xFD, 0xFF, 0xC1, 0xE0, 0xF0,
0x78, 0x3F, 0xFB, 0xF8, 0xFF, 0xFF, 0xF0, 0x78, 0x3C, 0x1F, 0xFF, 0xFE,
0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0xFF, 0xF0, 0x00, 0x0F,
0xFF, 0xF7, 0xBC, 0x00, 0x03, 0xFF, 0x18, 0xC6, 0x30, 0x01, 0x83, 0xC3,
0x87, 0x8F, 0x07, 0x03, 0xC0, 0x78, 0x0F, 0x03, 0xC0, 0x60, 0xFF, 0xFF,
0xC0, 0x00, 0x0F, 0xFF, 0xFC, 0xC0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0C,
0x1E, 0x3E, 0x3C, 0x78, 0x30, 0x00, 0x06, 0x07, 0x87, 0x67, 0x3F, 0x3E,
0x38, 0x38, 0x38, 0x30, 0x18, 0x0C, 0x00, 0x03, 0x01, 0x80, 0x7F, 0x7F,
0xF0, 0x60, 0x30, 0x1B, 0xEF, 0xF7, 0x9B, 0xCD, 0xE6, 0xF3, 0x79, 0xBF,
0xFB, 0xB8, 0x08, 0x0E, 0x07, 0x03, 0x81, 0xE1, 0xB0, 0xD8, 0x66, 0x63,
0x3F, 0x9F, 0xDC, 0x3C, 0x1E, 0x0C, 0xFE, 0x7F, 0xB0, 0xF8, 0x3C, 0x1E,
0x1F, 0xFD, 0xFE, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xF7, 0xF8, 0x1F, 0x9F,
0xCC, 0x0C, 0x06, 0x06, 0x03, 0x01, 0x80, 0xE0, 0x30, 0x0C, 0x06, 0x01,
0xF8, 0xFC, 0xFC, 0x7F, 0x0D, 0xC6, 0x63, 0x39, 0x8C, 0xC6, 0x63, 0x31,
0x99, 0x8C, 0xC6, 0xCF, 0xE7, 0xE0, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x06,
0x03, 0xE1, 0xF0, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xFF, 0xFC, 0xFF, 0xFF,
0xF0, 0x18, 0x0F, 0xE7, 0xF3, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C,
0x06, 0x00, 0x1F, 0x8F, 0xCC, 0x0C, 0x0E, 0x06, 0x03, 0x01, 0x9F, 0xCF,
0xE0, 0xF0, 0x78, 0x3F, 0xFB, 0xF8, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E,
0x0F, 0xFF, 0xFF, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0C, 0xFF, 0xFF,
0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0,
0x30, 0xFF, 0xFF, 0xF0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0xE3, 0xC7,
0x8F, 0x1E, 0x3F, 0xE7, 0x80, 0xC1, 0xE1, 0xF1, 0xD9, 0x8D, 0x87, 0x83,
0x81, 0xE0, 0xF8, 0x6E, 0x33, 0x98, 0xEC, 0x3E, 0x0C, 0xC0, 0x60, 0x30,
0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xFF,
0xFC, 0xE3, 0xF1, 0xFD, 0xFB, 0xFD, 0xDE, 0x4F, 0x07, 0x83, 0xC1, 0xE0,
0xF0, 0x78, 0x3C, 0x1E, 0x0C, 0xC1, 0xF0, 0xF8, 0x7E, 0x3F, 0x1E, 0xCF,
0x67, 0x9B, 0xCD, 0xE7, 0xF1, 0xF8, 0xFC, 0x3E, 0x1C, 0x1E, 0x1F, 0x0D,
0xCC, 0x66, 0x3E, 0x0F, 0x07, 0x83, 0xE1, 0xB1, 0x9C, 0xC6, 0xC1, 0xE0,
0xE0, 0xFF, 0x7F, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0xFF, 0xFF, 0x60,
0x30, 0x18, 0x0C, 0x06, 0x00, 0x07, 0x07, 0xC7, 0x67, 0x37, 0x1E, 0x0F,
0x07, 0x83, 0xCD, 0xE7, 0xB3, 0x9B, 0xCF, 0xFB, 0x9C, 0xFF, 0x7F, 0xF0,
0x78, 0x3C, 0x1F, 0xFF, 0xFD, 0xB8, 0xCC, 0x67, 0x31, 0xD8, 0x6C, 0x1E,
0x0C, 0x7F, 0x7F, 0xF8, 0x6C, 0x03, 0x01, 0xC0, 0x70, 0x18, 0x06, 0x01,
0x80, 0xF8, 0x3F, 0xFB, 0xF8, 0xFF, 0xFF, 0xF3, 0x61, 0x80, 0xC0, 0x60,
0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0xC1, 0xE0, 0xF0,
0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3F, 0xFB,
0xF8, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1F, 0x19, 0x8C, 0xCE, 0x36, 0x1B,
0x0F, 0x03, 0x81, 0xC0, 0x40, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x6F,
0x37, 0x9B, 0xCD, 0xE6, 0xF3, 0x79, 0xBF, 0xFB, 0xB8, 0xC0, 0xB8, 0x66,
0x38, 0xCC, 0x3E, 0x07, 0x81, 0xC0, 0x70, 0x3E, 0x0D, 0xC7, 0x31, 0x86,
0xC1, 0xB0, 0x20, 0xC1, 0xE0, 0xF0, 0x6C, 0x67, 0x71, 0xF0, 0x70, 0x30,
0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xFF, 0xFF, 0xC0, 0xE0, 0x60,
0x60, 0x30, 0x30, 0x38, 0x18, 0x18, 0x1C, 0x0C, 0x0F, 0xFF, 0xFC, 0xFF,
0xFF, 0xF6, 0x1B, 0x0D, 0x86, 0xC3, 0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x1B,
0x0F, 0xFF, 0xFC, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x38, 0x06, 0x00, 0xC0,
0x38, 0x06, 0x00, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x20, 0xFF, 0xFF, 0xC3,
0x61, 0xB0, 0xD8, 0x6C, 0x36, 0x1B, 0x0D, 0x86, 0xC3, 0x61, 0xBF, 0xFF,
0xFC, 0x08, 0x0E, 0x0F, 0x87, 0xC7, 0x77, 0x1F, 0x07, 0x81, 0xFF, 0xF8,
0xCF, 0x30, 0x3F, 0x1F, 0xC0, 0x60, 0x37, 0xFF, 0xFF, 0x07, 0x83, 0xFF,
0xBF, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x0D, 0xF7, 0xFF, 0x87, 0x83, 0xC1,
0xE0, 0xF0, 0x7C, 0x3F, 0xFE, 0xF8, 0x1F, 0x9F, 0xD8, 0x18, 0x0C, 0x06,
0x03, 0x80, 0xE0, 0x3F, 0x8F, 0xC0, 0x01, 0x80, 0xC0, 0x60, 0x33, 0xDF,
0xFF, 0x0F, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x77, 0xF9, 0xEC, 0x3E, 0x7F,
0xB0, 0x78, 0x3F, 0xFF, 0xFF, 0x01, 0xC0, 0x7F, 0x9F, 0xC0, 0x1F, 0x3F,
0x30, 0x30, 0xFC, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x3D, 0xBF, 0xF0, 0xF8, 0x3C, 0x1E, 0x0F, 0x07, 0x87, 0x7F, 0x9E, 0xC0,
0x60, 0x77, 0xF3, 0xF0, 0xC0, 0x60, 0x30, 0x18, 0x0D, 0xE7, 0xDF, 0xC7,
0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0C, 0x30, 0x30, 0x00, 0x00,
0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x06,
0x0C, 0x00, 0x00, 0x0F, 0xDF, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1,
0x83, 0xC7, 0xFD, 0xF0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x36, 0x3B, 0x39,
0xB8, 0xF0, 0x7C, 0x33, 0x98, 0xEC, 0x3E, 0x0C, 0xF9, 0xF0, 0x60, 0xC1,
0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xCF, 0xFF, 0xC0, 0xFB, 0xBF, 0xFE,
0xEF, 0x33, 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0xCC, 0xF3, 0x30, 0xCF, 0x7F,
0xF8, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xC0, 0x7F, 0x7F,
0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xFF, 0x3F, 0x00, 0xDE, 0x7F,
0xB8, 0xFC, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE3, 0xFF, 0xB7, 0x98, 0x0C,
0x06, 0x03, 0x00, 0x3F, 0xBF, 0xF0, 0xF8, 0x3C, 0x1E, 0x0F, 0x07, 0x87,
0xFF, 0xBE, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x03, 0x67, 0xFC, 0x7C, 0x3C,
0x1E, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x00, 0x7F, 0x7F, 0xF0, 0x1E,
0x03, 0xE0, 0x78, 0x07, 0x03, 0xFF, 0xBF, 0x80, 0x30, 0x18, 0x0C, 0x06,
0x0F, 0xF7, 0xF8, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x33, 0xF8, 0xF8,
0xC1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x0F, 0x8F, 0xFF, 0xBC, 0xC0,
0xC1, 0xE0, 0xF0, 0x6C, 0x66, 0x31, 0xB8, 0xD8, 0x7C, 0x1C, 0x0E, 0x00,
0xC1, 0xB0, 0x6C, 0x1B, 0x36, 0xCD, 0xB3, 0x6D, 0xDB, 0xFE, 0x77, 0x18,
0xC0, 0xC1, 0xF1, 0xDD, 0xC7, 0xC1, 0xC1, 0xE1, 0xD9, 0xCE, 0xC3, 0xC0,
0xC0, 0xC1, 0xE0, 0xF0, 0x78, 0x76, 0x33, 0x18, 0xD8, 0x6C, 0x1E, 0x06,
0x03, 0x03, 0x0F, 0x87, 0xC0, 0x7F, 0xBF, 0xC1, 0xC1, 0xC1, 0xC1, 0xC1,
0xC1, 0xC0, 0xFF, 0xFF, 0xC0, 0x0F, 0xC3, 0xF0, 0xC0, 0x30, 0x0C, 0x03,
0x0F, 0x83, 0xF0, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0F, 0x83, 0xE0, 0xFF,
0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3,
0xC3, 0xC3, 0xFF, 0xFF, 0xFC, 0x7E, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x3E,
0x1F, 0x0C, 0x06, 0x03, 0x01, 0x87, 0xC3, 0xE0, 0x00, 0x7F, 0xF7, 0xE0 };
const GFXglyph stalker111pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 6, 0, 0 }, // 0x20 ' '
{ 1, 3, 14, 6, 3, -13 }, // 0x21 '!'
{ 7, 9, 7, 11, 2, -13 }, // 0x22 '"'
{ 15, 9, 12, 11, 2, -12 }, // 0x23 '#'
{ 29, 9, 14, 11, 2, -13 }, // 0x24 '$'
{ 45, 9, 14, 11, 2, -13 }, // 0x25 '%'
{ 61, 1, 1, 11, 0, 0 }, // 0x26 '&'
{ 62, 4, 7, 7, 4, -13 }, // 0x27 '''
{ 66, 4, 14, 7, 3, -13 }, // 0x28 '('
{ 73, 4, 14, 7, 3, -13 }, // 0x29 ')'
{ 80, 9, 11, 11, 2, -11 }, // 0x2A '*'
{ 93, 10, 8, 11, 2, -9 }, // 0x2B '+'
{ 103, 3, 6, 8, 4, -3 }, // 0x2C ','
{ 106, 8, 2, 11, 2, -6 }, // 0x2D '-'
{ 108, 3, 4, 7, 3, -4 }, // 0x2E '.'
{ 110, 9, 14, 11, 1, -13 }, // 0x2F '/'
{ 126, 9, 14, 11, 2, -13 }, // 0x30 '0'
{ 142, 9, 14, 11, 2, -13 }, // 0x31 '1'
{ 158, 9, 14, 11, 2, -13 }, // 0x32 '2'
{ 174, 9, 14, 11, 2, -13 }, // 0x33 '3'
{ 190, 8, 14, 11, 2, -13 }, // 0x34 '4'
{ 204, 9, 14, 11, 2, -13 }, // 0x35 '5'
{ 220, 9, 14, 11, 2, -13 }, // 0x36 '6'
{ 236, 9, 14, 11, 2, -13 }, // 0x37 '7'
{ 252, 9, 14, 11, 2, -13 }, // 0x38 '8'
{ 268, 9, 14, 12, 2, -13 }, // 0x39 '9'
{ 284, 4, 10, 7, 3, -10 }, // 0x3A ':'
{ 289, 5, 12, 8, 3, -9 }, // 0x3B ';'
{ 297, 9, 11, 11, 2, -11 }, // 0x3C '<'
{ 310, 9, 6, 11, 2, -9 }, // 0x3D '='
{ 317, 9, 11, 11, 2, -11 }, // 0x3E '>'
{ 330, 9, 14, 10, 1, -13 }, // 0x3F '?'
{ 346, 9, 14, 11, 2, -13 }, // 0x40 '@'
{ 362, 9, 14, 11, 2, -13 }, // 0x41 'A'
{ 378, 9, 14, 11, 2, -13 }, // 0x42 'B'
{ 394, 9, 14, 10, 1, -13 }, // 0x43 'C'
{ 410, 9, 14, 11, 2, -13 }, // 0x44 'D'
{ 426, 9, 14, 10, 2, -13 }, // 0x45 'E'
{ 442, 9, 14, 11, 2, -13 }, // 0x46 'F'
{ 458, 9, 14, 10, 1, -13 }, // 0x47 'G'
{ 474, 9, 14, 11, 2, -13 }, // 0x48 'H'
{ 490, 10, 14, 11, 2, -13 }, // 0x49 'I'
{ 508, 7, 14, 10, 2, -13 }, // 0x4A 'J'
{ 521, 9, 14, 11, 2, -13 }, // 0x4B 'K'
{ 537, 9, 14, 10, 2, -13 }, // 0x4C 'L'
{ 553, 9, 14, 11, 2, -13 }, // 0x4D 'M'
{ 569, 9, 14, 11, 2, -13 }, // 0x4E 'N'
{ 585, 9, 14, 11, 2, -13 }, // 0x4F 'O'
{ 601, 9, 14, 11, 2, -13 }, // 0x50 'P'
{ 617, 9, 14, 11, 2, -13 }, // 0x51 'Q'
{ 633, 9, 14, 11, 2, -13 }, // 0x52 'R'
{ 649, 9, 14, 11, 2, -13 }, // 0x53 'S'
{ 665, 9, 14, 10, 2, -13 }, // 0x54 'T'
{ 681, 9, 14, 11, 2, -13 }, // 0x55 'U'
{ 697, 9, 14, 11, 2, -13 }, // 0x56 'V'
{ 713, 9, 14, 11, 2, -13 }, // 0x57 'W'
{ 729, 10, 14, 11, 2, -13 }, // 0x58 'X'
{ 747, 9, 14, 11, 2, -13 }, // 0x59 'Y'
{ 763, 9, 14, 11, 1, -13 }, // 0x5A 'Z'
{ 779, 9, 14, 10, 2, -13 }, // 0x5B '['
{ 795, 10, 14, 11, 1, -13 }, // 0x5C '\'
{ 813, 9, 14, 11, 1, -13 }, // 0x5D ']'
{ 829, 9, 8, 11, 2, -9 }, // 0x5E '^'
{ 838, 13, 1, 13, 0, 2 }, // 0x5F '_'
{ 840, 4, 3, 7, 2, -13 }, // 0x60 '`'
{ 842, 9, 10, 11, 1, -9 }, // 0x61 'a'
{ 854, 9, 14, 11, 2, -13 }, // 0x62 'b'
{ 870, 9, 10, 10, 1, -9 }, // 0x63 'c'
{ 882, 9, 14, 11, 1, -13 }, // 0x64 'd'
{ 898, 9, 10, 11, 1, -9 }, // 0x65 'e'
{ 910, 8, 14, 10, 2, -13 }, // 0x66 'f'
{ 924, 9, 14, 11, 2, -9 }, // 0x67 'g'
{ 940, 9, 14, 11, 2, -13 }, // 0x68 'h'
{ 956, 8, 15, 10, 2, -14 }, // 0x69 'i'
{ 971, 7, 19, 9, 2, -14 }, // 0x6A 'j'
{ 988, 9, 14, 10, 2, -13 }, // 0x6B 'k'
{ 1004, 7, 14, 9, 2, -13 }, // 0x6C 'l'
{ 1017, 10, 10, 11, 1, -9 }, // 0x6D 'm'
{ 1030, 9, 10, 11, 2, -9 }, // 0x6E 'n'
{ 1042, 9, 10, 11, 2, -9 }, // 0x6F 'o'
{ 1054, 9, 15, 11, 2, -10 }, // 0x70 'p'
{ 1071, 9, 14, 11, 2, -9 }, // 0x71 'q'
{ 1087, 9, 11, 10, 2, -10 }, // 0x72 'r'
{ 1100, 9, 10, 11, 2, -9 }, // 0x73 's'
{ 1112, 9, 14, 10, 1, -13 }, // 0x74 't'
{ 1128, 9, 10, 11, 2, -9 }, // 0x75 'u'
{ 1140, 9, 10, 11, 1, -9 }, // 0x76 'v'
{ 1152, 10, 10, 11, 2, -9 }, // 0x77 'w'
{ 1165, 9, 10, 11, 2, -9 }, // 0x78 'x'
{ 1177, 9, 14, 11, 2, -9 }, // 0x79 'y'
{ 1193, 9, 10, 11, 2, -9 }, // 0x7A 'z'
{ 1205, 10, 14, 10, 1, -13 }, // 0x7B '{'
{ 1223, 8, 17, 11, 1, -16 }, // 0x7C '|'
{ 1240, 9, 14, 11, 2, -13 }, // 0x7D '}'
{ 1256, 9, 3, 12, 2, -8 } }; // 0x7E '~'
const GFXfont stalker111pt7b PROGMEM = {
(uint8_t *)stalker111pt7bBitmaps,
(GFXglyph *)stalker111pt7bGlyphs,
0x20, 0x7E, 23 };
// Approx. 1932 bytes

View File

@ -1,178 +0,0 @@
const uint8_t stalker19pt7bBitmaps[] PROGMEM = {
0x00, 0xFF, 0xAA, 0x0F, 0xFF, 0xCF, 0x1A, 0x34, 0x60, 0x24, 0x48, 0x97,
0xF2, 0x44, 0xBF, 0x92, 0x24, 0x48, 0x10, 0x20, 0x47, 0xF8, 0x1F, 0xC0,
0x81, 0xFE, 0x20, 0x40, 0x80, 0xE0, 0xE0, 0xE2, 0x04, 0x08, 0x18, 0x10,
0x20, 0x40, 0x8E, 0x8E, 0x0E, 0x00, 0xFF, 0xED, 0x80, 0x2D, 0x49, 0x24,
0x99, 0x10, 0x89, 0x12, 0x49, 0x25, 0x40, 0x08, 0x08, 0x6B, 0x7C, 0x38,
0x38, 0x74, 0x92, 0x10, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, 0x00, 0xFC,
0x92, 0x40, 0xFF, 0xFC, 0xFF, 0x80, 0x01, 0x02, 0x06, 0x04, 0x08, 0x18,
0x10, 0x20, 0x20, 0x40, 0xC0, 0x80, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60,
0xC1, 0x83, 0x06, 0x0F, 0xF0, 0xF0, 0x20, 0x40, 0x81, 0x02, 0x04, 0x09,
0x12, 0x24, 0x4F, 0xF0, 0xFE, 0x04, 0x08, 0x10, 0x3F, 0xE0, 0x40, 0x81,
0x02, 0x07, 0xF0, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x3E, 0x02, 0x01, 0x01,
0x01, 0x01, 0xFF, 0x81, 0x0A, 0x14, 0x28, 0x50, 0xBF, 0x82, 0x04, 0x08,
0x10, 0x7E, 0x81, 0x02, 0x04, 0x08, 0x1F, 0x81, 0x02, 0x06, 0x0F, 0xF0,
0xC0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x81, 0x81, 0x81, 0xFF,
0xFF, 0x04, 0x08, 0x10, 0x20, 0x82, 0x08, 0x10, 0x20, 0x40, 0x80, 0x7C,
0x89, 0x12, 0x24, 0x5F, 0xE0, 0xC1, 0x83, 0x06, 0x0F, 0xF0, 0xFF, 0x81,
0x81, 0x81, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0xFF, 0x81,
0xFF, 0xEE, 0xE0, 0x0F, 0x11, 0x11, 0x02, 0x0C, 0x30, 0x60, 0x80, 0xC0,
0x30, 0x0C, 0x03, 0xFE, 0x00, 0x07, 0xF0, 0xC0, 0x30, 0x18, 0x06, 0x03,
0x02, 0x0C, 0x30, 0xC0, 0x04, 0x0A, 0x33, 0x67, 0xCE, 0x9C, 0x30, 0x20,
0x20, 0x00, 0x00, 0x40, 0x7E, 0xC1, 0x81, 0x01, 0x01, 0x79, 0x89, 0x89,
0x89, 0x89, 0x89, 0x7E, 0x18, 0x18, 0x18, 0x28, 0x24, 0x24, 0x44, 0x44,
0x7E, 0x42, 0x82, 0x81, 0xFE, 0x83, 0x81, 0x81, 0x81, 0x82, 0xFE, 0x83,
0x81, 0x81, 0x83, 0xFE, 0x1F, 0x20, 0x60, 0x40, 0xC0, 0x80, 0x80, 0xC0,
0x40, 0x60, 0x20, 0x1F, 0xF8, 0x24, 0x24, 0x22, 0x22, 0x21, 0x21, 0x22,
0x22, 0x24, 0x24, 0xF8, 0xFF, 0x02, 0x04, 0x08, 0x10, 0x3C, 0x40, 0x81,
0x02, 0x07, 0xF0, 0xFF, 0x02, 0x04, 0x0F, 0xD0, 0x20, 0x40, 0x81, 0x02,
0x04, 0x00, 0x1E, 0x40, 0x82, 0x08, 0x10, 0x20, 0x4F, 0x83, 0x06, 0x0B,
0xE0, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x7F, 0xC1, 0x83, 0x06, 0x0C, 0x10,
0xFE, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x47, 0xF0, 0x04,
0x10, 0x41, 0x04, 0x10, 0x61, 0x86, 0x1C, 0xDE, 0x82, 0x84, 0x88, 0xB0,
0xE0, 0x80, 0x80, 0xC0, 0xB0, 0x98, 0x84, 0x83, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFE, 0xC7, 0xE5, 0xE9, 0xB9,
0xB1, 0x91, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xC3, 0x86, 0x8D, 0x19,
0x32, 0x62, 0xC5, 0x87, 0x0E, 0x0C, 0x10, 0x38, 0x24, 0x44, 0x42, 0x82,
0x81, 0x81, 0x82, 0x42, 0x44, 0x24, 0x38, 0xFD, 0x06, 0x0C, 0x18, 0x30,
0x60, 0xFE, 0x81, 0x02, 0x04, 0x00, 0x06, 0x14, 0xCB, 0x1C, 0x30, 0x60,
0xC9, 0x9D, 0x12, 0x67, 0x30, 0xFF, 0x06, 0x0C, 0x1F, 0xF2, 0x22, 0x46,
0x85, 0x0E, 0x0C, 0x10, 0x7F, 0x06, 0x0A, 0x06, 0x04, 0x04, 0x04, 0x0D,
0x0F, 0x0B, 0xF0, 0xFF, 0x26, 0x48, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20,
0x40, 0x80, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0B,
0xE0, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x42, 0x64, 0x24, 0x38, 0x18,
0x10, 0x81, 0x81, 0x81, 0x81, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91,
0x7E, 0x83, 0x82, 0x44, 0x64, 0x28, 0x18, 0x10, 0x18, 0x2C, 0x24, 0x42,
0x82, 0x83, 0x06, 0x0A, 0x26, 0x87, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
0xFF, 0x04, 0x04, 0x08, 0x08, 0x10, 0x30, 0x20, 0x60, 0x40, 0x80, 0xFF,
0xFF, 0x42, 0x85, 0x0A, 0x14, 0x28, 0x50, 0xA1, 0x42, 0x87, 0xF0, 0x80,
0x80, 0x40, 0x60, 0x20, 0x10, 0x18, 0x08, 0x04, 0x06, 0x02, 0x01, 0xFE,
0x14, 0x28, 0x50, 0xA1, 0x42, 0x85, 0x0A, 0x14, 0x2F, 0xF0, 0x10, 0x38,
0x7C, 0x66, 0xC6, 0x83, 0xFF, 0xE0, 0xC6, 0x30, 0x3C, 0x04, 0x0B, 0xF8,
0x30, 0x61, 0xBD, 0x80, 0x80, 0x80, 0x80, 0xFE, 0xC1, 0x81, 0x81, 0x81,
0x81, 0xC1, 0xBE, 0x3E, 0x40, 0x80, 0x80, 0x80, 0xC0, 0x60, 0x3F, 0x02,
0x04, 0x08, 0x17, 0xF0, 0xE0, 0xC1, 0x83, 0x07, 0x1B, 0xD0, 0x7D, 0x06,
0x0C, 0x1F, 0xF0, 0x20, 0x3F, 0x1E, 0x40, 0x81, 0x0F, 0x84, 0x08, 0x10,
0x20, 0x40, 0x81, 0x00, 0x3D, 0xC3, 0x81, 0x81, 0x81, 0x81, 0x83, 0x7D,
0x01, 0x03, 0x7E, 0x81, 0x02, 0x04, 0x0B, 0xD8, 0x60, 0xC1, 0x83, 0x06,
0x0C, 0x10, 0x61, 0x80, 0x00, 0xF0, 0x41, 0x04, 0x10, 0x41, 0x1F, 0x0C,
0x30, 0x00, 0x7C, 0x10, 0x41, 0x04, 0x10, 0x41, 0x07, 0x17, 0x80, 0x81,
0x02, 0x04, 0x08, 0x53, 0x28, 0x70, 0xF1, 0x32, 0x14, 0x10, 0xF0, 0x41,
0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x3F, 0xFF, 0xD9, 0x91, 0x91, 0x91,
0x91, 0x91, 0x91, 0xBD, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x7D, 0x06,
0x0C, 0x18, 0x30, 0x60, 0xBE, 0xBC, 0xE6, 0xC1, 0x81, 0x81, 0x81, 0x81,
0xE2, 0xBC, 0x80, 0x80, 0x80, 0x7F, 0x0E, 0x0C, 0x18, 0x30, 0x61, 0xBD,
0x02, 0x04, 0x08, 0x06, 0xB9, 0xC1, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80,
0xFF, 0x05, 0x80, 0xE0, 0x20, 0x60, 0xFE, 0x20, 0x20, 0x20, 0xFE, 0x20,
0x20, 0x20, 0x20, 0x22, 0x22, 0x1E, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x63,
0xB9, 0x83, 0x06, 0x0A, 0x24, 0x45, 0x8A, 0x0C, 0x81, 0x81, 0x91, 0x91,
0x91, 0x99, 0x7E, 0x66, 0x46, 0xC8, 0xE0, 0xC1, 0x84, 0xB0, 0xC1, 0x83,
0x06, 0x0A, 0x26, 0x44, 0x8E, 0x0C, 0x08, 0x23, 0xC0, 0xFE, 0x02, 0x06,
0x0C, 0x18, 0x30, 0x40, 0xFF, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10,
0x10, 0x10, 0x10, 0x10, 0x1E, 0xFF, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1,
0x83, 0x06, 0x0C, 0x18, 0x3F, 0xC0, 0xF8, 0x08, 0x08, 0x08, 0x08, 0x0F,
0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0xC2, 0xFE };
const GFXglyph stalker19pt7bGlyphs[] PROGMEM = {
{ 0, 1, 1, 5, 0, 0 }, // 0x20 ' '
{ 1, 2, 12, 5, 3, -11 }, // 0x21 '!'
{ 4, 7, 5, 9, 1, -10 }, // 0x22 '"'
{ 9, 7, 10, 9, 1, -10 }, // 0x23 '#'
{ 18, 7, 12, 9, 2, -11 }, // 0x24 '$'
{ 29, 8, 12, 9, 1, -11 }, // 0x25 '%'
{ 41, 1, 1, 9, 0, 0 }, // 0x26 '&'
{ 42, 3, 6, 6, 3, -10 }, // 0x27 '''
{ 45, 3, 12, 6, 2, -11 }, // 0x28 '('
{ 50, 3, 12, 6, 2, -11 }, // 0x29 ')'
{ 55, 8, 9, 9, 1, -9 }, // 0x2A '*'
{ 64, 7, 7, 9, 1, -7 }, // 0x2B '+'
{ 71, 3, 6, 6, 3, -3 }, // 0x2C ','
{ 74, 7, 2, 9, 1, -5 }, // 0x2D '-'
{ 76, 3, 3, 6, 3, -3 }, // 0x2E '.'
{ 78, 8, 12, 9, 1, -11 }, // 0x2F '/'
{ 90, 7, 12, 9, 1, -11 }, // 0x30 '0'
{ 101, 7, 12, 9, 1, -11 }, // 0x31 '1'
{ 112, 7, 12, 9, 1, -11 }, // 0x32 '2'
{ 123, 8, 12, 9, 1, -11 }, // 0x33 '3'
{ 135, 7, 11, 9, 2, -10 }, // 0x34 '4'
{ 145, 7, 12, 9, 2, -11 }, // 0x35 '5'
{ 156, 8, 12, 9, 1, -11 }, // 0x36 '6'
{ 168, 7, 12, 9, 2, -11 }, // 0x37 '7'
{ 179, 7, 12, 9, 1, -11 }, // 0x38 '8'
{ 190, 8, 12, 9, 1, -11 }, // 0x39 '9'
{ 202, 3, 8, 6, 3, -8 }, // 0x3A ':'
{ 205, 4, 10, 6, 2, -7 }, // 0x3B ';'
{ 210, 8, 9, 9, 1, -9 }, // 0x3C '<'
{ 219, 7, 4, 9, 1, -7 }, // 0x3D '='
{ 223, 8, 9, 9, 1, -9 }, // 0x3E '>'
{ 232, 8, 12, 9, 1, -11 }, // 0x3F '?'
{ 244, 8, 12, 9, 1, -11 }, // 0x40 '@'
{ 256, 8, 12, 9, 1, -11 }, // 0x41 'A'
{ 268, 8, 12, 9, 1, -11 }, // 0x42 'B'
{ 280, 8, 12, 8, 1, -11 }, // 0x43 'C'
{ 292, 8, 12, 9, 1, -11 }, // 0x44 'D'
{ 304, 7, 12, 9, 1, -11 }, // 0x45 'E'
{ 315, 7, 12, 9, 2, -11 }, // 0x46 'F'
{ 326, 7, 12, 9, 1, -11 }, // 0x47 'G'
{ 337, 7, 12, 9, 1, -11 }, // 0x48 'H'
{ 348, 7, 12, 9, 2, -11 }, // 0x49 'I'
{ 359, 6, 12, 8, 2, -11 }, // 0x4A 'J'
{ 368, 8, 12, 9, 1, -11 }, // 0x4B 'K'
{ 380, 8, 12, 9, 1, -11 }, // 0x4C 'L'
{ 392, 8, 12, 9, 1, -11 }, // 0x4D 'M'
{ 404, 7, 12, 9, 1, -11 }, // 0x4E 'N'
{ 415, 8, 12, 9, 1, -11 }, // 0x4F 'O'
{ 427, 7, 12, 9, 1, -11 }, // 0x50 'P'
{ 438, 7, 12, 9, 1, -11 }, // 0x51 'Q'
{ 449, 7, 12, 9, 1, -11 }, // 0x52 'R'
{ 460, 7, 12, 9, 1, -11 }, // 0x53 'S'
{ 471, 7, 12, 8, 1, -11 }, // 0x54 'T'
{ 482, 7, 12, 9, 1, -11 }, // 0x55 'U'
{ 493, 8, 12, 9, 1, -11 }, // 0x56 'V'
{ 505, 8, 12, 9, 1, -11 }, // 0x57 'W'
{ 517, 8, 12, 9, 1, -11 }, // 0x58 'X'
{ 529, 7, 12, 9, 1, -11 }, // 0x59 'Y'
{ 540, 8, 12, 9, 1, -11 }, // 0x5A 'Z'
{ 552, 7, 12, 9, 1, -11 }, // 0x5B '['
{ 563, 8, 12, 9, 1, -11 }, // 0x5C '\'
{ 575, 7, 12, 9, 1, -11 }, // 0x5D ']'
{ 586, 8, 6, 9, 1, -7 }, // 0x5E '^'
{ 592, 11, 1, 11, 0, 2 }, // 0x5F '_'
{ 594, 4, 3, 6, 2, -11 }, // 0x60 '`'
{ 596, 7, 8, 9, 1, -7 }, // 0x61 'a'
{ 603, 8, 12, 9, 1, -11 }, // 0x62 'b'
{ 615, 8, 8, 8, 1, -7 }, // 0x63 'c'
{ 623, 7, 12, 9, 1, -11 }, // 0x64 'd'
{ 634, 7, 8, 9, 1, -7 }, // 0x65 'e'
{ 641, 7, 12, 8, 1, -11 }, // 0x66 'f'
{ 652, 8, 11, 9, 1, -7 }, // 0x67 'g'
{ 663, 7, 12, 9, 1, -11 }, // 0x68 'h'
{ 674, 6, 12, 8, 2, -11 }, // 0x69 'i'
{ 683, 6, 15, 8, 1, -11 }, // 0x6A 'j'
{ 695, 7, 12, 8, 1, -11 }, // 0x6B 'k'
{ 706, 6, 12, 7, 2, -11 }, // 0x6C 'l'
{ 715, 8, 8, 9, 1, -7 }, // 0x6D 'm'
{ 723, 7, 8, 9, 1, -7 }, // 0x6E 'n'
{ 730, 7, 8, 9, 1, -7 }, // 0x6F 'o'
{ 737, 8, 12, 9, 1, -8 }, // 0x70 'p'
{ 749, 7, 11, 9, 1, -7 }, // 0x71 'q'
{ 759, 8, 9, 9, 1, -8 }, // 0x72 'r'
{ 768, 7, 8, 9, 1, -7 }, // 0x73 's'
{ 775, 8, 11, 8, 1, -10 }, // 0x74 't'
{ 786, 7, 8, 9, 1, -7 }, // 0x75 'u'
{ 793, 7, 8, 9, 1, -7 }, // 0x76 'v'
{ 800, 8, 8, 9, 1, -7 }, // 0x77 'w'
{ 808, 7, 8, 9, 1, -7 }, // 0x78 'x'
{ 815, 7, 11, 9, 1, -7 }, // 0x79 'y'
{ 825, 8, 8, 9, 1, -7 }, // 0x7A 'z'
{ 833, 8, 12, 8, 1, -11 }, // 0x7B '{'
{ 845, 7, 14, 9, 1, -13 }, // 0x7C '|'
{ 858, 8, 12, 9, 1, -11 }, // 0x7D '}'
{ 870, 8, 2, 10, 2, -6 } }; // 0x7E '~'
const GFXfont stalker19pt7b PROGMEM = {
(uint8_t *)stalker19pt7bBitmaps,
(GFXglyph *)stalker19pt7bGlyphs,
0x20, 0x7E, 19 };
// Approx. 1544 bytes

View File

@ -1,56 +0,0 @@
#include <Arduino.h>
#include <FastLED.h>
#include "constants.h"
#include "enums.h"
#include "supercomputer.h"
#include "overlay.h"
struct Cell {
float state;
float factor;
};
float cell_value(Cell c) {
return (1.0 + sin(c.state * c.factor)) * 0.5;
}
Cell cells[PANEL_WIDTH * PANEL_HEIGHT];
bool cells_setup = false;
uint8_t rainbow_offset = 0;
void setup_cells() {
for(int i = 0; i < PANEL_WIDTH * PANEL_HEIGHT; i++) {
cells[i].state = random(100, 1000) / 100.0;
cells[i].factor = random(90, 110) / 100.0;
}
}
void draw_supercomputer(MatrixPanel_I2S_DMA *matrix, Mode mode) {
if (!cells_setup) {
setup_cells();
cells_setup = true;
}
for(int i = 0; i < PANEL_WIDTH * PANEL_HEIGHT; i++) {
int x = i % PANEL_WIDTH;
int y = i / PANEL_WIDTH;
cells[i].state += 0.3;
if (mode == Stealth) {
// red only
matrix->drawPixel(x, y, matrix->color565((int)round(255.0 * cell_value(cells[i])), 0, 0));
} else {
// rainbow
float progress = (255.0 / PANEL_WIDTH) * x;
uint8_t hue = ((int)round(progress) + rainbow_offset);
if (overlay[i / 8] & (1 << (7 - (i % 8)))) {
hue -= 128;
} else if (mode == HighVis) {
continue;
}
CHSV hsv_color(hue, 255, 255 * cell_value(cells[i]));
CRGB rgb;
hsv2rgb_rainbow(hsv_color, rgb);
matrix->drawPixel(x, y, matrix->color565(rgb.r, rgb.g, rgb.b));
}
}
rainbow_offset++;
}

View File

@ -1,3 +0,0 @@
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include "enums.h"
void draw_supercomputer(MatrixPanel_I2S_DMA *matrix, Mode mode);

View File

@ -1,21 +0,0 @@
# Uncomment lines below if you have problems with $PATH
#SHELL := /bin/bash
#PATH := /usr/local/bin:$(PATH)
all:
pio.exe -f -c vim run
upload:
pio.exe -f -c vim run --target upload
clean:
pio.exe -f -c vim run --target clean
program:
pio.exe -f -c vim run --target program
uploadfs:
pio.exe -f -c vim run --target uploadfs
update:
pio.exe -f -c vim update

View File

@ -1,22 +0,0 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:adafruit_matrixportal_esp32s3]
platform = espressif32
board = adafruit_matrixportal_esp32s3
framework = arduino
monitor_speed = 115200
lib_deps =
adafruit/Adafruit GFX Library
adafruit/Adafruit BusIO
Wire
fastled/FastLED
https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA.git

View File

@ -1,105 +0,0 @@
#include <Arduino.h>
#include "constants.h"
#include "config.h"
#include "util.h"
void setupGaussianKernel(float* kernel, int width, float sigma) {
float sum = 0.0;
for(int i = 0; i < width; i++) {
//kernel[width+i] = exp( -(i*i) / (2 * sigma * sigma)) / (PI * 2 * sigma * sigma);
kernel[i] = exp(-0.5f * (i * i) / (sigma * sigma));
sum += kernel[width];
}
for(int i; i < width; i++) {
kernel[i] = sum/width;
}
}
//float first_pass[PANEL_WIDTH][PANEL_HEIGHT];
void gaussian_blur(float *field[PANEL_WIDTH][PANEL_HEIGHT]) {
float kernel[GAUSS_WIDTH];
float first_pass[PANEL_WIDTH][PANEL_HEIGHT];
memset(first_pass, 0.0, sizeof first_pass);
setupGaussianKernel(kernel, GAUSS_WIDTH, GAUSS_SIGMA);
// horizontal pass
for (int x = 0; x < PANEL_WIDTH; x++) {
for(int y = 0; y < PANEL_HEIGHT; y++) {
float sum = *field[x][y] * DECAY_FACTOR * kernel[0]; //0.0;
int additions = 1;
for (int x_offset = 1; x_offset < GAUSS_WIDTH; x_offset++) {
if (is_in_bounds(x+x_offset, y)) {
sum += *field[x + x_offset][y] * kernel[x_offset];
additions++;
}
if (is_in_bounds(x-x_offset, y)) {
sum += *field[x - x_offset][y] * kernel[x_offset];
additions++;
}
}
first_pass[x][y] = sum/GAUSS_WIDTH;
}
}
// vertical pass
for (int x = 0; x < PANEL_WIDTH; x++) {
for(int y = 0; y < PANEL_HEIGHT; y++) {
float sum = first_pass[x][y] * kernel[0]; //0.0;
int additions = 1;
for (int y_offset = 1; y_offset < GAUSS_WIDTH; y_offset++) {
if (is_in_bounds(x, y + y_offset)) {
sum += first_pass[x][y + y_offset] * kernel[y_offset];
additions++;
}
if (is_in_bounds(x, y - y_offset)) {
sum += first_pass[x][y - y_offset] * kernel[y_offset];
additions++;
}
}
*field[x][y] = sum/GAUSS_WIDTH;
}
}
}
void box_blur(float field[PANEL_WIDTH][PANEL_HEIGHT]) {
auto first_pass = new float[PANEL_WIDTH][PANEL_HEIGHT]();
// horizontal pass
for (int x = 0; x < PANEL_WIDTH; x++) {
for(int y = 0; y < PANEL_HEIGHT; y++) {
float sum;
sum = field[x][y] * DECAY_FACTOR; //0.0;
int additions = 1;
for (int x_offset = 1; x_offset < BLUR_KERNEL_SIZE; x_offset++) {
if (is_in_bounds(x+x_offset, y)) {
sum += field[x + x_offset][y];
additions++;
}
if (is_in_bounds(x-x_offset, y)) {
sum += field[x - x_offset][y];
additions++;
}
}
first_pass[x][y] = (sum/additions);
}
}
// vertical pass
for (int x = 0; x < PANEL_WIDTH; x++) {
for(int y = 0; y < PANEL_HEIGHT; y++) {
float sum = first_pass[x][y]; //0.0;
int additions = 1;
for (int y_offset = 1; y_offset < BLUR_KERNEL_SIZE; y_offset++) {
if (is_in_bounds(x, y + y_offset)) {
sum += first_pass[x][y + y_offset];
additions++;
}
if (is_in_bounds(x, y - y_offset)) {
sum += first_pass[x][y - y_offset];
additions++;
}
}
float result = (sum/additions); // * DECAY_FACTOR;
//attractant[x][y] = (((8.0*attractant[x][y]) + result) / 9.0);
field[x][y] = result;
}
}
delete[] first_pass;
}

View File

@ -1,3 +0,0 @@
#include "constants.h"
void gaussian_blur(float *field[PANEL_WIDTH][PANEL_HEIGHT]);
void box_blur(float field[PANEL_WIDTH][PANEL_HEIGHT]);

View File

@ -1,18 +0,0 @@
// gaussian blur
#define GAUSS_WIDTH 1
#define GAUSS_SIGMA 1.0
#define DECAY_FACTOR 0.9
// box blur
#define BLUR_KERNEL_SIZE 1
// agent params
#define NUM_AGENTS_MIN 64
#define NUM_AGENTS_MAX 301
#define AGENT_DROP_AMOUNT 10
#define AGENT_SENSOR_DISTANCE_MIN 2.0
#define AGENT_SENSOR_DISTANCE_MAX 3.5
// general params
#define NUM_ITERATIONS 500
#define SPAWN_MIN_X 2
#define SPAWN_MAX_X 63
#define SPAWN_MIN_Y 2
#define SPAWN_MAX_Y 31

View File

@ -1,26 +0,0 @@
#define R1 42
#define G1 40
#define BL1 41
#define R2 38
#define G2 37
#define BL2 39
#define CH_A 45
#define CH_B 36
#define CH_C 48
#define CH_D 35
#define CH_E 21
#define CLK 2
#define LAT 47
#define OE 14
#define PIN_E 21
#define PANEL_WIDTH 64
#define PANEL_HEIGHT 32 // Panel height of 64 will required PIN_E to be defined.
#define PANELS_NUMBER 1
#define PANE_WIDTH PANEL_WIDTH * PANELS_NUMBER
#define PANE_HEIGHT PANEL_HEIGHT
#define NUM_LEDS PANE_WIDTH*PANE_HEIGHT
#define ONBOARD_LED 13

View File

@ -1,177 +0,0 @@
#include <Arduino.h>
#include "xtensa/core-macros.h"
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include "main.h"
#include "constants.h"
#include "config.h"
#include "overlay.h"
#include "util.h"
#include "visual.h"
#include "blur.h"
#include <vector>
MatrixPanel_I2S_DMA *matrix = nullptr;
struct SlimeAgent {
int x_position;
int y_position;
float heading;
};
int NUM_AGENTS;
int AGENT_MOVE_DISTANCE;
float AGENT_SENSOR_DISTANCE;
float AGENT_MOVE_ANGLE;
float AGENT_SENSOR_ANGLE;
float attractant[PANEL_WIDTH][PANEL_HEIGHT] = {};
int iterations = 0;
std::vector<SlimeAgent> agents;
void init_attractant() {
memset(attractant, 0.0, sizeof attractant);
// draw a circle out of attractant
//for (int p = 0; p < PANEL_WIDTH; p++) {
// float angle = ((PI * 2) / PANEL_WIDTH) * p;
// int x = PANEL_WIDTH/2 + round(10 * sin(angle));
// int y = PANEL_WIDTH/2 + round(10 * cos(angle));
// attractant[x][y] = 15.0;
//}
// draw a bitmap
//for(int x = 0; x < PANEL_WIDTH; x++) {
// for(int y = 0; y < PANEL_HEIGHT; y++) {
// int pixel_num = (y * PANEL_WIDTH) + x;
// if(overlay[ pixel_num / 8 ] & (1 << (7 - (pixel_num % 8)) ) ){
// attractant[x][y] = 255.0;
// }
// }
//}
}
void init_agents() {
AGENT_MOVE_DISTANCE = 1;
AGENT_MOVE_ANGLE = 0.175;//random(0, 334) / 1000.0;
//if (random(0, 2) > 0) {
// AGENT_SENSOR_ANGLE = 0.175;
//} else {
AGENT_SENSOR_ANGLE = 0.0875;
//}
AGENT_SENSOR_DISTANCE = random(AGENT_SENSOR_DISTANCE_MIN * 1000.0, AGENT_SENSOR_DISTANCE_MAX * 1000.0) / 1000.0;
NUM_AGENTS = random(NUM_AGENTS_MIN, NUM_AGENTS_MAX);
agents.clear();
for(int a = 0; a < NUM_AGENTS; a++) {
float angle = ((PI * 2) / NUM_AGENTS) * a;
//agents[a].x_position = 31 + round(10*sin(angle));
//agents[a].y_position = 15 + round(10*cos(angle));
// agents[a].heading = ((PI * 2) / NUM_AGENTS) * );
agents.push_back({
random(SPAWN_MIN_X, SPAWN_MAX_X),
random(SPAWN_MIN_Y, SPAWN_MAX_Y),
(random(0, 100) / 100.0) * (PI*2)
});
}
}
void setup(){
Serial.begin(BAUD_RATE);
//while (!Serial) {
// ; // wait for serial port to connect. Needed for native USB
//}
pinMode(ONBOARD_LED, OUTPUT);
// redefine pins if required
HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK};
HUB75_I2S_CFG mxconfig(PANEL_WIDTH, PANEL_HEIGHT, PANELS_NUMBER, _pins);
mxconfig.gpio.e = PIN_E;
mxconfig.driver = HUB75_I2S_CFG::FM6126A; // for panels using FM6126A chips
mxconfig.latch_blanking = 4;
mxconfig.i2sspeed = HUB75_I2S_CFG::HZ_10M;
mxconfig.clkphase = false;
mxconfig.double_buff = true;
matrix = new MatrixPanel_I2S_DMA(mxconfig);
matrix->begin();
matrix->setBrightness8(64);
matrix->fillScreenRGB888(0, 0, 0);
init_agents();
init_attractant();
}
void loop() {
matrix ->flipDMABuffer();
delay(10);
matrix->fillScreenRGB888(15, 0, 10);
// draw background and organism
draw_bg(matrix);
draw_attractant(matrix, attractant);
for(int a = 0; a < NUM_AGENTS; a++) {
//matrix->drawPixel(agents[a].x_position, agents[a].y_position, matrix->color565(0, 0, attractant[agents[a].x_position][agents[a].y_position]));
// motor step: check if agent can move forward
// if yes, do so, if not, turn randomly
float target_x = agents[a].x_position + cos(agents[a].heading) * AGENT_MOVE_DISTANCE;
float target_y = agents[a].y_position + sin(agents[a].heading) * AGENT_MOVE_DISTANCE;
int move_x = round(target_x);
int move_y = round(target_y);
if (is_in_bounds(move_x, move_y)) {
agents[a].x_position = move_x;
agents[a].y_position = move_y;
if (attractant[move_x][move_y] < 255.0 - AGENT_DROP_AMOUNT) {
attractant[move_x][move_y] += AGENT_DROP_AMOUNT;
}
} else {
agents[a].heading = (random(0, 100)/100.0) * (PI*2);
}
}
// sample step - check the 3 positions
for(int a = 0; a < NUM_AGENTS; a++) {
//matrix->drawPixel(agents[a].x_position, agents[a].y_position, matrix->color565(0, 0, attractant[agents[a].x_position][agents[a].y_position]));
int front_x = round(agents[a].x_position + cos(agents[a].heading) * AGENT_SENSOR_DISTANCE);
int front_y = round(agents[a].y_position + sin(agents[a].heading) * AGENT_SENSOR_DISTANCE);
int left_x = round(agents[a].x_position + cos(agents[a].heading - (AGENT_SENSOR_ANGLE * (PI * 2))) * AGENT_SENSOR_DISTANCE);
int left_y = round(agents[a].y_position + sin(agents[a].heading - (AGENT_SENSOR_ANGLE * (PI * 2))) * AGENT_SENSOR_DISTANCE);
int right_x = round(agents[a].x_position + cos(agents[a].heading + (AGENT_SENSOR_ANGLE * (PI * 2))) * AGENT_SENSOR_DISTANCE);
int right_y = round(agents[a].y_position + sin(agents[a].heading + (AGENT_SENSOR_ANGLE * (PI * 2))) * AGENT_SENSOR_DISTANCE);
float front_value = attractant[front_x][front_y];
float left_value = attractant[left_x][left_y];
float right_value = attractant[right_x][right_y];
if (front_value > right_value and front_value > left_value) {
;
} else if (front_value < right_value and front_value < left_value) {
agents[a].heading += (random(0, 2) * 2 - 1) * (AGENT_MOVE_ANGLE / 100.0) * (PI*2) ;
} else if (left_value > right_value) {
agents[a].heading -= AGENT_MOVE_ANGLE * (PI * 2);
} else {
agents[a].heading += AGENT_MOVE_ANGLE * (PI * 2);
}
}
iterations++;
if (iterations % 2 == 0) { //64 && iterations % 64 == 0) { // (( == 0) {
box_blur(attractant);
//gaussian_blur();
;
}
if (iterations >= NUM_ITERATIONS) {
//cleanup();
if (cleanup(matrix, &iterations)) {
init_attractant();
init_agents();
}
}
}

View File

@ -1,10 +0,0 @@
#include <FastLED.h>
#define BAUD_RATE 115200 // serial debug port baud rate
void buffclear(CRGB *buf);
uint16_t XY16( uint16_t x, uint16_t y);
void mxfill(CRGB *leds);
uint16_t colorWheel(uint8_t pos);
void drawText(int colorWheelOffset);

View File

@ -1,19 +0,0 @@
const unsigned char overlay [] PROGMEM = {
// 'bw2, 64x32px
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
0x01, 0xf8, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80,
0x01, 0xff, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x80, 0x01, 0xc7, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00,
0x01, 0xc3, 0x80, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x01, 0xc3, 0x8f, 0xe1, 0xbe, 0x1c, 0x7b, 0x80,
0x01, 0xc3, 0x8f, 0xe1, 0xff, 0x1c, 0x73, 0x80, 0x01, 0xc3, 0x88, 0x71, 0xe7, 0x1c, 0xe3, 0x80,
0x01, 0xc3, 0x80, 0x71, 0xc3, 0x9d, 0xe3, 0x80, 0x01, 0xff, 0x00, 0x71, 0xc3, 0x9d, 0xc3, 0x80,
0x01, 0xff, 0x03, 0xf1, 0xc3, 0x9f, 0x83, 0x80, 0x01, 0xfc, 0x0f, 0xf1, 0xc3, 0x9f, 0xc3, 0x80,
0x01, 0xc0, 0x1f, 0x71, 0xc3, 0x9f, 0xc3, 0x80, 0x01, 0xc0, 0x3c, 0x71, 0xc3, 0x9d, 0xe3, 0x80,
0x01, 0xc0, 0x38, 0x71, 0xc3, 0x9c, 0xe3, 0x80, 0x01, 0xc0, 0x38, 0x71, 0xc3, 0x9c, 0xf3, 0x80,
0x01, 0xc0, 0x1c, 0xf1, 0xc3, 0x9c, 0x73, 0x80, 0x01, 0xc0, 0x1f, 0xf1, 0xc3, 0x9c, 0x7b, 0x80,
0x01, 0xc0, 0x0f, 0xb1, 0x83, 0x9c, 0x3b, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

View File

@ -1,5 +0,0 @@
#include "constants.h"
bool is_in_bounds(int x, int y) {
return (x < PANEL_WIDTH) and (y < PANEL_HEIGHT) and (x >= 0) and (y >= 0);
}

View File

@ -1,2 +0,0 @@
bool is_in_bounds(int x, int y);

View File

@ -1,54 +0,0 @@
#include "constants.h"
#include "visual.h"
void draw_bg(MatrixPanel_I2S_DMA *matrix) {
int h_lines = round(PANEL_HEIGHT / 7);
int v_lines = round(PANEL_WIDTH / 7);
for(int v = 0; v <= v_lines; v++) {
matrix->drawFastVLine(v*7+2, 0, PANEL_HEIGHT, matrix->color565(41, 17, 76));
}
for(int h = 0; h <= h_lines; h++) {
matrix->drawFastHLine(0, 7*h + 1, PANEL_WIDTH, matrix->color565(41, 17, 76));
}
}
void draw_attractant(MatrixPanel_I2S_DMA *matrix, float attractant[PANEL_WIDTH][PANEL_HEIGHT]) {
for(int x = 0; x<PANEL_WIDTH; x++) {
for(int y = 0; y<PANEL_HEIGHT; y++){
if (attractant[x][y] > 15.0) {
matrix->drawPixel(x, y, matrix->color565(
int((255.0 / 255.0) * round(attractant[x][y])),
int((80.0 / 255.0) * round(attractant[x][y])),
int((83.0 / 255.0) * round(attractant[x][y]))
)
);
}
}
}
}
int cleanup_x = 0;
bool cleanup(MatrixPanel_I2S_DMA *matrix, int* iterations) {
int progress = *iterations - NUM_ITERATIONS;
matrix->drawFastVLine(cleanup_x, 0, PANEL_HEIGHT, matrix->color565(254, 242, 255));
if (cleanup_x > 0) {
matrix->fillRect(0, 0, cleanup_x, PANEL_HEIGHT, matrix->color565(16, 0, 16));
}
int h_lines = round(PANEL_HEIGHT / 7);
int v_lines = round(cleanup_x / 7);
for(int v = 0; v < cleanup_x; v++) {
if (v%7 == 2) {
matrix->drawFastVLine(v, 0, PANEL_HEIGHT, matrix->color565(41, 17, 76));
}
}
for(int h = 0; h <= h_lines; h++) {
matrix->drawFastHLine(0, 7*h + 1, cleanup_x-1, matrix->color565(41, 17, 76));
}
cleanup_x++;
if (cleanup_x > PANEL_WIDTH) {
*iterations = 0;
cleanup_x = 0;
return true;
}
return false;
}

View File

@ -1,6 +0,0 @@
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include "constants.h"
#include "config.h"
void draw_bg(MatrixPanel_I2S_DMA *matrix);
void draw_attractant(MatrixPanel_I2S_DMA *matrix, float attractant[PANEL_WIDTH][PANEL_HEIGHT]);
bool cleanup(MatrixPanel_I2S_DMA *matrix, int* iterations);