mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-09 06:32:06 +00:00
SX126x/8x: Add HEADER_VALID IRQ flag for actively receiving check (#2333)
* Add HEADER_VALID IRQ flag for SX126x/8x to detect actively receiving Needs new RadioLib commit * Update comments * Use latest RadioLib release --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
parent
5044169e8d
commit
3ca1e62b1f
@ -66,8 +66,7 @@ lib_deps =
|
|||||||
https://github.com/meshtastic/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3
|
https://github.com/meshtastic/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3
|
||||||
nanopb/Nanopb@^0.4.6
|
nanopb/Nanopb@^0.4.6
|
||||||
erriez/ErriezCRC32@^1.0.1
|
erriez/ErriezCRC32@^1.0.1
|
||||||
; jgromes/RadioLib@^5.5.1
|
jgromes/RadioLib@^5.7.0
|
||||||
https://github.com/jgromes/RadioLib.git#1afa947030c5637f71f6563bc22aa75032e53a57
|
|
||||||
|
|
||||||
; Used for the code analysis in PIO Home / Inspect
|
; Used for the code analysis in PIO Home / Inspect
|
||||||
check_tool = cppcheck
|
check_tool = cppcheck
|
||||||
|
@ -212,9 +212,10 @@ template <typename T> void SX126xInterface<T>::startReceive()
|
|||||||
|
|
||||||
setStandby();
|
setStandby();
|
||||||
|
|
||||||
// int err = lora.startReceive();
|
// We use a 16 bit preamble so this should save some power by letting radio sit in standby mostly.
|
||||||
int err = lora.startReceiveDutyCycleAuto(); // We use a 32 bit preamble so this should save some power by letting radio sit in
|
// Furthermore, we need the HEADER_VALID IRQ flag to detect whether we are actively receiving
|
||||||
// standby mostly.
|
int err =
|
||||||
|
lora.startReceiveDutyCycleAuto(preambleLength, 8, RADIOLIB_SX126X_IRQ_RX_DEFAULT | RADIOLIB_SX126X_IRQ_HEADER_VALID);
|
||||||
assert(err == RADIOLIB_ERR_NONE);
|
assert(err == RADIOLIB_ERR_NONE);
|
||||||
|
|
||||||
isReceiving = true;
|
isReceiving = true;
|
||||||
@ -224,7 +225,7 @@ template <typename T> void SX126xInterface<T>::startReceive()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Could we send right now (i.e. either not actively receving or transmitting)? */
|
/** Is the channel currently active? */
|
||||||
template <typename T> bool SX126xInterface<T>::isChannelActive()
|
template <typename T> bool SX126xInterface<T>::isChannelActive()
|
||||||
{
|
{
|
||||||
// check if we can detect a LoRa preamble on the current channel
|
// check if we can detect a LoRa preamble on the current channel
|
||||||
@ -245,17 +246,12 @@ template <typename T> bool SX126xInterface<T>::isActivelyReceiving()
|
|||||||
{
|
{
|
||||||
// The IRQ status will be cleared when we start our read operation. Check if we've started a header, but haven't yet
|
// The IRQ status will be cleared when we start our read operation. Check if we've started a header, but haven't yet
|
||||||
// received and handled the interrupt for reading the packet/handling errors.
|
// received and handled the interrupt for reading the packet/handling errors.
|
||||||
// FIXME: it would be better to check for preamble, but we currently have our ISR not set to fire for packets that
|
|
||||||
// never even get a valid header, so we don't want preamble to get set and stay set due to noise on the network.
|
|
||||||
|
|
||||||
uint16_t irq = lora.getIrqStatus();
|
uint16_t irq = lora.getIrqStatus();
|
||||||
bool hasPreamble = (irq & RADIOLIB_SX126X_IRQ_HEADER_VALID);
|
bool headerValid = (irq & RADIOLIB_SX126X_IRQ_HEADER_VALID);
|
||||||
|
|
||||||
// this is not correct - often always true - need to add an extra conditional
|
// if (headerValid) LOG_DEBUG("rx headerValid\n");
|
||||||
// size_t bytesPending = lora.getPacketLength();
|
return headerValid;
|
||||||
|
|
||||||
// if (hasPreamble) LOG_DEBUG("rx hasPreamble\n");
|
|
||||||
return hasPreamble;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> bool SX126xInterface<T>::sleep()
|
template <typename T> bool SX126xInterface<T>::sleep()
|
||||||
|
@ -203,7 +203,9 @@ template <typename T> void SX128xInterface<T>::startReceive()
|
|||||||
digitalWrite(SX128X_TXEN, LOW);
|
digitalWrite(SX128X_TXEN, LOW);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int err = lora.startReceive();
|
// We use the HEADER_VALID IRQ flag to detect whether we are actively receiving
|
||||||
|
int err =
|
||||||
|
lora.startReceive(RADIOLIB_SX128X_RX_TIMEOUT_INF, RADIOLIB_SX128X_IRQ_RX_DEFAULT | RADIOLIB_SX128X_IRQ_HEADER_VALID);
|
||||||
|
|
||||||
assert(err == RADIOLIB_ERR_NONE);
|
assert(err == RADIOLIB_ERR_NONE);
|
||||||
|
|
||||||
@ -214,7 +216,7 @@ template <typename T> void SX128xInterface<T>::startReceive()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Could we send right now (i.e. either not actively receving or transmitting)? */
|
/** Is the channel currently active? */
|
||||||
template <typename T> bool SX128xInterface<T>::isChannelActive()
|
template <typename T> bool SX128xInterface<T>::isChannelActive()
|
||||||
{
|
{
|
||||||
// check if we can detect a LoRa preamble on the current channel
|
// check if we can detect a LoRa preamble on the current channel
|
||||||
@ -234,8 +236,8 @@ template <typename T> bool SX128xInterface<T>::isChannelActive()
|
|||||||
template <typename T> bool SX128xInterface<T>::isActivelyReceiving()
|
template <typename T> bool SX128xInterface<T>::isActivelyReceiving()
|
||||||
{
|
{
|
||||||
uint16_t irq = lora.getIrqStatus();
|
uint16_t irq = lora.getIrqStatus();
|
||||||
bool hasPreamble = (irq & RADIOLIB_SX128X_IRQ_HEADER_VALID);
|
bool hasHeader = (irq & RADIOLIB_SX128X_IRQ_HEADER_VALID);
|
||||||
return hasPreamble;
|
return hasHeader;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> bool SX128xInterface<T>::sleep()
|
template <typename T> bool SX128xInterface<T>::sleep()
|
||||||
|
Loading…
Reference in New Issue
Block a user