[RF69] Extracted common packet mode code

This commit is contained in:
jgromes 2019-11-22 13:29:33 +01:00
parent bd2161cc47
commit 57fab02e20
2 changed files with 29 additions and 47 deletions

View file

@ -9,7 +9,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT,
_promiscuous = false; _promiscuous = false;
_syncWordLength = RF69_DEFAULT_SYNC_WORD_LENGTH; _syncWordLength = 2;
} }
int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) {
@ -92,7 +92,7 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe
} }
// default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library
uint8_t syncWord[] = RF69_DEFAULT_SYNC_WORD; uint8_t syncWord[] = {0x2D, 0x01};
state = setSyncWord(syncWord, sizeof(syncWord)); state = setSyncWord(syncWord, sizeof(syncWord));
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
@ -506,7 +506,7 @@ int16_t RF69::setOutputPower(int8_t power) {
int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) { int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) {
// check constraints // check constraints
if((maxErrBits > 7) || (len > RF69_MAX_SYNC_WORD_LENGTH)) { if((maxErrBits > 7) || (len > 8)) {
return(ERR_INVALID_SYNC_WORD); return(ERR_INVALID_SYNC_WORD);
} }
@ -603,49 +603,11 @@ size_t RF69::getPacketLength(bool update) {
} }
int16_t RF69::fixedPacketLengthMode(uint8_t len) { int16_t RF69::fixedPacketLengthMode(uint8_t len) {
if (len > RF69_MAX_PACKET_LENGTH) { return(setPacketMode(RF69_PACKET_FORMAT_FIXED, len));
return(ERR_PACKET_TOO_LONG);
}
// set to fixed packet length
int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_FIXED, 7, 7);
if (state != ERR_NONE) {
return(state);
}
// set length to register
state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, len);
if (state != ERR_NONE) {
return(state);
}
// all went well: cache the reg value
_packetLengthConfig = RF69_PACKET_FORMAT_FIXED;
return(state);
} }
int16_t RF69::variablePacketLengthMode(uint8_t maxLen) { int16_t RF69::variablePacketLengthMode(uint8_t maxLen) {
if (maxLen > RF69_MAX_PACKET_LENGTH) { return(setPacketMode(RF69_PACKET_FORMAT_VARIABLE, maxLen));
return(ERR_PACKET_TOO_LONG);
}
// set to variable packet length
int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_VARIABLE, 7, 7);
if (state != ERR_NONE) {
return(state);
}
// set max length to register
state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, maxLen);
if (state != ERR_NONE) {
return(state);
}
// all went well: cache the reg value
_packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE;
return(state);
} }
int16_t RF69::enableSyncWordFiltering(uint8_t maxErrBits) { int16_t RF69::enableSyncWordFiltering(uint8_t maxErrBits) {
@ -792,6 +754,29 @@ int16_t RF69::config() {
return(ERR_NONE); return(ERR_NONE);
} }
int16_t RF69::setPacketMode(uint8_t mode, uint8_t len) {
// check length
if (len > RF69_MAX_PACKET_LENGTH) {
return(ERR_PACKET_TOO_LONG);
}
// set to fixed packet length
int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, mode, 7, 7);
if (state != ERR_NONE) {
return(state);
}
// set length to register
state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, len);
if (state != ERR_NONE) {
return(state);
}
// update the cached value
_packetLengthConfig = mode;
return(state);
}
int16_t RF69::setMode(uint8_t mode) { int16_t RF69::setMode(uint8_t mode) {
return(_mod->SPIsetRegValue(RF69_REG_OP_MODE, mode, 4, 2)); return(_mod->SPIsetRegValue(RF69_REG_OP_MODE, mode, 4, 2));
} }

View file

@ -10,10 +10,6 @@
#define RF69_CRYSTAL_FREQ 32.0 #define RF69_CRYSTAL_FREQ 32.0
#define RF69_DIV_EXPONENT 19 #define RF69_DIV_EXPONENT 19
#define RF69_MAX_PACKET_LENGTH 64 #define RF69_MAX_PACKET_LENGTH 64
#define RF69_MAX_PREAMBLE_LENGTH 4
#define RF69_MAX_SYNC_WORD_LENGTH 8
#define RF69_DEFAULT_SYNC_WORD_LENGTH 2
#define RF69_DEFAULT_SYNC_WORD { 0x2D, 0x01 }
// RF69 register map // RF69 register map
#define RF69_REG_FIFO 0x00 #define RF69_REG_FIFO 0x00
@ -781,6 +777,7 @@ class RF69: public PhysicalLayer {
int16_t config(); int16_t config();
int16_t directMode(); int16_t directMode();
int16_t setPacketMode(uint8_t mode, uint8_t len);
#ifndef RADIOLIB_GODMODE #ifndef RADIOLIB_GODMODE
private: private: