2022-10-27 17:07:07 +00:00
|
|
|
/*
|
2024-01-23 16:10:19 +00:00
|
|
|
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
|
2022-10-27 17:07:07 +00:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
|
#include "esp_err.h"
|
|
|
|
#include "esp_netif_types.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @defgroup ESP_NETIF_SNTP_API ESP-NETIF SNTP API
|
|
|
|
* @brief SNTP API for underlying TCP/IP stack
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** @addtogroup ESP_NETIF_SNTP_API
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Time sync notification function
|
|
|
|
*/
|
|
|
|
typedef void (*esp_sntp_time_cb_t)(struct timeval *tv);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Utility macro for providing multiple servers in parentheses
|
|
|
|
*/
|
|
|
|
#define ESP_SNTP_SERVER_LIST(...) { __VA_ARGS__ }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Default configuration to init SNTP with multiple servers
|
|
|
|
* @param servers_in_list Number of servers in the list
|
|
|
|
* @param list_of_servers List of servers (use ESP_SNTP_SERVER_LIST(...))
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#define ESP_NETIF_SNTP_DEFAULT_CONFIG_MULTIPLE(servers_in_list, list_of_servers) { \
|
2023-05-12 07:08:53 +00:00
|
|
|
.smooth_sync = false, \
|
|
|
|
.server_from_dhcp = false, \
|
|
|
|
.wait_for_sync = true, \
|
|
|
|
.start = true, \
|
|
|
|
.sync_cb = NULL, \
|
|
|
|
.renew_servers_after_new_IP = false, \
|
|
|
|
.ip_event_to_renew = IP_EVENT_STA_GOT_IP, \
|
|
|
|
.index_of_first_server = 0, \
|
|
|
|
.num_of_servers = (servers_in_list), \
|
|
|
|
.servers = list_of_servers, \
|
2022-10-27 17:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Default configuration with a single server
|
|
|
|
*/
|
|
|
|
#define ESP_NETIF_SNTP_DEFAULT_CONFIG(server) \
|
|
|
|
ESP_NETIF_SNTP_DEFAULT_CONFIG_MULTIPLE(1, {server})
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief SNTP configuration struct
|
|
|
|
*/
|
|
|
|
typedef struct esp_sntp_config {
|
|
|
|
bool smooth_sync; ///< set to true if smooth sync required
|
|
|
|
bool server_from_dhcp; ///< set to true to request NTP server config from DHCP
|
|
|
|
bool wait_for_sync; ///< if true, we create a semaphore to signal time sync event
|
|
|
|
bool start; ///< set to true to automatically start the SNTP service
|
|
|
|
esp_sntp_time_cb_t sync_cb; ///< optionally sets callback function on time sync event
|
|
|
|
bool renew_servers_after_new_IP; ///< this is used to refresh server list if NTP provided by DHCP (which cleans other pre-configured servers)
|
|
|
|
ip_event_t ip_event_to_renew; ///< set the IP event id on which we refresh server list (if renew_servers_after_new_IP=true)
|
|
|
|
size_t index_of_first_server; ///< refresh server list after this server (if renew_servers_after_new_IP=true)
|
|
|
|
size_t num_of_servers; ///< number of preconfigured NTP servers
|
|
|
|
const char* servers[CONFIG_LWIP_SNTP_MAX_SERVERS]; ///< list of servers
|
|
|
|
} esp_sntp_config_t;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Initialize SNTP with supplied config struct
|
|
|
|
* @param config Config struct
|
|
|
|
* @return ESP_OK on success
|
|
|
|
*/
|
|
|
|
esp_err_t esp_netif_sntp_init(const esp_sntp_config_t * config);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Start SNTP service
|
|
|
|
* if it wasn't started during init (config.start = false)
|
|
|
|
* or restart it if already started
|
|
|
|
* @return ESP_OK on success
|
|
|
|
*/
|
|
|
|
esp_err_t esp_netif_sntp_start(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Deinitialize esp_netif SNTP module
|
|
|
|
*/
|
|
|
|
void esp_netif_sntp_deinit(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Wait for time sync event
|
|
|
|
* @param tout Specified timeout in RTOS ticks
|
|
|
|
* @return ESP_TIMEOUT if sync event didn't came withing the timeout
|
|
|
|
* ESP_ERR_NOT_FINISHED if the sync event came, but we're in smooth update mode and still in progress (SNTP_SYNC_STATUS_IN_PROGRESS)
|
|
|
|
* ESP_OK if time sync'ed
|
|
|
|
*/
|
|
|
|
esp_err_t esp_netif_sntp_sync_wait(TickType_t tout);
|
|
|
|
|
2024-01-23 16:10:19 +00:00
|
|
|
/**
|
|
|
|
* @brief Returns SNTP server's reachability shift register as described in RFC 5905.
|
|
|
|
*
|
|
|
|
* @param index Index of the SERVER
|
|
|
|
* @param reachability reachability shift register
|
|
|
|
* @return ESP_OK on success,
|
|
|
|
* ESP_ERR_INVALID_STATE if SNTP not initialized
|
|
|
|
* ESP_ERR_INVALID_ARG if invalid arguments
|
|
|
|
*/
|
|
|
|
esp_err_t esp_netif_sntp_reachability(unsigned int index, unsigned int *reachability);
|
|
|
|
|
2022-10-27 17:07:07 +00:00
|
|
|
/**
|
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|