some lora changes
This commit is contained in:
@@ -130,8 +130,10 @@ template <typename SPI, int PIN_SLAVE_SEL, int PIN_RESET, int PIN_DIO0> class SX
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
struct PacketDetails {
|
struct PacketDetails {
|
||||||
int16_t rssi; // can be smaller than -128!
|
int8_t rssi; // can be smaller than -128! -> use getter method (-128 - 1 -> + 127)
|
||||||
float snr;
|
int8_t snr4; // SNR*4 (must be scaled by 0.25)
|
||||||
|
float getSNR() const {return snr4 * 0.25f;}
|
||||||
|
int16_t getRSSI() const {return (rssi<0) ? (rssi) : (-256 + rssi);}
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -325,16 +327,17 @@ public:
|
|||||||
|
|
||||||
/** switch to idle mode */
|
/** switch to idle mode */
|
||||||
void idle() {
|
void idle() {
|
||||||
debugMod(NAME, "idle()");
|
//debugMod(NAME, "idle()");
|
||||||
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY);
|
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** switch to sleep mode */
|
/** switch to sleep mode */
|
||||||
void sleep() {
|
void sleep() {
|
||||||
debugMod(NAME, "sleep()");
|
//debugMod(NAME, "sleep()");
|
||||||
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);
|
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** is the device currently transmitting? */
|
||||||
bool isTransmitting() {
|
bool isTransmitting() {
|
||||||
if ((readRegister(REG_OP_MODE) & MODE_TX) == MODE_TX) {return true;}
|
if ((readRegister(REG_OP_MODE) & MODE_TX) == MODE_TX) {return true;}
|
||||||
if (readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) {writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);} // clear TX-done IRQ flag
|
if (readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) {writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);} // clear TX-done IRQ flag
|
||||||
@@ -344,7 +347,7 @@ public:
|
|||||||
/** send the given data */
|
/** send the given data */
|
||||||
int send(const uint8_t* data, uint8_t len, bool async) {
|
int send(const uint8_t* data, uint8_t len, bool async) {
|
||||||
|
|
||||||
debugMod1(NAME, "send(%d bytes)", len);
|
debugMod2(NAME, "tx(%d bytes, async:%d)", len, async);
|
||||||
|
|
||||||
//if (len > MAX_PKT_LENGTH) {return -1;}
|
//if (len > MAX_PKT_LENGTH) {return -1;}
|
||||||
if (isTransmitting()) {return 0;}
|
if (isTransmitting()) {return 0;}
|
||||||
@@ -352,18 +355,14 @@ public:
|
|||||||
// put in standby mode
|
// put in standby mode
|
||||||
idle();
|
idle();
|
||||||
|
|
||||||
//if (implicitHeader) {
|
|
||||||
// implicitHeaderMode();
|
|
||||||
//} else {
|
|
||||||
explicitHeaderMode();
|
explicitHeaderMode();
|
||||||
//}
|
|
||||||
|
|
||||||
// reset FIFO address and payload length
|
// reset FIFO address and payload length
|
||||||
writeRegister(REG_FIFO_ADDR_PTR, 0);
|
writeRegister(REG_FIFO_ADDR_PTR, 0);
|
||||||
writeRegister(REG_PAYLOAD_LENGTH, 0);
|
writeRegister(REG_PAYLOAD_LENGTH, 0);
|
||||||
|
|
||||||
// write data into FIFO
|
// write data into FIFO
|
||||||
debugMod(NAME, "writing FIFO");
|
//debugMod(NAME, "writing FIFO");
|
||||||
for (uint16_t i = 0; i < len; ++i) {writeRegister(REG_FIFO, data[i]);}
|
for (uint16_t i = 0; i < len; ++i) {writeRegister(REG_FIFO, data[i]);}
|
||||||
writeRegister(REG_PAYLOAD_LENGTH, len);
|
writeRegister(REG_PAYLOAD_LENGTH, len);
|
||||||
|
|
||||||
@@ -371,38 +370,43 @@ public:
|
|||||||
//if ((async) && (_onTxDone)) writeRegister(REG_DIO_MAPPING_1, 0x40); // DIO0 => TXDONE
|
//if ((async) && (_onTxDone)) writeRegister(REG_DIO_MAPPING_1, 0x40); // DIO0 => TXDONE
|
||||||
|
|
||||||
// put in TX mode
|
// put in TX mode
|
||||||
debugMod(NAME, "starting TX");
|
//debugMod(NAME, "starting TX");
|
||||||
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX);
|
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX);
|
||||||
|
|
||||||
if (!async) {
|
if (!async) {
|
||||||
debugMod(NAME, "waiting");
|
//debugMod(NAME, "waiting");
|
||||||
while ((readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) == 0) {yield();} // wait for TX done
|
while ((readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) == 0) {yield();} // wait for TX done
|
||||||
writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK); // clear IRQ TX-done flag
|
writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK); // clear IRQ TX-done flag
|
||||||
debugMod(NAME, "done");
|
debugMod(NAME, "tx done");
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** switch to RX-mode. either for a single frame or permanent */
|
/** blocking wait for TX to finish */
|
||||||
void setRX(bool single) {
|
void waitTxComplete() {
|
||||||
|
|
||||||
// reset FIFO address
|
|
||||||
writeRegister(REG_FIFO_ADDR_PTR, 0);
|
|
||||||
|
|
||||||
// put in single RX mode
|
|
||||||
if (single) {
|
|
||||||
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_SINGLE);
|
|
||||||
} else {
|
|
||||||
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** switch to RX mode, but only for a single packet */
|
||||||
|
void rxSingle() {
|
||||||
|
enableRX(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** switch to RX mode, continuously */
|
||||||
|
void rxContinuous() {
|
||||||
|
enableRX(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** fetch one received packet, if any is available. requires setRX(..) beforehand to actually receive something! */
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch one received packet, if any is available.
|
||||||
|
* requires rxSingle()/rxContinuous() beforehand to actually receive something!!!
|
||||||
|
*/
|
||||||
int read(uint8_t* dst, PacketDetails* det) {
|
int read(uint8_t* dst, PacketDetails* det) {
|
||||||
|
|
||||||
uint8_t irqFlags = readRegister(REG_IRQ_FLAGS);
|
uint8_t irqFlags = readRegister(REG_IRQ_FLAGS);
|
||||||
@@ -428,8 +432,8 @@ public:
|
|||||||
|
|
||||||
// read the details?
|
// read the details?
|
||||||
if (det) {
|
if (det) {
|
||||||
det->rssi = (readRegister(REG_PKT_RSSI_VALUE) - (curFreq < 868E6 ? 164 : 157));
|
det->rssi = (readRegister(REG_PKT_RSSI_VALUE) - (curFreq < 868E6 ? 164 : 157)); // can be smaller than -128 !! -> overflow -> use getter method
|
||||||
det->snr = ((int8_t)readRegister(REG_PKT_SNR_VALUE)) * 0.25f;
|
det->snr4 = ((int8_t)readRegister(REG_PKT_SNR_VALUE)); // SNR*4 (must be scaled by 0.25) -> use getter method
|
||||||
}
|
}
|
||||||
|
|
||||||
// put in standby mode
|
// put in standby mode
|
||||||
@@ -455,19 +459,40 @@ private:
|
|||||||
usleep(5000);
|
usleep(5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* configure explicit header mode.
|
||||||
|
* TX: the SX1276 appends an automatically created header in front of every packet
|
||||||
|
* RX: the SX1276 expects and automatically reads the header in front of every received packet
|
||||||
|
* Note: the header contains the packet's length, and the FEC (codingRate) for the content
|
||||||
|
* the header itself always has a coding rate of 8/4(?)
|
||||||
|
*/
|
||||||
void explicitHeaderMode() {
|
void explicitHeaderMode() {
|
||||||
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
|
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
|
||||||
}
|
}
|
||||||
|
|
||||||
void implicitHeaderMode() {
|
// void implicitHeaderMode() {
|
||||||
writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) | 0x01);
|
// writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) | 0x01);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** switch to RX-mode. either for a single frame or permanent */
|
||||||
|
void enableRX(bool single) {
|
||||||
|
|
||||||
|
debugMod1(NAME, "rx(single: %d)", single);
|
||||||
|
|
||||||
|
// reset FIFO address
|
||||||
|
writeRegister(REG_FIFO_ADDR_PTR, 0);
|
||||||
|
|
||||||
|
// put in single RX mode
|
||||||
|
if (single) {
|
||||||
|
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_SINGLE);
|
||||||
|
} else {
|
||||||
|
writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// uint8_t getMode() {
|
|
||||||
// const uint8_t mode = readRegister(REG_OP_MODE);
|
|
||||||
// debugMod1(NAME, "mode: %d", mode);
|
|
||||||
// return mode;
|
|
||||||
// }
|
|
||||||
|
|
||||||
/** set the RF frequency to use (in Hz) */
|
/** set the RF frequency to use (in Hz) */
|
||||||
void setFrequency(uint32_t hz) {
|
void setFrequency(uint32_t hz) {
|
||||||
|
|||||||
Reference in New Issue
Block a user