Skip to content

Commit 8aa75b1

Browse files
committed
Add support for implicit header mode and SF 6
1 parent 9b19623 commit 8aa75b1

File tree

2 files changed

+62
-13
lines changed

2 files changed

+62
-13
lines changed

src/LoRa.cpp

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ LoRaClass::LoRaClass() :
5151
_ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN),
5252
_frequency(0),
5353
_packetIndex(0),
54+
_implicitHeaderMode(0),
5455
_onReceive(NULL)
5556
{
5657
}
@@ -110,11 +111,17 @@ void LoRaClass::end()
110111
SPI.end();
111112
}
112113

113-
int LoRaClass::beginPacket()
114+
int LoRaClass::beginPacket(bool implicitHeader)
114115
{
115116
// put in standby mode
116117
idle();
117118

119+
if (implicitHeader) {
120+
implicitHeaderMode();
121+
} else {
122+
explicitHeaderMode();
123+
}
124+
118125
// reset FIFO address and paload length
119126
writeRegister(REG_FIFO_ADDR_PTR, 0);
120127
writeRegister(REG_PAYLOAD_LENGTH, 0);
@@ -136,11 +143,19 @@ int LoRaClass::endPacket()
136143
return 1;
137144
}
138145

139-
int LoRaClass::parsePacket()
146+
int LoRaClass::parsePacket(int size)
140147
{
141148
int packetLength = 0;
142149
int irqFlags = readRegister(REG_IRQ_FLAGS);
143150

151+
if (size > 0) {
152+
implicitHeaderMode();
153+
154+
writeRegister(REG_PAYLOAD_LENGTH, size & 0xff);
155+
} else {
156+
explicitHeaderMode();
157+
}
158+
144159
// clear IRQ's
145160
writeRegister(REG_IRQ_FLAGS, irqFlags);
146161

@@ -149,7 +164,11 @@ int LoRaClass::parsePacket()
149164
_packetIndex = 0;
150165

151166
// read packet length
152-
packetLength = readRegister(REG_RX_NB_BYTES);
167+
if (_implicitHeaderMode) {
168+
packetLength = readRegister(REG_PAYLOAD_LENGTH);
169+
} else {
170+
packetLength = readRegister(REG_RX_NB_BYTES);
171+
}
153172

154173
// set FIFO address to current RX address
155174
writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));
@@ -255,8 +274,16 @@ void LoRaClass::onReceive(void(*callback)(int))
255274
}
256275
}
257276

258-
void LoRaClass::receive()
277+
void LoRaClass::receive(int size)
259278
{
279+
if (size > 0) {
280+
implicitHeaderMode();
281+
282+
writeRegister(REG_PAYLOAD_LENGTH, size & 0xff);
283+
} else {
284+
explicitHeaderMode();
285+
}
286+
260287
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
261288
}
262289

@@ -299,15 +326,19 @@ void LoRaClass::setTxPower(int level)
299326

300327
void LoRaClass::setSpreadingFactor(int sf)
301328
{
302-
if (sf < 7) {
303-
sf = 7;
329+
if (sf < 6) {
330+
sf = 6;
304331
} else if (sf > 12) {
305332
sf = 12;
306333
}
307334

308-
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
309-
writeRegister(REG_DETECTION_OPTIMIZE, 0xc3);
310-
writeRegister(REG_DETECTION_THRESHOLD, 0x0a);
335+
if (sf == 6) {
336+
writeRegister(REG_DETECTION_OPTIMIZE, 0xc5);
337+
writeRegister(REG_DETECTION_THRESHOLD, 0x0c);
338+
} else {
339+
writeRegister(REG_DETECTION_OPTIMIZE, 0xc3);
340+
writeRegister(REG_DETECTION_THRESHOLD, 0x0a);
341+
}
311342

312343
writeRegister(REG_MODEM_CONFIG_2, (readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0));
313344
}
@@ -392,6 +423,20 @@ void LoRaClass::dumpRegisters(Stream& out)
392423
}
393424
}
394425

426+
void LoRaClass::explicitHeaderMode()
427+
{
428+
_implicitHeaderMode = 0;
429+
430+
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
431+
}
432+
433+
void LoRaClass::implicitHeaderMode()
434+
{
435+
_implicitHeaderMode = 1;
436+
437+
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) | 0x01);
438+
}
439+
395440
void LoRaClass::handleDio0Rise()
396441
{
397442
int irqFlags = readRegister(REG_IRQ_FLAGS);
@@ -404,7 +449,7 @@ void LoRaClass::handleDio0Rise()
404449
_packetIndex = 0;
405450

406451
// read packet length
407-
int packetLength = readRegister(REG_RX_NB_BYTES);
452+
int packetLength = _implicitHeaderMode ? readRegister(REG_PAYLOAD_LENGTH) : readRegister(REG_RX_NB_BYTES);
408453

409454
// set FIFO address to current RX address
410455
writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));

src/LoRa.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ class LoRaClass : public Stream {
1515
int begin(long frequency);
1616
void end();
1717

18-
int beginPacket();
18+
int beginPacket(bool implicitHeader = false);
1919
int endPacket();
2020

21-
int parsePacket();
21+
int parsePacket(int size = 0);
2222
int packetRssi();
2323
float packetSnr();
2424

@@ -34,7 +34,7 @@ class LoRaClass : public Stream {
3434

3535
void onReceive(void(*callback)(int));
3636

37-
void receive();
37+
void receive(int size = 0);
3838
void idle();
3939
void sleep();
4040

@@ -55,6 +55,9 @@ class LoRaClass : public Stream {
5555
void dumpRegisters(Stream& out);
5656

5757
private:
58+
void explicitHeaderMode();
59+
void implicitHeaderMode();
60+
5861
void handleDio0Rise();
5962

6063
uint8_t readRegister(uint8_t address);
@@ -70,6 +73,7 @@ class LoRaClass : public Stream {
7073
int _dio0;
7174
int _frequency;
7275
int _packetIndex;
76+
int _implicitHeaderMode;
7377
void (*_onReceive)(int);
7478
};
7579

0 commit comments

Comments
 (0)