diff --git a/firmware/applications/exe.c b/firmware/applications/exe.c index 294fb4c..3847060 100644 --- a/firmware/applications/exe.c +++ b/firmware/applications/exe.c @@ -1,4 +1,5 @@ #include +#include #include "basic/basic.h" @@ -54,21 +55,56 @@ void execute_file (const char * fname){ /**************************************************************************/ void execute_menu(void){ - FATFS FatFs; /* File system object for logical drive */ - FRESULT res; lcdPrintln("Enter RAM!"); lcdRefresh(); while(getInput()!=BTN_NONE); - res=f_mount(0, &FatFs); - lcdPrint("Mount:"); - lcdPrintln(f_get_rc_string(res)); - execute_file("0:test.c0d"); lcdRefresh(); }; +#define MAXENTRIES 10 +#define FLEN 13 +void select_menu(void){ + DIR dir; /* Directory object */ + FILINFO Finfo; + FRESULT res; + char fname[FLEN*MAXENTRIES]; + int ctr; + + res = f_opendir(&dir, "0:"); + lcdPrint("OpenDir:"); + lcdPrintln(f_get_rc_string(res)); + if(res){ + return; + }; + + for(ctr=0;;ctr++) { + res = f_readdir(&dir, &Finfo); + if ((res != FR_OK) || !Finfo.fname[0]) break; + int len=strlen(Finfo.fname); + if( Finfo.fname[len-4]!='.' || + Finfo.fname[len-3]!='C' || + Finfo.fname[len-2]!='0' || + Finfo.fname[len-1]!='D') + continue; + + if (Finfo.fattrib & AM_DIR) + continue; + + lcdPrint(" "); + lcdPrint(Finfo.fname); + lcdPrint(" <"); + lcdPrintInt(Finfo.fsize); + lcdPrint(">"); + lcdNl(); + + strcpy(fname+ctr*FLEN,Finfo.fname); + } + lcdPrintln(""); +}; + void msc_menu(void){ DoString(0,8,"MSC Enabled."); lcdDisplay(0); @@ -109,10 +145,12 @@ const struct MENU_DEF menu_volt = {"Akku", &adc_check}; const struct MENU_DEF menu_nop = {"---", NULL}; const struct MENU_DEF menu_msc = {"MSC", &msc_menu}; const struct MENU_DEF menu_exe = {"Exec", &execute_menu}; +const struct MENU_DEF menu_exesel = {"Exec2", &select_menu}; static menuentry menu[] = { &menu_msc, &menu_exe, + &menu_exesel, &menu_nop, &menu_mirror, &menu_volt, @@ -129,6 +167,15 @@ void main_exe(void) { backlightInit(); font=&Font_7x8; + FATFS FatFs; /* File system object for logical drive */ + FRESULT res; + res=f_mount(0, &FatFs); + if(res!=FR_OK){ + lcdPrint("Mount:"); + lcdPrintln(f_get_rc_string(res)); + getInput(); + }; + while (1) { lcdFill(0); // clear display buffer lcdDisplay(0); diff --git a/firmware/applications/funk.c b/firmware/applications/funk.c index 7195658..0bc10fd 100644 --- a/firmware/applications/funk.c +++ b/firmware/applications/funk.c @@ -15,10 +15,6 @@ void f_init(void){ dx=DoString(0,dy,"Done."); ;dy+=8; }; -#define CS_LOW() {gpioSetValue(RB_SPI_NRF_CS, 0); gpioSetValue(3,2,0);} -#define CS_HIGH() {gpioSetValue(RB_SPI_NRF_CS, 1); gpioSetValue(3,2,1);} -#include "core/ssp/ssp.h" - void f_status(void){ int dx=0; int dy=8; @@ -28,12 +24,22 @@ void f_status(void){ buf[1]=0; buf[2]=0; buf[3]=0; - dx=DoString(0,dy,"S:"); DoIntX(dx,dy,*(int*)buf);dy+=8; + dx=DoString(0,dy,"S:"); + dx=DoCharX(dx,dy,buf[0]); + dx=DoCharX(dx,dy,buf[1]); + dx=DoCharX(dx,dy,buf[2]); + dx=DoCharX(dx,dy,buf[3]); + dy+=8; nrf_cmd_rw_long(buf,2); - dx=DoString(0,dy,"R:"); DoIntX(dx,dy,*(int*)buf);dy+=8; + dx=DoString(0,dy,"R:"); + dx=DoCharX(dx,dy,buf[0]); + dx=DoCharX(dx,dy,buf[1]); + dx=DoCharX(dx,dy,buf[2]); + dx=DoCharX(dx,dy,buf[3]); + dy+=8; int status=nrf_cmd_status(C_NOP); - dx=DoString(0,dy,"St:"); DoIntX(dx,dy,status);dy+=8; + dx=DoString(0,dy,"St:"); DoCharX(dx,dy,status);dy+=8; }; void f_recv(void){ @@ -55,7 +61,7 @@ void f_recv(void){ return; }; dx=DoString(0,dy,"Size:"); DoInt(dx,dy,len); dy+=8; - dx=DoString(0,dy,"1:"); DoIntX(dx,dy,*(int*)(buf));dy+=8; + dx=DoString(0,dy,"1:"); DoIntX(dx,dy,*(int*)(buf+0));dy+=8; dx=DoString(0,dy,"2:"); DoIntX(dx,dy,*(int*)(buf+4));dy+=8; dx=DoString(0,dy,"3:"); DoIntX(dx,dy,*(int*)(buf+8));dy+=8; dx=DoString(0,dy,"4:"); DoIntX(dx,dy,*(int*)(buf+12));dy+=8; diff --git a/firmware/funk/nrf24l01p.c b/firmware/funk/nrf24l01p.c index 5a9c029..6229bb8 100644 --- a/firmware/funk/nrf24l01p.c +++ b/firmware/funk/nrf24l01p.c @@ -13,6 +13,10 @@ inline void xmit_spi(uint8_t dat) { sspSend(0, (uint8_t*) &dat, 1); } +inline void rcv_spi(uint8_t *dat) { + sspReceive(0, dat, 1); +} + #define CS_LOW() gpioSetValue(RB_SPI_NRF_CS, 0) #define CS_HIGH() gpioSetValue(RB_SPI_NRF_CS, 1) #define CE_LOW() gpioSetValue(RB_NRF_CE, 0) @@ -45,6 +49,15 @@ void nrf_write_reg(const uint8_t reg, const uint8_t val){ CS_HIGH(); }; +uint8_t nrf_read_reg(const uint8_t reg){ + uint8_t val; + CS_LOW(); + xmit_spi(C_R_REGISTER | reg); + rcv_spi(&val); + CS_HIGH(); + return val; +}; + void nrf_read_long(const uint8_t cmd, int len, uint8_t* data){ CS_LOW(); xmit_spi(cmd); @@ -62,51 +75,9 @@ void nrf_write_long(const uint8_t cmd, int len, uint8_t* data){ }; #define nrf_write_reg_long(reg, len, data) \ - nrf_write_long(C_W_REGISTER|reg, len, data) + nrf_write_long(C_W_REGISTER|(reg), len, data) -void nrf_init() { - // Enable SPI correctly - sspInit(0, sspClockPolarity_Low, sspClockPhase_RisingEdge); - - // Enable CS & CE pins - gpioSetDir(RB_SPI_NRF_CS, gpioDirection_Output); - gpioSetPullup(&RB_SPI_NRF_CS_IO, gpioPullupMode_Inactive); - gpioSetDir(RB_NRF_CE, gpioDirection_Output); - gpioSetPullup(&RB_NRF_CE_IO, gpioPullupMode_PullUp); - - // Setup for nrf24l01+ - // power up takes 1.5ms - 3.5ms (depending on crystal) - CS_LOW(); - nrf_write_reg(R_CONFIG, - R_CONFIG_PRIM_RX| // Receive mode - R_CONFIG_PWR_UP| // Power on - R_CONFIG_EN_CRC // CRC on, single byte - ); - - nrf_write_reg(R_EN_AA, 0); // Disable Enhanced ShockBurst; - - nrf_write_reg(R_RF_CH, CHANNEL_BEACON &127); // Select channel - - // enable receive pipes - nrf_write_reg(R_EN_RXADDR,R_EN_RXADDR_ERX_P0 -// |R_EN_RXADDR_ERX_P1 - ); - - nrf_write_reg(R_RX_PW_P0,16); - nrf_write_reg_long(R_RX_ADDR_P0,5,(uint8_t*)MAC_BEACON); - -// nrf_write_reg(R_RX_PW_P1,16); -// nrf_write_reg_long(R_RX_ADDR_P1,5,"R0KET"); - - // OpenBeacon transmit address - nrf_write_reg_long(R_TX_ADDR,5,(uint8_t*)MAC_BEACON); - - // Set speed / strength - nrf_write_reg(R_RF_SETUP,DEFAULT_SPEED|R_RF_SETUP_RF_PWR_3); - - // XXX: or write R_CONFIG last? - CE_LOW(); -}; +// High-Level: int nrf_rcv_pkt_time(int maxtime, int maxsize, uint8_t * pkt){ uint8_t buf; @@ -159,7 +130,6 @@ int nrf_rcv_pkt_time(int maxtime, int maxsize, uint8_t * pkt){ }; char nrf_snd_pkt_crc(int size, uint8_t * pkt){ - char status; if(size > MAX_PKT) size=MAX_PKT; @@ -185,3 +155,89 @@ char nrf_snd_pkt_crc(int size, uint8_t * pkt){ return nrf_cmd_status(C_NOP); }; + +void nrf_set_rx_mac(int pipe, int rxlen, int maclen, uint8_t * mac){ +#ifdef SAFE + assert(maclen>=1 || maclen<=5); + assert(rxlen>=1 || rxlen<=32); + assert(pipe>=0 || pipe<=5); + assert(mac!=NULL); + if(pipe>1) + assert(maclen==1); +#endif + nrf_write_reg(R_RX_PW_P0+pipe,rxlen); + + nrf_write_reg_long(R_RX_ADDR_P0+pipe,maclen,mac); + nrf_write_reg(R_EN_RXADDR, + nrf_read_reg(R_EN_RXADDR) | (1<=1 || maclen<=5); + assert(mac!=NULL); +#endif + nrf_write_reg_long(R_TX_ADDR,maclen,mac); +}; + +void nrf_disable_pipe(int pipe){ +#ifdef SAFE + assert(pipe>=0 || pipe<=5); +#endif + nrf_write_reg(R_EN_RXADDR, + nrf_read_reg(R_EN_RXADDR) & ~(1<'9') s[len]+='A'-'9'-1; - if(num==0){ -// s[len]=' '; // configurable? -// o=s+len; break; - }; num/=16; }; return DoString(sx,sy,o); -#undef mxlen }; - +int DoIntX(int sx, int sy, unsigned int num){ + return DoIntXn(sx, sy, num, 8); +}; + +int DoCharX(int sx, int sy, unsigned char num){ + return DoIntXn(sx, sy, num, 2); +}; diff --git a/firmware/lcd/render.h b/firmware/lcd/render.h index 04f7d47..dd56050 100644 --- a/firmware/lcd/render.h +++ b/firmware/lcd/render.h @@ -29,6 +29,8 @@ int DoChar(int sx, int sy, int c); int DoString(int sx, int sy, const char *s); int DoInt(int sx, int sy, int num); +int DoIntXn(int sx, int sy, unsigned int num, unsigned int maxlen); int DoIntX(int sx, int sy, unsigned int num); +int DoCharX(int sx, int sy, unsigned char num); #endif