From f31781cf751d2fb075b36f39aa319e8d0a73adf7 Mon Sep 17 00:00:00 2001 From: FUJIURA Toyonori Date: Mon, 28 Mar 2022 10:15:37 +0900 Subject: [PATCH] Collision avoidance. --- lib/LoRa/LoRa.cpp | 5 +++++ lib/LoRa/LoRa.h | 1 + src/TaskModem.cpp | 17 +++++++++++------ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/LoRa/LoRa.cpp b/lib/LoRa/LoRa.cpp index 35dfacd..2422ca8 100644 --- a/lib/LoRa/LoRa.cpp +++ b/lib/LoRa/LoRa.cpp @@ -18,6 +18,7 @@ #define REG_FIFO_RX_CURRENT_ADDR 0x10 #define REG_IRQ_FLAGS 0x12 #define REG_RX_NB_BYTES 0x13 +#define REG_MODEM_STAT 0x18 #define REG_PKT_SNR_VALUE 0x19 #define REG_PKT_RSSI_VALUE 0x1a #define REG_RSSI_VALUE 0x1b @@ -251,6 +252,10 @@ float LoRaClass::packetSnr() { return ((int8_t)readRegister(REG_PKT_SNR_VALUE)) * 0.25; } +bool LoRaClass::rxSignalDetected() { + return (readRegister(REG_MODEM_STAT) & 0x01) == 0x01; +} + long LoRaClass::packetFrequencyError() { int32_t freqError = 0; freqError = static_cast(readRegister(REG_FREQ_ERROR_MSB) & B111); diff --git a/lib/LoRa/LoRa.h b/lib/LoRa/LoRa.h index 51e089a..45c92bd 100644 --- a/lib/LoRa/LoRa.h +++ b/lib/LoRa/LoRa.h @@ -44,6 +44,7 @@ public: int packetRssi(); float packetSnr(); long packetFrequencyError(); + bool rxSignalDetected(); int rssi(); diff --git a/src/TaskModem.cpp b/src/TaskModem.cpp index ca0784d..017b2b2 100644 --- a/src/TaskModem.cpp +++ b/src/TaskModem.cpp @@ -45,13 +45,18 @@ bool ModemTask::loop(System &system) { } if (!_toModem.empty()) { - std::shared_ptr msg = _toModem.getElement(); - if (system.getUserConfig()->lora.tx_enable) { - system.getLogger().log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, getName(), "[%s] Transmitting packet '%s'", timeString().c_str(), msg->toString().c_str()); - _lora_aprs.sendMessage(msg); - system.getLogger().log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, getName(), "[%s] TX done", timeString().c_str()); + if (_lora_aprs.rxSignalDetected()) { + system.getLogger().log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, getName(), "[%s] RX signal detected. Waiting TX", timeString().c_str()); + delay(1000); } else { - system.getLogger().log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, getName(), "[%s] NOT transmitting packet as TX is not enabled '%s'", timeString().c_str(), msg->toString().c_str()); + std::shared_ptr msg = _toModem.getElement(); + if (system.getUserConfig()->lora.tx_enable) { + system.getLogger().log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, getName(), "[%s] Transmitting packet '%s'", timeString().c_str(), msg->toString().c_str()); + _lora_aprs.sendMessage(msg); + system.getLogger().log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, getName(), "[%s] TX done", timeString().c_str()); + } else { + system.getLogger().log(logging::LoggerLevel::LOGGER_LEVEL_DEBUG, getName(), "[%s] NOT transmitting packet as TX is not enabled '%s'", timeString().c_str(), msg->toString().c_str()); + } } }