send network pings when the user does something with their device

This commit is contained in:
geeksville 2020-02-12 14:07:06 -08:00
parent d3ca56f91a
commit e79c49d100
6 changed files with 71 additions and 16 deletions

View File

@ -1,11 +1,7 @@
# High priority # High priority
* send user and location events much less often
* send location (or if not available user) when the user wakes the device from display sleep (both for testing and to improve user experience)
* have node info screen show real info (including time since last contact, distance and heading) * have node info screen show real info (including time since last contact, distance and heading)
* make debug info screen show real data (including battery level & charging) * make debug info screen show real data (including battery level & charging)
* make real implementation of getNumOnlineNodes
* very occasionally send our position and user packet based on the schedule in the radio info (if for nothing else so that other nodes update last_seen)
* show real text info on the text screen * show real text info on the text screen
* retest BLE software update for both board types * retest BLE software update for both board types
* turn on screen when a new update arrives * turn on screen when a new update arrives
@ -127,3 +123,7 @@ until the phone pulls those packets. Ever so often power on bluetooth just so w
* make screen sleep behavior work * make screen sleep behavior work
* make screen advance only when a new node update arrives, a new text arrives or the user presses a button, turn off screen after a while * make screen advance only when a new node update arrives, a new text arrives or the user presses a button, turn off screen after a while
* after reboot, channel number is getting reset to zero! fix! * after reboot, channel number is getting reset to zero! fix!
* send user and location events much less often
* send location (or if not available user) when the user wakes the device from display sleep (both for testing and to improve user experience)
* make real implementation of getNumOnlineNodes
* very occasionally send our position and user packet based on the schedule in the radio info (if for nothing else so that other nodes update last_seen)

View File

@ -153,10 +153,10 @@ void MeshService::loop()
handleFromRadio(); handleFromRadio();
// FIXME, don't send user this often, but for now it is useful for testing // occasionally send our owner info
static uint32_t lastsend; static uint32_t lastsend;
uint32_t now = millis(); uint32_t now = millis();
if (now - lastsend > 5 * 60 * 1000) if (now - lastsend > radioConfig.preferences.send_owner_secs * 1000)
{ {
lastsend = now; lastsend = now;
sendOurOwner(); sendOurOwner();
@ -193,7 +193,7 @@ void MeshService::handleToRadio(std::string s)
void MeshService::sendToMesh(MeshPacket *p) void MeshService::sendToMesh(MeshPacket *p)
{ {
nodeDB.updateFrom(*p); nodeDB.updateFrom(*p); // update our local DB for this packet
assert(radio.send(p) == pdTRUE); assert(radio.send(p) == pdTRUE);
} }
@ -208,8 +208,33 @@ MeshPacket *MeshService::allocForSending()
return p; return p;
} }
void MeshService::sendNetworkPing()
{
NodeInfo *node = nodeDB.getNode(nodeDB.getNodeNum());
assert(node);
if (node->has_position)
sendOurPosition();
else
sendOurOwner();
}
void MeshService::sendOurPosition()
{
NodeInfo *node = nodeDB.getNode(nodeDB.getNodeNum());
assert(node);
assert(node->has_position);
// Update our local node info with our position (even if we don't decide to update anyone else)
MeshPacket *p = allocForSending();
p->payload.which_variant = SubPacket_position_tag;
p->payload.variant.position = node->position;
sendToMesh(p);
}
void MeshService::onGPSChanged() void MeshService::onGPSChanged()
{ {
// Update our local node info with our position (even if we don't decide to update anyone else)
MeshPacket *p = allocForSending(); MeshPacket *p = allocForSending();
p->payload.which_variant = SubPacket_position_tag; p->payload.which_variant = SubPacket_position_tag;
Position &pos = p->payload.variant.position; Position &pos = p->payload.variant.position;
@ -218,7 +243,23 @@ void MeshService::onGPSChanged()
pos.latitude = gps.location.lat(); pos.latitude = gps.location.lat();
pos.longitude = gps.location.lng(); pos.longitude = gps.location.lng();
sendToMesh(p); // We limit our GPS broadcasts to a max rate
static uint32_t lastGpsSend;
uint32_t now = millis();
if (lastGpsSend == 0 || now - lastGpsSend > radioConfig.preferences.position_broadcast_secs * 1000)
{
lastGpsSend = now;
DEBUG_MSG("Sending position to mesh\n");
sendToMesh(p);
}
else
{
// We don't need to send this packet to anyone else, but it still serves as a nice uniform way to update our local state
nodeDB.updateFrom(*p);
releaseToPool(p);
}
} }
void MeshService::onNotify(Observable *o) void MeshService::onNotify(Observable *o)

View File

