Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 23 additions & 9 deletions src/cubesat_radio/src/sx1262_radio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ bool wait_for_irq(Sx126xLinuxHalContext &hal, sx126x_irq_mask_t wanted, uint32_t
seen = 0;

while (Clock::now() < deadline) {
if (sx126x_get_and_clear_irq_status(&hal, &seen) != SX126X_STATUS_OK) {
if (sx126x_get_irq_status(&hal, &seen) != SX126X_STATUS_OK) {
return false;
}
if ((seen & wanted) != 0) {
Expand All @@ -89,7 +89,12 @@ bool wait_for_irq(Sx126xLinuxHalContext &hal, sx126x_irq_mask_t wanted, uint32_t
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}

return true;
return false;
}

bool set_continuous_rx(Sx126xLinuxHalContext &hal) {
return set_rf_switch_rx(hal) &&
sx126x_set_rx_with_timeout_in_rtc_step(&hal, SX126X_RX_CONTINUOUS) == SX126X_STATUS_OK;
}

} // namespace
Expand Down Expand Up @@ -232,10 +237,11 @@ bool Sx1262Radio::send(const std::vector<uint8_t> &data) {

sx126x_irq_mask_t irq = 0;
const bool got_irq = wait_for_irq(impl->hal, SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT, kTxTimeoutMs + 100, irq);

sx126x_clear_irq_status(&impl->hal, SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT);
const bool success = got_irq && ((irq & SX126X_IRQ_TX_DONE) != 0);

set_rf_switch_rx(impl->hal);
sx126x_set_rx_with_timeout_in_rtc_step(&impl->hal, SX126X_RX_CONTINUOUS);
set_continuous_rx(impl->hal);
return success;
}

Expand All @@ -249,42 +255,44 @@ std::optional<ReceivedPacket> Sx1262Radio::receive() {
if (sx126x_get_and_clear_irq_status(&impl->hal, &irq) != SX126X_STATUS_OK) {
return std::nullopt;
}
if ((irq & SX126X_IRQ_RX_DONE) == 0) {
if ((irq & SX126X_IRQ_RX_DONE) == 0 || (irq & SX126X_IRQ_CRC_ERROR) != 0) {
set_continuous_rx(impl->hal);
return std::nullopt;
}

sx126x_rx_buffer_status_t rx_status{};
sx126x_pkt_status_lora_t pkt_status{};
if (sx126x_get_rx_buffer_status(&impl->hal, &rx_status) != SX126X_STATUS_OK ||
sx126x_get_lora_pkt_status(&impl->hal, &pkt_status) != SX126X_STATUS_OK || rx_status.pld_len_in_bytes == 0) {
set_continuous_rx(impl->hal);
return std::nullopt;
}

ReceivedPacket packet;
packet.data.resize(rx_status.pld_len_in_bytes);
if (sx126x_read_buffer(&impl->hal, rx_status.buffer_start_pointer, packet.data.data(),
rx_status.pld_len_in_bytes) != SX126X_STATUS_OK) {
set_continuous_rx(impl->hal);
return std::nullopt;
}
packet.rssi_dbm = pkt_status.rssi_pkt_in_dbm;
packet.snr_db = pkt_status.snr_pkt_in_db;

sx126x_clear_irq_status(&impl->hal, SX126X_IRQ_ALL);
sx126x_set_rx_with_timeout_in_rtc_step(&impl->hal, SX126X_RX_CONTINUOUS);
set_continuous_rx(impl->hal);
return packet;
}

bool Sx1262Radio::setReceiveMode() {
std::lock_guard<std::mutex> lock(impl->mutex);
auto logger = rclcpp::get_logger("sx1262");
if (!impl->is_configured || !set_rf_switch_rx(impl->hal)) {
if (!impl->is_configured) {
RCLCPP_WARN(logger, "setReceiveMode failed isConfigured: %d", (int)impl->is_configured);
return false;
}
RCLCPP_INFO(logger, "Setting Receive mode");

// don't use normal set_rx with RX_CONTINUOUS since its argument is a ms value and will fail with the continuous flag
return sx126x_set_rx_with_timeout_in_rtc_step(&impl->hal, SX126X_RX_CONTINUOUS) == SX126X_STATUS_OK;
return set_continuous_rx(impl->hal);
}

bool Sx1262Radio::setSleepMode() {
Expand All @@ -306,6 +314,12 @@ bool Sx1262Radio::waitForInterrupt(std::chrono::milliseconds timeout) {
if (!impl->is_configured) {
return false;
}

sx126x_irq_mask_t irq = 0;
if (sx126x_get_irq_status(&impl->hal, &irq) == SX126X_STATUS_OK &&
(irq & (SX126X_IRQ_RX_DONE | SX126X_IRQ_CRC_ERROR | SX126X_IRQ_TIMEOUT)) != 0) {
return true;
}
}

return wait_for_dio1_rising(impl->hal, static_cast<int>(timeout.count()));
Expand Down