116 lines
3.1 KiB
C++
116 lines
3.1 KiB
C++
#include "SX1280.h"
|
|
#if !defined(RADIOLIB_EXCLUDE_SX128X)
|
|
|
|
SX1280::SX1280(Module* mod) : SX1281(mod) {
|
|
|
|
}
|
|
|
|
int16_t SX1280::range(bool master, uint32_t addr) {
|
|
// start ranging
|
|
int16_t state = startRanging(master, addr);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// wait until ranging is finished
|
|
uint32_t start = Module::millis();
|
|
while(!Module::digitalRead(_mod->getIrq())) {
|
|
Module::yield();
|
|
if(Module::millis() - start > 10000) {
|
|
clearIrqStatus();
|
|
standby();
|
|
return(ERR_RANGING_TIMEOUT);
|
|
}
|
|
}
|
|
|
|
// clear interrupt flags
|
|
state = clearIrqStatus();
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set mode to standby
|
|
state = standby();
|
|
|
|
return(state);
|
|
}
|
|
|
|
int16_t SX1280::startRanging(bool master, uint32_t addr) {
|
|
// check active modem
|
|
uint8_t modem = getPacketType();
|
|
if(!((modem == SX128X_PACKET_TYPE_LORA) || (modem == SX128X_PACKET_TYPE_RANGING))) {
|
|
return(ERR_WRONG_MODEM);
|
|
}
|
|
|
|
// ensure modem is set to ranging
|
|
int16_t state = ERR_NONE;
|
|
if(modem == SX128X_PACKET_TYPE_LORA) {
|
|
state = setPacketType(SX128X_PACKET_TYPE_RANGING);
|
|
RADIOLIB_ASSERT(state);
|
|
}
|
|
|
|
// set modulation parameters
|
|
state = setModulationParams(_sf, _bw, _cr);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set packet parameters
|
|
state = setPacketParamsLoRa(_preambleLengthLoRa, _headerType, _payloadLen, _crcLoRa);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// check all address bits
|
|
uint8_t regValue;
|
|
state = readRegister(SX128X_REG_SLAVE_RANGING_ADDRESS_WIDTH, ®Value, 1);
|
|
RADIOLIB_ASSERT(state);
|
|
regValue &= 0b00111111;
|
|
regValue |= 0b11000000;
|
|
state = writeRegister(SX128X_REG_SLAVE_RANGING_ADDRESS_WIDTH, ®Value, 1);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set remaining parameter values
|
|
uint32_t addrReg = SX128X_REG_SLAVE_RANGING_ADDRESS_BYTE_3;
|
|
uint32_t irqMask = SX128X_IRQ_RANGING_SLAVE_RESP_DONE | SX128X_IRQ_RANGING_SLAVE_REQ_DISCARD;
|
|
uint32_t irqDio1 = SX128X_IRQ_RANGING_SLAVE_RESP_DONE;
|
|
if(master) {
|
|
addrReg = SX128X_REG_MASTER_RANGING_ADDRESS_BYTE_3;
|
|
irqMask = SX128X_IRQ_RANGING_MASTER_RES_VALID | SX128X_IRQ_RANGING_MASTER_TIMEOUT;
|
|
irqDio1 = SX128X_IRQ_RANGING_MASTER_RES_VALID;
|
|
}
|
|
|
|
// set ranging address
|
|
uint8_t addrBuff[] = { (uint8_t)((addr >> 24) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)(addr & 0xFF) };
|
|
state = writeRegister(addrReg, addrBuff, 4);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set DIO mapping
|
|
state = setDioIrqParams(irqMask, irqDio1);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set role and start ranging
|
|
if(master) {
|
|
state = setRangingRole(SX128X_RANGING_ROLE_MASTER);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setTx(SX128X_TX_TIMEOUT_NONE);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
} else {
|
|
state = setRangingRole(SX128X_RANGING_ROLE_SLAVE);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setRx(SX128X_RX_TIMEOUT_INF);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
}
|
|
|
|
return(state);
|
|
}
|
|
|
|
float SX1280::getRangingResult() {
|
|
// read the register values
|
|
uint8_t data[4];
|
|
int16_t state = readRegister(SX128X_REG_RANGING_RESULT_MSB, data + 1, 3);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// calculate the real result
|
|
uint32_t raw = 0;
|
|
memcpy(&raw, data, sizeof(uint32_t));
|
|
return((float)raw * (150.0/(4.096 * _bwKhz)));
|
|
}
|
|
|
|
#endif
|