feat(reticulum): complete messaging, calls, and P4 support

Add official Sideband/LXST messaging and telephony flows, realtime resource ownership, call and ping UI, durable unread state, and bounded Nomad/Micron browsing.

Integrate ESP32-P4/C6 gateway transport, TinyUSB CDC, ES8311 audio, shared Codec2 call media, Reticulum defaults, compatibility settings, and conformance coverage.
This commit is contained in:
liu weikai
2026-07-14 22:36:07 +08:00
parent 427f610a5c
commit f7d6599310
122 changed files with 10954 additions and 1046 deletions
+41
View File
@@ -326,6 +326,7 @@ if(BUILD_TESTING)
add_executable(trailmate_reticulum_supported_subset_vectors_smoke
"${TRAIL_MATE_REPO_ROOT}/tests/reticulum_conformance/test_reticulum_supported_subset_vectors.cpp"
"${TRAIL_MATE_REPO_ROOT}/modules/core_chat/src/infra/lxmf/lxmf_wire.cpp"
"${TRAIL_MATE_REPO_ROOT}/modules/core_chat/src/infra/reticulum/lxst_telephony_wire.cpp"
"${TRAIL_MATE_REPO_ROOT}/modules/core_chat/src/infra/reticulum/reticulum_wire.cpp")
target_include_directories(trailmate_reticulum_supported_subset_vectors_smoke
PRIVATE
@@ -562,6 +563,35 @@ if(BUILD_TESTING)
add_test(NAME trailmate_runtime_async_smoke
COMMAND trailmate_runtime_async_smoke)
add_executable(trailmate_app_config_defaults_smoke
"${TRAIL_MATE_REPO_ROOT}/modules/core_sys/tests/test_app_config_defaults.cpp")
target_include_directories(trailmate_app_config_defaults_smoke
PRIVATE
"${TRAIL_MATE_REPO_ROOT}/modules/core_sys/include"
"${TRAIL_MATE_REPO_ROOT}/modules/core_chat/include")
target_compile_definitions(trailmate_app_config_defaults_smoke
PRIVATE TRAIL_MATE_LORA_TX_POWER_MAX_DBM=22)
target_compile_features(trailmate_app_config_defaults_smoke
PRIVATE cxx_std_17)
add_test(NAME trailmate_app_config_defaults_smoke
COMMAND trailmate_app_config_defaults_smoke)
# MinGW.org's libstdc++ is built without gthreads and does not expose
# std::mutex. Linux and modern host toolchains exercise this runtime test.
if(NOT MINGW)
add_executable(trailmate_reticulum_call_runtime_smoke
"${TRAIL_MATE_REPO_ROOT}/modules/core_sys/tests/test_reticulum_call_runtime.cpp"
"${TRAIL_MATE_REPO_ROOT}/modules/core_sys/src/platform/ui/reticulum_call_runtime.cpp"
"${TRAIL_MATE_REPO_ROOT}/modules/core_sys/src/sys/clock.cpp")
target_include_directories(trailmate_reticulum_call_runtime_smoke
PRIVATE
"${TRAIL_MATE_REPO_ROOT}/modules/core_sys/include")
target_compile_features(trailmate_reticulum_call_runtime_smoke
PRIVATE cxx_std_17)
add_test(NAME trailmate_reticulum_call_runtime_smoke
COMMAND trailmate_reticulum_call_runtime_smoke)
endif()
add_executable(trailmate_storage_event_runtime_smoke
"${TRAIL_MATE_REPO_ROOT}/modules/core_sys/tests/test_storage_event_runtime.cpp")
target_include_directories(trailmate_storage_event_runtime_smoke
@@ -645,6 +675,17 @@ if(BUILD_TESTING)
add_test(NAME trailmate_network_micron_markup_contract_smoke
COMMAND trailmate_network_micron_markup_contract_smoke)
add_executable(trailmate_network_micron_renderer_fixture_smoke
"${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/tests/test_network_micron_renderer_fixture.cpp"
"${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/src/ui/screens/network/micron_markup_contract.cpp")
target_include_directories(trailmate_network_micron_renderer_fixture_smoke
PRIVATE
"${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/include")
target_compile_features(trailmate_network_micron_renderer_fixture_smoke
PRIVATE cxx_std_17)
add_test(NAME trailmate_network_micron_renderer_fixture_smoke
COMMAND trailmate_network_micron_renderer_fixture_smoke)
add_executable(trailmate_pinyin_lookup_smoke
"${TRAIL_MATE_REPO_ROOT}/modules/ui_shared/tests/test_pinyin_lookup.cpp")
target_include_directories(trailmate_pinyin_lookup_smoke
@@ -111,6 +111,48 @@ int main()
rtdir::bind_mesh_peer_directory(nullptr);
assert(std::strcmp(rtdir::lxmf_addresses_path(), "/mesh/peers.bin") == 0);
rtdir::AnnounceRecord announce{};
announce.valid = true;
for (std::size_t index = 0; index < rtdir::kReticulumHashSize; ++index)
{
announce.destination_hash[index] = static_cast<uint8_t>(0x10U + index);
announce.identity_hash[index] = static_cast<uint8_t>(0x30U + index);
}
announce.aspect = rtdir::AnnounceAspect::LxmfDelivery;
announce.source = rtdir::EntrySource::RuntimeRx;
announce.first_seen_s = 10;
announce.last_seen_s = 20;
announce.hops = 2;
announce.delivery = true;
std::snprintf(announce.display_name,
sizeof(announce.display_name),
"%s",
"first announce");
assert(rtdir::record_announce(announce).saved);
announce.first_seen_s = 30;
announce.last_seen_s = 40;
announce.hops = 1;
std::snprintf(announce.display_name,
sizeof(announce.display_name),
"%s",
"updated announce");
assert(rtdir::record_announce(announce).saved);
rtdir::AnnounceRecord loaded_announces[2] = {};
std::size_t loaded_announce_count = 0;
const rtdir::Status announce_load_status =
rtdir::load_announces(loaded_announces,
2,
&loaded_announce_count);
assert(announce_load_status.loaded);
assert(loaded_announce_count == 1);
assert(loaded_announces[0].first_seen_s == 10);
assert(loaded_announces[0].last_seen_s == 40);
assert(loaded_announces[0].hops == 1);
assert(std::strcmp(loaded_announces[0].display_name,
"updated announce") == 0);
rtdir::LxmfAddressRecord alpha = make_address("alpha trail", true, true);
char alpha_destination[rtpage::kReticulumPageDestinationTextSize] = {};
format_hash_hex(alpha.destination_hash,