Merge pull request #56 from rfquack/master

Variable/fixed packet length mode config for RF69/SX1231
This commit is contained in:
Jan Gromeš 2019-11-08 18:47:26 +01:00 committed by GitHub
commit e61e9afbe5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 98 additions and 3 deletions

View file

@ -88,7 +88,7 @@ setDataShaping KEYWORD2
setOOK KEYWORD2 setOOK KEYWORD2
setDataShapingOOK KEYWORD2 setDataShapingOOK KEYWORD2
setCRC KEYWORD2 setCRC KEYWORD2
variablePacketLengthMode KEYWORD2 variablePacketLengthMode KEYWORD2
fixedPacketLengthMode KEYWORD2 fixedPacketLengthMode KEYWORD2
# RF69-specific # RF69-specific

View file

@ -4,6 +4,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT,
_mod = module; _mod = module;
_tempOffset = 0; _tempOffset = 0;
_packetLengthQueried = false; _packetLengthQueried = false;
_packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE;
} }
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) {
@ -54,27 +55,37 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe
return(state); return(state);
} }
// configure bitrate
_rxBw = 125.0; _rxBw = 125.0;
state = setBitRate(br); state = setBitRate(br);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default RX bandwidth
state = setRxBandwidth(rxBw); state = setRxBandwidth(rxBw);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default frequency deviation
state = setFrequencyDeviation(freqDev); state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default TX output power
state = setOutputPower(power); state = setOutputPower(power);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// set default packet length mode
state = variablePacketLengthMode();
if (state != ERR_NONE) {
return(state);
}
// 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[] = {0x2D, 0x01}; uint8_t syncWord[] = {0x2D, 0x01};
state = setSyncWord(syncWord, 2); state = setSyncWord(syncWord, 2);
@ -250,6 +261,11 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
// set packet length // set packet length
_mod->SPIwriteRegister(RF69_REG_FIFO, len); _mod->SPIwriteRegister(RF69_REG_FIFO, len);
// optionally write packet length
if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) {
_mod->SPIwriteRegister(RF69_REG_FIFO, len);
}
// check address filtering // check address filtering
uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1); uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1);
if((filter == RF69_ADDRESS_FILTERING_NODE) || (filter == RF69_ADDRESS_FILTERING_NODE_BROADCAST)) { if((filter == RF69_ADDRESS_FILTERING_NODE) || (filter == RF69_ADDRESS_FILTERING_NODE_BROADCAST)) {
@ -563,13 +579,63 @@ int16_t RF69::getTemperature() {
size_t RF69::getPacketLength(bool update) { size_t RF69::getPacketLength(bool update) {
if(!_packetLengthQueried && update) { if(!_packetLengthQueried && update) {
_packetLength = _mod->SPIreadRegister(RF69_REG_FIFO); if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) {
_packetLength = _mod->SPIreadRegister(RF69_REG_FIFO);
} else {
_packetLength = _mod->SPIreadRegister(RF69_REG_PAYLOAD_LENGTH);
}
_packetLengthQueried = true; _packetLengthQueried = true;
} }
return(_packetLength); return(_packetLength);
} }
int16_t RF69::fixedPacketLengthMode(uint8_t len) {
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, 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) {
if (maxLen > RF69_MAX_PACKET_LENGTH) {
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::config() { int16_t RF69::config() {
int16_t state = ERR_NONE; int16_t state = ERR_NONE;

View file

@ -697,7 +697,7 @@ class RF69: public PhysicalLayer {
*/ */
int16_t getTemperature(); int16_t getTemperature();
/*! /*!
\brief Query modem for the packet length of received payload. \brief Query modem for the packet length of received payload.
\param update Update received packet length. Will return cached value when set to false. \param update Update received packet length. Will return cached value when set to false.
@ -706,6 +706,24 @@ class RF69: public PhysicalLayer {
*/ */
size_t getPacketLength(bool update = true); size_t getPacketLength(bool update = true);
/*!
\brief Set modem in fixed packet length mode.
\param len Packet length.
\returns \ref status_codes
*/
int16_t fixedPacketLengthMode(uint8_t len = RF69_MAX_PACKET_LENGTH);
/*!
\brief Set modem in variable packet length mode.
\param len Maximum packet length.
\returns \ref status_codes
*/
int16_t variablePacketLengthMode(uint8_t maxLen = RF69_MAX_PACKET_LENGTH);
protected: protected:
Module* _mod; Module* _mod;
@ -715,6 +733,7 @@ class RF69: public PhysicalLayer {
size_t _packetLength; size_t _packetLength;
bool _packetLengthQueried; bool _packetLengthQueried;
uint8_t _packetLengthConfig;
int16_t config(); int16_t config();
int16_t directMode(); int16_t directMode();

View file

@ -53,22 +53,26 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
return(state); return(state);
} }
// configure bitrate
_rxBw = 125.0; _rxBw = 125.0;
state = setBitRate(br); state = setBitRate(br);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default RX bandwidth
state = setRxBandwidth(rxBw); state = setRxBandwidth(rxBw);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default frequency deviation
state = setFrequencyDeviation(freqDev); state = setFrequencyDeviation(freqDev);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
} }
// configure default TX output power
state = setOutputPower(power); state = setOutputPower(power);
if(state != ERR_NONE) { if(state != ERR_NONE) {
return(state); return(state);
@ -81,6 +85,12 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po
return(state); return(state);
} }
// set default packet length mode
state = variablePacketLengthMode();
if (state != ERR_NONE) {
return(state);
}
// SX1231 V2a only // SX1231 V2a only
if(_chipRevision == SX1231_CHIP_REVISION_2_A) { if(_chipRevision == SX1231_CHIP_REVISION_2_A) {
// modify default OOK threshold value // modify default OOK threshold value