Hi! I am trying to sync the time on my nrf9160dk with date_time_now() or date_time_uptime_to_unix_time_ms() but it seems that they return a very low unix_time_ms (only 1089262423ms). This is my code:
static K_SEM_DEFINE(write_done_sem, 0, 1); // Starts at 0; max count is 1
static K_SEM_DEFINE(read_done_sem, 0, 1);
static K_SEM_DEFINE(lte_connected, 0, 1);
static K_SEM_DEFINE(date_time_obtained, 0, 1);
static void date_time_evt_handler(const struct date_time_evt *evt)
{
switch (evt->type) {
case DATE_TIME_OBTAINED_NTP:
printk("\r\nDate and time obtained from NTP\n");
k_sem_give(&date_time_obtained);
break;
case DATE_TIME_OBTAINED_MODEM:
printk("\r\nDate and time obtained from modem\n");
k_sem_give(&date_time_obtained);
break;
case DATE_TIME_OBTAINED_EXT:
printk("\r\nDate and time obtained from external source\n");
k_sem_give(&date_time_obtained);
break;
case DATE_TIME_NOT_OBTAINED:
printk("\r\nDate and time not obtained\n");
k_sem_give(&date_time_obtained);
break;
default:
break;
}
}
static void lte_handler(const struct lte_lc_evt *const evt)
{
switch (evt->type) {
case LTE_LC_EVT_NW_REG_STATUS:
if ((evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &&
(evt->nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING)) {
break;
}
printk("\r\nNetwork registration status: %s",
evt->nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ?
"Connected - home network" : "Connected - roaming");
k_sem_give(<e_connected);
break;
case LTE_LC_EVT_RRC_UPDATE:
printk("\r\nRRC mode: %s", evt->rrc_mode == LTE_LC_RRC_MODE_CONNECTED ?
"Connected" : "Idle");
break;
default:
break;
}
}
static int modem_configure(void)
{
int err;
err = nrf_modem_lib_init();
if (err) {
printk("Failed to initialize the modem library, error: %d", err);
return err;
}
/* lte_lc_init deprecated in >= v2.6.0 */
#if NCS_VERSION_NUMBER < 0x20600
err = lte_lc_init();
if (err) {
printk("Failed to initialize LTE link control library, error: %d", err);
return err;
}
#endif
date_time_register_handler(date_time_evt_handler);
printk("\r\nConnecting to LTE network");
err = lte_lc_connect_async(lte_handler);
if (err) {
printk("Error in lte_lc_connect_async, error: %d", err);
return err;
}
k_sem_take(<e_connected, K_FOREVER);
printk("\r\nWaiting for date and time\n");
k_sem_take(&date_time_obtained, K_SECONDS(30));
printk("\r\nDate and time obtained\n");
if (!date_time_is_valid()) {
printk("\r\nDate and time is not valid\n");
return -1;
}
else{
printk("\r\nDate and time is valid\n");
}
return 0;
}
void main(void){
ret = modem_configure();
if (ret) {
printk("Failed to configure the modem");
return 0;
}
current_time = 0;
date_time_now(¤t_time);
printk("\r\nCurrent time: %lld\n", current_time);
}
and my prj.conf:
CONFIG_LTE_AUTO_INIT_AND_CONNECT=n CONFIG_LTE_LINK_CONTROL=y CONFIG_NRF_MODEM_LIB=y CONFIG_DATE_TIME_NTP=y # CONFIG_DATE_TIME_MODEM=n #I've tried all combination of these two and it gives me the same result CONFIG_DATE_TIME=y CONFIG_DATE_TIME_NTP_QUERY_TIME_SECONDS=25 CONFIG_AT_HOST_LIBRARY=y # Network CONFIG_NETWORKING=y CONFIG_NET_NATIVE=n CONFIG_NET_SOCKETS=y CONFIG_NET_SOCKETS_OFFLOAD=y CONFIG_NET_SOCKETS_POSIX_NAMES=y CONFIG_LOG=y
I am a bit lost since it feels like i have done everything correctly since it connects and goes into RRC mode before instantly updating the time but the final time is just wrong.
Best,
Ray