Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: LoRaWAN-SanJose_Bootcamp LoRaWAN-grove-cayenne LoRaWAN-classC-demo LoRaWAN-grove-cayenne ... more
Diff: radio/radio.cpp
- Revision:
- 7:4b6f960dcca2
- Parent:
- 4:e4bfe9183f94
--- a/radio/radio.cpp Fri Apr 06 23:41:55 2018 +0000 +++ b/radio/radio.cpp Fri May 04 11:00:06 2018 -0700 @@ -236,10 +236,11 @@ lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS); MAC_PRINTF("\e[7mdio1:%02x\e[0m\r\n", lora.RegIrqFlags.octet); - if (!lora.RegIrqFlags.bits.RxTimeout) { - MAC_PRINTF("dio1-not-rxtimeout\r\n"); - } else if (RadioEvents->RxTimeout) + + if (RadioEvents->RxTimeout) RadioEvents->RxTimeout(); + + radio.write_reg(REG_LR_IRQFLAGS, 0x80); // ensure RxTimeout is cleared } void Radio::dio1isr() @@ -259,36 +260,59 @@ lpt.start(); } -void Radio::Send(uint8_t size) +int Radio::Send(uint8_t size, timestamp_t maxListenTime, timestamp_t channelFreeTime, int rssiThresh) { if (radio.RegOpMode.bits.Mode == RF_OPMODE_SLEEP) { radio.set_opmode(RF_OPMODE_STANDBY); wait_us(1000); } - //MAC_PRINTF("Radio::Send() dio:%u:%u opmode:%02x ", radio.dio0.read(), radio.dio1.read(), radio.read_reg(REG_OPMODE)); + radio.write_reg(REG_LR_IRQFLAGS, 0x08); // ensure TxDone is cleared + MAC_PRINTF("Radio::Send() dio:%u:%u opmode:%02x ", radio.dio0.read(), radio.dio1.read(), radio.read_reg(REG_OPMODE)); lora.RegPayloadLength = size; radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); + + if (maxListenTime > 0) { + int rssi; + us_timestamp_t startAt, chFreeAt, now; + lora.start_rx(RF_OPMODE_RECEIVER); + startAt = lpt.read_us(); +Lstart: + do { + now = lpt.read_us(); + if ((now - startAt) > maxListenTime) { + return -1; + } + rssi = lora.get_current_rssi(); + } while (rssi > rssiThresh); + chFreeAt = lpt.read_us(); + do { + now = lpt.read_us(); + rssi = lora.get_current_rssi(); + if (rssi > rssiThresh) { + goto Lstart; + } + } while ((now - chFreeAt) < channelFreeTime); + } + lora.start_tx(size); pinEvent.txing = 1; + + return 0; } -/*volatile RadioState_t state; - -RadioState_t Radio::GetStatus() -{ - return state; -}*/ - void Radio::Rx(unsigned timeout) { - if (timeout == 0) + if (timeout == 0) { lora.start_rx(RF_OPMODE_RECEIVER); - else + MAC_PRINTF("startRxC "); + } else { + lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS); // yyy tmp remove lora.start_rx(RF_OPMODE_RECEIVER_SINGLE); + MAC_PRINTF("startRxS:%02x ", lora.RegIrqFlags.octet); + } pinEvent.txing = 0; - MAC_PRINTF("start_rx "); } @@ -313,9 +337,23 @@ void Radio::PrintStatus() { - MAC_PRINTF("dio:%u:%u opmode:%02x ", radio.dio0.read(), radio.dio1.read(), radio.read_reg(REG_OPMODE)); +#ifdef MAC_DEBUG + radio.RegOpMode.octet = radio.read_reg(REG_OPMODE); + switch (radio.RegOpMode.bits.Mode) { + case RF_OPMODE_SLEEP: MAC_PRINTF("SLEEP "); break; + case RF_OPMODE_STANDBY: MAC_PRINTF("STBY "); break; + case RF_OPMODE_SYNTHESIZER_TX: MAC_PRINTF("FSTX "); break; + case RF_OPMODE_TRANSMITTER: MAC_PRINTF("TX "); break; + case RF_OPMODE_SYNTHESIZER_RX: MAC_PRINTF("FSRX "); break; + case RF_OPMODE_RECEIVER: MAC_PRINTF("RXC "); break; + case RF_OPMODE_RECEIVER_SINGLE: MAC_PRINTF("RXS "); break; + case RF_OPMODE_CAD: MAC_PRINTF("CAD "); break; + } + + MAC_PRINTF("dio:%u:%u opmode:%02x %.2fMHz sf%ubw%u ", radio.dio0.read(), radio.dio1.read(), radio.RegOpMode.octet, radio.get_frf_MHz(), lora.getSf(), lora.getBw()); lora.RegIrqFlags.octet = radio.read_reg(REG_LR_IRQFLAGS); MAC_PRINTF("irqFlags:%02x\r\n", lora.RegIrqFlags.octet); +#endif /* MAC_DEBUG */ } #ifdef DUTY_ENABLE