From b538677ad2602548015e829da3de5bae32f36747 Mon Sep 17 00:00:00 2001 From: geeksville Date: Tue, 4 Feb 2020 09:00:17 -0800 Subject: [PATCH] include our local user in the node db --- platformio.ini | 2 +- src/MeshService.cpp | 2 ++ src/NodeDB.cpp | 49 +++++++++++++++++++++++++++++++++++---------- src/NodeDB.h | 5 ++++- src/mesh.pb.c | 3 --- src/mesh.pb.h | 48 ++++++++++++++------------------------------ 6 files changed, 60 insertions(+), 49 deletions(-) diff --git a/platformio.ini b/platformio.ini index f742e0223..f3f63be08 100644 --- a/platformio.ini +++ b/platformio.ini @@ -36,7 +36,7 @@ monitor_speed = 115200 # debug_port = /dev/ttyUSB0 debug_tool = olimex-arm-usb-ocd-h -upload_protocol = olimex-arm-usb-ocd-h +; upload_protocol = olimex-arm-usb-ocd-h ;debug_init_cmds = ; adapter_khz 10000 diff --git a/src/MeshService.cpp b/src/MeshService.cpp index 9308ed680..79f1dc7d2 100644 --- a/src/MeshService.cpp +++ b/src/MeshService.cpp @@ -37,6 +37,8 @@ MeshService::MeshService() void MeshService::init() { + nodeDB.init(); + if (!radio.init()) DEBUG_MSG("radio init failed\n"); } diff --git a/src/NodeDB.cpp b/src/NodeDB.cpp index 932e417cc..388be804b 100644 --- a/src/NodeDB.cpp +++ b/src/NodeDB.cpp @@ -10,32 +10,60 @@ MyNodeInfo myNodeInfo = MyNodeInfo_init_zero; NodeDB nodeDB; -User owner = User_init_zero; + +/** + * + * Normally userids are unique and start with +country code to look like Signal phone numbers. + * But there are some special ids used when we haven't yet been configured by a user. In that case + * we use !macaddr (no colons). + */ +User owner = {"+1650xxxyyyy", "unset name", "????", {0}}; + +static uint8_t ourMacAddr[6]; /** * get our starting (provisional) nodenum from flash. But check first if anyone else is using it, by trying to send a message to it (arping) */ static NodeNum getDesiredNodeNum() { - uint8_t dmac[6]; - esp_efuse_mac_get_default(dmac); + esp_efuse_mac_get_default(ourMacAddr); // FIXME not the right way to guess node numes - uint8_t r = dmac[5]; + uint8_t r = ourMacAddr[5]; assert(r != 0xff); // It better not be the broadcast address return r; } -NodeDB::NodeDB() : ourNodeNum(getDesiredNodeNum()) -{ -} - /// return number msecs since 1970 uint64_t getCurrentTime() { return 4403; // FIXME } + +NodeDB::NodeDB() +{ + +} + + +void NodeDB::init() { + ourNodeNum = getDesiredNodeNum(); + + // Init our blank owner info to reasonable defaults + 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)); + + // FIXME, read owner info from flash + + // Include our owner in the node db under our nodenum + NodeInfo *info = getOrCreateNode(ourNodeNum); + info->user = owner; + info->has_user = true; + info->last_seen = getCurrentTime(); +} + const NodeInfo *NodeDB::readNextInfo() { if (readPointer < numNodes) @@ -60,8 +88,7 @@ void NodeDB::updateFrom(const MeshPacket &mp) if (oldNumNodes != numNodes) updateGUI = true; // we just created a nodeinfo - info->last_seen.msecs = getCurrentTime(); - info->has_last_seen = true; + info->last_seen = getCurrentTime(); switch (p.which_variant) { @@ -99,7 +126,7 @@ NodeInfo *NodeDB::getOrCreateNode(NodeNum n) { NodeInfo *info = getNode(n); - if (!n) + if (!info) { // add the node assert(numNodes < MAX_NUM_NODES); diff --git a/src/NodeDB.h b/src/NodeDB.h index 781389ee5..4881aff9a 100644 --- a/src/NodeDB.h +++ b/src/NodeDB.h @@ -10,7 +10,7 @@ class NodeDB { // NodeNum provisionalNodeNum; // if we are trying to find a node num this is our current attempt - NodeNum ourNodeNum; + NodeNum ourNodeNum = 0; // A NodeInfo for every node we've seen // Eventually use a smarter datastructure @@ -28,6 +28,9 @@ public: /// instead just store in flash - possibly even in the initial alpha release do this hack NodeDB(); + /// Called from service after app start, to do init which can only be done after OS load + void init(); + /// given a subpacket sniffed from the network, update our DB state /// we updateGUI and updateGUIforNode if we think our this change is big enough for a redraw void updateFrom(const MeshPacket &p); diff --git a/src/mesh.pb.c b/src/mesh.pb.c index eddf2d2a6..d68b2c89c 100644 --- a/src/mesh.pb.c +++ b/src/mesh.pb.c @@ -9,9 +9,6 @@ PB_BIND(Position, Position, AUTO) -PB_BIND(Time, Time, AUTO) - - PB_BIND(Data, Data, AUTO) diff --git a/src/mesh.pb.h b/src/mesh.pb.h index 8ce7994bf..1cf9df674 100644 --- a/src/mesh.pb.h +++ b/src/mesh.pb.h @@ -55,14 +55,10 @@ typedef struct _RadioConfig { bool promiscuous_mode; } RadioConfig; -typedef struct _Time { - uint64_t msecs; -} Time; - typedef struct _User { char id[16]; char long_name[40]; - char short_name[4]; + char short_name[5]; pb_byte_t macaddr[6]; } User; @@ -77,8 +73,7 @@ typedef struct _NodeInfo { User user; bool has_position; Position position; - bool has_last_seen; - Time last_seen; + uint64_t last_seen; int32_t rx_power; } NodeInfo; @@ -86,7 +81,7 @@ typedef struct _SubPacket { pb_size_t which_variant; union { Position position; - Time time; + uint64_t time; Data data; User user; WantNodeNum want_node; @@ -135,7 +130,6 @@ typedef struct _ToRadio { /* Initializer values for message structs */ #define Position_init_default {0, 0, 0, 0, 0} -#define Time_init_default {0} #define Data_init_default {_Data_Type_MIN, {0, {0}}} #define User_init_default {"", "", "", {0}} #define WantNodeNum_init_default {0, {0}} @@ -143,13 +137,12 @@ 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, 0, 0, 0, 0, 0} -#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, false, Time_init_default, 0} +#define NodeInfo_init_default {0, false, User_init_default, false, Position_init_default, 0, 0} #define DeviceState_init_default {false, RadioConfig_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}, 0} #define MyNodeInfo_init_default {0} #define FromRadio_init_default {0, 0, {MeshPacket_init_default}} #define ToRadio_init_default {0, {MeshPacket_init_default}} #define Position_init_zero {0, 0, 0, 0, 0} -#define Time_init_zero {0} #define Data_init_zero {_Data_Type_MIN, {0, {0}}} #define User_init_zero {"", "", "", {0}} #define WantNodeNum_init_zero {0, {0}} @@ -157,7 +150,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, 0, 0, 0, 0, 0} -#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, false, Time_init_zero, 0} +#define NodeInfo_init_zero {0, false, User_init_zero, false, Position_init_zero, 0, 0} #define DeviceState_init_zero {false, RadioConfig_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}, 0} #define MyNodeInfo_init_zero {0} #define FromRadio_init_zero {0, 0, {MeshPacket_init_zero}} @@ -182,7 +175,6 @@ typedef struct _ToRadio { #define RadioConfig_coding_rate_tag 7 #define RadioConfig_keep_all_packets_tag 100 #define RadioConfig_promiscuous_mode_tag 101 -#define Time_msecs_tag 1 #define User_id_tag 1 #define User_long_name_tag 2 #define User_short_name_tag 3 @@ -191,9 +183,9 @@ typedef struct _ToRadio { #define WantNodeNum_macaddr_tag 2 #define NodeInfo_num_tag 1 #define NodeInfo_user_tag 2 -#define NodeInfo_position_tag 4 -#define NodeInfo_last_seen_tag 5 -#define NodeInfo_rx_power_tag 6 +#define NodeInfo_position_tag 3 +#define NodeInfo_last_seen_tag 4 +#define NodeInfo_rx_power_tag 5 #define SubPacket_position_tag 1 #define SubPacket_time_tag 2 #define SubPacket_data_tag 3 @@ -221,11 +213,6 @@ X(a, STATIC, SINGULAR, BOOL, from_hardware, 5) #define Position_CALLBACK NULL #define Position_DEFAULT NULL -#define Time_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UINT64, msecs, 1) -#define Time_CALLBACK NULL -#define Time_DEFAULT NULL - #define Data_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UENUM, typ, 1) \ X(a, STATIC, SINGULAR, BYTES, payload, 2) @@ -253,7 +240,7 @@ X(a, STATIC, SINGULAR, FIXED_LENGTH_BYTES, macaddr, 1) #define SubPacket_FIELDLIST(X, a) \ X(a, STATIC, ONEOF, MESSAGE, (variant,position,variant.position), 1) \ -X(a, STATIC, ONEOF, MESSAGE, (variant,time,variant.time), 2) \ +X(a, STATIC, ONEOF, UINT64, (variant,time,variant.time), 2) \ X(a, STATIC, ONEOF, MESSAGE, (variant,data,variant.data), 3) \ X(a, STATIC, ONEOF, MESSAGE, (variant,user,variant.user), 4) \ X(a, STATIC, ONEOF, MESSAGE, (variant,want_node,variant.want_node), 5) \ @@ -261,7 +248,6 @@ X(a, STATIC, ONEOF, MESSAGE, (variant,deny_node,variant.deny_node), 6) #define SubPacket_CALLBACK NULL #define SubPacket_DEFAULT NULL #define SubPacket_variant_position_MSGTYPE Position -#define SubPacket_variant_time_MSGTYPE Time #define SubPacket_variant_data_MSGTYPE Data #define SubPacket_variant_user_MSGTYPE User #define SubPacket_variant_want_node_MSGTYPE WantNodeNum @@ -291,14 +277,13 @@ X(a, STATIC, SINGULAR, BOOL, promiscuous_mode, 101) #define NodeInfo_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, INT32, num, 1) \ X(a, STATIC, OPTIONAL, MESSAGE, user, 2) \ -X(a, STATIC, OPTIONAL, MESSAGE, position, 4) \ -X(a, STATIC, OPTIONAL, MESSAGE, last_seen, 5) \ -X(a, STATIC, SINGULAR, INT32, rx_power, 6) +X(a, STATIC, OPTIONAL, MESSAGE, position, 3) \ +X(a, STATIC, SINGULAR, UINT64, last_seen, 4) \ +X(a, STATIC, SINGULAR, INT32, rx_power, 5) #define NodeInfo_CALLBACK NULL #define NodeInfo_DEFAULT NULL #define NodeInfo_user_MSGTYPE User #define NodeInfo_position_MSGTYPE Position -#define NodeInfo_last_seen_MSGTYPE Time #define DeviceState_FIELDLIST(X, a) \ X(a, STATIC, OPTIONAL, MESSAGE, radio, 1) \ @@ -330,7 +315,6 @@ X(a, STATIC, ONEOF, MESSAGE, (variant,packet,variant.packet), 1) #define ToRadio_variant_packet_MSGTYPE MeshPacket extern const pb_msgdesc_t Position_msg; -extern const pb_msgdesc_t Time_msg; extern const pb_msgdesc_t Data_msg; extern const pb_msgdesc_t User_msg; extern const pb_msgdesc_t WantNodeNum_msg; @@ -346,7 +330,6 @@ extern const pb_msgdesc_t ToRadio_msg; /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ #define Position_fields &Position_msg -#define Time_fields &Time_msg #define Data_fields &Data_msg #define User_fields &User_msg #define WantNodeNum_fields &WantNodeNum_msg @@ -362,16 +345,15 @@ extern const pb_msgdesc_t ToRadio_msg; /* Maximum encoded size of messages (where known) */ #define Position_size 42 -#define Time_size 11 #define Data_size 104 -#define User_size 71 +#define User_size 72 #define WantNodeNum_size 14 #define DenyNodeNum_size 8 #define SubPacket_size 106 #define MeshPacket_size 130 #define RadioConfig_size 62 -#define NodeInfo_size 152 -#define DeviceState_size 9291 +#define NodeInfo_size 151 +#define DeviceState_size 9259 #define MyNodeInfo_size 11 #define FromRadio_size 139 #define ToRadio_size 133