#include #include #include "ql_func.h" #include "ql_rtc.h" #include "ql_rtos.h" #include "ql_dev.h" #include "build_macro.h" #include "time_diag.h" #include "../../../../ql-config/config/talkingq_time_diag.h" void talkingq_time_diag_log(const char *phase) { talkingq_time_diag_snapshot_fn snapshot; talkingq_time_diag_snapshot s; int ret; snapshot = m_get_api_ptr ? (talkingq_time_diag_snapshot_fn) m_get_api_ptr(TALKINGQ_TIME_DIAG_API_NAME) : NULL; if (!snapshot) { printf("[TIME-DIAG] phase=%s ticks=%lu kernel_diag=unavailable " "need_matching_diagnostic_kernel=1\r\n", phase, (unsigned long)ql_rtos_get_systicks()); return; } memset(&s, 0, sizeof(s)); ret = snapshot(&s, sizeof(s)); if (ret != 0 || s.abi_version != TALKINGQ_TIME_DIAG_ABI_VERSION) { printf("[TIME-DIAG] phase=%s kernel_diag=abi_mismatch rc=%d abi=%u\r\n", phase, ret, s.abi_version); return; } printf("[TIME-DIAG] phase=%s ticks=%u abi=%u rtc_init=%u " "counter=%lu sys_offset=%lu app_offset=%lu " "sys_raw=%lu app_raw=%lu follows_sys=%u app_ever=%u storage=%d\r\n", phase, s.sample_ticks, s.abi_version, s.rtc_initialized, (unsigned long)s.counter, (unsigned long)s.sys_offset, (unsigned long)s.app_offset, (unsigned long)(s.counter + s.sys_offset), (unsigned long)(s.counter + s.app_offset), s.app_follows_sys, s.app_ever_configured, s.offset_storage); printf("[TIME-DIAG] phase=%s ticks=%u net_tz_min=%d rtc_tz_hour=%d source=%d " "ntp_type=%d ntp_status=%d ntp_ready=%d gnss_rtc=%d cid=%d " "triggers=%d dns_attempted=%d ntp_ip=%.31s\r\n", phase, s.sample_ticks, s.network_tz_minutes, s.rtc_tz_hours, s.rtc_source, s.ntp_type, s.ntp_status, s.ntp_ready, s.gnss_rtc_status, s.gnss_cid, s.ntp_triggers, s.ntp_dns_attempted, s.ntp_server); } void talkingq_time_diag_boot(void) { char firmware[128] = {0}; int ret = ql_dev_get_firmware_version(firmware, sizeof(firmware)); firmware[sizeof(firmware) - 1] = '\0'; printf("[TIME-DIAG] boot app_ver=%s app_build=%s app_rev=%s " "diag_build=%s %s firmware_rc=%d firmware=%s\r\n", CUSTOM_APP_BUILD_VER, CUSTOM_APP_BUILD_TIME, CUSTOM_APP_BUILD_REV, __DATE__, __TIME__, ret, firmware); talkingq_time_diag_log("boot-before-nitz"); } time_t talkingq_time_diag_wss_time(void) { time_t original; time_t with_pointer; time_t pointer_value = 1; ql_rtc_time_t rtc; int rtc_ret; /* Capture raw flags first. Do not replace or correct the existing gate. */ talkingq_time_diag_log("wss-before-time-read"); original = time(NULL); with_pointer = time(&pointer_value); memset(&rtc, 0, sizeof(rtc)); rtc_ret = ql_rtc_get_time(&rtc); printf("[TIME-DIAG] phase=wss-precheck ticks=%lu time_null=%ld " "time_ptr_return=%ld time_ptr_value=%ld rtc_rc=%d " "app_calendar=%04d-%02d-%02dT%02d:%02d:%02d min_epoch=1704067200 valid=%d\r\n", (unsigned long)ql_rtos_get_systicks(), (long)original, (long)with_pointer, (long)pointer_value, rtc_ret, rtc.tm_year, rtc.tm_mon, rtc.tm_mday, rtc.tm_hour, rtc.tm_min, rtc.tm_sec, original >= 1704067200); talkingq_time_diag_log("wss-after-time-read"); return original; }