Receive messages for multiple POCSAG RICs (#998)
* Make it possible to supply a list of addresses for POCSAG reception. * Initialize some instance variables to sensible values.
This commit is contained in:
parent
744834509f
commit
268e2d704f
2 changed files with 50 additions and 3 deletions
|
@ -28,6 +28,9 @@ PagerClient::PagerClient(PhysicalLayer* phy) {
|
||||||
#if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
|
#if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
|
||||||
readBitInstance = phyLayer;
|
readBitInstance = phyLayer;
|
||||||
#endif
|
#endif
|
||||||
|
filterNumAddresses = 0;
|
||||||
|
filterAddresses = NULL;
|
||||||
|
filterMasks = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t PagerClient::begin(float base, uint16_t speed, bool invert, uint16_t shift) {
|
int16_t PagerClient::begin(float base, uint16_t speed, bool invert, uint16_t shift) {
|
||||||
|
@ -246,6 +249,21 @@ int16_t PagerClient::startReceive(uint32_t pin, uint32_t addr, uint32_t mask) {
|
||||||
filterAddr = addr;
|
filterAddr = addr;
|
||||||
filterMask = mask;
|
filterMask = mask;
|
||||||
|
|
||||||
|
return startReceiveCommon();
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t PagerClient::startReceive(uint32_t pin, uint32_t *addrs, uint32_t *masks, size_t numAddresses) {
|
||||||
|
// save the variables
|
||||||
|
readBitPin = pin;
|
||||||
|
|
||||||
|
filterAddresses = addrs;
|
||||||
|
filterMasks = masks;
|
||||||
|
filterNumAddresses = numAddresses;
|
||||||
|
|
||||||
|
return startReceiveCommon();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t PagerClient::startReceiveCommon() {
|
||||||
// set the carrier frequency
|
// set the carrier frequency
|
||||||
int16_t state = phyLayer->setFrequency(baseFreq);
|
int16_t state = phyLayer->setFrequency(baseFreq);
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
@ -260,7 +278,7 @@ int16_t PagerClient::startReceive(uint32_t pin, uint32_t addr, uint32_t mask) {
|
||||||
|
|
||||||
// now set up the direct mode reception
|
// now set up the direct mode reception
|
||||||
Module* mod = phyLayer->getMod();
|
Module* mod = phyLayer->getMod();
|
||||||
mod->hal->pinMode(pin, mod->hal->GpioModeInput);
|
mod->hal->pinMode(readBitPin, mod->hal->GpioModeInput);
|
||||||
|
|
||||||
// set direct sync word to the frame sync word
|
// set direct sync word to the frame sync word
|
||||||
// the logic here is inverted, because modules like SX1278
|
// the logic here is inverted, because modules like SX1278
|
||||||
|
@ -356,8 +374,7 @@ int16_t PagerClient::readData(uint8_t* data, size_t* len, uint32_t* addr) {
|
||||||
|
|
||||||
// should be an address code word, extract the address
|
// should be an address code word, extract the address
|
||||||
uint32_t addr_found = ((cw & RADIOLIB_PAGER_ADDRESS_BITS_MASK) >> (RADIOLIB_PAGER_ADDRESS_POS - 3)) | (framePos/2);
|
uint32_t addr_found = ((cw & RADIOLIB_PAGER_ADDRESS_BITS_MASK) >> (RADIOLIB_PAGER_ADDRESS_POS - 3)) | (framePos/2);
|
||||||
if((addr_found & filterMask) == (filterAddr & filterMask)) {
|
if (addressMatched(addr_found)) {
|
||||||
// we have a match!
|
|
||||||
match = true;
|
match = true;
|
||||||
if(addr) {
|
if(addr) {
|
||||||
*addr = addr_found;
|
*addr = addr_found;
|
||||||
|
@ -460,6 +477,22 @@ int16_t PagerClient::readData(uint8_t* data, size_t* len, uint32_t* addr) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool PagerClient::addressMatched(uint32_t addr) {
|
||||||
|
if (filterNumAddresses == 0) {
|
||||||
|
return ((addr & filterMask) == (filterAddr & filterMask));
|
||||||
|
} else {
|
||||||
|
if (filterAddresses == NULL || filterMasks == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < filterNumAddresses; i++) {
|
||||||
|
if ((filterAddresses[i] & filterMasks[i]) == (addr & filterMasks[i])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PagerClient::write(uint32_t* data, size_t len) {
|
void PagerClient::write(uint32_t* data, size_t len) {
|
||||||
// write code words from buffer
|
// write code words from buffer
|
||||||
for(size_t i = 0; i < len; i++) {
|
for(size_t i = 0; i < len; i++) {
|
||||||
|
|
|
@ -130,6 +130,15 @@ class PagerClient {
|
||||||
*/
|
*/
|
||||||
int16_t startReceive(uint32_t pin, uint32_t addr, uint32_t mask = 0xFFFFF);
|
int16_t startReceive(uint32_t pin, uint32_t addr, uint32_t mask = 0xFFFFF);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Start reception of POCSAG packets for multiple addresses and masks.
|
||||||
|
\param pin Pin to receive digital data on (e.g., DIO2 for SX127x).
|
||||||
|
\param addrs Array of addresses to receive.
|
||||||
|
\param masks Array of address masks to use for filtering. Masks will be applied to corresponding addresses in addr array.
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t startReceive(uint32_t pin, uint32_t *addrs, uint32_t *masks, size_t numAddress);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Get the number of POCSAG batches available in buffer. Limited by the size of direct mode buffer!
|
\brief Get the number of POCSAG batches available in buffer. Limited by the size of direct mode buffer!
|
||||||
\returns Number of available batches.
|
\returns Number of available batches.
|
||||||
|
@ -175,10 +184,15 @@ class PagerClient {
|
||||||
uint16_t bitDuration;
|
uint16_t bitDuration;
|
||||||
uint32_t filterAddr;
|
uint32_t filterAddr;
|
||||||
uint32_t filterMask;
|
uint32_t filterMask;
|
||||||
|
uint32_t *filterAddresses;
|
||||||
|
uint32_t *filterMasks;
|
||||||
|
size_t filterNumAddresses;
|
||||||
bool inv = false;
|
bool inv = false;
|
||||||
|
|
||||||
void write(uint32_t* data, size_t len);
|
void write(uint32_t* data, size_t len);
|
||||||
void write(uint32_t codeWord);
|
void write(uint32_t codeWord);
|
||||||
|
uint16_t startReceiveCommon();
|
||||||
|
bool addressMatched(uint32_t addr);
|
||||||
|
|
||||||
#if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
|
#if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
|
||||||
uint32_t read();
|
uint32_t read();
|
||||||
|
|
Loading…
Add table
Reference in a new issue