Merge branch 'master' of github.com:r0ket/r0ket
This commit is contained in:
commit
1e517d51ed
|
@ -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
|
|
@ -50,6 +50,10 @@ WRAPOBJ=$(WRAP).o
|
|||
WRAPSRC=$(WRAP).c
|
||||
LIBFILE=lib$(LIBNAME).a
|
||||
|
||||
ifeq "$(FINAL)" "y"
|
||||
CFLAGS+=-DFINAL
|
||||
endif
|
||||
|
||||
##########################################################################
|
||||
# Compiler settings, parameters and flags
|
||||
##########################################################################
|
||||
|
|
|
@ -29,10 +29,6 @@ void main_default(void) {
|
|||
case BTN_UP: // Reset config
|
||||
f_unlink("r0ket.cfg");
|
||||
break;
|
||||
case BTN_RIGHT:
|
||||
GLOBAL(develmode)=1;
|
||||
applyConfig();
|
||||
break;
|
||||
case BTN_DOWN:
|
||||
usbMSCInit();
|
||||
while(1)
|
||||
|
@ -41,6 +37,10 @@ void main_default(void) {
|
|||
};
|
||||
|
||||
readConfig();
|
||||
if(getInputRaw()==BTN_RIGHT){
|
||||
GLOBAL(develmode)=1;
|
||||
applyConfig();
|
||||
};
|
||||
randomInit();
|
||||
|
||||
return;
|
||||
|
|
|
@ -120,7 +120,19 @@ char *meshmsgs(void){
|
|||
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];
|
||||
//# MENU messages
|
||||
|
@ -152,6 +164,12 @@ void m_choose(){
|
|||
case('T'):
|
||||
strcpy(p,"Time");
|
||||
break;
|
||||
case('Z'):
|
||||
strcpy(p,"Schnitzel");
|
||||
break;
|
||||
case('z'):
|
||||
strcpy(p,"S-Score");
|
||||
break;
|
||||
case('i'):
|
||||
strcpy(p,"Invaders");
|
||||
break;
|
||||
|
@ -188,6 +206,12 @@ void m_choose(){
|
|||
case('T'):
|
||||
lcdPrintln("Time");
|
||||
break;
|
||||
case('Z'):
|
||||
strcpy(p,"Schnitzel");
|
||||
break;
|
||||
case('z'):
|
||||
strcpy(p,"S-Score");
|
||||
break;
|
||||
case('i'):
|
||||
lcdPrintln("Invaders");
|
||||
break;
|
||||
|
@ -203,7 +227,19 @@ void m_choose(){
|
|||
lcdPrint(IntToStr(tm->tm_sec,2,F_LONG|F_ZEROS));
|
||||
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(".");
|
||||
lcdPrint(IntToStr(tm->tm_mon+1,2,0));
|
||||
|
|
|
@ -23,13 +23,7 @@
|
|||
#define BEACON_CHANNEL 81
|
||||
#define BEACON_MAC "\x1\x2\x3\x2\1"
|
||||
|
||||
uint32_t const beaconkey[4] = {
|
||||
0xB4595344,0xD3E119B6,0xA814D0EC,0xEFF5A24E
|
||||
};
|
||||
uint32_t remotekey[4] = {
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
|
||||
};
|
||||
extern uint32_t const meshkey[4];
|
||||
#include "SECRETS"
|
||||
|
||||
char funkencrypt=0;
|
||||
|
||||
|
@ -167,7 +161,7 @@ int process(char * input){
|
|||
config.maclen[0]=0x10;
|
||||
config.nrmacs=1;
|
||||
nrf_config_set(&config);
|
||||
memcpy(thekey,beaconkey,sizeof(thekey));
|
||||
memcpy(thekey,openbeaconkey,sizeof(thekey));
|
||||
funkencrypt=1;
|
||||
}else if(input[1]=='?'){
|
||||
nrf_config_get(&config);
|
||||
|
|
|
@ -28,7 +28,7 @@ struct CDESC the_config[]= {
|
|||
{"flamemaxw", 255, 1, 255, 1, CFG_TYPE_FLAME},
|
||||
{"flameminw", 0x8f, 1, 255, 1, CFG_TYPE_FLAME},
|
||||
{"l0nick", 0, 0, 1 , 0, 0},
|
||||
{"chargeled", 1, 0, 1 , 0, 0},
|
||||
{"chargeled", 0, 0, 1 , 0, 0},
|
||||
{ NULL, 0, 0, 0 , 0, 0},
|
||||
};
|
||||
|
||||
|
|
|
@ -79,6 +79,8 @@ void handleMenu(const struct MENU *the_menu) {
|
|||
if (the_menu->entries[menuselection].callback!=NULL)
|
||||
the_menu->entries[menuselection].callback();
|
||||
|
||||
setSystemFont();
|
||||
|
||||
if (menuflags&MENU_JUSTONCE)
|
||||
return;
|
||||
|
||||
|
@ -91,6 +93,7 @@ void handleMenu(const struct MENU *the_menu) {
|
|||
if (the_menu->entries[menuselection].callback!=NULL)
|
||||
the_menu->entries[menuselection].callback();
|
||||
lcdRefresh();
|
||||
setSystemFont();
|
||||
|
||||
if (menuflags&MENU_JUSTONCE)
|
||||
return;
|
||||
|
|
|
@ -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 */
|
|
@ -14,9 +14,7 @@ char meshmsg=0;
|
|||
char meshnice=0;
|
||||
MPKT meshbuffer[MESHBUFSIZE];
|
||||
|
||||
uint32_t const meshkey[4] = {
|
||||
0x00000042, 0x000005ec, 0x00000023, 0x00000005
|
||||
};
|
||||
#include "SECRETS"
|
||||
|
||||
struct NRF_CFG oldconfig;
|
||||
|
||||
|
@ -57,6 +55,8 @@ MPKT * meshGetMessage(uint8_t type){
|
|||
void mesh_cleanup(void){
|
||||
time_t now=getSeconds();
|
||||
for(int i=1;i<MESHBUFSIZE;i++){
|
||||
if(meshbuffer[i].flags&MF_LOCK)
|
||||
continue;
|
||||
if(meshbuffer[i].flags&MF_USED){
|
||||
if (MO_GEN(meshbuffer[i].pkt)<meshgen)
|
||||
meshbuffer[i].flags=MF_FREE;
|
||||
|
@ -128,6 +128,20 @@ void mesh_recvqloop_setup(void){
|
|||
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){
|
||||
__attribute__ ((aligned (4))) uint8_t buf[32];
|
||||
int len;
|
||||
|
@ -166,9 +180,29 @@ uint8_t mesh_recvqloop_work(void){
|
|||
// Store packet in a same/free slot
|
||||
MPKT* mpkt=meshGetMessage(MO_TYPE(buf));
|
||||
|
||||
// Skip locked packet
|
||||
if(mpkt->flags&MF_LOCK)
|
||||
return 2;
|
||||
// Schnitzel
|
||||
if(MO_TYPE(buf)=='Z'){
|
||||
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
|
||||
if(mpkt->flags==MF_USED)
|
||||
|
@ -181,6 +215,7 @@ uint8_t mesh_recvqloop_work(void){
|
|||
|
||||
memcpy(mpkt->pkt,buf,MESHPKTSIZE);
|
||||
mpkt->flags=MF_USED;
|
||||
|
||||
return 1;
|
||||
};
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "basic/uuid.h"
|
||||
|
||||
//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 mac[5] = {1,2,3,2,1};
|
||||
|
||||
|
|
|
@ -167,6 +167,10 @@ static bool highscore_set(uint32_t score, char nick[]) {
|
|||
|
||||
MO_TIME_set(mpkt->pkt,score);
|
||||
strcpy((char*)MO_BODY(mpkt->pkt),nick);
|
||||
if(GLOBAL(privacy)==0){
|
||||
uint32touint8p(GetUUID32(),mpkt->pkt+26);
|
||||
mpkt->pkt[25]=0;
|
||||
};
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "basic/basic.h"
|
||||
|
||||
#include "lcd/print.h"
|
||||
#include "lcd/render.h"
|
||||
#include "lcd/display.h"
|
||||
|
||||
|
@ -28,47 +29,100 @@ typedef uint8_t uchar;
|
|||
int pattern=0;
|
||||
#define PATTERNCOUNT 3
|
||||
|
||||
|
||||
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;
|
||||
static unsigned long iter=0;
|
||||
|
||||
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();
|
||||
reset_area();
|
||||
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();
|
||||
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
|
||||
nickwidth=DoString(nickx,nicky,GLOBAL(nickname));
|
||||
if(nickwidth<50)nickoff=30;
|
||||
nickheight=getFontHeight();
|
||||
|
||||
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())
|
||||
lcdClear();
|
||||
// draw_area(); // xor life pattern again to restore original display content
|
||||
// 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;
|
||||
delayms_queue_plus(10,0);
|
||||
calc_area();
|
||||
case BTN_RIGHT:
|
||||
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;
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
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) {
|
||||
for(uchar x=x0; x<=x1; ++x) {
|
||||
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() {
|
||||
for(uchar x=0; x<RESX; ++x) {
|
||||
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() {
|
||||
#ifdef SIMULATOR
|
||||
static unsigned long iter=0;
|
||||
fprintf(stderr,"Iteration %d \n",++iter);
|
||||
#endif
|
||||
++iter;
|
||||
// sweeping mutation point
|
||||
static uint8_t xiter=0;
|
||||
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 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:
|
||||
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;
|
||||
#if 0
|
||||
case 1:
|
||||
for(int i=0; i<RESX/2; ++i) bitset_set2(life,i,0,1);
|
||||
case 1: // block in the center, continuous generators at the edges
|
||||
for(int i=0; i<RESX/2+3; ++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,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;
|
||||
case 2:
|
||||
#if 0
|
||||
case 2: // _|^|_
|
||||
bitset_set2(life,40,40,1);
|
||||
bitset_set2(life,41,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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 "###"
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue