[RF69] Reduced code redundancies
This commit is contained in:
parent
55459f5271
commit
bf85e16880
2 changed files with 111 additions and 199 deletions
|
@ -85,37 +85,12 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) {
|
int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
// check packet length
|
// start transmission
|
||||||
if(len > 64) {
|
int16_t state = startTransmit(data, len, addr);
|
||||||
return(ERR_PACKET_TOO_LONG);
|
if(state != ERR_NONE) {
|
||||||
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set mode to standby
|
|
||||||
setMode(RF69_STANDBY);
|
|
||||||
|
|
||||||
// set DIO pin mapping
|
|
||||||
_mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PACKET_SENT, 7, 6);
|
|
||||||
|
|
||||||
// clear interrupt flags
|
|
||||||
clearIRQFlags();
|
|
||||||
|
|
||||||
// set packet length
|
|
||||||
_mod->SPIwriteRegister(RF69_REG_FIFO, len);
|
|
||||||
|
|
||||||
// check address filtering
|
|
||||||
uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1);
|
|
||||||
if((filter == RF69_ADDRESS_FILTERING_NODE) || (filter == RF69_ADDRESS_FILTERING_NODE_BROADCAST)) {
|
|
||||||
_mod->SPIwriteRegister(RF69_REG_FIFO, addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// write packet to FIFO
|
|
||||||
_mod->SPIwriteRegisterBurst(RF69_REG_FIFO, data, len);
|
|
||||||
|
|
||||||
// set mode to transmit
|
|
||||||
setMode(RF69_TX);
|
|
||||||
_mod->SPIsetRegValue(RF69_REG_TEST_PA1, RF69_PA1_20_DBM);
|
|
||||||
_mod->SPIsetRegValue(RF69_REG_TEST_PA2, RF69_PA2_20_DBM);
|
|
||||||
|
|
||||||
// wait for transmission end
|
// wait for transmission end
|
||||||
while(!digitalRead(_mod->getInt0()));
|
while(!digitalRead(_mod->getInt0()));
|
||||||
|
|
||||||
|
@ -126,23 +101,11 @@ int16_t RF69::transmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t RF69::receive(uint8_t* data, size_t len) {
|
int16_t RF69::receive(uint8_t* data, size_t len) {
|
||||||
// set mode to standby
|
// start reception
|
||||||
setMode(RF69_STANDBY);
|
int16_t state = startReceive();
|
||||||
|
if(state != ERR_NONE) {
|
||||||
// set DIO pin mapping
|
return(state);
|
||||||
_mod->SPIsetRegValue(RF69_REG_DIO_MAPPING_1, RF69_DIO0_PACK_PAYLOAD_READY | RF69_DIO1_PACK_TIMEOUT, 7, 4);
|
}
|
||||||
|
|
||||||
// clear interrupt flags
|
|
||||||
clearIRQFlags();
|
|
||||||
|
|
||||||
// enable RX timouts
|
|
||||||
_mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START);
|
|
||||||
_mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH);
|
|
||||||
|
|
||||||
// set mode to receive
|
|
||||||
setMode(RF69_RX);
|
|
||||||
_mod->SPIsetRegValue(RF69_REG_TEST_PA1, RF69_PA1_NORMAL);
|
|
||||||
_mod->SPIsetRegValue(RF69_REG_TEST_PA2, RF69_PA2_NORMAL);
|
|
||||||
|
|
||||||
// wait for packet reception or timeout
|
// wait for packet reception or timeout
|
||||||
while(!digitalRead(_mod->getInt0())) {
|
while(!digitalRead(_mod->getInt0())) {
|
||||||
|
@ -152,34 +115,8 @@ int16_t RF69::receive(uint8_t* data, size_t len) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// get packet length
|
|
||||||
size_t length = _mod->SPIreadRegister(RF69_REG_FIFO);
|
|
||||||
|
|
||||||
// check address filtering
|
|
||||||
uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1);
|
|
||||||
if((filter == RF69_ADDRESS_FILTERING_NODE) || (filter == RF69_ADDRESS_FILTERING_NODE_BROADCAST)) {
|
|
||||||
_mod->SPIreadRegister(RF69_REG_FIFO);
|
|
||||||
}
|
|
||||||
|
|
||||||
// read packet data
|
// read packet data
|
||||||
if(len == 0) {
|
return(readData(data, len));
|
||||||
// argument len equal to zero indicates String call, which means dynamically allocated data array
|
|
||||||
// dispose of the original and create a new one
|
|
||||||
delete[] data;
|
|
||||||
data = new uint8_t[length + 1];
|
|
||||||
}
|
|
||||||
_mod->SPIreadRegisterBurst(RF69_REG_FIFO, length, data);
|
|
||||||
|
|
||||||
// add terminating null
|
|
||||||
data[length] = 0;
|
|
||||||
|
|
||||||
// update RSSI
|
|
||||||
lastPacketRSSI = -1.0 * (_mod->SPIgetRegValue(RF69_REG_RSSI_VALUE)/2.0);
|
|
||||||
|
|
||||||
// clear interrupt flags
|
|
||||||
clearIRQFlags();
|
|
||||||
|
|
||||||
return(ERR_NONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t RF69::sleep() {
|
int16_t RF69::sleep() {
|
||||||
|
@ -192,12 +129,12 @@ int16_t RF69::standby() {
|
||||||
return(setMode(RF69_STANDBY));
|
return(setMode(RF69_STANDBY));
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t RF69::transmitDirect(uint32_t FRF) {
|
int16_t RF69::transmitDirect(uint32_t frf) {
|
||||||
// user requested to start transmitting immediately (required for RTTY)
|
// user requested to start transmitting immediately (required for RTTY)
|
||||||
if(FRF != 0) {
|
if(frf != 0) {
|
||||||
_mod->SPIwriteRegister(RF69_REG_FRF_MSB, (FRF & 0xFF0000) >> 16);
|
_mod->SPIwriteRegister(RF69_REG_FRF_MSB, (frf & 0xFF0000) >> 16);
|
||||||
_mod->SPIwriteRegister(RF69_REG_FRF_MID, (FRF & 0x00FF00) >> 8);
|
_mod->SPIwriteRegister(RF69_REG_FRF_MID, (frf & 0x00FF00) >> 8);
|
||||||
_mod->SPIwriteRegister(RF69_REG_FRF_LSB, FRF & 0x0000FF);
|
_mod->SPIwriteRegister(RF69_REG_FRF_LSB, frf & 0x0000FF);
|
||||||
|
|
||||||
return(setMode(RF69_TX));
|
return(setMode(RF69_TX));
|
||||||
}
|
}
|
||||||
|
@ -287,14 +224,6 @@ void RF69::setDio1Action(void (*func)(void)) {
|
||||||
attachInterrupt(digitalPinToInterrupt(_mod->getInt1()), func, RISING);
|
attachInterrupt(digitalPinToInterrupt(_mod->getInt1()), func, RISING);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t RF69::startTransmit(String& str, uint8_t addr) {
|
|
||||||
return(RF69::startTransmit(str.c_str(), addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
int16_t RF69::startTransmit(const char* str, uint8_t addr) {
|
|
||||||
return(RF69::startTransmit((uint8_t*)str, strlen(str), addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
|
int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
// check packet length
|
// check packet length
|
||||||
if(len > 64) {
|
if(len > 64) {
|
||||||
|
@ -326,27 +255,13 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
|
||||||
_mod->SPIwriteRegisterBurst(RF69_REG_FIFO, data, len);
|
_mod->SPIwriteRegisterBurst(RF69_REG_FIFO, data, len);
|
||||||
|
|
||||||
// set mode to transmit
|
// set mode to transmit
|
||||||
state = setMode(RF69_TX);
|
state = _mod->SPIsetRegValue(RF69_REG_TEST_PA1, RF69_PA1_20_DBM);
|
||||||
state |= _mod->SPIsetRegValue(RF69_REG_TEST_PA1, RF69_PA1_20_DBM);
|
|
||||||
state |= _mod->SPIsetRegValue(RF69_REG_TEST_PA2, RF69_PA2_20_DBM);
|
state |= _mod->SPIsetRegValue(RF69_REG_TEST_PA2, RF69_PA2_20_DBM);
|
||||||
|
state |= setMode(RF69_TX);
|
||||||
|
|
||||||
return(state);
|
return(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t RF69::readData(String& str, size_t len) {
|
|
||||||
// create temporary array to store received data
|
|
||||||
char* data = new char[len];
|
|
||||||
int16_t state = RF69::readData((uint8_t*)data, len);
|
|
||||||
|
|
||||||
// if packet was received successfully, copy data into String
|
|
||||||
if(state == ERR_NONE) {
|
|
||||||
str = String(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete[] data;
|
|
||||||
return(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
int16_t RF69::readData(uint8_t* data, size_t len) {
|
int16_t RF69::readData(uint8_t* data, size_t len) {
|
||||||
// get packet length
|
// get packet length
|
||||||
size_t length = _mod->SPIreadRegister(RF69_REG_FIFO);
|
size_t length = _mod->SPIreadRegister(RF69_REG_FIFO);
|
||||||
|
@ -367,9 +282,7 @@ int16_t RF69::readData(uint8_t* data, size_t len) {
|
||||||
_mod->SPIreadRegisterBurst(RF69_REG_FIFO, length, data);
|
_mod->SPIreadRegisterBurst(RF69_REG_FIFO, length, data);
|
||||||
|
|
||||||
// add terminating null
|
// add terminating null
|
||||||
if(len == 0) {
|
|
||||||
data[length] = 0;
|
data[length] = 0;
|
||||||
}
|
|
||||||
|
|
||||||
// update RSSI
|
// update RSSI
|
||||||
lastPacketRSSI = -1.0 * (_mod->SPIgetRegValue(RF69_REG_RSSI_VALUE)/2.0);
|
lastPacketRSSI = -1.0 * (_mod->SPIgetRegValue(RF69_REG_RSSI_VALUE)/2.0);
|
||||||
|
|
|
@ -424,6 +424,8 @@ class RF69: public PhysicalLayer {
|
||||||
// introduce PhysicalLayer overloads
|
// introduce PhysicalLayer overloads
|
||||||
using PhysicalLayer::transmit;
|
using PhysicalLayer::transmit;
|
||||||
using PhysicalLayer::receive;
|
using PhysicalLayer::receive;
|
||||||
|
using PhysicalLayer::startTransmit;
|
||||||
|
using PhysicalLayer::readData;
|
||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
RF69(Module* module);
|
RF69(Module* module);
|
||||||
|
@ -437,7 +439,7 @@ class RF69: public PhysicalLayer {
|
||||||
int16_t receive(uint8_t* data, size_t len);
|
int16_t receive(uint8_t* data, size_t len);
|
||||||
int16_t sleep();
|
int16_t sleep();
|
||||||
int16_t standby();
|
int16_t standby();
|
||||||
int16_t transmitDirect(uint32_t FRF = 0);
|
int16_t transmitDirect(uint32_t frf = 0);
|
||||||
int16_t receiveDirect();
|
int16_t receiveDirect();
|
||||||
int16_t packetMode();
|
int16_t packetMode();
|
||||||
|
|
||||||
|
@ -449,11 +451,8 @@ class RF69: public PhysicalLayer {
|
||||||
// interrupt methods
|
// interrupt methods
|
||||||
void setDio0Action(void (*func)(void));
|
void setDio0Action(void (*func)(void));
|
||||||
void setDio1Action(void (*func)(void));
|
void setDio1Action(void (*func)(void));
|
||||||
int16_t startTransmit(String& str, uint8_t addr = 0);
|
|
||||||
int16_t startTransmit(const char* str, uint8_t addr = 0);
|
|
||||||
int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0);
|
int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0);
|
||||||
int16_t startReceive();
|
int16_t startReceive();
|
||||||
int16_t readData(String& str, size_t len = 0);
|
|
||||||
int16_t readData(uint8_t* data, size_t len);
|
int16_t readData(uint8_t* data, size_t len);
|
||||||
|
|
||||||
// configuration methods
|
// configuration methods
|
||||||
|
|
Loading…
Add table
Reference in a new issue