Fix time updates from client device and potentially incorrect UI frame receiving 'toggle watch face' button tap (#3974)

This commit is contained in:
andrew-moroz
2024-05-26 08:04:31 -04:00
committed by GitHub
parent aa33ad1d58
commit 77cf5c6200
5 changed files with 41 additions and 22 deletions

View File

@@ -55,6 +55,15 @@ bool PositionModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes
isLocal = true;
if (config.position.fixed_position) {
LOG_DEBUG("Ignore incoming position update from myself except for time, because position.fixed_position is true\n");
#ifdef T_WATCH_S3
// Since we return early if position.fixed_position is true, set the T-Watch's RTC to the time received from the
// client device here
if (p.time && channels.getByIndex(mp.channel).role == meshtastic_Channel_Role_PRIMARY) {
trySetRtc(p, isLocal, true);
}
#endif
nodeDB->setLocalPosition(p, true);
return false;
} else {
@@ -71,8 +80,17 @@ bool PositionModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes
p.time);
if (p.time && channels.getByIndex(mp.channel).role == meshtastic_Channel_Role_PRIMARY) {
bool force = false;
#ifdef T_WATCH_S3
// The T-Watch appears to "pause" its RTC when shut down, such that the time it reads upon powering on is the same as when
// it was shut down. So we need to force the update here, since otherwise RTC::perhapsSetRTC will ignore it because it
// will always be an equivalent or lesser RTCQuality (RTCQualityNTP or RTCQualityNet).
force = true;
#endif
// Set from phone RTC Quality to RTCQualityNTP since it should be approximately so
trySetRtc(p, isLocal);
trySetRtc(p, isLocal, force);
}
nodeDB->updatePosition(getFrom(&mp), p);
@@ -104,14 +122,14 @@ void PositionModule::alterReceivedProtobuf(meshtastic_MeshPacket &mp, meshtastic
}
}
void PositionModule::trySetRtc(meshtastic_Position p, bool isLocal)
void PositionModule::trySetRtc(meshtastic_Position p, bool isLocal, bool forceUpdate)
{
struct timeval tv;
uint32_t secs = p.time;
tv.tv_sec = secs;
tv.tv_usec = 0;
perhapsSetRTC(isLocal ? RTCQualityNTP : RTCQualityFromNet, &tv);
perhapsSetRTC(isLocal ? RTCQualityNTP : RTCQualityFromNet, &tv, forceUpdate);
}
meshtastic_MeshPacket *PositionModule::allocReply()

View File

@@ -54,7 +54,7 @@ class PositionModule : public ProtobufModule<meshtastic_Position>, private concu
private:
struct SmartPosition getDistanceTraveledSinceLastSend(meshtastic_PositionLite currentPosition);
meshtastic_MeshPacket *allocAtakPli();
void trySetRtc(meshtastic_Position p, bool isLocal);
void trySetRtc(meshtastic_Position p, bool isLocal, bool forceUpdate = false);
uint32_t precision;
void sendLostAndFoundText();