mirror of
https://github.com/meshtastic/firmware.git
synced 2026-08-01 02:48:49 -04:00
* Add explicit presence for MeshPacket.rx_time (arrival time) rx_time is now proto3 optional with a has_rx_time presence bit, matching the rx_rssi treatment. A node with no GPS and no phone connected yet has no time source at all, so a bare 0 was indistinguishable from a genuine 1970-01-01 reading; downstream consumers (replay packets, JSON serialization) now check has_rx_time instead of the value. * Dedupe rx_time stamping into a shared helper; trim a debug log string Extract the repeated haveTime/rx_time/has_rx_time stamp logic (5 call sites across Router.cpp, MeshBeaconModule.cpp, MeshService.cpp) into Router::computeRxTimeStamp()/stampRxTime(). Also shorten the new RTC.cpp LOG_DEBUG string. Saves 48 bytes of flash on rak4631 (measured), no behavior change. * Fix has_rx_rssi presence carried unconditionally through StoreForward replay preparePayload() set has_rx_rssi = true unconditionally on replay, regardless of whether the packet's rx_rssi at store time was a genuine measurement (e.g. MQTT-relayed packets carry no real RSSI). Store the presence bit alongside rx_rssi in PacketHistoryStruct and restore it on replay instead. Flagged by Copilot on #11271 (same root cause the has_rx_time explicit presence work fixes) but never addressed before that PR merged. * Trim comment blocks to the repo's 1-2 line guideline .github/copilot-instructions.md:338 caps code comments at 1-2 lines; several blocks added across the rx_time explicit-presence work ran well past that. Also consolidates Time.cpp's file-level doc comment into Time.h, where the rest of the Time:: API contract already lives. No behavior change. * Add rx_time explicit-presence test coverage - test_meshpacket_serializer: has_rx_time=false fixture plus tests asserting JsonSerialize/JsonSerializeEncrypted emit 0 rather than leaking the millis() placeholder, alongside the has_rx_time=true baseline. - test_stream_api: two tests driving a real PhoneAPI handshake (want_config_id through STATE_SEND_PACKETS) that simulate a phone time-giving transaction arriving before vs. after a queued packet is drained - covering both the reconciled and the ships-with-placeholder-absent paths of MeshService::reconcilePendingRxTimes(). * Fix three correctness issues flagged in review - Time.h: drop the reserved-identifier include guard (_MT_TIME_H); pragma once already covers it, matching convention elsewhere (e.g. RTC.h). - Time.cpp: rebase getMillis64()'s wrap accumulator when the test seam swaps clock sources, so a real<->injected clock jump isn't miscounted as a genuine 32-bit wrap. - NodeInfoModule: the 12h reply-suppression window is a local dedup duration, not a wall-clock reading - switch it to Time::getMillis64() so RTC-quality jumps and replayed packets' stale rx_time can't perturb it. - StoreForwardModule: has_rx_time was derived from *current* RTC quality at replay time rather than stored at capture time, so a history entry saved while time-blind could be misreported as a valid epoch once the clock later improved. Persist the presence bit in PacketHistoryStruct instead. * tryfix CI * post review fixes * more test fixes
47 lines
1.5 KiB
C++
47 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
|
|
// Monotonic uptime clock, injectable so tests can drive a virtual timebase instead of sleeping.
|
|
// Uptime only; see gps/RTC.h for wall-clock. Not named Time.h: -Isrc would shadow C's <time.h>.
|
|
namespace Time
|
|
{
|
|
#ifdef PIO_UNIT_TESTING
|
|
// Test-only virtual clock; OFF by default so suites relying on real time are unaffected.
|
|
inline uint32_t testNowMs = 0;
|
|
inline bool useTestClock = false;
|
|
inline bool clockSourceChanged = true; // forces getMillis64() to rebase its wrap accumulator
|
|
|
|
inline void setTestMillis(uint32_t ms)
|
|
{
|
|
testNowMs = ms;
|
|
useTestClock = true;
|
|
clockSourceChanged = true;
|
|
}
|
|
inline void advanceTestMillis(uint32_t deltaMs)
|
|
{
|
|
// Advancing from 0 after getMillis64() sampled the real clock steps backward, which would
|
|
// otherwise be miscounted as a wrap.
|
|
if (!useTestClock)
|
|
clockSourceChanged = true;
|
|
testNowMs += deltaMs;
|
|
useTestClock = true;
|
|
}
|
|
// Restore real-clock behaviour (call in test tearDown if a suite mixes real and fake time).
|
|
inline void useRealClock()
|
|
{
|
|
useTestClock = false;
|
|
testNowMs = 0;
|
|
clockSourceChanged = true;
|
|
}
|
|
#endif
|
|
|
|
/// Milliseconds since boot, 32-bit (wraps ~49.7 days). Drop-in for millis().
|
|
uint32_t getMillis();
|
|
|
|
/// Milliseconds since boot, 64-bit, rollover-immune. Must be polled at least once per ~49.7-day
|
|
/// wrap window to catch every wrap, and keeps mutable static carry state, so it is NOT ISR-safe.
|
|
uint64_t getMillis64();
|
|
|
|
} // namespace Time
|