From a34cfb0ee0b3df6ba4b62261eb0bb7cbae7054f9 Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 3 Jun 2020 13:15:45 -0700 Subject: [PATCH 1/7] Populate metainfo for apps to allow 32 bit node and packet ids --- proto | 2 +- src/mesh/NodeDB.cpp | 6 ++++++ src/mesh/PacketHistory.cpp | 3 +-- src/mesh/PacketHistory.h | 3 +++ src/mesh/Router.cpp | 10 ++++++---- src/mesh/mesh.pb.h | 22 +++++++++++++++++----- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/proto b/proto index adf4127fe..e9c7f9b95 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit adf4127fe3e4140bfd97b48a2d11b53ee34a16c8 +Subproject commit e9c7f9b95d490aea3f0f213d4666d2dbf7e2111c diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index f46d1d8d3..faa035930 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -8,7 +8,9 @@ #include "CryptoEngine.h" #include "GPS.h" #include "NodeDB.h" +#include "PacketHistory.h" #include "PowerFSM.h" +#include "Router.h" #include "configuration.h" #include "error.h" #include "mesh-pb-constants.h" @@ -122,6 +124,10 @@ void NodeDB::init() // default to no GPS, until one has been found by probing myNodeInfo.has_gps = false; + myNodeInfo.node_num_bits = sizeof(NodeNum) * 8; + myNodeInfo.packet_id_bits = sizeof(PacketId) * 8; + myNodeInfo.message_timeout_msec = FLOOD_EXPIRE_TIME; + generatePacketId(); // FIXME - ugly way to init current_packet_id; // Init our blank owner info to reasonable defaults getMacAddr(ourMacAddr); diff --git a/src/mesh/PacketHistory.cpp b/src/mesh/PacketHistory.cpp index 11accf4c5..75005d408 100644 --- a/src/mesh/PacketHistory.cpp +++ b/src/mesh/PacketHistory.cpp @@ -2,8 +2,7 @@ #include "configuration.h" #include "mesh-pb-constants.h" -/// We clear our old flood record five minute after we see the last of it -#define FLOOD_EXPIRE_TIME (5 * 60 * 1000L) + PacketHistory::PacketHistory() { diff --git a/src/mesh/PacketHistory.h b/src/mesh/PacketHistory.h index 38edf7d77..3cc81084f 100644 --- a/src/mesh/PacketHistory.h +++ b/src/mesh/PacketHistory.h @@ -6,6 +6,9 @@ using namespace std; +/// We clear our old flood record five minute after we see the last of it +#define FLOOD_EXPIRE_TIME (5 * 60 * 1000L) + /** * A record of a recent message broadcast */ diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index 5abf73cb5..dc7409a07 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -44,8 +44,6 @@ void Router::loop() } } -#define NUM_PACKET_ID 255 // 0 is consider invalid - /// Generate a unique packet id // FIXME, move this someplace better PacketId generatePacketId() @@ -53,14 +51,18 @@ PacketId generatePacketId() static uint32_t i; // Note: trying to keep this in noinit didn't help for working across reboots static bool didInit = false; + uint32_t numPacketId = 255; // 0 is consider invalid + if (!didInit) { didInit = true; - i = random(0, NUM_PACKET_ID + + i = random(0, numPacketId + 1); // pick a random initial sequence number at boot (to prevent repeated reboots always starting at 0) } i++; - return (i % NUM_PACKET_ID) + 1; // return number between 1 and 255 + PacketId id = (i % numPacketId) + 1; // return number between 1 and 255 (ie - never zero) + myNodeInfo.current_packet_id = id; // Kinda crufty - we keep updating this so the phone can see a current value + return id; } MeshPacket *Router::allocForSending() diff --git a/src/mesh/mesh.pb.h b/src/mesh/mesh.pb.h index fe9cd575c..ae7edb1ff 100644 --- a/src/mesh/mesh.pb.h +++ b/src/mesh/mesh.pb.h @@ -74,6 +74,10 @@ typedef struct _MyNodeInfo { uint32_t error_code; uint32_t error_address; uint32_t error_count; + uint32_t packet_id_bits; + uint32_t current_packet_id; + uint32_t node_num_bits; + uint32_t message_timeout_msec; } MyNodeInfo; typedef struct _Position { @@ -238,7 +242,7 @@ typedef struct _ToRadio { #define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default, false, ChannelSettings_init_default} #define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}} #define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0} -#define MyNodeInfo_init_default {0, 0, 0, "", "", "", 0, 0, 0} +#define MyNodeInfo_init_default {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 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}, false, MeshPacket_init_default, 0} #define DebugString_init_default {""} #define FromRadio_init_default {0, 0, {MeshPacket_init_default}} @@ -254,7 +258,7 @@ typedef struct _ToRadio { #define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero, false, ChannelSettings_init_zero} #define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}} #define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0} -#define MyNodeInfo_init_zero {0, 0, 0, "", "", "", 0, 0, 0} +#define MyNodeInfo_init_zero {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 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}, false, MeshPacket_init_zero, 0} #define DebugString_init_zero {""} #define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}} @@ -282,6 +286,10 @@ typedef struct _ToRadio { #define MyNodeInfo_error_code_tag 7 #define MyNodeInfo_error_address_tag 8 #define MyNodeInfo_error_count_tag 9 +#define MyNodeInfo_packet_id_bits_tag 10 +#define MyNodeInfo_current_packet_id_tag 11 +#define MyNodeInfo_node_num_bits_tag 12 +#define MyNodeInfo_message_timeout_msec_tag 13 #define Position_latitude_i_tag 7 #define Position_longitude_i_tag 8 #define Position_altitude_tag 3 @@ -472,7 +480,11 @@ X(a, STATIC, SINGULAR, STRING, hw_model, 5) \ X(a, STATIC, SINGULAR, STRING, firmware_version, 6) \ X(a, STATIC, SINGULAR, UINT32, error_code, 7) \ X(a, STATIC, SINGULAR, UINT32, error_address, 8) \ -X(a, STATIC, SINGULAR, UINT32, error_count, 9) +X(a, STATIC, SINGULAR, UINT32, error_count, 9) \ +X(a, STATIC, SINGULAR, UINT32, packet_id_bits, 10) \ +X(a, STATIC, SINGULAR, UINT32, current_packet_id, 11) \ +X(a, STATIC, SINGULAR, UINT32, node_num_bits, 12) \ +X(a, STATIC, SINGULAR, UINT32, message_timeout_msec, 13) #define MyNodeInfo_CALLBACK NULL #define MyNodeInfo_DEFAULT NULL @@ -580,8 +592,8 @@ extern const pb_msgdesc_t ManufacturingData_msg; #define RadioConfig_size 157 #define RadioConfig_UserPreferences_size 93 #define NodeInfo_size 132 -#define MyNodeInfo_size 80 -#define DeviceState_size 15433 +#define MyNodeInfo_size 104 +#define DeviceState_size 15457 #define DebugString_size 258 #define FromRadio_size 333 #define ToRadio_size 327 From 5b1488ddf07715601f812eaf2791df2db8124ff3 Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 3 Jun 2020 13:46:31 -0700 Subject: [PATCH 2/7] Allow packet and nodenums to be 32 bits long (but don't change yet) --- docs/software/mesh-alg.md | 3 +++ src/mesh/MeshTypes.h | 2 +- src/mesh/NodeDB.cpp | 6 ++++-- src/mesh/RadioInterface.cpp | 2 +- src/mesh/RadioInterface.h | 4 +++- src/mesh/Router.cpp | 5 +++-- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/software/mesh-alg.md b/docs/software/mesh-alg.md index 7d7837be9..ecad282ab 100644 --- a/docs/software/mesh-alg.md +++ b/docs/software/mesh-alg.md @@ -31,6 +31,9 @@ dsr tasks optimizations / low priority: - read @cyclomies long email with good ideas on optimizations and reply +- Remove NodeNum assignment algorithm (now that we use 4 byte node nums) +- make android app warn if firmware is too old or too new to talk to +- change nodenums and packetids in protobuf to be fixed32 - low priority: think more careful about reliable retransmit intervals - make ReliableRouter.pending threadsafe - bump up PacketPool size for all the new ack/nak/routing packets diff --git a/src/mesh/MeshTypes.h b/src/mesh/MeshTypes.h index f491ce508..adba78415 100644 --- a/src/mesh/MeshTypes.h +++ b/src/mesh/MeshTypes.h @@ -9,7 +9,7 @@ typedef uint8_t NodeNum; typedef uint8_t PacketId; // A packet sequence number -#define NODENUM_BROADCAST 255 +#define NODENUM_BROADCAST (sizeof(NodeNum) == 4 ? UINT32_MAX : UINT8_MAX) #define ERRNO_OK 0 #define ERRNO_NO_INTERFACES 33 #define ERRNO_UNKNOWN 32 // pick something that doesn't conflict with RH_ROUTER_ERROR_UNABLE_TO_DELIVER diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index faa035930..1e263134e 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -178,8 +178,10 @@ void NodeDB::init() */ void NodeDB::pickNewNodeNum() { - // FIXME not the right way to guess node numes - uint8_t r = ourMacAddr[5]; + // Pick an initial nodenum based on the macaddr + NodeNum r = sizeof(NodeNum) == 1 ? ourMacAddr[5] + : ((ourMacAddr[2] << 24) | (ourMacAddr[3] << 16) | (ourMacAddr[4] << 8) | ourMacAddr[5]); + if (r == 0xff || r < NUM_RESERVED) r = NUM_RESERVED; // don't pick a reserved node number diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 45ecc42a8..c7edf74de 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -26,7 +26,7 @@ separated by 2.16 MHz with respect to the adjacent channels. Channel zero starts RadioInterface::RadioInterface() : txQueue(MAX_TX_QUEUE) { - assert(sizeof(PacketHeader) == 4); // make sure the compiler did what we expected + assert(sizeof(PacketHeader) == 4 || sizeof(PacketHeader) == 16); // make sure the compiler did what we expected myNodeInfo.num_channels = NUM_CHANNELS; diff --git a/src/mesh/RadioInterface.h b/src/mesh/RadioInterface.h index 419763750..64222a76a 100644 --- a/src/mesh/RadioInterface.h +++ b/src/mesh/RadioInterface.h @@ -19,7 +19,9 @@ * wtih the old radiohead implementation. */ typedef struct { - uint8_t to, from, id; + NodeNum to, from; // can be 1 byte or four bytes + + PacketId id; // can be 1 byte or 4 bytes /** * Usage of flags: diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index dc7409a07..eb8a1ab32 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -51,7 +51,8 @@ PacketId generatePacketId() static uint32_t i; // Note: trying to keep this in noinit didn't help for working across reboots static bool didInit = false; - uint32_t numPacketId = 255; // 0 is consider invalid + assert(sizeof(PacketId) == 4 || sizeof(PacketId) == 1); // only supported values + uint32_t numPacketId = sizeof(PacketId) == 1 ? UINT8_MAX : UINT32_MAX; // 0 is consider invalid if (!didInit) { didInit = true; @@ -60,7 +61,7 @@ PacketId generatePacketId() } i++; - PacketId id = (i % numPacketId) + 1; // return number between 1 and 255 (ie - never zero) + PacketId id = (i % numPacketId) + 1; // return number between 1 and numPacketId (ie - never zero) myNodeInfo.current_packet_id = id; // Kinda crufty - we keep updating this so the phone can see a current value return id; } From c753ea7cd16a52539a06f2f5d7a2b8469cbb2285 Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 3 Jun 2020 13:51:53 -0700 Subject: [PATCH 3/7] don't use a fixed randomSeed. --- src/mesh/NodeDB.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 1e263134e..8f8c0f5b8 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -134,16 +134,13 @@ void NodeDB::init() sprintf(owner.id, "!%02x%02x%02x%02x%02x%02x", ourMacAddr[0], ourMacAddr[1], ourMacAddr[2], ourMacAddr[3], ourMacAddr[4], ourMacAddr[5]); memcpy(owner.macaddr, ourMacAddr, sizeof(owner.macaddr)); - - // make each node start with ad different random seed (but okay that the sequence is the same each boot) - randomSeed((ourMacAddr[2] << 24L) | (ourMacAddr[3] << 16L) | (ourMacAddr[4] << 8L) | ourMacAddr[5]); - sprintf(owner.long_name, "Unknown %02x%02x", ourMacAddr[4], ourMacAddr[5]); - sprintf(owner.short_name, "?%02X", ourMacAddr[5]); // Crummy guess at our nodenum pickNewNodeNum(); + sprintf(owner.short_name, "?%02X", myNodeInfo.my_node_num & 0xff); + // Include our owner in the node db under our nodenum NodeInfo *info = getOrCreateNode(getNodeNum()); info->user = owner; @@ -182,7 +179,7 @@ void NodeDB::pickNewNodeNum() NodeNum r = sizeof(NodeNum) == 1 ? ourMacAddr[5] : ((ourMacAddr[2] << 24) | (ourMacAddr[3] << 16) | (ourMacAddr[4] << 8) | ourMacAddr[5]); - if (r == 0xff || r < NUM_RESERVED) + if (r == NODENUM_BROADCAST || r < NUM_RESERVED) r = NUM_RESERVED; // don't pick a reserved node number NodeInfo *found; From 49b5738f4f59591837c14d641c7fbdf14efccab7 Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 3 Jun 2020 13:57:30 -0700 Subject: [PATCH 4/7] add min_app_version so apps can warn if they are too old --- proto | 2 +- src/mesh/NodeDB.cpp | 1 + src/mesh/mesh.pb.h | 13 ++++++++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/proto b/proto index e9c7f9b95..9d083d5d4 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit e9c7f9b95d490aea3f0f213d4666d2dbf7e2111c +Subproject commit 9d083d5d4ff4ef095135b18468004eaba77cb691 diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 8f8c0f5b8..7ffd92e3a 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -127,6 +127,7 @@ void NodeDB::init() myNodeInfo.node_num_bits = sizeof(NodeNum) * 8; myNodeInfo.packet_id_bits = sizeof(PacketId) * 8; myNodeInfo.message_timeout_msec = FLOOD_EXPIRE_TIME; + myNodeInfo.min_app_version = 167; generatePacketId(); // FIXME - ugly way to init current_packet_id; // Init our blank owner info to reasonable defaults diff --git a/src/mesh/mesh.pb.h b/src/mesh/mesh.pb.h index ae7edb1ff..0eae7ecad 100644 --- a/src/mesh/mesh.pb.h +++ b/src/mesh/mesh.pb.h @@ -78,6 +78,7 @@ typedef struct _MyNodeInfo { uint32_t current_packet_id; uint32_t node_num_bits; uint32_t message_timeout_msec; + uint32_t min_app_version; } MyNodeInfo; typedef struct _Position { @@ -242,7 +243,7 @@ typedef struct _ToRadio { #define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default, false, ChannelSettings_init_default} #define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}} #define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0} -#define MyNodeInfo_init_default {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0} +#define MyNodeInfo_init_default {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0, 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}, false, MeshPacket_init_default, 0} #define DebugString_init_default {""} #define FromRadio_init_default {0, 0, {MeshPacket_init_default}} @@ -258,7 +259,7 @@ typedef struct _ToRadio { #define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero, false, ChannelSettings_init_zero} #define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0}} #define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0} -#define MyNodeInfo_init_zero {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0} +#define MyNodeInfo_init_zero {0, 0, 0, "", "", "", 0, 0, 0, 0, 0, 0, 0, 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}, false, MeshPacket_init_zero, 0} #define DebugString_init_zero {""} #define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}} @@ -290,6 +291,7 @@ typedef struct _ToRadio { #define MyNodeInfo_current_packet_id_tag 11 #define MyNodeInfo_node_num_bits_tag 12 #define MyNodeInfo_message_timeout_msec_tag 13 +#define MyNodeInfo_min_app_version_tag 14 #define Position_latitude_i_tag 7 #define Position_longitude_i_tag 8 #define Position_altitude_tag 3 @@ -484,7 +486,8 @@ X(a, STATIC, SINGULAR, UINT32, error_count, 9) \ X(a, STATIC, SINGULAR, UINT32, packet_id_bits, 10) \ X(a, STATIC, SINGULAR, UINT32, current_packet_id, 11) \ X(a, STATIC, SINGULAR, UINT32, node_num_bits, 12) \ -X(a, STATIC, SINGULAR, UINT32, message_timeout_msec, 13) +X(a, STATIC, SINGULAR, UINT32, message_timeout_msec, 13) \ +X(a, STATIC, SINGULAR, UINT32, min_app_version, 14) #define MyNodeInfo_CALLBACK NULL #define MyNodeInfo_DEFAULT NULL @@ -592,8 +595,8 @@ extern const pb_msgdesc_t ManufacturingData_msg; #define RadioConfig_size 157 #define RadioConfig_UserPreferences_size 93 #define NodeInfo_size 132 -#define MyNodeInfo_size 104 -#define DeviceState_size 15457 +#define MyNodeInfo_size 110 +#define DeviceState_size 15463 #define DebugString_size 258 #define FromRadio_size 333 #define ToRadio_size 327 From 5166717298ffeb2ddf4afd529b78c03a4f1547fe Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 3 Jun 2020 14:24:34 -0700 Subject: [PATCH 5/7] confirm randomSeed is set correctly --- src/esp32/main-esp32.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/esp32/main-esp32.cpp b/src/esp32/main-esp32.cpp index e8512e2ea..67256bc7f 100644 --- a/src/esp32/main-esp32.cpp +++ b/src/esp32/main-esp32.cpp @@ -156,7 +156,9 @@ void axp192Init() void esp32Setup() { - randomSeed(esp_random()); // ESP docs say this is fairly random + uint32_t seed = esp_random(); + DEBUG_MSG("Setting random seed %u\n", seed); + randomSeed(seed); // ESP docs say this is fairly random #ifdef AXP192_SLAVE_ADDRESS axp192Init(); @@ -185,7 +187,11 @@ Periodic axpDebugOutput(axpDebugRead); /** * Per @spattinson - * MIN_BAT_MILLIVOLTS seems high. Typical 18650 are different chemistry to LiPo, even for LiPos that chart seems a bit off, other charts put 3690mV at about 30% for a lipo, for 18650 i think 10% remaining iis in the region of 3.2-3.3V. Reference 1st graph in [this test report](https://lygte-info.dk/review/batteries2012/Samsung%20INR18650-30Q%203000mAh%20%28Pink%29%20UK.html) looking at the red line - discharge at 0.2A - he gets a capacity of 2900mah, 90% of 2900 = 2610, that point in the graph looks to be a shade above 3.2V + * MIN_BAT_MILLIVOLTS seems high. Typical 18650 are different chemistry to LiPo, even for LiPos that chart seems a bit off, other + * charts put 3690mV at about 30% for a lipo, for 18650 i think 10% remaining iis in the region of 3.2-3.3V. Reference 1st graph + * in [this test report](https://lygte-info.dk/review/batteries2012/Samsung%20INR18650-30Q%203000mAh%20%28Pink%29%20UK.html) + * looking at the red line - discharge at 0.2A - he gets a capacity of 2900mah, 90% of 2900 = 2610, that point in the graph looks + * to be a shade above 3.2V */ #define MIN_BAT_MILLIVOLTS 3250 // millivolts. 10% per https://blog.ampow.com/lipo-voltage-chart/ From 99437d931ee06509ddcbe95ebda16a5a6087c31c Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 3 Jun 2020 16:08:11 -0700 Subject: [PATCH 6/7] fix #153 --- src/mesh/NodeDB.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 7ffd92e3a..0fee4b7b2 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -30,7 +30,7 @@ DeviceState versions used to be defined in the .proto file but really only this #define here. */ -#define DEVICESTATE_CUR_VER 7 +#define DEVICESTATE_CUR_VER 8 #define DEVICESTATE_MIN_VER DEVICESTATE_CUR_VER #ifndef NO_ESP32 From 4e5a445d8bcd6e984a27b7f1cc480f4bc4735c15 Mon Sep 17 00:00:00 2001 From: geeksville Date: Thu, 4 Jun 2020 10:37:08 -0700 Subject: [PATCH 7/7] 0.6.7 --- bin/version.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/version.sh b/bin/version.sh index 2887e511d..a13f8e90b 100644 --- a/bin/version.sh +++ b/bin/version.sh @@ -1,3 +1,3 @@ -export VERSION=0.6.4 \ No newline at end of file +export VERSION=0.6.7 \ No newline at end of file