Skip to content

bugfix channel clock

rogovogor edited this page May 15, 2026 · 2 revisions

Bugfixes: TerminalCLI channel overwrite + clock on NRF52 / Фиксы: TerminalCLI перетирал канал + часы на NRF52

[English] · [Русский]


English

Files: src/helpers/BaseChatMesh.cpp, examples/companion_radio/ui-new/UITask.cpp


1. TerminalCLI was overwriting the last user channel

Symptom

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.

Cause

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:

  1. addChannel("Public", …)channels[0], num_channels = 1
  2. loadChannels()setChannel(0, Public), setChannel(1, MyChan)num_channels stays 1
  3. Scan 0..MAX — TerminalCLI not found → addChannel("TerminalCLI") → writes to channels[1]overwrites MyChan

Most commonly observed when upgrading from a firmware without TerminalCLI to one that includes it.

Fix

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.


2. Clock was not working on NRF52 boards

Symptom

The CLOCK page on all NRF52 companion nodes (ProMicro, GAT562, etc.) showed a frozen time regardless of synchronization settings.

Cause

examples/companion_radio/ui-new/UITask.cpp, CLOCK page:

time_t now = time(nullptr);   // POSIX time

On 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.

Fix

// 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.

Affected platforms

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


1. TerminalCLI перетирал последний пользовательский канал

Симптом

После обновления прошивки (или при первом появлении WITH_COMPANION_CLI) канал, добавленный пользователем, исчезал и заменялся каналом TerminalCLI.

Причина

addChannel() использует num_channels как индекс следующей записи. loadChannels() восстанавливает каналы через setChannel(idx, ch) — прямая запись в массив по индексу, num_channels при этом не обновлялась.

Последовательность при старте:

  1. addChannel("Public", …)channels[0], num_channels = 1
  2. loadChannels()setChannel(0, Public), setChannel(1, MyChan)num_channels остаётся 1
  3. Скан 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) и продолжает работать корректно.


2. Часы не работали на NRF52 платах

Симптом

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 часы работали корректно до фикса — изменение не влияет на их поведение.

Clone this wiki locally