1
0
mirror of https://github.com/sandeepmistry/arduino-LoRa.git synced 2025-06-06 23:01:00 +03:00

non blocking functions added (#62)

This commit is contained in:
Samuel Lang 2018-08-19 16:34:32 +02:00 committed by Sandeep Mistry
parent 07bfead143
commit 9d2a8c9c82
5 changed files with 72 additions and 10 deletions

View File

@ -33,5 +33,6 @@ script:
buildExampleSketch LoRaReceiverCallback;
fi
- buildExampleSketch LoRaSender
- buildExampleSketch LoRaSenderNonBlocking
- buildExampleSketch LoRaSetSpread
- buildExampleSketch LoRaSetSyncWord

7
API.md
View File

@ -82,7 +82,7 @@ LoRa.beginPacket(implicitHeader);
* `implicitHeader` - (optional) `true` enables implicit header mode, `false` enables explicit header mode (default)
Returns `1` on success, `0` on failure.
Returns `1` if radio is ready to transmit, `0` if busy or on failure.
### Writing
@ -109,8 +109,11 @@ Returns the number of bytes written.
End the sequence of sending a packet.
```arduino
LoRa.endPacket()
LoRa.endPacket();
LoRa.endPacket(async);
```
* `async` - (optional) `true` enables non-blocking mode, `false` waits for transmission to be completed (default)
Returns `1` on success, `0` on failure.

View File

@ -0,0 +1,35 @@
#include <SPI.h>
#include <LoRa.h>
int counter = 0;
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("LoRa Sender non-blocking");
if (!LoRa.begin(915E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
}
void loop() {
// wait until the radio is ready to send a packet
while (LoRa.beginPacket() == 0) {
Serial.print("waiting for radio ... ");
delay(100);
}
Serial.print("Sending packet non-blocking: ");
Serial.println(counter);
// send in async / non-blocking mode
LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket(true); // true = async / non-blocking mode
counter++;
}

View File

@ -149,6 +149,10 @@ void LoRaClass::end()
int LoRaClass::beginPacket(int implicitHeader)
{
if (isTransmitting()) {
return 0;
}
// put in standby mode
idle();
@ -165,22 +169,40 @@ int LoRaClass::beginPacket(int implicitHeader)
return 1;
}
int LoRaClass::endPacket()
int LoRaClass::endPacket(bool async)
{
// put in TX mode
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX);
// wait for TX done
while ((readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) == 0) {
yield();
if (async) {
// grace time is required for the radio
delayMicroseconds(150);
} else {
// wait for TX done
while ((readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) == 0) {
yield();
}
// clear IRQ's
writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);
}
// clear IRQ's
writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);
return 1;
}
bool LoRaClass::isTransmitting()
{
if ((readRegister(REG_OP_MODE) & MODE_TX) == MODE_TX) {
return true;
}
if (readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) {
// clear IRQ's
writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);
}
return false;
}
int LoRaClass::parsePacket(int size)
{
int packetLength = 0;

View File

@ -32,7 +32,7 @@ public:
void end();
int beginPacket(int implicitHeader = false);
int endPacket();
int endPacket(bool async = false);
int parsePacket(int size = 0);
int packetRssi();
@ -88,6 +88,7 @@ private:
void implicitHeaderMode();
void handleDio0Rise();
bool isTransmitting();
int getSpreadingFactor();
long getSignalBandwidth();