diff --git a/firmware/applications/schneider.c b/firmware/applications/schneider.c index 9e7ec11..ee24e29 100644 --- a/firmware/applications/schneider.c +++ b/firmware/applications/schneider.c @@ -6,52 +6,186 @@ #include "basic/basic.h" #include "lcd/render.h" #include "lcd/allfonts.h" +#include "basic/config.h" +#include "basic/byteorder.h" +#include "lcd/lcd.h" +#include "lcd/print.h" +#include "funk/nrf24l01p.h" +#include "usbcdc/usb.h" +#include "usbcdc/usbcore.h" +#include "usbcdc/usbhw.h" +#include "usbcdc/cdcuser.h" +#include "usbcdc/cdc_buf.h" +#include "usbcdc/util.h" +#include "core/ssp/ssp.h" -#include "ecc.c" -void backlightInit(void); +#if CFG_USBMSC +#error "MSC is defined" +#endif +#if !CFG_USBCDC +#error "CDC is not defined" +#endif + +#define CHANNEL 81 +#define MAC "\x1\x2\x3\x2\x1" + +#define UB_NONE 0 +#define UB_ESCAPE '\\' +#define UB_STOP '0' +#define UB_PACKETLEN 128 + +struct NRF_CFG config = { + .channel= CHANNEL, + .txmac= MAC, + .nrmacs=1, + .mac0= MAC, + .maclen ="\x10", +}; + +uint8_t serialmsg_message[UB_PACKETLEN]; +uint8_t serialmsg_len = 0; + +void serialmsg_init(void); +uint8_t serialmsg_put(uint8_t data); +char snd_pkt_no_crc(int size, uint8_t * pkt); + +#define INPUTLEN 99 /**************************************************************************/ -void main_schneider(void) { - //int yctr=8; - int dx=0; - char key; - int ctr = 1; - backlightInit(); - font_direction = FONT_DIR_LTR; // LeftToRight is the default - //yctr=18; - bitstr_parse(poly, "800000000000000000000000000000000000000c9"); - bitstr_parse(coeff_b, "20a601907b8c953ca1481eb10512f78744a3205fd"); - bitstr_parse(base_x, "3f0eba16286a2d57ea0991168d4994637e8343e36"); - bitstr_parse(base_y, "0d51fbc6c71a0094fa2cdd545b11c5c0c797324f1"); - bitstr_parse(base_order, "40000000000000000000292fe77e70c12a4234c33"); +void main_schneider(void) +{ + GLOBAL(daytrig)=10; + GLOBAL(lcdbacklight)=10; + char input[INPUTLEN+1]; - ECIES_generate_key_pair(); // generate a public/private key pair - while (1) { - key= getInput(); - font=&Font_7x8; - - // Easy flashing - if(key==BTN_LEFT){ - DoString(0,8,"Enter ISP!"); - lcdDisplay(); - ISPandReset(); - }; - - // Display nickname - //font = &Font_Ubuntu36pt; - dx=DoString(0,0,"Test"); - dx=DoInt(dx,0,ctr++); - lcdDisplay(); - encryption_decryption_demo("This is encrypted", - "1c56d302cf642a8e1ba4b48cc4fbe2845ee32dce7", - "45f46eb303edf2e62f74bd68368d979e265ee3c03", - "0e10e787036941e6c78daf8a0e8e1dbfac68e26d2"); + usbCDCInit(); + delayms(500); + nrf_init(); + nrf_config_set(&config); + + nrf_rcv_pkt_start(); + while(1){ + int l=INPUTLEN, i, status; + CDC_OutBufAvailChar (&l); + if(l>0){ + CDC_RdOutBuf (input, &l); + for(i=0; i 0 ){ + puts("\\1"); + CDC_WrInBuf(buf, &len); + puts("\\0"); + } } - return; } void tick_schneider(void){ return; }; +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) +#define CE_HIGH() gpioSetValue(RB_NRF_CE, 1) + +char snd_pkt_no_crc(int size, uint8_t * pkt) +{ + if(size > MAX_PKT) + size=MAX_PKT; + + nrf_write_reg(R_CONFIG, + R_CONFIG_PWR_UP| // Power on + R_CONFIG_EN_CRC // CRC on, single byte + ); + + CS_LOW(); + xmit_spi(C_W_TX_PAYLOAD); + sspSend(0,pkt,size); + CS_HIGH(); + + CE_HIGH(); + delayms(1); // Send it. (only needs >10ys, i think) + CE_LOW(); + + return nrf_cmd_status(C_NOP); +}; + +void serialmsg_init(void) +{ + serialmsg_len = 0; +} + +//returns the message type or UB_NONE +uint8_t serialmsg_put(uint8_t data) +{ + static uint8_t escaped = 0; + static uint8_t msgtype = UB_NONE; + + if( data == UB_ESCAPE && escaped == 0 ){ + //a control code will follow + escaped = 1; + return UB_NONE; + }else if( escaped ){ + escaped = 0; + if( data != UB_ESCAPE ){ + if( data == UB_STOP ){ + uint8_t tmp = msgtype; + msgtype = UB_NONE; + return tmp; + } + msgtype = data; + serialmsg_len=0; + return UB_NONE; + } + } + serialmsg_message[serialmsg_len++] = data; + + //prevent a buffer overflow + if( serialmsg_len == UB_PACKETLEN ) + serialmsg_len--; + + return UB_NONE; +} + +