跳转至

TIME (v1.1)

本页保留完整源码摘录,按文件展开阅读。先看设计说明了解数据流、接口和算法,再核对实现;源码摘录可能属于历史版本,当前实现请以所选工程为准。

tiny_time.h

展开 tiny_time.h · 99 行
/**
 * @file tiny_time.h
 * @author SHUAIWEN CUI (SHUAIWEN001@e.ntu.edu.sg)
 * @brief Submodule for TinyToolbox - header file
 * @version 1.1
 * @date 2025-04-10
 * @copyright Copyright (c) 2025
 *
 */

#pragma once

/* ================================ DEPENDENCIES ================================ */
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include "esp_log.h"
#include "esp_timer.h"
#include "esp_sntp.h"
#include "node_rtc.h"
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"

#ifdef __cplusplus
extern "C"
{
#endif

/* ================================ DEFINITIONS ================================= */

typedef int64_t TinyTimeMark_t;

typedef struct TinyDateTime_t
{
    int     year;
    int     month;
    int     day;
    int     hour;
    int     minute;
    int     second;
    int32_t microsecond;
} TinyDateTime_t;

typedef struct TinyNtpSync_t
{
    uint32_t unix_sec;
    uint64_t local_us_anchor;
    uint64_t last_sync_time_us;
    uint8_t  sync_quality;
    bool     is_synced;
} TinyNtpSync_t;

/* ================================ FUNCTIONS =================================== */

/* LOCAL RUNNING TIME */
TinyTimeMark_t tiny_get_running_time(void);

/* WORLD CURRENT TIME - SNTP */
void sync_time_with_timezone(const char *timezone_str);

/* WORLD CURRENT TIME - GET */
TinyDateTime_t tiny_get_current_datetime(bool print_flag);

/* UNIX TIMESTAMP CONVERSION */
bool     tiny_unix_to_datetime(uint32_t unix_sec, TinyDateTime_t *dt);
bool     tiny_unix_us_to_datetime(uint64_t unix_us, TinyDateTime_t *dt);
uint32_t tiny_datetime_to_unix(const TinyDateTime_t *dt);
bool     tiny_is_valid_datetime(const TinyDateTime_t *dt);

static inline bool tiny_is_leap_year(uint16_t year)
{
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

/* TIME FORMATTING AND DISPLAY */
int tiny_format_datetime_iso8601(const TinyDateTime_t *dt, char *buf, size_t buflen);
int tiny_format_datetime_us(const TinyDateTime_t *dt, char *buf, size_t buflen);
int tiny_format_datetime_ms(const TinyDateTime_t *dt, char *buf, size_t buflen);
int tiny_format_unix_sec(uint32_t unix_sec, char *buf, size_t buflen);
int tiny_format_unix_us(uint64_t unix_us, char *buf, size_t buflen);
int tiny_format_duration_us(uint64_t duration_us, char *buf, size_t buflen);

/* NTP SYNCHRONIZATION HOOK */
void tiny_ntp_set_sync_hook(bool (*hook)(uint32_t unix_sec));

/* NTP SYNCHRONIZATION */
bool     tiny_ntp_record_sync(uint32_t unix_sec);
uint64_t tiny_ntp_get_world_time_us(void);
bool     tiny_ntp_get_sync_info(TinyNtpSync_t *sync_info);
bool     tiny_ntp_is_synced(void);
void     tiny_ntp_set_quality(uint8_t quality);
bool     tiny_ntp_get_datetime_us(TinyDateTime_t *dt);

#ifdef __cplusplus
}
#endif