From b4c80c480cebafa563997517de3bc62e4690a142 Mon Sep 17 00:00:00 2001 From: bernd Date: Fri, 5 Aug 2011 03:12:41 +0200 Subject: [PATCH 1/3] Added dummy implementation for GetChrgStat to simulat0r --- simulat0r/firmware/basic/voltage.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/simulat0r/firmware/basic/voltage.c b/simulat0r/firmware/basic/voltage.c index a56ae54..7f56667 100644 --- a/simulat0r/firmware/basic/voltage.c +++ b/simulat0r/firmware/basic/voltage.c @@ -3,6 +3,7 @@ #include "basic/basic.h" uint32_t results=5000; +static uint8_t chrg=1; void VoltageCheck(void){ }; @@ -10,3 +11,7 @@ void VoltageCheck(void){ uint32_t GetVoltage(void){ return results; }; + +uint8_t GetChrgStat(void){ + return !chrg; +} From 2db0ed255254a62a7efbb11ac61c76829c9dfbe7 Mon Sep 17 00:00:00 2001 From: bernd Date: Fri, 5 Aug 2011 03:14:42 +0200 Subject: [PATCH 2/3] Saved lots of bytes by tuned calculation, so functionality could be (re)added --- firmware/l0dable/nick_life.c | 149 +++++++++++++++++++---------------- 1 file changed, 79 insertions(+), 70 deletions(-) diff --git a/firmware/l0dable/nick_life.c b/firmware/l0dable/nick_life.c index b4d1382..204ea98 100644 --- a/firmware/l0dable/nick_life.c +++ b/firmware/l0dable/nick_life.c @@ -30,20 +30,14 @@ int pattern=0; uchar stepmode=0; uchar randdensity=0; -//uint8_t bl=0; - -struct bitset _buf1,*buf1=&_buf1; -struct bitset _buf2,*buf2=&_buf2; - -struct bitset *life =&_buf1; -struct bitset *new =&_buf2; +struct bitset _life; +#define life (&_life) static void draw_area(); static void calc_area(); static void random_area(struct bitset *area, uchar x0, uchar y0, uchar x1, uchar y1,uchar value); static void reset_area(); -static void nextledcycle(); void ram(void) { getInputWaitRelease(); @@ -54,19 +48,29 @@ void ram(void) { setExtFont(GLOBAL(nickfont)); DoString(20,20,GLOBAL(nickname)); -#if 0 - gpioSetValue (RB_LED0, CFG_LED_ON); - gpioSetValue (RB_LED1, CFG_LED_ON); - gpioSetValue (RB_LED2, CFG_LED_ON); - gpioSetValue (RB_LED3, CFG_LED_ON); -#endif + char stepmode=0; while (1) { draw_area(); // xor life pattern over display content lcdDisplay(); draw_area(); // xor life pattern again to restore original display content lcdShift(1,-2,1); - if(getInputRaw()) - return; + char key=stepmode?getInputWait():getInputRaw(); + stepmode=0; + switch(key) { + case BTN_LEFT: + return; + case BTN_DOWN: + stepmode=1; + getInputWaitRelease(); + break; + case BTN_ENTER: + pattern=(pattern+1)%PATTERNCOUNT; + case BTN_UP: + stepmode=1; + reset_area(); + getInputWaitRelease(); + break; + } delayms_queue_plus(10,0); calc_area(); } @@ -132,13 +136,6 @@ static void fill_rect(char x0, char y0, char x1, char y1) { } } -#define STARTVALUE 10 -static void swap_areas() { - struct bitset *tmp=life; - life=new; - new=tmp; -} - static void fill_area(struct bitset *area, uchar x0, uchar y0, uchar x1, uchar y1,uchar value) { for(uchar x=x0; x<=x1; ++x) { for(uchar y=y0; y<=y1; ++y) { @@ -174,50 +171,79 @@ static void draw_area() { } } +static void copy_col(uint8_t columnindex, uint8_t *columnbuffer) { + for(uchar y=0; y<=RESY+1; ++y) { + columnbuffer[y]=bitset_get2(life,columnindex,y); + } +} + static void calc_area() { #ifdef SIMULATOR static unsigned long iter=0; fprintf(stderr,"Iteration %d \n",++iter); #endif + static uint8_t xiter=0; + static uint8_t yiter=0; + // printf("Mutant %d %d => ",xiter,yiter); + xiter=(xiter+1)%RESX; + if(xiter==0) yiter=(yiter+1)%RESY; + bitset_set2(life,xiter+1,yiter+1,1); + // printf("%d %d\n ",xiter,yiter); + + static uint8_t _a[RESY+2],*left=_a; + static uint8_t _b[RESY+2],*middle=_b; + copy_col(0,left); + copy_col(1,middle); for(uchar x=1; x<=RESX; ++x) { for(uchar y=1; y<=RESY; ++y) { - uchar sum=sum_area(life,x-1,y-1,x+1,y+1)-bitset_get2(life,x,y); - bitset_set2(new,x,y,sum==3||(sum==2&&bitset_get2(life,x,y))); + uchar sum=bitset_get2(life,x+1,y-1)+bitset_get2(life,x+1,y)+bitset_get2(life,x+1,y+1)+ + left[y-1]+left[y]+left[y+1]+middle[y-1]+middle[y+1]; + bitset_set2(life,x,y,sum==3||(sum==2&&bitset_get2(life,x,y))); } + // temp-less swap of buffer pointers + left+=(uint32_t)middle; + middle=left-(uint32_t)middle; + left=left-(uint32_t)middle; + copy_col(x+1,middle); } - swap_areas(); } static void reset_area() { - fill_area(life,0,0,RESX+1,RESY+1,0); - fill_area(new,0,0,RESX+1,RESY+1,0); - - switch(pattern) { - case 0: - bitset_set2(life,41,40,1); - bitset_set2(life,42,40,1); - bitset_set2(life,41,41,1); - bitset_set2(life,40,41,1); - bitset_set2(life,41,42,1); - break; + fill_area(life,0,0,RESX+1,RESY+1,0); + + switch(pattern) { + case 0: // R pentomino + bitset_set2(life,41,40,1); + bitset_set2(life,42,40,1); + bitset_set2(life,41,41,1); + bitset_set2(life,40,41,1); + bitset_set2(life,41,42,1); + break; + case 1: // block in the center, continuous generators at the edges + for(int i=0; i Date: Fri, 5 Aug 2011 03:46:37 +0200 Subject: [PATCH 3/3] Added mutation to make nick_life more living Slowed down nick shifting speed --- firmware/l0dable/nick_life.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/firmware/l0dable/nick_life.c b/firmware/l0dable/nick_life.c index 204ea98..50b47b7 100644 --- a/firmware/l0dable/nick_life.c +++ b/firmware/l0dable/nick_life.c @@ -28,8 +28,11 @@ typedef uint8_t uchar; int pattern=0; #define PATTERNCOUNT 3 +#define LCDSHIFT_EVERY_N 10 + uchar stepmode=0; uchar randdensity=0; +static unsigned long iter=0; struct bitset _life; #define life (&_life) @@ -53,7 +56,7 @@ void ram(void) { draw_area(); // xor life pattern over display content lcdDisplay(); draw_area(); // xor life pattern again to restore original display content - lcdShift(1,-2,1); + if(iter%LCDSHIFT_EVERY_N==0) lcdShift(1,-2,1); char key=stepmode?getInputWait():getInputRaw(); stepmode=0; switch(key) { @@ -178,19 +181,20 @@ static void copy_col(uint8_t columnindex, uint8_t *columnbuffer) { } static void calc_area() { + ++iter; #ifdef SIMULATOR - static unsigned long iter=0; - fprintf(stderr,"Iteration %d \n",++iter); + fprintf(stderr,"Iteration %d \n",iter); #endif + // sweeping mutation point static uint8_t xiter=0; static uint8_t yiter=0; - // printf("Mutant %d %d => ",xiter,yiter); xiter=(xiter+1)%RESX; if(xiter==0) yiter=(yiter+1)%RESY; bitset_set2(life,xiter+1,yiter+1,1); - // printf("%d %d\n ",xiter,yiter); - static uint8_t _a[RESY+2],*left=_a; + // remember just two columns + // these donĀ“t have to be static, so if the stack is big enoguh put them there and save another 200 bytes? + static uint8_t _a[RESY+2],*left=_a; static uint8_t _b[RESY+2],*middle=_b; copy_col(0,left); copy_col(1,middle);