85 lines
3.4 KiB
C
85 lines
3.4 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#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;
|
|
}
|