#include #include #include "../compat/pgmspace.h" #include "../random/prng.h" #include "../util.h" #include "../autoconf.h" #include "../pixel.h" #define BITMAP_WIDTH 48 #define BITMAP_HEIGHT 48 #define VIEWPORT_WIDTH 16 #define VIEWPORT_HEIGHT 16 #define XDOMAIN (BITMAP_WIDTH - VIEWPORT_WIDTH) #define YDOMAIN (BITMAP_HEIGHT - VIEWPORT_HEIGHT) static uint16_t laborlogo_getLine(uint8_t x, uint8_t y) { assert(x <= BITMAP_WIDTH - VIEWPORT_WIDTH); assert(y < BITMAP_HEIGHT); static const uint8_t nBitmap[48][6] PROGMEM = {{0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF}, {0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0xFF}, {0xFF, 0xF8, 0x00, 0xFF, 0x1F, 0xFF}, {0xFF, 0xF0, 0x00, 0xFF, 0xEF, 0xFF}, {0xFF, 0xC0, 0x00, 0xFF, 0xF3, 0xFF}, {0xFF, 0x80, 0x00, 0xFF, 0xFD, 0xFF}, {0xFF, 0x00, 0x00, 0xFF, 0xFE, 0xFF}, {0xFE, 0x00, 0x03, 0x3F, 0xFF, 0x7F}, {0xFC, 0x00, 0x04, 0xDF, 0xFF, 0xBF}, {0xF8, 0x00, 0x08, 0xEF, 0xFF, 0xDF}, {0xF0, 0x00, 0x10, 0xF7, 0xFF, 0xEF}, {0xF0, 0x00, 0x10, 0xF7, 0xFF, 0xEF}, {0xE0, 0xC0, 0x10, 0xF7, 0xFF, 0xF7}, {0xC0, 0xC0, 0x10, 0xF7, 0xFF, 0xFB}, {0xC0, 0x40, 0x08, 0xEF, 0xFF, 0xFB}, {0xC0, 0x40, 0x04, 0xDF, 0xFF, 0xFB}, {0x80, 0x40, 0x03, 0x3F, 0xFF, 0xFD}, {0x87, 0xFC, 0x00, 0xFF, 0xFF, 0xFD}, {0x84, 0x0C, 0x00, 0xFF, 0xFF, 0xFD}, {0x04, 0x00, 0x1F, 0x07, 0xFF, 0xFE}, {0x04, 0x00, 0x10, 0xF7, 0xFF, 0xFE}, {0x04, 0x00, 0x10, 0xF7, 0xFF, 0xFE}, {0xFF, 0x80, 0x10, 0xF7, 0xFF, 0xFE}, {0x00, 0x80, 0x10, 0xF7, 0xFF, 0xFE}, {0x00, 0x80, 0x10, 0xF7, 0xFF, 0xFE}, {0x00, 0x80, 0x10, 0xF7, 0xFF, 0xFE}, {0x00, 0x80, 0x10, 0xF7, 0xFF, 0xFE}, {0x00, 0x80, 0x10, 0xF7, 0xFF, 0xFE}, {0x00, 0x80, 0x10, 0xF7, 0xFF, 0xFE}, {0xBF, 0xFC, 0x10, 0xF7, 0xFF, 0xFD}, {0xB0, 0x0C, 0x10, 0xF7, 0xFF, 0xFD}, {0x80, 0x00, 0x10, 0xF7, 0xFF, 0xFD}, {0xC0, 0x00, 0x10, 0xF7, 0xFF, 0xFB}, {0xC0, 0x00, 0x10, 0xF7, 0xFF, 0xFB}, {0xC0, 0x00, 0x10, 0xF7, 0xFF, 0xFB}, {0xE0, 0x00, 0x10, 0xF7, 0xFF, 0xF7}, {0xF0, 0x00, 0x10, 0xF7, 0xFF, 0xEF}, {0xF0, 0x00, 0x10, 0xF7, 0xFF, 0xEF}, {0xF8, 0x00, 0x10, 0xF7, 0xFF, 0xDF}, {0xFC, 0x00, 0x10, 0xF7, 0xFF, 0xBF}, {0xFE, 0x00, 0x1F, 0x07, 0xFF, 0x7F}, {0xFF, 0x00, 0x00, 0xFF, 0xFE, 0xFF}, {0xFF, 0x80, 0x00, 0xFF, 0xFD, 0xFF}, {0xFF, 0xC0, 0x00, 0xFF, 0xF3, 0xFF}, {0xFF, 0xF0, 0x00, 0xFF, 0xEF, 0xFF}, {0xFF, 0xF8, 0x00, 0xFF, 0x1F, 0xFF}, {0xFF, 0xFF, 0x00, 0xF8, 0xFF, 0xFF}, {0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF}}; uint16_t nLine; uint8_t nAlignment = x % 8; if (nAlignment == 0) { nLine = nBitmap[y][x / 8] << 8 | (nBitmap[y][x / 8 + 1]); } else { nLine = pgm_read_byte(&nBitmap[y][x / 8]) << (8 + nAlignment); nLine |= pgm_read_byte(&nBitmap[y][x / 8 + 1]) << nAlignment; nLine |= pgm_read_byte(&nBitmap[y][x / 8 + 2]) >> (8 - nAlignment); } return nLine; } void laborlogo_drawViewport(uint8_t nBitmapX, uint8_t nBitmapY) { assert(nBitmapX <= 32); assert(nBitmapY <= 32); for (uint8_t nVPortY = 0; nVPortY < 16; ++nVPortY) { uint16_t nLineBuffer = laborlogo_getLine(nBitmapX, nVPortY + nBitmapY); for (int8_t nVPortX = 0; nVPortX < 16; ++nVPortX) { if ((0x0001 << nVPortX) & nLineBuffer) { setpixel((pixel){nVPortX, nVPortY}, 3); } else { setpixel((pixel){nVPortX, nVPortY}, 0); } } } } void laborlogo_recalcVectors(int8_t *px, int8_t *py, int8_t *pdx, int8_t *pdy) { if (((*px + *pdx) > (XDOMAIN)) || ((*px + *pdx) < 0)) { *pdx = random8() % 2 * (*px < (XDOMAIN / 2) ? 1 : -1); } if (((*py + *pdy) > (YDOMAIN)) || ((*py + *pdy) < 0)) { *pdy = random8() % 2 * (*py < (YDOMAIN / 2) ? 1 : -1); } if (*pdx == 0 && *pdy == 0) { *pdx = (*px < (XDOMAIN / 2) ? 1 : -1); *pdy = (*py < (YDOMAIN / 2) ? 1 : -1); } *px += *pdx; *py += *pdy; // printf("%d, %d\n", *px , *py); } void laborlogo() { uint16_t nCycles = 500; int8_t x = random8() % (XDOMAIN + 1); int8_t y = random8() % (YDOMAIN + 1); int8_t dx = 0; int8_t dy = 0; while (nCycles-- != 0) { laborlogo_drawViewport(x ,y); wait(75); laborlogo_recalcVectors(&x, &y, &dx, &dy); } }