-
Notifications
You must be signed in to change notification settings - Fork 4
bugfix channel clock
Bugfixes: TerminalCLI channel overwrite + clock on NRF52 / Фиксы: TerminalCLI перетирал канал + часы на NRF52
Files: src/helpers/BaseChatMesh.cpp, examples/companion_radio/ui-new/UITask.cpp
After a firmware update (or when WITH_COMPANION_CLI first appeared), a channel
added by the user would disappear and be replaced by the TerminalCLI channel.
addChannel() uses num_channels as the index for the next entry.
loadChannels() restores channels via setChannel(idx, ch) — a direct write
into the array by index, without updating num_channels.
Startup sequence:
-
addChannel("Public", …)→channels[0],num_channels = 1 -
loadChannels()→setChannel(0, Public),setChannel(1, MyChan)—num_channelsstays1 - Scan 0..MAX —
TerminalCLInot found →addChannel("TerminalCLI")→ writes tochannels[1]← overwrites MyChan
Most commonly observed when upgrading from a firmware without TerminalCLI to one that includes it.
src/helpers/BaseChatMesh.cpp, function setChannel():
if (idx >= num_channels) num_channels = idx + 1;After loadChannels(), num_channels reflects the actual number of occupied slots,
and addChannel("TerminalCLI") writes to the next free slot without overwriting loaded channels.
The existing mechanism that checks for and auto-registers TerminalCLI when absent
(MyMesh.cpp:1043–1057) continues to work correctly.
The CLOCK page on all NRF52 companion nodes (ProMicro, GAT562, etc.) showed a frozen time regardless of synchronization settings.
examples/companion_radio/ui-new/UITask.cpp, CLOCK page:
time_t now = time(nullptr); // POSIX timeOn ESP32, setCurrentTime() calls settimeofday() — the system POSIX time
is updated and time() returns the correct value.
On NRF52, ProMicro/GAT562 have no hardware RTC → VolatileRTCClock is used.
Its setCurrentTime() updates the internal base_time but does not call settimeofday().
time(nullptr) returns 0 regardless of network synchronization.
// before:
time_t now = time(nullptr);
// after:
time_t now = (time_t)_rtc->getCurrentTime();_rtc (VolatileRTCClock) is correctly updated during network synchronization via
TimeSyncHelper. localtime_r and strftime are unchanged.
All NRF52 companion variants: ProMicro (all revisions), RAK 4631, RAK 3401, LilyGo T-Echo / T-Echo Lite, GAT562 (all variants), ikoka (handheld / nano / stick), KeepteenLT1, Mesh Pocket, Meshtiny, Minewsemi, Nano G2 Ultra, R1Neo, SenseCap Solar, Heltec t096 / t114, ThinkNode M1 / M3 / M6, WioTrackerL1 / Eink, wio_wm1110, Xiao nRF52.
Also RP2040 and STM32 companion variants (PicoW, RAK 11310, waveshare, wio-e5).
On ESP32, the clock was already working correctly before this fix — the change does not affect its behavior.
Файлы: src/helpers/BaseChatMesh.cpp, examples/companion_radio/ui-new/UITask.cpp
После обновления прошивки (или при первом появлении WITH_COMPANION_CLI) канал,
добавленный пользователем, исчезал и заменялся каналом TerminalCLI.
addChannel() использует num_channels как индекс следующей записи.
loadChannels() восстанавливает каналы через setChannel(idx, ch) — прямая запись
в массив по индексу, num_channels при этом не обновлялась.
Последовательность при старте:
-
addChannel("Public", …)→channels[0],num_channels = 1 -
loadChannels()→setChannel(0, Public),setChannel(1, MyChan)—num_channelsостаётся1 - Скан 0..MAX —
TerminalCLIне найден →addChannel("TerminalCLI")→ пишет вchannels[1]← затирает MyChan
Чаще всего проявлялось при обновлении с прошивки без TerminalCLI на прошивку с ним.
src/helpers/BaseChatMesh.cpp, функция setChannel():
if (idx >= num_channels) num_channels = idx + 1;После loadChannels() num_channels отражает реальное количество занятых слотов,
и addChannel("TerminalCLI") записывается следующим, не затирая загруженные каналы.
Механизм проверки и авто-регистрации TerminalCLI при отсутствии уже существовал
(MyMesh.cpp:1043–1057) и продолжает работать корректно.
CLOCK-страница на всех NRF52 companion-нодах (ProMicro, GAT562 и др.) показывала неизменное время независимо от настроек синхронизации.
examples/companion_radio/ui-new/UITask.cpp, CLOCK page:
time_t now = time(nullptr); // POSIX timeНа ESP32 setCurrentTime() вызывает settimeofday() — системное POSIX-время
обновляется, time() возвращает правильное значение.
На NRF52 нет hardware RTC на ProMicro/GAT562 → используется VolatileRTCClock.
Его setCurrentTime() обновляет внутренний base_time, но не вызывает settimeofday().
time(nullptr) возвращает 0 вне зависимости от сетевой синхронизации.
// было:
time_t now = time(nullptr);
// стало:
time_t now = (time_t)_rtc->getCurrentTime();_rtc (VolatileRTCClock) корректно обновляется при сетевой синхронизации через
TimeSyncHelper. localtime_r и strftime не изменились.
Все NRF52 companion-варианты: ProMicro (все модификации), RAK 4631, RAK 3401, LilyGo T-Echo / T-Echo Lite, GAT562 (все варианты), ikoka (handheld / nano / stick), KeepteenLT1, Mesh Pocket, Meshtiny, Minewsemi, Nano G2 Ultra, R1Neo, SenseCap Solar, Heltec t096 / t114, ThinkNode M1 / M3 / M6, WioTrackerL1 / Eink, wio_wm1110, Xiao nRF52.
Также RP2040 и STM32 companion-варианты (PicoW, RAK 11310, waveshare, wio-e5).
На ESP32 часы работали корректно до фикса — изменение не влияет на их поведение.