@ -60,9 +60,14 @@ public:
/// Allocate and return a meshpacket which defaults as send to broadcast from the current node. /// Allocate and return a meshpacket which defaults as send to broadcast from the current node.
MeshPacket *allocForSending(); MeshPacket *allocForSending();
/// Called when the user wakes up our GUI, normally sends our latest location to the mesh (if we have it), otherwise at least sends our owner
void sendNetworkPing();
/// Send our owner info to a particular node /// Send our owner info to a particular node
void sendOurOwner(NodeNum dest = NODENUM_BROADCAST); void sendOurOwner(NodeNum dest = NODENUM_BROADCAST);
private: private:
/// Broadcasts our last known position
void sendOurPosition();
/// Send a packet into the mesh - note p must have been allocated from packetPool. We will return it to that pool after sending. /// Send a packet into the mesh - note p must have been allocated from packetPool. We will return it to that pool after sending.
/// This is the ONLY function you should use for sending messages into the mesh, because it also updates the nodedb cache /// This is the ONLY function you should use for sending messages into the mesh, because it also updates the nodedb cache

View File

@ -49,6 +49,14 @@ void NodeDB::init()
devicestate.node_db_count = 0; devicestate.node_db_count = 0;
devicestate.receive_queue_count = 0; devicestate.receive_queue_count = 0;
radioConfig.preferences.send_owner_secs = 60 * 60; // default to once an hour
radioConfig.preferences.position_broadcast_secs = 15 * 60; // default to once every 15 mins
#ifdef GPS_RX_PIN
// some hardware defaults to have a built in GPS
myNodeInfo.has_gps = true;
#endif
// Init our blank owner info to reasonable defaults // Init our blank owner info to reasonable defaults
esp_efuse_mac_get_default(ourMacAddr); esp_efuse_mac_get_default(ourMacAddr);
sprintf(owner.id, "!%02x%02x%02x%02x%02x%02x", ourMacAddr[0], sprintf(owner.id, "!%02x%02x%02x%02x%02x%02x", ourMacAddr[0],

View File

@ -442,6 +442,7 @@ void loop()
// esp_pm_dump_locks(stdout); // FIXME, do this someplace better // esp_pm_dump_locks(stdout); // FIXME, do this someplace better
wasPressed = true; wasPressed = true;
minPressMs = millis() + 3000; minPressMs = millis() + 3000;
service.sendNetworkPing();
screen_press(); screen_press();
} }
} }

View File

@ -34,8 +34,8 @@ typedef enum _ChannelSettings_ModemConfig {
typedef enum _DeviceState_Version { typedef enum _DeviceState_Version {
DeviceState_Version_Unset = 0, DeviceState_Version_Unset = 0,
DeviceState_Version_Minimum = 10, DeviceState_Version_Minimum = 11,
DeviceState_Version_Current = 10 DeviceState_Version_Current = 11
} DeviceState_Version; } DeviceState_Version;
/* Struct definitions */ /* Struct definitions */
@ -67,8 +67,8 @@ typedef struct _Position {
} Position; } Position;
typedef struct _RadioConfig_UserPreferences { typedef struct _RadioConfig_UserPreferences {
uint32_t position_broadcast_msec; uint32_t position_broadcast_secs;
uint32_t min_broadcast_msec; uint32_t send_owner_secs;
bool keep_all_packets; bool keep_all_packets;
bool promiscuous_mode; bool promiscuous_mode;
} RadioConfig_UserPreferences; } RadioConfig_UserPreferences;
@ -206,8 +206,8 @@ typedef struct _ToRadio {
#define Position_altitude_tag 3 #define Position_altitude_tag 3
#define Position_battery_level_tag 4 #define Position_battery_level_tag 4
#define Position_from_hardware_tag 5 #define Position_from_hardware_tag 5
#define RadioConfig_UserPreferences_position_broadcast_msec_tag 1 #define RadioConfig_UserPreferences_position_broadcast_secs_tag 1
#define RadioConfig_UserPreferences_min_broadcast_msec_tag 2 #define RadioConfig_UserPreferences_send_owner_secs_tag 2
#define RadioConfig_UserPreferences_keep_all_packets_tag 100 #define RadioConfig_UserPreferences_keep_all_packets_tag 100
#define RadioConfig_UserPreferences_promiscuous_mode_tag 101 #define RadioConfig_UserPreferences_promiscuous_mode_tag 101
#define User_id_tag 1 #define User_id_tag 1
@ -300,8 +300,8 @@ X(a, STATIC, OPTIONAL, MESSAGE, channel_settings, 2)
#define RadioConfig_channel_settings_MSGTYPE ChannelSettings #define RadioConfig_channel_settings_MSGTYPE ChannelSettings
#define RadioConfig_UserPreferences_FIELDLIST(X, a) \ #define RadioConfig_UserPreferences_FIELDLIST(X, a) \
X(a, STATIC, SINGULAR, UINT32, position_broadcast_msec, 1) \ X(a, STATIC, SINGULAR, UINT32, position_broadcast_secs, 1) \
X(a, STATIC, SINGULAR, UINT32, min_broadcast_msec, 2) \ X(a, STATIC, SINGULAR, UINT32, send_owner_secs, 2) \
X(a, STATIC, SINGULAR, BOOL, keep_all_packets, 100) \ X(a, STATIC, SINGULAR, BOOL, keep_all_packets, 100) \
X(a, STATIC, SINGULAR, BOOL, promiscuous_mode, 101) X(a, STATIC, SINGULAR, BOOL, promiscuous_mode, 101)
#define RadioConfig_UserPreferences_CALLBACK NULL #define RadioConfig_UserPreferences_CALLBACK NULL