Christian Kroll
15 years ago
5 changed files with 171 additions and 1 deletions
@ -0,0 +1,145 @@ |
|||||
|
#include <stdint.h> |
||||
|
#include <assert.h> |
||||
|
#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); |
||||
|
} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
/*
|
||||
|
* laborlogo.h |
||||
|
* |
||||
|
* Created on: 13.04.2010 |
||||
|
* Author: chris |
||||
|
*/ |
||||
|
|
||||
|
#ifndef LABORLOGO_H_ |
||||
|
#define LABORLOGO_H_ |
||||
|
|
||||
|
void laborlogo(); |
||||
|
|
||||
|
#endif /* LABORLOGO_H_ */ |
Loading…
Reference in new issue