Merge branch 'master' of github.com:r0ket/r0ket

This commit is contained in:
iggy 2011-08-05 12:12:51 +02:00
commit 1e517d51ed
14 changed files with 504 additions and 139 deletions

14
firmware/SECRETS Normal file
View File

@ -0,0 +1,14 @@
#ifndef _SECRETS_
#define _SECRETS_
static uint32_t const meshkey[4] = {
0x00000042, 0x000005ec, 0x00000023, 0x00000005
};
static const uint32_t openbeaconkey[4] = {
0xB4595344, 0xD3E119B6, 0xA814D0EC, 0xEFF5A24E
};
static uint32_t const remotekey[4] = {
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
};
#endif

View File

@ -50,6 +50,10 @@ WRAPOBJ=$(WRAP).o
WRAPSRC=$(WRAP).c WRAPSRC=$(WRAP).c
LIBFILE=lib$(LIBNAME).a LIBFILE=lib$(LIBNAME).a
ifeq "$(FINAL)" "y"
CFLAGS+=-DFINAL
endif
########################################################################## ##########################################################################
# Compiler settings, parameters and flags # Compiler settings, parameters and flags
########################################################################## ##########################################################################

View File

@ -29,10 +29,6 @@ void main_default(void) {
case BTN_UP: // Reset config case BTN_UP: // Reset config
f_unlink("r0ket.cfg"); f_unlink("r0ket.cfg");
break; break;
case BTN_RIGHT:
GLOBAL(develmode)=1;
applyConfig();
break;
case BTN_DOWN: case BTN_DOWN:
usbMSCInit(); usbMSCInit();
while(1) while(1)
@ -41,6 +37,10 @@ void main_default(void) {
}; };
readConfig(); readConfig();
if(getInputRaw()==BTN_RIGHT){
GLOBAL(develmode)=1;
applyConfig();
};
randomInit(); randomInit();
return; return;

View File

