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
|
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
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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};
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -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"
|
#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;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue