Unfinished version 0.6 library for the Pi Swarm robot. NOTE: This library is not yet finished or fully tested - it will change.
Dependents: Pi_Swarm_Blank Aggregation-Flocking_2 Pi_Swarm_User_Command_RF_Test
Fork of Pi_Swarm_Library by
Diff: alpha433.cpp
- Revision:
- 1:b067a08ff54e
- Parent:
- 0:9ffe8ebd1c40
- Child:
- 4:52b3e4c5a425
--- a/alpha433.cpp Fri Jan 31 22:59:25 2014 +0000 +++ b/alpha433.cpp Sun Feb 02 18:05:58 2014 +0000 @@ -1,14 +1,14 @@ /* University of York Robot Lab Pi Swarm Library: 433MHz Alpha Transceiver * * (C) Dr James Hilder, Dept. Electronics & Computer Science, University of York - * + * * Version 0.4 January 2014 * * Designed for use with the Pi Swarm Board (enhanced MBED sensor board) v1.2 * - * Based on code developed by Tobias Dipper, University of Stuttgart (see copyright notice at end of file) + * Based on code developed by Tobias Dipper, University of Stuttgart (see copyright notice at end of file) */ - + #include "main.h" #include "communications.h" @@ -30,12 +30,14 @@ char cDataAvailable = 0; -Alpha433::Alpha433(PinName mosi, PinName miso, PinName sck, PinName fss, PinName nirq) : Stream("Alpha433"), _spi(mosi,miso,sck), _fss(fss), _nirq_test(nirq), _nirq(nirq) { - +Alpha433::Alpha433(PinName mosi, PinName miso, PinName sck, PinName fss, PinName nirq) : Stream("Alpha433"), _spi(mosi,miso,sck), _fss(fss), _nirq_test(nirq), _nirq(nirq) +{ + } -Alpha433::Alpha433() : Stream("Alpha433"), _spi(p5,p6,p7), _fss(p8), _nirq_test(p11), _nirq(p11) { - +Alpha433::Alpha433() : Stream("Alpha433"), _spi(p5,p6,p7), _fss(p8), _nirq_test(p11), _nirq(p11) +{ + } @@ -50,18 +52,18 @@ // sendString(count, message); unsigned long Alpha433::sendString(char cCount, char* cBuffer) { - // pc.printf("SendString called"); + // pc.printf("SendString called"); unsigned char i = 0; if(cRFStatus == ALPHA433_MODE_TRANSMITTING) {// RF already transmitting if(RF_VERBOSE == 1)pc.printf("RF Error: Already transmitting\n"); return 1; // Error - - } - + + } + if(cCount > 62) {// Amount of data to high if(RF_VERBOSE == 1)pc.printf("RF Error: Too much tx data\n"); return 2; // Error - + } if(cCount == 0) {// No Data if(RF_VERBOSE == 1)pc.printf("RF Error: No tx data\n"); @@ -69,11 +71,11 @@ } cTXBuffer[i] = cCount; - unsigned char checksum_byte = 0; + unsigned char checksum_byte = 0; for(i=0; i<cCount; i++) {// make a copy cTXBuffer[i+1] = cBuffer[i]; checksum_byte ^= cBuffer[i]; - } + } cTXBuffer[cCount+1] = checksum_byte; if(RF_VERBOSE == 1)pc.printf("RF Message: \"%s\" Checksum: %2X\n",cBuffer,checksum_byte); ssTransmitCount = cCount+3; // add count and checksum @@ -81,20 +83,20 @@ cRFStatus = ALPHA433_MODE_SWITCHING; disableReceiver(); enableTransmitter(); - cRFStatus = ALPHA433_MODE_TRANSMITTING; - + cRFStatus = ALPHA433_MODE_TRANSMITTING; + if(RF_VERBOSE == 1)pc.printf("RF Transmitting"); - while(ssTransmitPointer <= ssTransmitCount){ - while(_nirq_test); - if(ssTransmitPointer < -2) _write(0xB8AA); // send sync - else if(ssTransmitPointer == -2) _write(0xB82D); // send first part of the fifo pattern; - else if(ssTransmitPointer == -1) _write(0xB8D4); // send second part of the fifo pattern; - else if(ssTransmitPointer == ssTransmitCount) _write(0xB800); // send dummy byte - else _write(0xB800 | cTXBuffer[ssTransmitPointer]); // send data - ssTransmitPointer++; + while(ssTransmitPointer <= ssTransmitCount) { + while(_nirq_test); + if(ssTransmitPointer < -2) _write(0xB8AA); // send sync + else if(ssTransmitPointer == -2) _write(0xB82D); // send first part of the fifo pattern; + else if(ssTransmitPointer == -1) _write(0xB8D4); // send second part of the fifo pattern; + else if(ssTransmitPointer == ssTransmitCount) _write(0xB800); // send dummy byte + else _write(0xB800 | cTXBuffer[ssTransmitPointer]); // send data + ssTransmitPointer++; } - + _write(0xB800); // send dummy byte, maybe redundant disableTransmitter(); enableReceiver(); @@ -134,8 +136,8 @@ // Disable RF Receiver void Alpha433::disableReceiver(void) -{ - if(RF_VERBOSE == 1)pc.printf("RF Disable RX\n"); +{ + if(RF_VERBOSE == 1)pc.printf("RF Disable RX\n"); //RFCommand(0x8208); _write(0x8208); //rx_led = 0; @@ -145,7 +147,7 @@ // SSI FiFo Clear void Alpha433::clearBuffer(void) { - while(_read(0xB000) != 0); + while(_read(0xB000) != 0); } // Reset RF @@ -174,10 +176,10 @@ // Initialise RF void Alpha433::rf_init(void) { - + if(RF_VERBOSE == 1)pc.printf("RF Init start\n"); rf_reset(); // RF Hardware Reset - _write(0x0000); // read status to cancel prior interrupt + _write(0x0000); // read status to cancel prior interrupt _write(0x8000 | ALPHA433_FREQUENCY | ALPHA433_CRYSTAL_LOAD | ALPHA433_USE_FIFO); _write(0x9000 | ALPHA433_PIN20 | ALPHA433_VDI_RESPONSE | ALPHA433_BANDWIDTH | ALPHA433_LNA_GAIN | ALPHA433_RSSI); _write(0xC228 | ALPHA433_CLOCK_RECOVERY | ALPHA433_FILTER | ALPHA433_DQD); @@ -191,57 +193,58 @@ if(RF_VERBOSE == 1)pc.printf("RF Init end\n"); cRFStatus = ALPHA433_MODE_RECEIVING; } - - + + // RF Interrupt void Alpha433::interrupt(void) { - if(cRFStatus == ALPHA433_MODE_RECEIVING){ - rf_led=1; - //Add reset timeout - reset_timeout.detach(); - reset_timeout.attach(this,&Alpha433::timeout,0.5); - //pc.printf("Rec. ISR\n"); - int res = _read(0x0000); - if(res==0) res = _read(0x0000); - char read_failure = 0; + if(cRFStatus == ALPHA433_MODE_RECEIVING) { + rf_led=1; + //Add reset timeout + reset_timeout.detach(); + reset_timeout.attach(this,&Alpha433::timeout,0.5); + //pc.printf("Rec. ISR\n"); + int res = _read(0x0000); + if(res==0) res = _read(0x0000); + char read_failure = 0; + + if (res & (ALPHA433_STATUS_TX_NEXT_BYTE | ALPHA433_STATUS_FIFO_LIMIT_REACHED)) { // RF: waiting for next Byte OR FIFO full + //pc.printf("Receiving"); + cRXBuffer[ssReceivePointer] = _read(0xB000) & 0xFF; // get data + if(ssReceivePointer == 0) { + ssReceiveCount = cRXBuffer[0]; - if (res & (ALPHA433_STATUS_TX_NEXT_BYTE | ALPHA433_STATUS_FIFO_LIMIT_REACHED)) { // RF: waiting for next Byte OR FIFO full - //pc.printf("Receiving"); - cRXBuffer[ssReceivePointer] = _read(0xB000) & 0xFF; // get data - if(ssReceivePointer == 0) { - ssReceiveCount = cRXBuffer[0]; - - if((ssReceiveCount == 0) || (ssReceiveCount > 62)) { // error amount of data - read_failure=1; - pc.printf("Error amount of RX data: %d\n",ssReceiveCount); - reset_timeout.detach(); - reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); - } else {ssReceiveCount += 2; // add count + checksum - //pc.printf("\nBytes to receive: %d\n",ssReceiveCount); - } - + if((ssReceiveCount == 0) || (ssReceiveCount > 62)) { // error amount of data + read_failure=1; + pc.printf("Error amount of RX data: %d\n",ssReceiveCount); + reset_timeout.detach(); + reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); + } else { + ssReceiveCount += 2; // add count + checksum + //pc.printf("\nBytes to receive: %d\n",ssReceiveCount); + } + + } + if(!read_failure) { + ssReceivePointer++; + if (ssReceivePointer >= ssReceiveCount) { // End transmission + disableFifoFill(); + enableFifoFill(); + //irqled=0; + reset_timeout.detach(); + reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); + ssReceivePointer = 0; + dataAvailable(cRXBuffer[0], &cRXBuffer[1]); + } + } else { + disableFifoFill(); + enableFifoFill(); + ssReceivePointer = 0; + reset_timeout.detach(); + reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); + } } - if(!read_failure){ - ssReceivePointer++; - if (ssReceivePointer >= ssReceiveCount) { // End transmission - disableFifoFill(); - enableFifoFill(); - //irqled=0; - reset_timeout.detach(); - reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); - ssReceivePointer = 0; - dataAvailable(cRXBuffer[0], &cRXBuffer[1]); - } - }else{ - disableFifoFill(); - enableFifoFill(); - ssReceivePointer = 0; - reset_timeout.detach(); - reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); - } - } - } + } } // RF Set Datarate @@ -292,42 +295,45 @@ // Handle new RF Data void Alpha433::dataAvailable(char cCount, char* cBuffer) { - char rstring [cCount+1]; - char checksum = 0; - int i; - for(i=0;i<cCount;i++){ - rstring[i]=cBuffer[i]; - checksum ^= rstring[i]; - } - rstring[cCount]=0; - if (cBuffer[cCount] != checksum){ + char rstring [cCount+1]; + char checksum = 0; + int i; + for(i=0; i<cCount; i++) { + rstring[i]=cBuffer[i]; + checksum ^= rstring[i]; + } + rstring[cCount]=0; + if (cBuffer[cCount] != checksum) { if(RF_VERBOSE == 1)pc.printf("RF Received [%d] \"%s\" (checksum failed: expected %02X, received %02X)%02X %02X\n",cCount,rstring,checksum,cBuffer[cCount],cBuffer[cCount-1],cBuffer[cCount+1]); - }else { - if(RF_VERBOSE == 1)pc.printf("RF Received [%d] \"%s\" (checksum passed)\n",cCount,rstring); - if(USE_COMMUNICATION_STACK == 1){ + } else { + if(RF_VERBOSE == 1)pc.printf("RF Received [%d] \"%s\" (checksum passed)\n",cCount,rstring); + if(USE_COMMUNICATION_STACK == 1) { processRadioData(rstring, cCount); - }else{processRawRFData(rstring, cCount); - } - } + } else { + processRawRFData(rstring, cCount); + } + } } int Alpha433::readStatusByte() { - if(RF_VERBOSE == 1)pc.printf("RF Reading status byte\n"); - return _read(0x0000); + if(RF_VERBOSE == 1)pc.printf("RF Reading status byte\n"); + return _read(0x0000); } //-----PRIVATE FUNCTIONS----- -void Alpha433::_write(int address) { +void Alpha433::_write(int address) +{ _fss=0; //select the deivce _spi.write(address); //write the address of where the data is to be written first //pc.printf("Write data: %04X\n",address); _fss=1; //deselect the device } -int Alpha433::_read(int address) { +int Alpha433::_read(int address) +{ int _data; _fss=0; //select the device _data = _spi.write(address); //select the register @@ -337,11 +343,13 @@ } -int Alpha433::_putc (int c) { +int Alpha433::_putc (int c) +{ return(c); } -int Alpha433::_getc (void) { +int Alpha433::_getc (void) +{ char r = 0; return(r); } \ No newline at end of file