Merge remote branch 'origin/master'
This commit is contained in:
commit
0142939508
|
@ -3,21 +3,36 @@
|
||||||
#include "basic/basic.h"
|
#include "basic/basic.h"
|
||||||
#include "funk/nrf24l01p.h"
|
#include "funk/nrf24l01p.h"
|
||||||
|
|
||||||
static uint32_t results=5000;
|
#define VOLTAGE_SAMPLES 8
|
||||||
|
static uint32_t voltage=5000*VOLTAGE_SAMPLES;
|
||||||
static uint8_t chrg=1;
|
static uint8_t chrg=1;
|
||||||
|
|
||||||
void VoltageCheck(void){
|
void VoltageCheck(void){
|
||||||
|
uint32_t v;
|
||||||
chrg=gpioGetValue(RB_PWR_CHRG);
|
chrg=gpioGetValue(RB_PWR_CHRG);
|
||||||
|
//slow down the adc for our high impedance voltage devider
|
||||||
|
ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 100000 - 1 ) << 8;
|
||||||
|
v = adcRead(1);
|
||||||
|
//speed it up again
|
||||||
|
ADC_AD0CR = ((CFG_CPU_CCLK / SCB_SYSAHBCLKDIV) / 1000000 - 1 ) << 8;
|
||||||
|
|
||||||
results = adcRead(1);
|
v *= 10560;
|
||||||
results *= 10560;
|
v /= 1024;
|
||||||
results /= 1024;
|
|
||||||
results += 50;
|
//add the drop over the voltage switch
|
||||||
if( results < 3500 ){
|
v += 50;
|
||||||
|
|
||||||
|
voltage -= voltage/VOLTAGE_SAMPLES;
|
||||||
|
voltage += v;
|
||||||
|
|
||||||
|
//battery is assumed empty if the volatge falls bellow 3.5V
|
||||||
|
if( voltage < (3500*VOLTAGE_SAMPLES) ){
|
||||||
|
//if( voltage < 3500 ){
|
||||||
nrf_off();
|
nrf_off();
|
||||||
gpioSetValue (RB_PWR_GOOD, 0);
|
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;
|
SCB_SCR |= SCB_SCR_SLEEPDEEP;
|
||||||
PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN;
|
PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN;
|
||||||
__asm volatile ("WFI");
|
__asm volatile ("WFI");
|
||||||
|
@ -25,7 +40,8 @@ void VoltageCheck(void){
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t GetVoltage(void){
|
uint32_t GetVoltage(void){
|
||||||
return results;
|
return voltage/8;
|
||||||
|
//return voltage;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t GetChrgStat(void){
|
uint8_t GetChrgStat(void){
|
||||||
|
|
|
@ -72,6 +72,17 @@ static void openbeaconRead()
|
||||||
|
|
||||||
void openbeaconSetup(void)
|
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();
|
oid = GetUUID32();
|
||||||
strength = 0;
|
strength = 0;
|
||||||
#if SAVE_OPENBEACON
|
#if SAVE_OPENBEACON
|
||||||
|
@ -137,8 +148,6 @@ static void openbeaconSendPacket(uint32_t id, uint32_t seq,
|
||||||
|
|
||||||
void openbeaconSend(void)
|
void openbeaconSend(void)
|
||||||
{
|
{
|
||||||
//uint8_t status;
|
|
||||||
|
|
||||||
nrf_config_get(&oldconfig);
|
nrf_config_get(&oldconfig);
|
||||||
|
|
||||||
nrf_set_channel(OPENBEACON_CHANNEL);
|
nrf_set_channel(OPENBEACON_CHANNEL);
|
||||||
|
@ -153,6 +162,6 @@ void openbeaconSend(void)
|
||||||
openbeaconSaveBlock();
|
openbeaconSaveBlock();
|
||||||
#endif
|
#endif
|
||||||
nrf_config_set(&oldconfig);
|
nrf_config_set(&oldconfig);
|
||||||
//return status;
|
nrf_set_strength(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,8 @@ $(LDFILE):
|
||||||
%.o : %.c
|
%.o : %.c
|
||||||
$(CC) $(CFLAGS) -o $@ $<
|
$(CC) $(CFLAGS) -o $@ $<
|
||||||
|
|
||||||
%.elf: %.o $(FIRMWARE) $(LDFILE)
|
%.elf: %.o $(FIRMWARE) $(LDFILE) libmemcpy.a
|
||||||
$(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $<
|
$(LD) $(LDFLAGS) -T $(LDFILE) -o $@ $< -L. -lmemcpy
|
||||||
$(SIZE) $@
|
$(SIZE) $@
|
||||||
|
|
||||||
%.bin: %.elf
|
%.bin: %.elf
|
||||||
|
@ -85,6 +85,13 @@ $(OBJS): usetable.h
|
||||||
usetable.h:
|
usetable.h:
|
||||||
./mktable.pl
|
./mktable.pl
|
||||||
|
|
||||||
|
help/memcpy.o: help/memcpy.c
|
||||||
|
|
||||||
|
libmemcpy.a: help/memcpy.o
|
||||||
|
$(AR) rcs $@ $<
|
||||||
|
$(RANLIB) $(RANLIBFLAGS) $@
|
||||||
|
|
||||||
|
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
|
||||||
.PHONY: $(LDFILE)
|
.PHONY: $(LDFILE)
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
#include <string.h>
|
||||||
|
#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);
|
||||||
|
};
|
|
@ -5,6 +5,7 @@
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
my $DIR="l0dable";
|
my $DIR="l0dable";
|
||||||
|
my $memcpy;
|
||||||
|
|
||||||
if( -d "../$DIR"){
|
if( -d "../$DIR"){
|
||||||
chdir("..");
|
chdir("..");
|
||||||
|
@ -105,10 +106,16 @@ for my $idx (0..$#symb){
|
||||||
print C "$_,";
|
print C "$_,";
|
||||||
};
|
};
|
||||||
print I "#define $_ ($types{$_}(TheTable[$idx]))";
|
print I "#define $_ ($types{$_}(TheTable[$idx]))";
|
||||||
|
if($_ eq "memcpy" || $_ eq "memmove"){
|
||||||
|
$memcpy=$idx
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
print C "};";
|
print C "};";
|
||||||
|
|
||||||
|
if (defined($memcpy)){
|
||||||
|
print I "#define _memcpy_nr $memcpy";
|
||||||
|
};
|
||||||
close(I);
|
close(I);
|
||||||
close(H);
|
close(H);
|
||||||
close(C);
|
close(C);
|
||||||
|
|
|
@ -0,0 +1,169 @@
|
||||||
|
/*
|
||||||
|
* 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 <sysinit.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* coded by Thammi from Pentagon Village
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sysinit.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#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();
|
||||||
|
lcdPrint("You failed,");
|
||||||
|
lcdNl();
|
||||||
|
lcdPrint(nickname);
|
||||||
|
lcdPrint("!");
|
||||||
|
lcdNl();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue