diff --git a/firmware/applications/vcard.c b/firmware/applications/vcard.c index fe04108..b9298f4 100644 --- a/firmware/applications/vcard.c +++ b/firmware/applications/vcard.c @@ -24,46 +24,46 @@ char *Priv ="0e10e787036941e6c78daf8a0e8e1dbfac68e26d2"; void sendPublicKey(char *px, char *py) { - uint8_t exp[2 + 4*NUMWORDS]; + uint8_t exp[2 + 4*NUMWORDS + 2]; exp[0] = 'P'; bitstr_parse_export((char*)exp+2, px); exp[1] = 'X'; - nrf_snd_pkt_crc(30, exp); + nrf_snd_pkt_crc(32, exp); delayms(10); exp[1] = 'Y'; bitstr_parse_export((char*)exp+2, py); - nrf_snd_pkt_crc(30, exp); + nrf_snd_pkt_crc(32, exp); delayms(10); } void sendR(uint8_t *rx, uint8_t *ry) { - uint8_t exp[2 + 4*NUMWORDS]; + uint8_t exp[2 + 4*NUMWORDS + 2]; exp[0] = 'R'; for(int i=0; i<4*NUMWORDS; i++) exp[2+i] = rx[i]; exp[1] = 'X'; - nrf_snd_pkt_crc(30, exp); + nrf_snd_pkt_crc(32, exp); delayms(10); exp[1] = 'Y'; for(int i=0; i<4*NUMWORDS; i++) exp[2+i] = ry[i]; - nrf_snd_pkt_crc(30, exp); + nrf_snd_pkt_crc(32, exp); delayms(10); } int receiveKey(uint8_t type, uint8_t *x, uint8_t *y) { - uint8_t buf[30]; + uint8_t buf[32]; uint8_t n; - n = nrf_rcv_pkt_time(1000, 30, buf); + n = nrf_rcv_pkt_time(1000, 32, buf); lcdPrint("pkt:"); lcdPrintInt(n);lcdPrintln(""); lcdRefresh(); - if( n == 30 && buf[0] == type && buf[1] == 'X' ){ + if( n == 32 && buf[0] == type && buf[1] == 'X' ){ for(int i=0; i MAXSIZE ) {lcdPrintln("too big"); lcdRefresh(); while(1);} if( size > MAXSIZE ) return 1; //file to big //if(fileexists(metadata)) return 1; //file already exists + lcdPrint("open"); lcdPrintln(metadata); lcdRefresh(); res = f_open(&file, (const char*)metadata, FA_OPEN_ALWAYS|FA_WRITE); + + //lcdPrintln("file opened"); lcdRefresh(); + if( res ) {lcdPrintln("res"); put_rc(res); lcdRefresh(); while(1);} if( res ) return res; uint16_t wordcount = (size+3)/4; - nrf_set_rx_mac(0, 32, 5, mac); + //nrf_set_rx_mac(0, 32, 5, mac); + lcdPrintln("get file"); lcdRefresh(); rftransfer_receive(buf, wordcount*4, 1000); + lcdPrintln("got file"); lcdRefresh(); //nrf_set_rx_mac(0, 32, 5, macbuf); xxtea_decode_words((uint32_t *)buf, wordcount, k); res = f_write(&file, buf, size, &written); + f_close(&file); if( res ) return res; if( written != size ) diff --git a/firmware/funk/nrf24l01p.c b/firmware/funk/nrf24l01p.c index a6240de..ab5510d 100644 --- a/firmware/funk/nrf24l01p.c +++ b/firmware/funk/nrf24l01p.c @@ -92,24 +92,6 @@ void nrf_write_long(const uint8_t cmd, int len, uint8_t* data){ nrf_write_long(C_W_REGISTER|(reg), len, data) // High-Level: -int nrf_rcv_pkt_time_xxtea(int maxtime, int maxsize, - uint8_t * pkt, uint32_t const k[4]) -{ - int n = nrf_rcv_pkt_time(maxtime, maxsize, pkt); - if( n ){ - if( n < 2 ) - return -4; - xxtea_decode(pkt, n, k); - uint16_t crc=crc16(pkt,n-2); - if( pkt[n-2] == ((crc>>8)&0xFF) && pkt[n-1] == (crc&0xFF) ){ - return n; - }else{ - return -5; - } - } - return n; -} - int nrf_rcv_pkt_time_encr(int maxtime, int maxsize, uint8_t * pkt, uint32_t const key[4]){ uint8_t len; uint8_t status=0; @@ -203,12 +185,6 @@ char nrf_snd_pkt_crc_encr(int size, uint8_t * pkt, uint32_t const key[4]){ return nrf_cmd_status(C_NOP); }; -char nrf_snd_pkt_xxtea(int size, uint8_t * pkt, uint32_t const k[4]) -{ - xxtea_encode(pkt, size, k); - return nrf_snd_pkt_crc(size, pkt); -} - void nrf_set_rx_mac(int pipe, int rxlen, int maclen, uint8_t * mac){ #ifdef SAFE assert(maclen>=1 || maclen<=5); diff --git a/firmware/funk/nrf24l01p.h b/firmware/funk/nrf24l01p.h index d20e82f..061c846 100644 --- a/firmware/funk/nrf24l01p.h +++ b/firmware/funk/nrf24l01p.h @@ -137,10 +137,6 @@ int nrf_rcv_pkt_time_encr(int maxtime, int maxsize, uint8_t * pkt, uint32_t cons nrf_snd_pkt_crc_encr(size, pkt, NULL) char nrf_snd_pkt_crc_encr(int size, uint8_t * pkt, uint32_t const k[4]); -// Schneider-stuff? -int nrf_rcv_pkt_time_xxtea(int maxtime, int maxsize, - uint8_t * pkt, uint32_t const k[4]); -char nrf_snd_pkt_xxtea(int size, uint8_t * pkt, uint32_t const k[4]); void nrf_init() ; void nrf_cmd(uint8_t cmd); diff --git a/firmware/funk/openbeacon.c b/firmware/funk/openbeacon.c new file mode 100644 index 0000000..b980a90 --- /dev/null +++ b/firmware/funk/openbeacon.c @@ -0,0 +1,46 @@ +#include "openbeacon.h" +#include "nrf24l01p.h" +#include "basic/byteorder.h" + +const uint32_t key = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}; +const uint8_t enctoggle = 0; +uint32_t mid = 0; +uint32_t mctr = 0; +uint8_t strength = 0; + +void openbeaconSetup(uint32_t id, uint32_t ctr) +{ + mid = id; + mctr = ctr; + strength = 0; +} + +void openbeaconSendPacket(uint32_t id, uint32_t ctr, uint8_t flags, uint8_t strength) +{ + uint8_t buf[32]; + int status; + + buf[0]=0x10; // Length: 16 bytes + buf[1]=0x17; // Proto - fixed at 0x17? + buf[2]=flags; + buf[3]=strength*85; // Send intensity + + uint322uint8p(ctr, buf+4); + uint322uint8p(id, buf+8); + + buf[12]=0xff; // salt (0xffff always?) + buf[13]=0xff; + + status=nrf_snd_pkt_crc_encr(16,buf,enctoggle?testkey:NULL); +} + +void openbeaconSend(void) +{ + //uint8_t tmp = nrfgetstrength(); + //nrfsetstrength(strength); + openbeaconSendPacket(mid, ctr++, 0xFF, strength++); + if( strength == 4 ) + strength = 0; + //maybe this produces timing problems? + //nrfsetstrength(tmp); +} diff --git a/firmware/funk/openbeacon.h b/firmware/funk/openbeacon.h new file mode 100644 index 0000000..3d9d82d --- /dev/null +++ b/firmware/funk/openbeacon.h @@ -0,0 +1,10 @@ +#ifndef _OPENBEACON_H_ +#define _OPENBEACON_H_ +#include + +void openbeaconSetup(uint32_t id, uint32_t ctr); +void openbeaconSendPacket(uint32_t id, uint32_t ctr, + uint8_t flags, uint8_t strength); +void openbeaconSend(void); + +#endif diff --git a/firmware/funk/rftransfer.c b/firmware/funk/rftransfer.c index 725bc15..5b79315 100644 --- a/firmware/funk/rftransfer.c +++ b/firmware/funk/rftransfer.c @@ -3,7 +3,7 @@ #include #include -#define MAXPACKET 30 +#define MAXPACKET 32 void rftransfer_send(uint16_t size, uint8_t *data) { uint8_t buf[MAXPACKET]; @@ -16,8 +16,8 @@ void rftransfer_send(uint16_t size, uint8_t *data) buf[4] = rand & 0xFF; //nrf_snd_pkt_crc(5,buf); //setup packet - nrf_snd_pkt_crc(30,buf); //setup packet - delayms(10); + nrf_snd_pkt_crc(32,buf); //setup packet + delayms(20); uint16_t index = 0; uint8_t i; uint16_t crc = crc16(data,size); @@ -32,9 +32,8 @@ void rftransfer_send(uint16_t size, uint8_t *data) buf[i] = *data++; } index++; - //nrf_snd_pkt_crc(i,buf); //data packet - nrf_snd_pkt_crc(30,buf); //setup packet - delayms(10); + nrf_snd_pkt_crc(32,buf); //data packet + delayms(20); } buf[0] = 'C'; @@ -43,8 +42,8 @@ void rftransfer_send(uint16_t size, uint8_t *data) buf[3] = rand >> 8; buf[4] = rand & 0xFF; //nrf_snd_pkt_crc(5,buf); //crc packet - nrf_snd_pkt_crc(30,buf); //setup packet - delayms(10); + nrf_snd_pkt_crc(32,buf); //setup packet + delayms(20); } uint16_t rftransfer_receive(uint8_t *buffer, uint16_t maxlen, uint16_t timeout) @@ -57,36 +56,46 @@ uint16_t rftransfer_receive(uint8_t *buffer, uint16_t maxlen, uint16_t timeout) unsigned int startTick = currentTick; while(currentTick < (startTick+timeout) ){//this fails if either overflows - n = nrf_rcv_pkt_time(10, MAXPACKET, buf); + n = nrf_rcv_pkt_time(1000, MAXPACKET, buf); switch(state){ case 0: - if( n == 5 && buf[0] == 'L' ){ + if( n == 32 && buf[0] == 'L' ){ size = (buf[1] << 8) | buf[2]; rand = (buf[3] << 8) | buf[4]; seq = 0; pos = 0; - if( size <= maxlen ) + if( size <= maxlen ){ + lcdClear(); + lcdPrintln("got l"); lcdRefresh(); state = 1; + } } break; case 1: - if( n > 5 && buf[0] == 'D' && ((buf[3]<<8)|buf[4])==rand ){ + if( n == 32 && buf[0] == 'D' && ((buf[3]<<8)|buf[4])==rand ){ + lcdPrint("got d"); lcdRefresh(); if( seq == ((buf[1]<<8)|buf[2]) ){ - if( (pos + n - 5)