From 7d79419f55e021ca448541b8739a2f8aabf4972c Mon Sep 17 00:00:00 2001 From: roy rocket Date: Thu, 11 Aug 2011 01:06:01 +0200 Subject: [PATCH] user supplied l0dables: leiwand demo and tedliz game --- firmware/l0dable/leiwand.c | 290 +++++++++++++++++++++++++++++++++++++ firmware/l0dable/leiwand.h | 70 +++++++++ firmware/l0dable/tedliz.c | 219 ++++++++++++++++++++++++++++ 3 files changed, 579 insertions(+) create mode 100644 firmware/l0dable/leiwand.c create mode 100644 firmware/l0dable/leiwand.h create mode 100644 firmware/l0dable/tedliz.c diff --git a/firmware/l0dable/leiwand.c b/firmware/l0dable/leiwand.c new file mode 100644 index 0000000..a88768d --- /dev/null +++ b/firmware/l0dable/leiwand.c @@ -0,0 +1,290 @@ +#include + +#include "basic/basic.h" + +//#include "lcd/render.h" +//#include "lcd/display.h" +//#include "lcd/allfonts.h" +//#include "lcd/backlight.h" +//#include "lcd/print.h" + +#include "usetable.h" + +//void backlightInit(void); +void incBacklight(void); +void decBacklight(void); +void paintLogo(bool); +void leiwandDisplay(void); + +/**************************************************************************/ +#include "leiwand.h" +/**************************************************************************/ + +void ram(void) { + int key; + while (1) { + leiwandDisplay(); + // Exit on enter+left + key=getInputRaw(); + if(key== BTN_ENTER + BTN_LEFT) + return; + } + return; +} + +void leiwandInit(void) { + paintLogo(false); + delayms(200); + DoString(0,0,"Boot..."); + lcdDisplay(); + delayms(1000); +} + +void leiwandDisplay(void) { + int dx=0; + char key = 0; + //backlightInit(); + int i; + int j; + char str[] = "LeiwandVille"; + char msg[] = " Just cool! "; +#define msglen 12 + int pos[msglen]; + int dir[msglen]; + int round = 0; + bool upPressed=false; + bool rightPressed=false; + bool downPressed=false; + int demoround = 0; + + //lcdToggleFlag(LCD_INVERTED); + + for(i = 0; i < msglen; i++) { + pos[i] = 1 + (i * 2); + dir[i] = 0; + } + + while (1) { + lcdDisplay(); + delayms(20); + + key= getInputRaw(); + + // Easy flashing + if((key&(BTN_ENTER|BTN_LEFT))==(BTN_ENTER|BTN_LEFT)){ + //DoString(0,8,"Enter ISP!"); + //lcdDisplay(); + //ISPandReset(); + return; + } + + /* + // INVERT + if(((key&(BTN_RIGHT))==(BTN_RIGHT))){ + if(!rightPressed) { + lcdToggleFlag(LCD_INVERTED); + } + rightPressed = true; + } else { + rightPressed = false; + } + */ + + // BRIGHTER + if(((key&(BTN_UP))==(BTN_UP))){ + if(!upPressed) { + incBacklight(); + } + upPressed = true; + } else { + upPressed = false; + } + + // DARKER + if(((key&(BTN_DOWN))==(BTN_DOWN))){ + if(!downPressed) { + decBacklight(); + } + downPressed = true; + } else { + downPressed = false; + } + + + round++; + if(round > 200) { + round = 0; + if(demoround == 1) { + paintLogo(true); + } else { + paintLogo(false); + delayms(1000); + } + demoround++; + } + if(demoround == 4) { + demoround = 0; + } + + for(i = 0; i < msglen; i++) { + if(dir[i] == 1) { + if(pos[i] >= 30) { + dir[i] = 0; + } else { + pos[i]++; + } + } else { + if(pos[i] == 0) { + dir[i] = 1; + } else { + pos[i]--; + } + } + } + + lcdFill(0); + //font=&Font_7x8; + for(i = 0; i < msglen; i++) { + if(str[i] != 32) { + dx=DoChar(i*8, pos[i], str[i]); + } + } + if(round < 100) { + // Second line of message + for(i = 0; i < msglen; i++) { + if(msg[i] != 32) { + dx=DoChar(i*8, 15+pos[i], msg[i]); + } + } + } else { + // INVADERS + //font = &Font_Invaders; + for(i = 2; i < 10; i+= 2) { + dx=DoChar(i*8, 15+pos[i], 'x'); + } + } + //font=&Font_7x8; + if(round < 50) { + dx=DoString(0, 60, " Visit us! "); + } else if(round < 100) { + dx=DoString(0, 60, " We are "); + } else if(round < 150) { + dx=DoString(0, 60, " next to the "); + } else { + dx=DoString(0, 60, " phone booth "); + if((round % 6) < 3) { + for(i = 0; i < 96; i++) { + for(j = 0; j < 8; j++) { + lcdSetPixel(i, j+60, !lcdGetPixel(i, j+60)); + } + } + } + } + /* + if(key&BTN_ENTER){ + lcdPrintInt(ctr++); + lcdPrintln("."); + while(getInputRaw())delayms(10); + }; + if(key&BTN_RIGHT){ + lcdShift(1,0,wrap); + } + if(key&BTN_LEFT){ + lcdShift(-1,0,wrap); + } + if(key&BTN_UP){ + lcdShift(0,1,wrap); + } + if(key&BTN_DOWN){ + lcdShift(0,-1,wrap); + } + */ + + //font = &Font_Ubuntu36pt; + } + return; +} + +void tick_scroll(void){ + return; +}; + +void incBacklight(void) { + /* + uint32_t brightness = backlightGetBrightness(); + if (brightness < 100) { + backlightSetBrightness(brightness + 10); + } + */ + return; +} + +void decBacklight(void) { + /* + uint32_t brightness = backlightGetBrightness(); + if (brightness > 0) { + backlightSetBrightness(brightness - 10); + } + */ + return; +} + +void paintLogo(bool animate) { + int i; + int j; + int t; + uint8_t pixel; + int bc = 8; + int next = 0; + int mask = 1; + + + lcdFill(0); + lcdDisplay(); + for(i = 0; i < 68; i++) { + for(j = 0; j < 68; j++) { + if(bc == 8) { + mask = 1; + bc = 0; + pixel = lv_logo[next]; + next++; + } + if((pixel & mask) > 0) { + lcdSetPixel(14+j, i, true); + } else { + lcdSetPixel(14+j, i, false); + } + bc++; + mask = mask << 1; + pixel >> 2; + } + //lcdDisplay(); + } + lcdDisplay(); + if(!animate) { + return; + } + + /* + for(i = 0; i < 30; i++) { + delayms(20); + } + */ + + for(t=0; t < 8; t++) { + for(i=0; i < 96; i++) { + for(j=0; j < 68; j++) { + lcdSetPixel(i, j, !lcdGetPixel(i,j)); + } + lcdDisplay(); + } + } + + /* + for(i = 0; i < 50; i++) { + delayms(20); + } + */ + + return; +} diff --git a/firmware/l0dable/leiwand.h b/firmware/l0dable/leiwand.h new file mode 100644 index 0000000..273d1ea --- /dev/null +++ b/firmware/l0dable/leiwand.h @@ -0,0 +1,70 @@ +uint8_t lv_logo[] = { +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,192,1, +0,0,0,0,0,0,128,63,0, +0,0,0,0,0,0,255,3, +0,0,0,0,0,0,255,95,0, +0,0,0,0,0,254,248,13, +0,0,0,0,0,254,3,159,0, +0,0,0,0,254,29,240,17, +0,0,0,0,252,131,1,31,1, +0,0,0,252,29,16,240,33, +0,0,0,252,131,1,1,31,2, +0,0,64,31,24,16,248,65, +0,0,0,224,129,129,193,31,4, +0,0,31,30,24,56,255,67, +0,0,252,231,129,129,255,61,4, +0,224,255,31,56,254,129,71, +0,0,255,255,129,255,3,120,4, +0,248,128,63,254,3,31,79, +0,192,247,224,255,3,248,243,4, +0,254,15,254,3,159,127,94, +0,224,255,240,3,248,251,199,5, +0,255,199,3,158,63,255,124, +0,240,63,4,248,251,247,143,7, +128,255,129,130,63,255,126,120, +0,248,0,0,248,247,207,129,3, +192,31,48,4,255,254,0,1, +0,252,255,231,240,207,3,0,0, +192,255,127,14,254,0,0,0, +0,254,255,113,193,3,0,0,0, +224,255,255,3,0,0,0,56, +0,0,255,63,2,0,0,240,7, +0,192,255,1,0,0,16,99, +0,0,224,7,2,0,8,49,4, +0,0,0,0,0,192,17,99, +0,0,0,0,0,24,60,49,6, +0,0,0,0,128,67,23,51, +0,0,0,0,96,60,228,241,1, +0,0,0,48,70,70,28,3, +0,0,0,8,39,100,132,1,0, +0,0,152,121,226,79,0,0, +0,0,136,153,54,198,0,0,6, +0,240,152,201,51,0,0,60, +0,0,131,241,28,1,0,192,0, +64,176,24,135,1,0,48,12, +0,4,143,113,0,0,4,195,7, +64,48,24,2,0,64,48,12, +0,4,131,1,0,100,4,195,0, +64,240,0,0,64,70,48,124, +0,60,3,0,48,102,4,203,0, +192,1,0,0,35,70,240,0, +0,0,0,0,96,99,60,0,0, +0,0,0,0,54,198,0,0, +0,0,0,0,192,97,0,0,0, +0,0,0,0,28,0,0,0, +0,0,0,0,128,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0, +0x0}; diff --git a/firmware/l0dable/tedliz.c b/firmware/l0dable/tedliz.c new file mode 100644 index 0000000..3e6d484 --- /dev/null +++ b/firmware/l0dable/tedliz.c @@ -0,0 +1,219 @@ +// tedliz +// ====== +// a kick ass tetris clone +// code by twobit (c3d2 at pentagon ville) +//////////////////////////////////////////////////////////////////////////////// + +#include +#include + +#include "basic/basic.h" +#include "basic/config.h" +#include "basic/random.h" +#include "lcd/render.h" +#include "lcd/display.h" +#include "lcd/fonts.h" +#include "lcd/fonts/invaders.h" +#include "funk/mesh.h" +#include "usetable.h" + +//////////////////////////////////////////////////////////////////////////////// + +enum { + GRID_WIDTH = 10, + GRID_HEIGHT = 20, + TICK_LENGTH = 30, + KEY_REPEAT_DELEAY = 5, + STARTING_SPEED = 12 +}; + +// key repeat delay stuff +int key_rep[] = { 0, 0, 0, 0, 0 }; + +int ticks_per_drop = STARTING_SPEED; + +int lines = 0; +int ticks = 0; + +int rot; +int stone; +int next_rot; +int next_stone; +int x_pos; +int y_pos; + +uint8_t grid[GRID_HEIGHT][GRID_WIDTH]; + +const uint8_t stones[7][16] = { + { 0, 0, 0, 0, 0,15,15, 0, 0,15,15, 0, 0, 0, 0, 0 }, + { 0, 0,10, 0, 5, 5,15, 5, 0, 0,10, 0, 0, 0,10, 0 }, + { 0, 0, 5, 0, 0, 0,15,15, 0,10,10, 5, 0, 0, 0, 0 }, + { 0, 0, 0, 5, 0,10,15, 5, 0, 0,15,10, 0, 0, 0, 0 }, + { 0, 4, 5, 8, 0,10,15,10, 0, 2, 5, 1, 0, 0, 0, 0 }, + { 0, 8, 5, 1, 0,10,15,10, 0, 4, 5, 2, 0, 0, 0, 0 }, + { 0, 0,11, 0, 0,13,15, 7, 0, 0,14, 0, 0, 0, 0, 0 } +}; + +void draw_grid(); +void new_stone(); +int collision(int top_also); + +void ram() { + + int raw_key, key; + int i, j; + + new_stone(); + new_stone(); + + // epmty grid + for(i = 0; i < GRID_HEIGHT; i++) + for(j = 0; j < GRID_WIDTH; j++) + grid[i][j] = 0; + + + // prepare screen + lcdClear(); + for(i = 0; i < 96; i++) { + lcdSetPixel(i, 2, 1); + lcdSetPixel(i, 65, 1); + } + for(i = 3; i < 65; i++) { + lcdSetPixel(2, i, 1); + lcdSetPixel(35, i, 1); + lcdSetPixel(93, i, 1); + } + + for(;;) { + + // handle input + raw_key = getInputRaw(); + key = 0; + for(i = 0; i < 5; i++) { + if(raw_key & (1 << i)) { + if(!key_rep[i] || key_rep[i] == KEY_REPEAT_DELEAY) key |= 1 << i; + key_rep[i] += key_rep[i] < KEY_REPEAT_DELEAY; + } + else key_rep[i] = 0; + } + + + // rotate + if(key & BTN_UP) { + i = rot; + rot = (rot << 1) % 15; + if(collision(0)) rot = i; + } + + // horizontal movement + i = x_pos; + x_pos += !!(key & BTN_RIGHT) - !!(key & BTN_LEFT); + if(i != x_pos && collision(0)) x_pos = i; + + // vertical movement + ticks++; + if(key & BTN_DOWN || ticks >= ticks_per_drop) { + ticks = 0; + y_pos++; + if(collision(0)) { + y_pos--; + + // check for game over + if(collision(1)) return; + + // copy stone to grid + int x, y; + for(y = 0; y < 4; y++) { + for(x = 0; x < 4; x++) { + if(stones[stone][(x << 2) + y] & rot) + grid[y + y_pos][x + x_pos] = 1; + } + } + + // check for complete lines + for(y = 0; y < GRID_HEIGHT; y++) { + for(x = 0; x < GRID_WIDTH; x++) + if(!grid[y][x]) break; + + if(x == GRID_WIDTH) { + + lines++; + ticks_per_drop = STARTING_SPEED - lines / 10; + if(ticks_per_drop < 1) ticks_per_drop = 1; + + for(i = y; i > 0; i--) + for(x = 0; x < GRID_WIDTH; x++) + grid[i][x] = grid[i - 1][x]; + } + } + + // get a new stone + new_stone(); + } + } + + draw_grid(); + lcdDisplay(); + delayms(TICK_LENGTH); + } + return; +} + +int collision(int top_also) { + int x, y; + for(y = 0; y < 4; y++) { + for(x = 0; x < 4; x++) { + if(stones[stone][(x << 2) + y] & rot && ( + x + x_pos < 0 || x + x_pos >= GRID_WIDTH || + (top_also && y + y_pos < 0) || y + y_pos >= GRID_HEIGHT || + grid[y + y_pos][x + x_pos])) + return 1; + } + } + return 0; +} + +void new_stone() { + x_pos = 3; + y_pos = -3; + + rot = next_rot; + stone = next_stone; + + next_rot = 1 << getRandom() % 4; + next_stone = getRandom() % 7; +} + + +void draw_block(int x, int y, int b) { + lcdSetPixel(0 + x, 0 + y, b); + lcdSetPixel(1 + x, 0 + y, b); + lcdSetPixel(2 + x, 0 + y, b); + lcdSetPixel(0 + x, 1 + y, b); + lcdSetPixel(1 + x, 1 + y, b); + lcdSetPixel(2 + x, 1 + y, b); + lcdSetPixel(0 + x, 2 + y, b); + lcdSetPixel(1 + x, 2 + y, b); + lcdSetPixel(2 + x, 2 + y, b); +} + +void draw_grid() { + int b, y, x; + + for(y = 0; y < GRID_HEIGHT; y++) { + for(x = 0; x < GRID_WIDTH; x++) { + + b = grid[y][x] || + (x >= x_pos && x < x_pos + 4 && y >= y_pos && y < y_pos + 4 && + stones[stone][((x - x_pos) << 2) + (y - y_pos)] & rot); + + draw_block(4 + x * 3, 4 + y * 3, b); + } + } + + // look adhead + for(y = 0; y < 4; y++) + for(x = 0; x < 4; x++) + draw_block(40 + x * 3, 7 + y * 3, !!(stones[next_stone][(x << 2) + y] & next_rot)); + +}