mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-08 22:22:05 +00:00
track radio signal levels, use wider bandwidth for incompatible radios
This commit is contained in:
parent
fb043bf86a
commit
112505d8e0
@ -12,7 +12,6 @@
|
|||||||
// Change to 434.0 or other frequency, must match RX's freq! FIXME, choose a better default value
|
// Change to 434.0 or other frequency, must match RX's freq! FIXME, choose a better default value
|
||||||
#define RF95_FREQ_US 902.0f
|
#define RF95_FREQ_US 902.0f
|
||||||
|
|
||||||
|
|
||||||
MeshRadio::MeshRadio(MemoryPool<MeshPacket> &_pool, PointerQueue<MeshPacket> &_rxDest)
|
MeshRadio::MeshRadio(MemoryPool<MeshPacket> &_pool, PointerQueue<MeshPacket> &_rxDest)
|
||||||
: rf95(NSS_GPIO, DIO0_GPIO),
|
: rf95(NSS_GPIO, DIO0_GPIO),
|
||||||
manager(rf95),
|
manager(rf95),
|
||||||
@ -20,7 +19,10 @@ MeshRadio::MeshRadio(MemoryPool<MeshPacket> &_pool, PointerQueue<MeshPacket> &_r
|
|||||||
rxDest(_rxDest),
|
rxDest(_rxDest),
|
||||||
txQueue(MAX_TX_QUEUE)
|
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.tx_power = 23;
|
||||||
radioConfig.center_freq = RF95_FREQ_US; // FIXME, pull this config from flash
|
radioConfig.center_freq = RF95_FREQ_US; // FIXME, pull this config from flash
|
||||||
}
|
}
|
||||||
@ -55,11 +57,8 @@ bool MeshRadio::init()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MeshRadio::reloadConfig()
|
void MeshRadio::reloadConfig()
|
||||||
{
|
{
|
||||||
DEBUG_MSG("configuring radio\n");
|
|
||||||
|
|
||||||
rf95.setModeIdle();
|
rf95.setModeIdle();
|
||||||
|
|
||||||
// Set up default configuration
|
// Set up default configuration
|
||||||
@ -74,7 +73,6 @@ void MeshRadio::reloadConfig()
|
|||||||
DEBUG_MSG("setFrequency failed\n");
|
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
|
// 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.
|
// FIXME - can we do this? It seems to be in the Heltec board.
|
||||||
rf95.setTxPower(radioConfig.tx_power, false);
|
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)
|
ErrorCode MeshRadio::send(MeshPacket *p)
|
||||||
@ -150,7 +148,9 @@ static int16_t packetnum = 0; // packet counter, we increment per xmission
|
|||||||
if (manager.recvfrom(radiobuf, &rxlen, &srcaddr, &destaddr, &id, &flags))
|
if (manager.recvfrom(radiobuf, &rxlen, &srcaddr, &destaddr, &id, &flags))
|
||||||
{
|
{
|
||||||
// We received a packet
|
// 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();
|
MeshPacket *mp = pool.allocZeroed();
|
||||||
|
|
||||||
@ -158,6 +158,17 @@ static int16_t packetnum = 0; // packet counter, we increment per xmission
|
|||||||
|
|
||||||
mp->from = srcaddr;
|
mp->from = srcaddr;
|
||||||
mp->to = destaddr;
|
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))
|
if (!pb_decode_from_bytes(radiobuf, rxlen, SubPacket_fields, p))
|
||||||
{
|
{
|
||||||
pool.release(mp);
|
pool.release(mp);
|
||||||
|
@ -62,10 +62,11 @@ public:
|
|||||||
/// pick a provisional nodenum we hope no one is using
|
/// pick a provisional nodenum we hope no one is using
|
||||||
void pickNewNodeNum();
|
void pickNewNodeNum();
|
||||||
|
|
||||||
private:
|
|
||||||
/// Find a node in our DB, return null for missing
|
/// Find a node in our DB, return null for missing
|
||||||
NodeInfo *getNode(NodeNum n);
|
NodeInfo *getNode(NodeNum n);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
/// Find a node in our DB, create an empty NodeInfo if missing
|
/// Find a node in our DB, create an empty NodeInfo if missing
|
||||||
NodeInfo *getOrCreateNode(NodeNum n);
|
NodeInfo *getOrCreateNode(NodeNum n);
|
||||||
|
|
||||||
|
@ -38,11 +38,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
// Select which T-Beam board is being used. Only uncomment one. Note: these options now come from platformio standard build file flags
|
// 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
|
//#ifdef ARDUINO_T_Beam
|
||||||
#define T_BEAM_V10 // AKA Rev1 (second board released)
|
//#define T_BEAM_V10 // AKA Rev1 (second board released)
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
//#ifdef ARDUINO_HELTEC_WIFI_LORA_32_V2
|
//#ifdef ARDUINO_HELTEC_WIFI_LORA_32_V2
|
||||||
//#define HELTEC_LORA32
|
#define HELTEC_LORA32
|
||||||
//#endif
|
//#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)
|
// 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)
|
||||||
|
@ -29,8 +29,8 @@ typedef enum _RadioConfig_ModemConfig {
|
|||||||
|
|
||||||
typedef enum _DeviceState_Version {
|
typedef enum _DeviceState_Version {
|
||||||
DeviceState_Version_Unset = 0,
|
DeviceState_Version_Unset = 0,
|
||||||
DeviceState_Version_Minimum = 2,
|
DeviceState_Version_Minimum = 4,
|
||||||
DeviceState_Version_Current = 2
|
DeviceState_Version_Current = 4
|
||||||
} DeviceState_Version;
|
} DeviceState_Version;
|
||||||
|
|
||||||
/* Struct definitions */
|
/* Struct definitions */
|
||||||
@ -78,7 +78,8 @@ typedef struct _NodeInfo {
|
|||||||
bool has_position;
|
bool has_position;
|
||||||
Position position;
|
Position position;
|
||||||
uint64_t last_seen;
|
uint64_t last_seen;
|
||||||
int32_t rx_power;
|
int32_t snr;
|
||||||
|
int32_t frequency_error;
|
||||||
} NodeInfo;
|
} NodeInfo;
|
||||||
|
|
||||||
typedef struct _SubPacket {
|
typedef struct _SubPacket {
|
||||||
@ -149,7 +150,7 @@ typedef struct _ToRadio {
|
|||||||
#define SubPacket_init_default {0, {Position_init_default}}
|
#define SubPacket_init_default {0, {Position_init_default}}
|
||||||
#define MeshPacket_init_default {0, 0, false, SubPacket_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 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 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 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}}
|
#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 SubPacket_init_zero {0, {Position_init_zero}}
|
||||||
#define MeshPacket_init_zero {0, 0, false, SubPacket_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 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 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 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}}
|
#define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}}
|
||||||
@ -191,7 +192,8 @@ typedef struct _ToRadio {
|
|||||||
#define NodeInfo_user_tag 2
|
#define NodeInfo_user_tag 2
|
||||||
#define NodeInfo_position_tag 3
|
#define NodeInfo_position_tag 3
|
||||||
#define NodeInfo_last_seen_tag 4
|
#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_position_tag 1
|
||||||
#define SubPacket_time_tag 2
|
#define SubPacket_time_tag 2
|
||||||
#define SubPacket_data_tag 3
|
#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, user, 2) \
|
||||||
X(a, STATIC, OPTIONAL, MESSAGE, position, 3) \
|
X(a, STATIC, OPTIONAL, MESSAGE, position, 3) \
|
||||||
X(a, STATIC, SINGULAR, UINT64, last_seen, 4) \
|
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_CALLBACK NULL
|
||||||
#define NodeInfo_DEFAULT NULL
|
#define NodeInfo_DEFAULT NULL
|
||||||
#define NodeInfo_user_MSGTYPE User
|
#define NodeInfo_user_MSGTYPE User
|
||||||
@ -340,9 +343,9 @@ extern const pb_msgdesc_t ToRadio_msg;
|
|||||||
#define SubPacket_size 208
|
#define SubPacket_size 208
|
||||||
#define MeshPacket_size 233
|
#define MeshPacket_size 233
|
||||||
#define RadioConfig_size 70
|
#define RadioConfig_size 70
|
||||||
#define NodeInfo_size 151
|
#define NodeInfo_size 162
|
||||||
#define MyNodeInfo_size 11
|
#define MyNodeInfo_size 11
|
||||||
#define DeviceState_size 12641
|
#define DeviceState_size 12993
|
||||||
#define FromRadio_size 242
|
#define FromRadio_size 242
|
||||||
#define ToRadio_size 236
|
#define ToRadio_size 236
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user