Port of lowpowerlab RFM69 Packet radio library for HopeRF RFM69H with hacks from debugging with a FRDM-KL25Z
Fork of RFM69 by
Diff: RFM69.cpp
- Revision:
- 3:9d44479041c3
- Parent:
- 2:574f229e8182
- Child:
- 4:a6b314434ab4
--- a/RFM69.cpp Mon Jun 08 20:53:46 2015 +0000 +++ b/RFM69.cpp Fri Jun 19 13:03:45 2015 +0000 @@ -465,6 +465,76 @@ return false; } +void RFM69::receive() { + unsigned long timeout = 10000; + char i; + + DATALEN = 0; + SENDERID = 0; + TARGETID = 0; + PAYLOADLEN = 0; + ACK_REQUESTED = 0; + ACK_RECEIVED = 0; + RSSI = 0; + for(i = 0; i < 63; i++) DATA[i] = 0; + + // Receive Data until timeout or valid data + while(1) { + if (readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY) + writeReg(REG_PACKETCONFIG2, (readReg(REG_PACKETCONFIG2) & 0xFB) | RF_PACKET2_RXRESTART); // avoid RX deadlocks + ////writeReg(REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01); //set DIO0 to "PAYLOADREADY" in receive mode + setMode(RF69_MODE_RX); + + //printf("Ya estoy en modo RX\n\r"); + + // Receive Data until timeout (aprox 2s) + while((readReg(REG_IRQFLAGS2) & RF_IRQFLAGS2_PAYLOADREADY) == 0) { + timeout--; + if(timeout == 0) { + //printf("Timeout!\n\r"); + setMode(RF69_MODE_STANDBY); + return; + } + //usleep(1); + } + + //printf("He recibido algo!!\n\r"); + + // Received any packet! + setMode(RF69_MODE_STANDBY); + select(); + + _spi.write(REG_FIFO & 0x7F); + PAYLOADLEN = _spi.write(0); + PAYLOADLEN = PAYLOADLEN > 66 ? 66 : PAYLOADLEN; // precaution + TARGETID = _spi.write(0); + + //printf("Payload length: %i\n\r", PAYLOADLEN); + //printf("Target id: %i\n\r", TARGETID); + + if(!(_promiscuousMode || TARGETID==_address || TARGETID==RF69_BROADCAST_ADDR) //match this node's address, or $ + || PAYLOADLEN < 3) { // address situation could receive packets that are malformed and don't fit this libraries extra fields + PAYLOADLEN = 0; + } else { + DATALEN = PAYLOADLEN - 3; + SENDERID = _spi.write(0); + uint8_t CTLbyte = _spi.write(0); + + ACK_RECEIVED = CTLbyte & 0x80; // extract ACK-received flag + ACK_REQUESTED = CTLbyte & 0x40; // extract ACK-requested flag + + for (uint8_t i = 0; i < DATALEN; i++) + { + DATA[i] = _spi.write(0); + } + if (DATALEN < RF69_MAX_DATA_LEN) DATA[DATALEN] = 0; // add null at end of string + } + unselect(); + //setMode(RF69_MODE_RX); + RSSI = readRSSI(0); + } +} + // To enable encryption: radio.encrypt("ABCDEFGHIJKLMNOP"); // To disable encryption: radio.encrypt(null) or radio.encrypt(0) // KEY HAS TO BE 16 bytes !!!