From 112505d8e06b3848e5d7ba6975b28befac0d8ff2 Mon Sep 17 00:00:00 2001 From: geeksville Date: Sat, 8 Feb 2020 19:45:21 -0800 Subject: [PATCH] track radio signal levels, use wider bandwidth for incompatible radios --- src/MeshRadio.cpp | 35 +++++++++++++++++++++++------------ src/NodeDB.h | 3 ++- src/configuration.h | 4 ++-- src/mesh.pb.h | 21 ++++++++++++--------- 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/MeshRadio.cpp b/src/MeshRadio.cpp index 792fdd618..d1ff3955c 100644 --- a/src/MeshRadio.cpp +++ b/src/MeshRadio.cpp @@ -12,7 +12,6 @@ // Change to 434.0 or other frequency, must match RX's freq! FIXME, choose a better default value #define RF95_FREQ_US 902.0f - MeshRadio::MeshRadio(MemoryPool &_pool, PointerQueue &_rxDest) : rf95(NSS_GPIO, DIO0_GPIO), manager(rf95), @@ -20,7 +19,10 @@ MeshRadio::MeshRadio(MemoryPool &_pool, PointerQueue &_r rxDest(_rxDest), txQueue(MAX_TX_QUEUE) { - radioConfig.modem_config = RadioConfig_ModemConfig_Bw125Cr45Sf128; + //radioConfig.modem_config = RadioConfig_ModemConfig_Bw125Cr45Sf128; // medium range and fast + radioConfig.modem_config = RadioConfig_ModemConfig_Bw500Cr45Sf128; // short range and fast, but wide bandwidth so incompatible radios can talk together + //radioConfig.modem_config = RadioConfig_ModemConfig_Bw125Cr48Sf4096; // slow and long range + radioConfig.tx_power = 23; radioConfig.center_freq = RF95_FREQ_US; // FIXME, pull this config from flash } @@ -55,26 +57,22 @@ bool MeshRadio::init() return true; } - void MeshRadio::reloadConfig() { - DEBUG_MSG("configuring radio\n"); - rf95.setModeIdle(); // Set up default configuration // No Sync Words in LORA mode. - rf95.setModemConfig((RH_RF95::ModemConfigChoice) radioConfig.modem_config); // Radio default - // setModemConfig(Bw125Cr48Sf4096); // slow and reliable? + rf95.setModemConfig((RH_RF95::ModemConfigChoice)radioConfig.modem_config); // Radio default + // setModemConfig(Bw125Cr48Sf4096); // slow and reliable? // rf95.setPreambleLength(8); // Default is 8 // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM if (!rf95.setFrequency(radioConfig.center_freq)) { DEBUG_MSG("setFrequency failed\n"); - assert(0); // fixme panic + assert(0); // fixme panic } - DEBUG_MSG("Set Freq to: %f\n", radioConfig.center_freq); // Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on @@ -84,7 +82,7 @@ void MeshRadio::reloadConfig() // FIXME - can we do this? It seems to be in the Heltec board. rf95.setTxPower(radioConfig.tx_power, false); - DEBUG_MSG("LoRa radio init OK!\n"); + DEBUG_MSG("Set radio: config=%u, freq=%f, txpower=%d\n", radioConfig.modem_config, radioConfig.center_freq, radioConfig.tx_power); } ErrorCode MeshRadio::send(MeshPacket *p) @@ -108,7 +106,7 @@ ErrorCode MeshRadio::sendTo(NodeNum dest, const uint8_t *buf, size_t len) // FIXME, we have to wait for sending to complete before freeing the buffer, otherwise it might get wiped // instead just have the radiohead layer understand queues. - if(res == ERRNO_OK) + if (res == ERRNO_OK) manager.waitPacketSent(); DEBUG_MSG("mesh sendTo %d bytes to 0x%x (%lu msecs)\n", len, dest, millis() - start); @@ -150,7 +148,9 @@ static int16_t packetnum = 0; // packet counter, we increment per xmission if (manager.recvfrom(radiobuf, &rxlen, &srcaddr, &destaddr, &id, &flags)) { // We received a packet - DEBUG_MSG("Received packet from mesh src=0x%x,dest=0x%x,id=%d,len=%d rxGood=%d,rxBad=%d\n", srcaddr, destaddr, id, rxlen, rf95.rxGood(), rf95.rxBad()); + int32_t freqerr = rf95.frequencyError(), snr = rf95.lastSNR(); + DEBUG_MSG("Received packet from mesh src=0x%x,dest=0x%x,id=%d,len=%d rxGood=%d,rxBad=%d,freqErr=%d,snr=%d\n", + srcaddr, destaddr, id, rxlen, rf95.rxGood(), rf95.rxBad(), freqerr, snr); MeshPacket *mp = pool.allocZeroed(); @@ -158,6 +158,17 @@ static int16_t packetnum = 0; // packet counter, we increment per xmission mp->from = srcaddr; mp->to = destaddr; + + // If we already have an entry in the DB for this nodenum, goahead and hide the snr/freqerr info there. + // Note: we can't create it at this point, because it might be a bogus User node allocation. But odds are we will + // already have a record we can hide this debugging info in. + NodeInfo *info = nodeDB.getNode(mp->from); + if (info) + { + info->snr = snr; + info->frequency_error = freqerr; + } + if (!pb_decode_from_bytes(radiobuf, rxlen, SubPacket_fields, p)) { pool.release(mp); diff --git a/src/NodeDB.h b/src/NodeDB.h index 93984078a..9d65d21dc 100644 --- a/src/NodeDB.h +++ b/src/NodeDB.h @@ -62,10 +62,11 @@ public: /// pick a provisional nodenum we hope no one is using void pickNewNodeNum(); -private: /// Find a node in our DB, return null for missing NodeInfo *getNode(NodeNum n); +private: + /// Find a node in our DB, create an empty NodeInfo if missing NodeInfo *getOrCreateNode(NodeNum n); diff --git a/src/configuration.h b/src/configuration.h index c85eb9f62..255a406bf 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -38,11 +38,11 @@ along with this program. If not, see . // Select which T-Beam board is being used. Only uncomment one. Note: these options now come from platformio standard build file flags //#ifdef ARDUINO_T_Beam -#define T_BEAM_V10 // AKA Rev1 (second board released) +//#define T_BEAM_V10 // AKA Rev1 (second board released) //#endif //#ifdef ARDUINO_HELTEC_WIFI_LORA_32_V2 -//#define HELTEC_LORA32 +#define HELTEC_LORA32 //#endif // If we are using the JTAG port for debugging, some pins must be left free for that (and things like GPS have to be disabled) diff --git a/src/mesh.pb.h b/src/mesh.pb.h index 8b6ee51dd..030584b27 100644 --- a/src/mesh.pb.h +++ b/src/mesh.pb.h @@ -29,8 +29,8 @@ typedef enum _RadioConfig_ModemConfig { typedef enum _DeviceState_Version { DeviceState_Version_Unset = 0, - DeviceState_Version_Minimum = 2, - DeviceState_Version_Current = 2 + DeviceState_Version_Minimum = 4, + DeviceState_Version_Current = 4 } DeviceState_Version; /* Struct definitions */ @@ -78,7 +78,8 @@ typedef struct _NodeInfo { bool has_position; Position position; uint64_t last_seen; - int32_t rx_power; + int32_t snr; + int32_t frequency_error; } NodeInfo; typedef struct _SubPacket { @@ -149,7 +150,7 @@ typedef struct _ToRadio { #define SubPacket_init_default {0, {Position_init_default}} #define MeshPacket_init_default {0, 0, false, SubPacket_init_default} #define RadioConfig_init_default {0, 0, 0, 0, _RadioConfig_ModemConfig_MIN, {0, {0}}, 0, 0} -#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0} +#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0, 0} #define MyNodeInfo_init_default {0} #define DeviceState_init_default {false, RadioConfig_init_default, false, MyNodeInfo_init_default, false, User_init_default, 0, {NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default, NodeInfo_init_default}, 0, {MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default, MeshPacket_init_default}, _DeviceState_Version_MIN} #define FromRadio_init_default {0, 0, {MeshPacket_init_default}} @@ -160,7 +161,7 @@ typedef struct _ToRadio { #define SubPacket_init_zero {0, {Position_init_zero}} #define MeshPacket_init_zero {0, 0, false, SubPacket_init_zero} #define RadioConfig_init_zero {0, 0, 0, 0, _RadioConfig_ModemConfig_MIN, {0, {0}}, 0, 0} -#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0} +#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0, 0} #define MyNodeInfo_init_zero {0} #define DeviceState_init_zero {false, RadioConfig_init_zero, false, MyNodeInfo_init_zero, false, User_init_zero, 0, {NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero, NodeInfo_init_zero}, 0, {MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero, MeshPacket_init_zero}, _DeviceState_Version_MIN} #define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}} @@ -191,7 +192,8 @@ typedef struct _ToRadio { #define NodeInfo_user_tag 2 #define NodeInfo_position_tag 3 #define NodeInfo_last_seen_tag 4 -#define NodeInfo_rx_power_tag 5 +#define NodeInfo_snr_tag 5 +#define NodeInfo_frequency_error_tag 6 #define SubPacket_position_tag 1 #define SubPacket_time_tag 2 #define SubPacket_data_tag 3 @@ -269,7 +271,8 @@ X(a, STATIC, SINGULAR, INT32, num, 1) \ X(a, STATIC, OPTIONAL, MESSAGE, user, 2) \ X(a, STATIC, OPTIONAL, MESSAGE, position, 3) \ X(a, STATIC, SINGULAR, UINT64, last_seen, 4) \ -X(a, STATIC, SINGULAR, INT32, rx_power, 5) +X(a, STATIC, SINGULAR, INT32, snr, 5) \ +X(a, STATIC, SINGULAR, INT32, frequency_error, 6) #define NodeInfo_CALLBACK NULL #define NodeInfo_DEFAULT NULL #define NodeInfo_user_MSGTYPE User @@ -340,9 +343,9 @@ extern const pb_msgdesc_t ToRadio_msg; #define SubPacket_size 208 #define MeshPacket_size 233 #define RadioConfig_size 70 -#define NodeInfo_size 151 +#define NodeInfo_size 162 #define MyNodeInfo_size 11 -#define DeviceState_size 12641 +#define DeviceState_size 12993 #define FromRadio_size 242 #define ToRadio_size 236