/* SPDX-License-Identifier: MIT Copyright (c) 2023 Casey Reeves and the LuminaSensum contributors Copyright (c) 2023 John Watts and the LuminaSensum contributors */ #include "ButtonThread.h" #include "Clock.h" #include "Filesystem.h" #include "FlashErase.h" #include "MainBD.h" #include "MainFilesystem.h" #include "MyUSBMSD.h" #include "NetworkHandler.h" #include "mbed-trace/mbed_trace.h" #include "mbed.h" #define TRACE_GROUP "APP" #if MBED_CONF_MBED_TRACE_ENABLE // mutex setup for tracing in thread safe mode static Mutex traceMutex; static void trace_mutex_wait() { traceMutex.lock(); } static void trace_mutex_release() { traceMutex.unlock(); } void setup_tracing(void) { char trace_filters[] = "APP,FS,FLER,NET,SNTP,USBM"; mbed_trace_mutex_wait_function_set(trace_mutex_wait); mbed_trace_mutex_release_function_set(trace_mutex_release); mbed_trace_init(); mbed_trace_include_filters_set(trace_filters); mbed_trace_config_set(TRACE_ACTIVE_LEVEL_ALL); tr_debug("Debug tracing enabled"); tr_info("Info tracing enabled"); tr_warn("Warning tracing enabled"); tr_err("Error tracing enabled"); } #else void setup_tracing(void) { // do nothing } #endif int main() { setup_tracing(); tr_info("Project Tardis"); clock_setup(); tr_info("The time is %s", clock_iso8601string()); mountFilesystem(mainBD, mainFS); Thread buttonThread; buttonThread.start(buttonTask); network_init(); network_connect(); while (true) { int presses = waitForPresses(600s); if (presses == 1) { unmountFilesystem(mainBD, mainFS); doUSBMSD(mainBD); mountFilesystem(mainBD, mainFS); } if (presses == 2) { unmountFilesystem(mainBD, mainFS); doErase(mainBD); } if (presses == 3) { if (!network_is_connected()) { tr_err("Can't sync clock without network " "connection!"); continue; } NetworkInterface *net = network_interface(); tr_info("Syncing clock..."); tr_info("The current time is %s", clock_iso8601string()); SNTPError err = clock_sync(*net); if (err != SNTPSuccess) { tr_err("Failed to sync clock, error %i", err); } else { tr_info("The new time is %s", clock_iso8601string()); } for (int i = 0; i < 5; ++i) { std::chrono::microseconds now = clock_now(); now += std::chrono::seconds(1); now = std::chrono::floor<std::chrono::seconds>( now); kernel_timepoint wait_time = kernel_time(now); ThisThread::sleep_until(wait_time); tr_info("Slept to nearest second. The new time " "is %s", clock_iso8601string()); } } } unmountFilesystem(mainBD, mainFS); buttonThread.terminate(); return 0; }