Files
trail-mate/apps/nrf52_node/src/nrf52_node_startup_runtime.cpp
T

89 lines
3.7 KiB
C++

#include "nrf52_node_startup_runtime.h"
#include <Arduino.h>
#include "nrf52_node_app_facade_runtime.h"
#include "nrf52_node_app_runtime_access.h"
#include "nrf52_node_target_board.h"
#include "nrf52_node_ui_runtime.h"
#include "platform/nrf52/debug/nrf52_debug_console.h"
#include "sys/clock.h"
#include <nrf.h>
namespace trailmate::apps::nrf52_node::startup_runtime
{
namespace
{
void logAndClearResetReason()
{
const uint32_t reason = NRF_POWER->RESETREAS;
platform::nrf52::debug_console::printf("%s resetreas raw=0x%08lX pin=%u dog=%u sreq=%u lockup=%u off=%u vbus=%u\n",
target_board::kLogTag,
static_cast<unsigned long>(reason),
(reason & POWER_RESETREAS_RESETPIN_Msk) ? 1U : 0U,
(reason & POWER_RESETREAS_DOG_Msk) ? 1U : 0U,
(reason & POWER_RESETREAS_SREQ_Msk) ? 1U : 0U,
(reason & POWER_RESETREAS_LOCKUP_Msk) ? 1U : 0U,
(reason & POWER_RESETREAS_OFF_Msk) ? 1U : 0U,
(reason & POWER_RESETREAS_VBUS_Msk) ? 1U : 0U);
if (reason != 0)
{
NRF_POWER->RESETREAS = reason;
}
}
} // namespace
void run()
{
platform::nrf52::debug_console::begin();
platform::nrf52::debug_console::println();
logAndClearResetReason();
platform::nrf52::debug_console::printf("%s startup begin\n", target_board::kLogTag);
auto& board = target_board::instance();
platform::nrf52::debug_console::printf("%s startup board begin\n", target_board::kLogTag);
(void)board.begin();
platform::nrf52::debug_console::printf("%s startup board ok\n", target_board::kLogTag);
sys::set_millis_provider([]() -> uint32_t
{ return millis(); });
sys::set_epoch_seconds_provider([]() -> uint32_t
{ return target_board::instance().currentEpochSeconds(); });
sys::set_sleep_provider([](uint32_t ms)
{ delay(ms); });
platform::nrf52::debug_console::printf("%s startup ui begin\n", target_board::kLogTag);
ui_runtime::initialize();
platform::nrf52::debug_console::printf("%s startup ui ok\n", target_board::kLogTag);
ui_runtime::appendBootLog("startup begin");
ui_runtime::appendBootLog("board/input ok");
platform::nrf52::debug_console::printf("%s startup radio bind\n", target_board::kLogTag);
(void)board.bindRadioIo();
const bool lora_ok = board.beginRadioIo();
platform::nrf52::debug_console::printf("%s startup lora io %s\n", target_board::kLogTag, lora_ok ? "ok" : "failed");
ui_runtime::appendBootLog(lora_ok ? "lora io ok" : "lora io fail");
if (app_runtime_access::initialize())
{
const auto& cfg = AppFacadeRuntime::instance().readConfig();
ui_runtime::bindChatObservers();
(void)board.startGpsRuntime(cfg);
platform::nrf52::debug_console::printf("%s startup app facade ok\n", target_board::kLogTag);
ui_runtime::appendBootLog("app/gps ok");
char freq_text[20] = {};
if (board.formatLoraFrequencyMHz(board.activeLoraFrequencyHz(), freq_text, sizeof(freq_text)))
{
ui_runtime::appendBootLog(freq_text);
}
ui_runtime::appendBootLog(cfg.mesh_protocol == chat::MeshProtocol::MeshCore ? "proto MC" : "proto MT");
}
else
{
platform::nrf52::debug_console::printf("%s startup app facade failed\n", target_board::kLogTag);
ui_runtime::appendBootLog("app init fail");
}
}
} // namespace trailmate::apps::nrf52_node::startup_runtime