@ -120,7 +120,19 @@ char *meshmsgs(void){
return msgtypes; return msgtypes;
}; };
static inline uint32_t popcount(uint32_t *buf, uint8_t n){
int cnt=0;
do {
unsigned m = *buf++;
m = (m & 0x55555555) + ((m & 0xaaaaaaaa) >> 1);
m = (m & 0x33333333) + ((m & 0xcccccccc) >> 2);
m = (m & 0x0f0f0f0f) + ((m & 0xf0f0f0f0) >> 4);
m = (m & 0x00ff00ff) + ((m & 0xff00ff00) >> 8);
m = (m & 0x0000ffff) + ((m & 0xffff0000) >> 16);
cnt += m;
} while(--n);
return cnt;
}
extern MPKT meshbuffer[MESHBUFSIZE]; extern MPKT meshbuffer[MESHBUFSIZE];
//# MENU messages //# MENU messages
@ -152,6 +164,12 @@ void m_choose(){
case('T'): case('T'):
strcpy(p,"Time"); strcpy(p,"Time");
break; break;
case('Z'):
strcpy(p,"Schnitzel");
break;
case('z'):
strcpy(p,"S-Score");
break;
case('i'): case('i'):
strcpy(p,"Invaders"); strcpy(p,"Invaders");
break; break;
@ -188,6 +206,12 @@ void m_choose(){
case('T'): case('T'):
lcdPrintln("Time"); lcdPrintln("Time");
break; break;
case('Z'):
strcpy(p,"Schnitzel");
break;
case('z'):
strcpy(p,"S-Score");
break;
case('i'): case('i'):
lcdPrintln("Invaders"); lcdPrintln("Invaders");
break; break;
@ -203,7 +227,19 @@ void m_choose(){
lcdPrint(IntToStr(tm->tm_sec,2,F_LONG|F_ZEROS)); lcdPrint(IntToStr(tm->tm_sec,2,F_LONG|F_ZEROS));
lcdNl(); lcdNl();
if(tmm[i]=='T'){ if(tmm[i]=='Z'){
lcdPrintln(IntToStrX(uint8ptouint32(meshbuffer[j].pkt+ 6),8));
lcdPrintln(IntToStrX(uint8ptouint32(meshbuffer[j].pkt+10),8));
lcdPrintln(IntToStrX(uint8ptouint32(meshbuffer[j].pkt+14),8));
lcdPrintln(IntToStrX(uint8ptouint32(meshbuffer[j].pkt+18),8));
lcdPrintln(IntToStrX(uint8ptouint32(meshbuffer[j].pkt+22),8));
lcdPrintln(IntToStrX(uint8ptouint32(meshbuffer[j].pkt+26),8));
lcdPrint(IntToStr(popcount(meshbuffer[j].pkt+6,6),3,0));
lcdPrintln(" pts.");
lcdRefresh();
getInputWaitRelease();
continue;
}else if(tmm[i]=='T'){
lcdPrint(IntToStr(tm->tm_mday,2,F_LONG)); lcdPrint(IntToStr(tm->tm_mday,2,F_LONG));
lcdPrint("."); lcdPrint(".");
lcdPrint(IntToStr(tm->tm_mon+1,2,0)); lcdPrint(IntToStr(tm->tm_mon+1,2,0));

View File

@ -23,13 +23,7 @@
#define BEACON_CHANNEL 81 #define BEACON_CHANNEL 81
#define BEACON_MAC "\x1\x2\x3\x2\1" #define BEACON_MAC "\x1\x2\x3\x2\1"
uint32_t const beaconkey[4] = { #include "SECRETS"
0xB4595344,0xD3E119B6,0xA814D0EC,0xEFF5A24E
};
uint32_t remotekey[4] = {
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
};
extern uint32_t const meshkey[4];
char funkencrypt=0; char funkencrypt=0;
@ -167,7 +161,7 @@ int process(char * input){
config.maclen[0]=0x10; config.maclen[0]=0x10;
config.nrmacs=1; config.nrmacs=1;
nrf_config_set(&config); nrf_config_set(&config);
memcpy(thekey,beaconkey,sizeof(thekey)); memcpy(thekey,openbeaconkey,sizeof(thekey));
funkencrypt=1; funkencrypt=1;
}else if(input[1]=='?'){ }else if(input[1]=='?'){
nrf_config_get(&config); nrf_config_get(&config);

View File

@ -28,7 +28,7 @@ struct CDESC the_config[]= {
{"flamemaxw", 255, 1, 255, 1, CFG_TYPE_FLAME}, {"flamemaxw", 255, 1, 255, 1, CFG_TYPE_FLAME},
{"flameminw", 0x8f, 1, 255, 1, CFG_TYPE_FLAME}, {"flameminw", 0x8f, 1, 255, 1, CFG_TYPE_FLAME},
{"l0nick", 0, 0, 1 , 0, 0}, {"l0nick", 0, 0, 1 , 0, 0},
{"chargeled", 1, 0, 1 , 0, 0}, {"chargeled", 0, 0, 1 , 0, 0},
{ NULL, 0, 0, 0 , 0, 0}, { NULL, 0, 0, 0 , 0, 0},
}; };

View File

@ -79,6 +79,8 @@ void handleMenu(const struct MENU *the_menu) {
if (the_menu->entries[menuselection].callback!=NULL) if (the_menu->entries[menuselection].callback!=NULL)
the_menu->entries[menuselection].callback(); the_menu->entries[menuselection].callback();
setSystemFont();
if (menuflags&MENU_JUSTONCE) if (menuflags&MENU_JUSTONCE)
return; return;
@ -91,6 +93,7 @@ void handleMenu(const struct MENU *the_menu) {
if (the_menu->entries[menuselection].callback!=NULL) if (the_menu->entries[menuselection].callback!=NULL)
the_menu->entries[menuselection].callback(); the_menu->entries[menuselection].callback();
lcdRefresh(); lcdRefresh();
setSystemFont();
if (menuflags&MENU_JUSTONCE) if (menuflags&MENU_JUSTONCE)
return; return;

View File

@ -0,0 +1,188 @@
/*---------------------------------------------------------------------------/
/ FatFs - FAT file system module configuration file R0.08b (C)ChaN, 2011
/----------------------------------------------------------------------------/
/
/ CAUTION! Do not forget to make clean the project after any changes to
/ the configuration options.
/
/----------------------------------------------------------------------------*/
#ifndef _FFCONF
#define _FFCONF 8237 /* Revision ID */
/*---------------------------------------------------------------------------/
/ Function and Buffer Configurations
/----------------------------------------------------------------------------*/
#define _FS_TINY 1 /* 0:Normal or 1:Tiny */
/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system
/ object instead of the sector buffer in the individual file object for file
/ data transfer. This reduces memory consumption 512 bytes each file object. */
#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */
/* Setting _FS_READONLY to 1 defines read only configuration. This removes
/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
/ f_truncate and useless f_getfree. */
#define _FS_MINIMIZE 1 /* 0 to 3 */
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
/
/ 0: Full function.
/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
/ are removed.
/ 2: f_opendir and f_readdir are removed in addition to 1.
/ 3: f_lseek is removed in addition to 2. */
#define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable */
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
#define _USE_MKFS 0 /* 0:Disable or 1:Enable */
/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */
/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */
#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */
/* To enable fast seek feature, set _USE_FASTSEEK to 1. */
/*---------------------------------------------------------------------------/
/ Locale and Namespace Configurations
/----------------------------------------------------------------------------*/
#define _CODE_PAGE 1
/* The _CODE_PAGE specifies the OEM code page to be used on the target system.
/ Incorrect setting of the code page can cause a file open failure.
/
/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows)
/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows)
/ 949 - Korean (DBCS, OEM, Windows)
/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows)
/ 1250 - Central Europe (Windows)
/ 1251 - Cyrillic (Windows)
/ 1252 - Latin 1 (Windows)
/ 1253 - Greek (Windows)
/ 1254 - Turkish (Windows)
/ 1255 - Hebrew (Windows)
/ 1256 - Arabic (Windows)
/ 1257 - Baltic (Windows)
/ 1258 - Vietnam (OEM, Windows)
/ 437 - U.S. (OEM)
/ 720 - Arabic (OEM)
/ 737 - Greek (OEM)
/ 775 - Baltic (OEM)
/ 850 - Multilingual Latin 1 (OEM)
/ 858 - Multilingual Latin 1 + Euro (OEM)
/ 852 - Latin 2 (OEM)
/ 855 - Cyrillic (OEM)
/ 866 - Russian (OEM)
/ 857 - Turkish (OEM)
/ 862 - Hebrew (OEM)
/ 874 - Thai (OEM, Windows)
/ 1 - ASCII only (Valid for non LFN cfg.)
*/
#define _USE_LFN 0 /* 0 to 3 */
#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */
/* The _USE_LFN option switches the LFN support.
/
/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect.
/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
/ 2: Enable LFN with dynamic working buffer on the STACK.
/ 3: Enable LFN with dynamic working buffer on the HEAP.
/
/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN,
/ Unicode handling functions ff_convert() and ff_wtoupper() must be added
/ to the project. When enable to use heap, memory control functions
/ ff_memalloc() and ff_memfree() must be added to the project. */
#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */
/* To switch the character code set on FatFs API to Unicode,
/ enable LFN feature and set _LFN_UNICODE to 1. */
#define _FS_RPATH 0 /* 0 to 2 */
/* The _FS_RPATH option configures relative path feature.
/
/ 0: Disable relative path feature and remove related functions.
/ 1: Enable relative path. f_chdrive() and f_chdir() are available.
/ 2: f_getcwd() is available in addition to 1.
/
/ Note that output of the f_readdir fnction is affected by this option. */
/*---------------------------------------------------------------------------/
/ Physical Drive Configurations
/----------------------------------------------------------------------------*/
#define _VOLUMES 1
/* Number of volumes (logical drives) to be used. */
#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */
/* Maximum sector size to be handled.
/ Always set 512 for memory card and hard disk but a larger value may be
/ required for on-board flash memory, floppy disk and optical disk.
/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size
/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */
#define _MULTI_PARTITION 0 /* 0:Single partition or 1:Multiple partition */
/* When set to 0, each volume is bound to the same physical drive number and
/ it can mount only first primaly partition. When it is set to 1, each volume
/ is tied to the partitions listed in VolToPart[]. */
#define _USE_ERASE 0 /* 0:Disable or 1:Enable */
/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command
/ should be added to the disk_ioctl functio. */
/*---------------------------------------------------------------------------/
/ System Configurations
/----------------------------------------------------------------------------*/
#define _WORD_ACCESS 0 /* 0 or 1 */
/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS
/ option defines which access method is used to the word data on the FAT volume.
/
/ 0: Byte-by-byte access.
/ 1: Word access. Do not choose this unless following condition is met.
/
/ When the byte order on the memory is big-endian or address miss-aligned word
/ access results incorrect behavior, the _WORD_ACCESS must be set to 0.
/ If it is not the case, the value can also be set to 1 to improve the
/ performance and code size. */
/* A header file that defines sync object types on the O/S, such as
/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */
#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */
#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */
#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */
/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module.
/
/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect.
/ 1: Enable reentrancy. Also user provided synchronization handlers,
/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj
/ function must be added to the project. */
#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */
/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value
defines how many files can be opened simultaneously. */
#endif /* _FFCONFIG */

View File

@ -14,9 +14,7 @@ char meshmsg=0;
char meshnice=0; char meshnice=0;
MPKT meshbuffer[MESHBUFSIZE]; MPKT meshbuffer[MESHBUFSIZE];
uint32_t const meshkey[4] = { #include "SECRETS"
0x00000042, 0x000005ec, 0x00000023, 0x00000005
};
struct NRF_CFG oldconfig; struct NRF_CFG oldconfig;
@ -57,6 +55,8 @@ MPKT * meshGetMessage(uint8_t type){
void mesh_cleanup(void){ void mesh_cleanup(void){
time_t now=getSeconds(); time_t now=getSeconds();
for(int i=1;i<MESHBUFSIZE;i++){ for(int i=1;i<MESHBUFSIZE;i++){
if(meshbuffer[i].flags&MF_LOCK)
continue;
if(meshbuffer[i].flags&MF_USED){ if(meshbuffer[i].flags&MF_USED){
if (MO_GEN(meshbuffer[i].pkt)<meshgen) if (MO_GEN(meshbuffer[i].pkt)<meshgen)
meshbuffer[i].flags=MF_FREE; meshbuffer[i].flags=MF_FREE;
@ -128,6 +128,20 @@ void mesh_recvqloop_setup(void){
nrf_rcv_pkt_start(); nrf_rcv_pkt_start();
}; };
static inline uint32_t popcount(uint32_t *buf, uint8_t n){
int cnt=0;
do {
unsigned m = *buf++;
m = (m & 0x55555555) + ((m & 0xaaaaaaaa) >> 1);
m = (m & 0x33333333) + ((m & 0xcccccccc) >> 2);
m = (m & 0x0f0f0f0f) + ((m & 0xf0f0f0f0) >> 4);
m = (m & 0x00ff00ff) + ((m & 0xff00ff00) >> 8);
m = (m & 0x0000ffff) + ((m & 0xffff0000) >> 16);
cnt += m;
} while(--n);
return cnt;
}
uint8_t mesh_recvqloop_work(void){ uint8_t mesh_recvqloop_work(void){
__attribute__ ((aligned (4))) uint8_t buf[32]; __attribute__ ((aligned (4))) uint8_t buf[32];
int len; int len;
@ -166,9 +180,29 @@ uint8_t mesh_recvqloop_work(void){
// Store packet in a same/free slot // Store packet in a same/free slot
MPKT* mpkt=meshGetMessage(MO_TYPE(buf)); MPKT* mpkt=meshGetMessage(MO_TYPE(buf));
// Skip locked packet // Schnitzel
if(mpkt->flags&MF_LOCK) if(MO_TYPE(buf)=='Z'){
return 2; mpkt->flags=MF_USED|MF_LOCK;
MO_TIME_set(mpkt->pkt,getSeconds());
MO_GEN_set(mpkt->pkt,0x70);
for(int i=6;i<MESHPKTSIZE;i++)
mpkt->pkt[i]|=buf[i];
int score=popcount(MO_BODY(mpkt->pkt),6);
MPKT* reply=meshGetMessage('z');
if(MO_TIME(reply->pkt)>=score)
return 1;
MO_TIME_set(reply->pkt,score);
strcpy((char*)MO_BODY(reply->pkt),GLOBAL(nickname));
if(GLOBAL(privacy)==0){
uint32touint8p(GetUUID32(),meshbuffer[0].pkt+26);
meshbuffer[0].pkt[25]=0;
};
return 1;
};
// only accept newer/better packets // only accept newer/better packets
if(mpkt->flags==MF_USED) if(mpkt->flags==MF_USED)
@ -181,6 +215,7 @@ uint8_t mesh_recvqloop_work(void){
memcpy(mpkt->pkt,buf,MESHPKTSIZE); memcpy(mpkt->pkt,buf,MESHPKTSIZE);
mpkt->flags=MF_USED; mpkt->flags=MF_USED;
return 1; return 1;
}; };

View File

@ -7,7 +7,7 @@
#include "basic/uuid.h" #include "basic/uuid.h"
//const uint32_t key[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; //const uint32_t key[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
const uint32_t openbeaconkey[4] = { 0xB4595344,0xD3E119B6,0xA814D0EC,0xEFF5A24E }; #include "SECRETS"
const uint8_t useencryption = 1; const uint8_t useencryption = 1;
const uint8_t mac[5] = {1,2,3,2,1}; const uint8_t mac[5] = {1,2,3,2,1};

View File

@ -167,6 +167,10 @@ static bool highscore_set(uint32_t score, char nick[]) {
MO_TIME_set(mpkt->pkt,score); MO_TIME_set(mpkt->pkt,score);
strcpy((char*)MO_BODY(mpkt->pkt),nick); strcpy((char*)MO_BODY(mpkt->pkt),nick);
if(GLOBAL(privacy)==0){
uint32touint8p(GetUUID32(),mpkt->pkt+26);
mpkt->pkt[25]=0;
};
return true; return true;
} }

View File

@ -2,6 +2,7 @@
#include "basic/basic.h" #include "basic/basic.h"
#include "lcd/print.h"
#include "lcd/render.h" #include "lcd/render.h"
#include "lcd/display.h" #include "lcd/display.h"
@ -28,47 +29,100 @@ typedef uint8_t uchar;
int pattern=0; int pattern=0;
#define PATTERNCOUNT 3 #define PATTERNCOUNT 3
uchar stepmode=0; uchar stepmode=0;
uchar randdensity=0; uchar randdensity=0;
//uint8_t bl=0; static unsigned long iter=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 draw_area();
static void calc_area(); static void calc_area();
static void random_area(struct bitset *area, uchar x0, uchar y0, uchar x1, uchar y1,uchar value); static void random_area(struct bitset *area, uchar x0, uchar y0, uchar x1, uchar y1,uchar value);
static void reset_area(); static void reset_area();
static void nextledcycle();
void ram(void) { void ram(void) {
getInputWaitRelease(); getInputWaitRelease();
reset_area(); reset_area();
random_area(life,1,1,RESX,RESY,40); random_area(life,1,1,RESX,RESY,40);
static int nickx=2,nicky=10;
signed char movy=1;
static int nickwidth,nickheight;
static int nickoff=10;
static char delay=10;
static char speedmode=0;
static char LCDSHIFTX_EVERY_N=2;
static char LCDSHIFTY_EVERY_N=2;
static char ITER_EVERY_N=1;
lcdClear(); lcdClear();
setExtFont(GLOBAL(nickfont)); setExtFont(GLOBAL(nickfont));
DoString(20,20,GLOBAL(nickname));
#if 0 nickwidth=DoString(nickx,nicky,GLOBAL(nickname));
gpioSetValue (RB_LED0, CFG_LED_ON); if(nickwidth<50)nickoff=30;
gpioSetValue (RB_LED1, CFG_LED_ON); nickheight=getFontHeight();
gpioSetValue (RB_LED2, CFG_LED_ON);
gpioSetValue (RB_LED3, CFG_LED_ON); char stepmode=0;
#endif
while (1) { while (1) {
draw_area(); // xor life pattern over display content draw_area(); // xor life pattern over display content
lcdDisplay(); lcdDisplay();
draw_area(); // xor life pattern again to restore original display content lcdClear();
lcdShift(1,-2,1); // draw_area(); // xor life pattern again to restore original display content
if(getInputRaw()) // Old shift code. Can't handle longer Nicks...
// if(iter%LCDSHIFT_EVERY_N==0) lcdShift(1,-2,1);
// if(iter%LCDSHIFT_EVERY_N==0) { nickx=(nickx+1)%100-nickwidth; nicky=(nicky+1)%50;}
if(iter%LCDSHIFTX_EVERY_N==0) { nickx--;
if(nickx<(-1*nickwidth-nickoff))nickx=0; }
if(iter%LCDSHIFTY_EVERY_N==0) { nicky+=movy;
if(nicky<1 || nicky>RESY-nickheight) movy*=-1; }
DoString(nickx,nicky,GLOBAL(nickname));
DoString(nickx+nickwidth+nickoff,nicky,GLOBAL(nickname));
if(nickwidth<RESX) DoString(nickx+2*(nickwidth+nickoff),nicky,GLOBAL(nickname));
char key=stepmode?getInputWait():getInputRaw();
stepmode=0;
switch(key) {
case BTN_ENTER:
return; return;
delayms_queue_plus(10,0); case BTN_RIGHT:
calc_area(); getInputWaitRelease();
speedmode=(speedmode+1)%7;
delay=15;
switch(speedmode) {
case 0:
ITER_EVERY_N=1; LCDSHIFTX_EVERY_N=1; LCDSHIFTY_EVERY_N=1; break;
case 1:
ITER_EVERY_N=1; LCDSHIFTX_EVERY_N=2; LCDSHIFTY_EVERY_N=2; break;
case 2:
ITER_EVERY_N=1; LCDSHIFTX_EVERY_N=4; LCDSHIFTY_EVERY_N=4; break;
case 3:
ITER_EVERY_N=2; LCDSHIFTX_EVERY_N=1; LCDSHIFTY_EVERY_N=1; break;
case 4:
ITER_EVERY_N=4; LCDSHIFTX_EVERY_N=1; LCDSHIFTY_EVERY_N=1; break;
case 5:
ITER_EVERY_N=8; LCDSHIFTX_EVERY_N=1; LCDSHIFTY_EVERY_N=1; break;
case 6:
delay=5; ITER_EVERY_N=8; LCDSHIFTX_EVERY_N=1; LCDSHIFTY_EVERY_N=1; break;
}
break;
case BTN_DOWN:
stepmode=1;
getInputWaitRelease();
break;
case BTN_LEFT:
pattern=(pattern+1)%PATTERNCOUNT;
case BTN_UP:
stepmode=1;
reset_area();
getInputWaitRelease();
break;
}
delayms_queue_plus(delay,0);
#ifdef SIMULATOR
fprintf(stderr,"Iteration %d - x %d, y %d \n",iter,nickx,nicky);
#endif
if(iter%ITER_EVERY_N==0) calc_area(); else ++iter;
} }
return; return;
} }
@ -113,32 +167,6 @@ static inline uint8_t bitset_get2(struct bitset *bs,uint8_t x,uint8_t y) {
return bitset_get(bs,bitset_offset2(x,y)); return bitset_get(bs,bitset_offset2(x,y));
} }
static void draw_rect(char x0, char y0, char x1, char y1) {
for(char x=x0; x<=x1; ++x) {
lcdSetPixel(x,y0,true);
lcdSetPixel(x,y1,true);
}
for(char y=y0+1; y<y1; ++y) {
lcdSetPixel(x0,y,true);
lcdSetPixel(x1,y,true);
}
}
static void fill_rect(char x0, char y0, char x1, char y1) {
for(char x=x0; x<=x1; ++x) {
for(char y=y0; y<=y1; ++y) {
lcdSetPixel(x,y,true);
}
}
}
#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) { 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 x=x0; x<=x1; ++x) {
for(uchar y=y0; y<=y1; ++y) { for(uchar y=y0; y<=y1; ++y) {
@ -147,25 +175,6 @@ static void fill_area(struct bitset *area, uchar x0, uchar y0, uchar x1, uchar y
} }
} }
static bool find_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) {
if(bitset_get2(area,x,y)==value) return true;
}
}
return false;
}
static uint32_t sum_area(struct bitset *area, uchar x0, uchar y0, uchar x1, uchar y1) {
uint32_t sum=0;
for(uchar x=x0; x<=x1; ++x) {
for(uchar y=y0; y<=y1; ++y) {
sum+=bitset_get2(area,x,y);
}
}
return sum;
}
static void draw_area() { static void draw_area() {
for(uchar x=0; x<RESX; ++x) { for(uchar x=0; x<RESX; ++x) {
for(uchar y=0; y<RESY; ++y) { for(uchar y=0; y<RESY; ++y) {
@ -174,40 +183,67 @@ 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() { static void calc_area() {
#ifdef SIMULATOR ++iter;
static unsigned long iter=0; // sweeping mutation point
fprintf(stderr,"Iteration %d \n",++iter); static uint8_t xiter=0;
#endif static uint8_t yiter=0;
xiter=(xiter+1)%RESX;
if(xiter==0) yiter=(yiter+1)%RESY;
bitset_set2(life,xiter+1,yiter+1,1);
// 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);
for(uchar x=1; x<=RESX; ++x) { for(uchar x=1; x<=RESX; ++x) {
for(uchar y=1; y<=RESY; ++y) { 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); uchar sum=bitset_get2(life,x+1,y-1)+bitset_get2(life,x+1,y)+bitset_get2(life,x+1,y+1)+
bitset_set2(new,x,y,sum==3||(sum==2&&bitset_get2(life,x,y))); 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() { static void reset_area() {
fill_area(life,0,0,RESX+1,RESY+1,0); fill_area(life,0,0,RESX+1,RESY+1,0);
fill_area(new,0,0,RESX+1,RESY+1,0);
switch(pattern) { switch(pattern) {
case 0: case 0: // R pentomino
bitset_set2(life,41,40,1); bitset_set2(life,41,40,1);
bitset_set2(life,42,40,1); bitset_set2(life,42,40,1);
bitset_set2(life,41,41,1); bitset_set2(life,41,41,1);
bitset_set2(life,40,41,1); bitset_set2(life,40,41,1);
bitset_set2(life,41,42,1); bitset_set2(life,41,42,1);
break; break;
#if 0 case 1: // block in the center, continuous generators at the edges
case 1: for(int i=0; i<RESX/2+3; ++i) bitset_set2(life,i,0,1);
for(int i=0; i<RESX/2; ++i) bitset_set2(life,i,0,1); // for(int i=0; i<RESY; ++i) bitset_set2(life,0,i,1);
// for(int i=0; i<RESY/2-20; ++i) bitset_set2(life,RESX+1,RESY-i,1);
// for(int i=0; i<RESX/2; ++i) bitset_set2(life,RESX-i,RESY+1,1);
bitset_set2(life,40,40,1); bitset_set2(life,40,40,1);
bitset_set2(life,41,40,1); bitset_set2(life,41,40,1);
bitset_set2(life,41,41,1); bitset_set2(life,42,40,1);
bitset_set2(life,42,41,1);
bitset_set2(life,42,42,1);
bitset_set2(life,40,41,1);
bitset_set2(life,40,42,1);
break; break;
case 2: #if 0
case 2: // _|^|_
bitset_set2(life,40,40,1); bitset_set2(life,40,40,1);
bitset_set2(life,41,40,1); bitset_set2(life,41,40,1);
bitset_set2(life,42,40,1); bitset_set2(life,42,40,1);
@ -227,20 +263,3 @@ static void random_area(struct bitset *area, uchar x0, uchar y0, uchar x1, uchar
} }
} }
} }
#define LEDINTERVAL 1
static void nextledcycle() {
static uint8_t ledcycle=3;
ledcycle=(ledcycle+1)%(8*LEDINTERVAL);
uint8_t a=ledcycle/LEDINTERVAL;
switch(a) {
case 0: gpioSetValue (RB_LED0, CFG_LED_ON); break;
case 4: gpioSetValue (RB_LED0, CFG_LED_OFF); break;
case 1: gpioSetValue (RB_LED1, CFG_LED_ON); break;
case 5: gpioSetValue (RB_LED1, CFG_LED_OFF); break;
case 2: gpioSetValue (RB_LED2, CFG_LED_ON); break;
case 6: gpioSetValue (RB_LED2, CFG_LED_OFF); break;
case 3: gpioSetValue (RB_LED3, CFG_LED_ON); break;
case 7: gpioSetValue (RB_LED3, CFG_LED_OFF); break;
}
}

63
firmware/release-all Executable file
View File

@ -0,0 +1,63 @@
#!/bin/sh -e
TARG=../release
if [ ! -d ../firmware ] ; then
echo Running from wrong directory.
exit 1
fi
cd ../firmware
if [ -d $TARG ] ; then
echo Release dir already exists
echo please remove/move away
exit 1
fi
mkdir $TARG
mkdir $TARG/files
echo "###"
echo "### Building initial"
echo "###"
export FINAL=y
git checkout filesystem/ffconf.h
make clean
make APP=initial
cp firmware.bin $TARG/initial.bin
echo "###"
echo "### Building final"
echo "###"
cp filesystem/ffconf.h-final ffconf.h
make clean
./l0dable/mktable.pl
make APP=final
cp firmware.elf $TARG/final.elf
cp firmware.bin $TARG/final.bin
echo "###"
echo "### Building crypto"
echo "###"
(cd ../tools/crypto && make)
echo "###"
echo "### Gathering files"
echo "###"
cp ../tools/font/binary/*.f0n $TARG/files/
cp ../tools/image/lcd/*.lcd $TARG/files/
echo "###"
echo "### Gathering/crypting loadables"
echo "###"
# XXX: add crypto stuff
(cd l0dable && make)
mv l0dable/*.c0d $TARG/files/
mv l0dable/*.int $TARG/files/
mv l0dable/*.nik $TARG/files/
echo "###"
echo "### Done. Yay!"
echo "###"

View File

@ -3,6 +3,7 @@
#include "basic/basic.h" #include "basic/basic.h"
uint32_t results=5000; uint32_t results=5000;
static uint8_t chrg=1;
void VoltageCheck(void){ void VoltageCheck(void){
}; };
@ -10,3 +11,7 @@ void VoltageCheck(void){
uint32_t GetVoltage(void){ uint32_t GetVoltage(void){
return results; return results;
}; };
uint8_t GetChrgStat(void){
return !chrg;
}