[MOD] Added support for interrupt-based timing
This commit is contained in:
parent
355446c43a
commit
04357cb306
3 changed files with 53 additions and 0 deletions
|
@ -246,6 +246,8 @@ sendTone KEYWORD2
|
||||||
|
|
||||||
# PhysicalLayer
|
# PhysicalLayer
|
||||||
dropSync KEYWORD2
|
dropSync KEYWORD2
|
||||||
|
setTimerFlag KEYWORD2
|
||||||
|
setInterruptSetup KEYWORD2
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# Constants (LITERAL1)
|
# Constants (LITERAL1)
|
||||||
|
|
|
@ -251,6 +251,24 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da
|
||||||
this->SPIendTransaction();
|
this->SPIendTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Module::waitForMicroseconds(uint32_t start, uint32_t len) {
|
||||||
|
#if defined(RADIOLIB_INTERRUPT_TIMING)
|
||||||
|
(void)start;
|
||||||
|
if((this->TimerSetupCb != nullptr) && (len != this->_prevTimingLen)) {
|
||||||
|
_prevTimingLen = len;
|
||||||
|
this->TimerSetupCb(len);
|
||||||
|
}
|
||||||
|
this->TimerFlag = false;
|
||||||
|
while(!this->TimerFlag) {
|
||||||
|
this->yield();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
while(this->micros() - start < len) {
|
||||||
|
this->yield();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void Module::pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode) {
|
void Module::pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode) {
|
||||||
if((pin == RADIOLIB_NC) || (cb_pinMode == nullptr)) {
|
if((pin == RADIOLIB_NC) || (cb_pinMode == nullptr)) {
|
||||||
return;
|
return;
|
||||||
|
|
33
src/Module.h
33
src/Module.h
|
@ -91,6 +91,25 @@ class Module {
|
||||||
*/
|
*/
|
||||||
uint8_t SPIwriteCommand = 0b10000000;
|
uint8_t SPIwriteCommand = 0b10000000;
|
||||||
|
|
||||||
|
#if defined(RADIOLIB_INTERRUPT_TIMING)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Timer interrupt setup callback typedef.
|
||||||
|
*/
|
||||||
|
typedef void (*TimerSetupCb_t)(uint32_t len);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Callback to timer interrupt setup function when running in interrupt timing control mode.
|
||||||
|
*/
|
||||||
|
TimerSetupCb_t TimerSetupCb = nullptr;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Timer flag variable to be controlled by a platform-dependent interrupt.
|
||||||
|
*/
|
||||||
|
volatile bool TimerFlag = false;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// basic methods
|
// basic methods
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -241,6 +260,16 @@ class Module {
|
||||||
*/
|
*/
|
||||||
void setRfSwitchState(RADIOLIB_PIN_STATUS rxPinState, RADIOLIB_PIN_STATUS txPinState);
|
void setRfSwitchState(RADIOLIB_PIN_STATUS rxPinState, RADIOLIB_PIN_STATUS txPinState);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Wait for time to elapse, either using the microsecond timer, or the TimerFlag.
|
||||||
|
Note that in interrupt timing mode, it is up to the user to set up the timing interrupt!
|
||||||
|
|
||||||
|
\param start Waiting start timestamp, in microseconds.
|
||||||
|
|
||||||
|
\param len Waiting duration, in microseconds;
|
||||||
|
*/
|
||||||
|
void waitForMicroseconds(uint32_t start, uint32_t len);
|
||||||
|
|
||||||
// Arduino core overrides
|
// Arduino core overrides
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -422,6 +451,10 @@ class Module {
|
||||||
RADIOLIB_PIN_TYPE _rxEn = RADIOLIB_NC;
|
RADIOLIB_PIN_TYPE _rxEn = RADIOLIB_NC;
|
||||||
RADIOLIB_PIN_TYPE _txEn = RADIOLIB_NC;
|
RADIOLIB_PIN_TYPE _txEn = RADIOLIB_NC;
|
||||||
|
|
||||||
|
#if defined(RADIOLIB_INTERRUPT_TIMING)
|
||||||
|
uint32_t _prevTimingLen = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
// hardware abstraction layer callbacks
|
// hardware abstraction layer callbacks
|
||||||
// this is placed at the end of Module class because the callback generator macros
|
// this is placed at the end of Module class because the callback generator macros
|
||||||
// screw with the private/public access specifiers
|
// screw with the private/public access specifiers
|
||||||
|
|
Loading…
Add table
Reference in a new issue