From 0403e99362b2a88adec5e3454b831e9f1e57bdac Mon Sep 17 00:00:00 2001 From: Thammi Date: Thu, 11 Aug 2011 17:35:17 +0200 Subject: [PATCH 01/11] Adding a very small tron/snake like game --- firmware/l0dable/tron.c | 98 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 firmware/l0dable/tron.c diff --git a/firmware/l0dable/tron.c b/firmware/l0dable/tron.c new file mode 100644 index 0000000..4fb8428 --- /dev/null +++ b/firmware/l0dable/tron.c @@ -0,0 +1,98 @@ +#include +#include + +#include "basic/basic.h" +#include "basic/random.h" +#include "lcd/display.h" +#include "usetable.h" + +void randomizeCoin(int* x, int* y); + +void ram() { + int key; + + int d = 0; + int x = RESX / 2; + int y = RESY / 2; + + int p = 0; + int q, r; + + randomizeCoin(&q, &r); + + lcdClear(); + + while (1) { + // display + lcdSetPixel(q, r, p % 3); + lcdSetPixel(x, y, 1); + lcdDisplay(); + + // wait + + delayms(20); + + // input + + key=getInputRaw(); + + switch(key) { + case BTN_RIGHT: + d = 3; + break; + case BTN_LEFT: + d = 2; + break; + case BTN_UP: + d = 0; + break; + case BTN_DOWN: + d = 1; + break; + case BTN_ENTER: + return; + } + + // step + + if(d > 1) { + x = (RESX + x + (d & 1) * 2 - 1) % RESX; + } else { + y = (RESY + y + d * 2 - 1) % RESY; + } + + p += 1; + + // collision + + if(x == q && y == r) { + p += 99; + randomizeCoin(&q, &r); + } else if(lcdGetPixel(x, y)) { + lcdClear(); + lcdPrintln("You lost!"); + lcdNl(); + lcdPrintInt(p); + lcdPrintln(" points"); + lcdDisplay(); + + while(getInputRaw() != BTN_ENTER); + + return; + } + } + return; +} + +void randomizeCoin(int* x, int* y) { + // WARNING: if you are really got at this the game freezes :D + for(;;) { + *x = getRandom() % RESX; + *y = getRandom() % RESY; + + if(!lcdGetPixel(*x, *y)) { + return; + } + } +} + From efbb72a31de80080a4e61805ff218279c8f387c0 Mon Sep 17 00:00:00 2001 From: Thammi Date: Thu, 11 Aug 2011 17:42:30 +0200 Subject: [PATCH 02/11] Adding author and license information to tron --- firmware/l0dable/tron.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/firmware/l0dable/tron.c b/firmware/l0dable/tron.c index 4fb8428..52a6978 100644 --- a/firmware/l0dable/tron.c +++ b/firmware/l0dable/tron.c @@ -1,3 +1,7 @@ +/* + * Pizzaware by Thammi from Pentaville + */ + #include #include From e3b1ff3a22ea0608f5ecc56dcde47149cf92a381 Mon Sep 17 00:00:00 2001 From: Thammi Date: Fri, 12 Aug 2011 21:41:06 +0200 Subject: [PATCH 03/11] Getting personal when losing tron --- firmware/l0dable/tron.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/firmware/l0dable/tron.c b/firmware/l0dable/tron.c index 52a6978..419a1a9 100644 --- a/firmware/l0dable/tron.c +++ b/firmware/l0dable/tron.c @@ -74,7 +74,11 @@ void ram() { randomizeCoin(&q, &r); } else if(lcdGetPixel(x, y)) { lcdClear(); - lcdPrintln("You lost!"); + lcdPrint("You failed,"); + lcdNl(); + lcdPrint(nickname); + lcdPrint("!"); + lcdNl(); lcdNl(); lcdPrintInt(p); lcdPrintln(" points"); From e0ad56aebc3608f10392e469d4a99c98a3862e82 Mon Sep 17 00:00:00 2001 From: Thammi Date: Fri, 12 Aug 2011 21:42:13 +0200 Subject: [PATCH 04/11] Removing pizzaware licence to use bsd --- firmware/l0dable/tron.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/l0dable/tron.c b/firmware/l0dable/tron.c index 419a1a9..78d6364 100644 --- a/firmware/l0dable/tron.c +++ b/firmware/l0dable/tron.c @@ -1,5 +1,5 @@ /* - * Pizzaware by Thammi from Pentaville + * coded by Thammi from Pentaville */ #include From 7f15ac9a4cc4ad747e8eb29e6b823d3927fe4c9b Mon Sep 17 00:00:00 2001 From: Thammi Date: Fri, 12 Aug 2011 23:08:45 +0200 Subject: [PATCH 05/11] Fixing village name --- firmware/l0dable/tron.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/l0dable/tron.c b/firmware/l0dable/tron.c index 78d6364..c238fd5 100644 --- a/firmware/l0dable/tron.c +++ b/firmware/l0dable/tron.c @@ -1,5 +1,5 @@ /* - * coded by Thammi from Pentaville + * coded by Thammi from Pentagon Village */ #include From 33fe346942176a0e988818980d04d1a8f746f894 Mon Sep 17 00:00:00 2001 From: Stefan Tomanek Date: Sat, 13 Aug 2011 14:14:12 +0200 Subject: [PATCH 06/11] add w0rpcore nickname l0dable This l0dable by Benedikt Roth and Stefan Tomanek serves as your main viewscreen, displaying your nickname the way you want it, and lets the stars zoom by. You can accelerate your vessel by pushing the joystick upwards or bring it to a halt by pressing it down - leaving your ship drifting in the endless space. Attach two LEDs to the modulbus connectors (SS2->GND, SS5->GND), so your r0ket can light up its nacelles when breaking the warp barrier. --- firmware/l0dable/nick_w0rpcore.c | 157 +++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 firmware/l0dable/nick_w0rpcore.c diff --git a/firmware/l0dable/nick_w0rpcore.c b/firmware/l0dable/nick_w0rpcore.c new file mode 100644 index 0000000..ca4df31 --- /dev/null +++ b/firmware/l0dable/nick_w0rpcore.c @@ -0,0 +1,157 @@ +#include + +#include "basic/basic.h" +#include "basic/config.h" + +#include "lcd/lcd.h" +#include "lcd/print.h" + +#include "usetable.h" + +#define NUM_STARS 100 +#define SPEED_MAX 10 +#define SPEED_DEFAULT 4 +#define SPEED_STOP 0 +#define SPEED_WARP 6 + +// Two RGB LEDs on the Modulbus +#define LEDA_R RB_SPI_SS0 +#define LEDA_G RB_SPI_SS1 +#define LEDA_B RB_SPI_SS2 + +#define LEDB_R RB_SPI_SS3 +#define LEDB_G RB_SPI_SS4 +#define LEDB_B RB_SPI_SS5 + +typedef struct { + short x, y, z; +} s_star; + +typedef struct { + short speed; +} s_ship; + +static s_ship ship = {SPEED_DEFAULT}; + +static s_star stars[NUM_STARS]; + +void init_star(s_star *star, int z); +void set_warp_lights(uint8_t enabled); +void drift_ship(void); + +void ram(void) +{ + short centerx = RESX >> 1; + short centery = RESY >> 1; + short i; + uint8_t key = 0; + + for (i = 0; i < NUM_STARS; i++) { + init_star(stars + i, i + 1); + } + + static uint8_t count = 0; + while(1) { + count++; + count%=256; + key = getInputRaw(); + if (key == BTN_ENTER) { + break; + } else if ( count%4 == 0 ) { + if (key == BTN_UP && ship.speed < SPEED_MAX) { + ship.speed++; + } else if (key == BTN_DOWN && ship.speed > SPEED_STOP) { + ship.speed--; + } else if (key ==BTN_NONE) { + /* converge towards default speed */ + if (ship.speed < SPEED_DEFAULT) { + ship.speed++; + } else if (ship.speed > SPEED_DEFAULT) { + ship.speed--; + } + } + } + + if (ship.speed > SPEED_WARP) { + set_warp_lights(1); + } else { + set_warp_lights(0); + } + + if (ship.speed == 0 && count%6==0) drift_ship(); + + int dx=0; + int dy=0; + setExtFont(GLOBAL(nickfont)); + dx=DoString(0,0,GLOBAL(nickname)); + dx=(RESX-dx)/2; + if(dx<0) dx=0; + dy=(RESY-getFontHeight())/2; + + lcdClear(); + DoString(dx,dy,GLOBAL(nickname)); + + for (i = 0; i < NUM_STARS; i++) { + stars[i].z -= ship.speed; + + if (ship.speed > 0 && stars[i].z <= 0) + init_star(stars + i, i + 1); + + short tempx = ((stars[i].x * 30) / stars[i].z) + centerx; + short tempy = ((stars[i].y * 30) / stars[i].z) + centery; + + if (tempx < 0 || tempx > RESX - 1 || tempy < 0 || tempy > RESY - 1) { + if (ship.speed > 0) { /* if we are flying, generate new stars in front */ + init_star(stars + i, i + 1); + } else { /* if we are drifting, simply move those stars to the other end */ + stars[i].x = (((tempx%RESX)-centerx)*stars[i].z)/30; + stars[i].y = (((tempy%RESY)-centery)*stars[i].z)/30; + } + continue; + } + + lcdSetPixel(tempx, tempy, 1); + if (stars[i].z < 50) { + lcdSetPixel(tempx + 1, tempy, 1); + } + if (stars[i].z < 20) { + lcdSetPixel(tempx, tempy + 1, 1); + lcdSetPixel(tempx + 1, tempy + 1, 1); + } + } + + lcdRefresh(); + + delayms_queue_plus(50,0); + } + set_warp_lights(0); +} + +void set_warp_lights(uint8_t enabled) { + gpioSetValue(LEDA_R, 0); + gpioSetValue(LEDA_G, 0); + gpioSetValue(LEDA_B, enabled); + + gpioSetValue(LEDB_R, 0); + gpioSetValue(LEDB_G, 0); + gpioSetValue(LEDB_B, enabled); +} + +void drift_ship(void) { + uint8_t d_x = 1; + uint8_t d_y = 1; + for (uint8_t i = 0; i < NUM_STARS; i++) { + stars[i].x += d_x; + stars[i].y += d_y; + } +} + +void init_star(s_star *star, int z) +{ + star->x = (getRandom() % RESX) - (RESX >> 1); + star->y = (getRandom() % RESY) - (RESY >> 1); + star->z = z; + + return; +} + From 29c7dfdf6488eb2e7ef5289f49ea9667439e6132 Mon Sep 17 00:00:00 2001 From: schneider Date: Mon, 16 Jan 2012 15:50:48 +0100 Subject: [PATCH 07/11] improved accuracy of battery voltage measurement Slowing down the ADC 10x while reading the voltage gives better results due to the very high impedance of the voltage devider. Readings are now about 100mV higher than before. --- firmware/basic/voltage.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/firmware/basic/voltage.c b/firmware/basic/voltage.c index a60bdd2..4996077 100644 --- a/firmware/basic/voltage.c +++ b/firmware/basic/voltage.c @@ -3,21 +3,31 @@ #include "basic/basic.h" #include "funk/nrf24l01p.h" -static uint32_t results=5000; +static uint32_t voltage=5000; static uint8_t chrg=1; void VoltageCheck(void){ chrg=gpioGetValue(RB_PWR_CHRG); + //slow down the adc for our high impedance volatage devider + ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 100000 - 1 ) << 8; + voltage = adcRead(1); + //speed it up again + ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 1000000 - 1 ) << 8; - results = adcRead(1); - results *= 10560; - results /= 1024; - results += 50; - if( results < 3500 ){ + voltage *= 10560; + voltage /= 1024; + + //add the drop over the voltage switch + voltage += 50; + + //battery is assumed empty if the volatge falls bellow 3.5V + if( voltage < 3500 ){ nrf_off(); gpioSetValue (RB_PWR_GOOD, 0); - gpioSetValue (RB_LCD_BL, 0); + gpioSetValue (RB_LCD_BL, 0); + + //put the chip into deep power down SCB_SCR |= SCB_SCR_SLEEPDEEP; PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN; __asm volatile ("WFI"); @@ -25,7 +35,7 @@ void VoltageCheck(void){ }; uint32_t GetVoltage(void){ - return results; + return voltage; }; uint8_t GetChrgStat(void){ From eee6ae55f0744a65392ae5b2eaa9503e8e7e13d0 Mon Sep 17 00:00:00 2001 From: schneider Date: Wed, 18 Jan 2012 20:59:12 +0100 Subject: [PATCH 08/11] openbeacon: set rf strength to 3 after sending --- firmware/funk/openbeacon.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/firmware/funk/openbeacon.c b/firmware/funk/openbeacon.c index 3ee67bc..ec048dd 100644 --- a/firmware/funk/openbeacon.c +++ b/firmware/funk/openbeacon.c @@ -72,6 +72,17 @@ static void openbeaconRead() void openbeaconSetup(void) { + uint8_t c = 0; + uint8_t channels[] = {12,17,22,27,32,37,42,47,52,57,62,67,72}; + //nrf_startCW(); + while(0){ + delayms(20); + nrf_set_channel(channels[c++]); + if( c == sizeof(channels) ){ + c = 0; + } + } + oid = GetUUID32(); strength = 0; #if SAVE_OPENBEACON @@ -137,8 +148,6 @@ static void openbeaconSendPacket(uint32_t id, uint32_t seq, void openbeaconSend(void) { - //uint8_t status; - nrf_config_get(&oldconfig); nrf_set_channel(OPENBEACON_CHANNEL); @@ -153,6 +162,6 @@ void openbeaconSend(void) openbeaconSaveBlock(); #endif nrf_config_set(&oldconfig); - //return status; + nrf_set_strength(3); } From d82dde9ecf0d9b088c366fc52c0e6d12ac58afe5 Mon Sep 17 00:00:00 2001 From: schneider Date: Thu, 19 Jan 2012 01:32:05 +0100 Subject: [PATCH 09/11] added authors to w0rpcore --- firmware/l0dable/nick_w0rpcore.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/firmware/l0dable/nick_w0rpcore.c b/firmware/l0dable/nick_w0rpcore.c index ca4df31..57a5526 100644 --- a/firmware/l0dable/nick_w0rpcore.c +++ b/firmware/l0dable/nick_w0rpcore.c @@ -1,3 +1,15 @@ +/* + * This l0dable by Benedikt Roth and Stefan Tomanek serves as your main + * viewscreen, displaying your nickname the way you want it, and lets the + * stars zoom by. You can accelerate your vessel by pushing the joystick + * upwards or bring it to a halt by pressing it down - leaving your ship + * drifting in the endless space. Attach two LEDs to the modulbus + * connectors (SS2->GND, SS5->GND), so your r0ket can light up its nacelles + * when breaking the warp barrier. + * + * commit 33fe346942176a0e988818980d04d1a8f746f894 1 parent 0eaf74fa87 + * wertarbyte authored August 13, 2011 + */ #include #include "basic/basic.h" From d9b7a2c6bd523fe1a93e075ca7d5ddc379af8fe8 Mon Sep 17 00:00:00 2001 From: schneider Date: Thu, 19 Jan 2012 23:01:00 +0100 Subject: [PATCH 10/11] added some filtering for the voltage reading --- firmware/basic/voltage.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/firmware/basic/voltage.c b/firmware/basic/voltage.c index 4996077..ff37ab6 100644 --- a/firmware/basic/voltage.c +++ b/firmware/basic/voltage.c @@ -3,26 +3,31 @@ #include "basic/basic.h" #include "funk/nrf24l01p.h" -static uint32_t voltage=5000; +#define VOLTAGE_SAMPLES 8 +static uint32_t voltage=5000*VOLTAGE_SAMPLES; static uint8_t chrg=1; void VoltageCheck(void){ - + uint32_t v; chrg=gpioGetValue(RB_PWR_CHRG); - //slow down the adc for our high impedance volatage devider + //slow down the adc for our high impedance voltage devider ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 100000 - 1 ) << 8; - voltage = adcRead(1); + v = adcRead(1); //speed it up again ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 1000000 - 1 ) << 8; - voltage *= 10560; - voltage /= 1024; + v *= 10560; + v /= 1024; //add the drop over the voltage switch - voltage += 50; + v += 50; + + voltage -= voltage/VOLTAGE_SAMPLES; + voltage += v; //battery is assumed empty if the volatge falls bellow 3.5V - if( voltage < 3500 ){ + if( voltage < (3500*VOLTAGE_SAMPLES) ){ + //if( voltage < 3500 ){ nrf_off(); gpioSetValue (RB_PWR_GOOD, 0); gpioSetValue (RB_LCD_BL, 0); @@ -35,7 +40,8 @@ void VoltageCheck(void){ }; uint32_t GetVoltage(void){ - return voltage; + return voltage/8; + //return voltage; }; uint8_t GetChrgStat(void){ From f823ef250462f40356e973c131d4f10b1323a43a Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Tue, 24 Jan 2012 00:18:36 +0100 Subject: [PATCH 11/11] Add "fake memcpy" lib so broken gcc can compile this --- firmware/l0dable/Makefile | 11 +++++++++-- firmware/l0dable/help/memcpy.c | 10 ++++++++++ firmware/l0dable/mktable.pl | 7 +++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 firmware/l0dable/help/memcpy.c diff --git a/firmware/l0dable/Makefile b/firmware/l0dable/Makefile index 873523b..ddf10f1 100644 --- a/firmware/l0dable/Makefile +++ b/firmware/l0dable/Makefile @@ -43,8 +43,8 @@ $(LDFILE): %.o : %.c $(CC) $(CFLAGS) -o $@ $< -%.elf: %.o $(FIRMWARE) $(LDFILE) - $(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $< +%.elf: %.o $(FIRMWARE) $(LDFILE) libmemcpy.a + $(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $< -L. -lmemcpy $(SIZE) $@ %.bin: %.elf @@ -85,6 +85,13 @@ $(OBJS): usetable.h usetable.h: ./mktable.pl +help/memcpy.o: help/memcpy.c + +libmemcpy.a: help/memcpy.o + $(AR) rcs $@ $< + $(RANLIB) $(RANLIBFLAGS) $@ + + .SUFFIXES: .PHONY: $(LDFILE) diff --git a/firmware/l0dable/help/memcpy.c b/firmware/l0dable/help/memcpy.c new file mode 100644 index 0000000..42e900d --- /dev/null +++ b/firmware/l0dable/help/memcpy.c @@ -0,0 +1,10 @@ +#include +#include "../usetable.h" + +#undef memcpy + +void * memcpy(void *dst, const void *src, size_t len){ + return + (*(void * (*)(void *, const void *, size_t ))(*(TheTable+_memcpy_nr))) + (dst, src, len); +}; diff --git a/firmware/l0dable/mktable.pl b/firmware/l0dable/mktable.pl index cceebe7..f55b9ee 100755 --- a/firmware/l0dable/mktable.pl +++ b/firmware/l0dable/mktable.pl @@ -5,6 +5,7 @@ use strict; my $DIR="l0dable"; +my $memcpy; if( -d "../$DIR"){ chdir(".."); @@ -105,10 +106,16 @@ for my $idx (0..$#symb){ print C "$_,"; }; print I "#define $_ ($types{$_}(TheTable[$idx]))"; + if($_ eq "memcpy" || $_ eq "memmove"){ + $memcpy=$idx + }; }; print C "};"; +if (defined($memcpy)){ + print I "#define _memcpy_nr $memcpy"; +}; close(I); close(H); close(C);