FULL-C: time functions: Porovnání verzí
Řádek 79: | Řádek 79: | ||
== Příklady == | == Příklady == | ||
− | + | Následující příklad přečte UTC EPOCH čas ze systému (index 139) a převede to na jednotlivé položky do struktury tmp (definována jako: struct tm). | |
+ | |||
+ | <syntaxhighlight lang="c"> | ||
+ | struct tm | ||
+ | { | ||
+ | int tm_sec; // seconds after the minute [0-60] | ||
+ | int tm_min; // minutes after the hour [0-59] | ||
+ | int tm_hour; // hours since midnight [0-23] | ||
+ | int tm_mday; // day of the month [1-31] | ||
+ | int tm_mon; // months since January [0-11] | ||
+ | int tm_year; // years since 1900 | ||
+ | int tm_wday; // days since Sunday [0-6] | ||
+ | int tm_yday; // days since January 1 [0-365] | ||
+ | // | ||
+ | int tm_isdst; // Daylight Saving Time flag | ||
+ | int tm_gmtoff; // offset from UTC in seconds | ||
+ | }; | ||
+ | |||
+ | void main(void) | ||
+ | { | ||
+ | unsigned int systemUTC; | ||
+ | struct tm tmp; | ||
+ | |||
+ | printf("time converstion test - localtime\n"); | ||
+ | |||
+ | // get NTP UTC time | ||
+ | systemUTC = SDS_get_u32(139); | ||
+ | |||
+ | localtime(&systemUTC, (void *)&tmp); | ||
+ | |||
+ | printf("%02u:%02u:%02u\n", tmp.tm_hour, tmp.tm_min, tmp.tm_sec); | ||
+ | printf("%u.%u.%u\n", tmp.tm_mday, tmp.tm_mon+1, tmp.tm_year+1900); | ||
+ | } | ||
+ | </syntaxhighlight> |
Verze z 11. 7. 2022, 17:58
Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.
Funkce pro převod časových struktur
POZOR - tyto C funkce jsou dostupné až pro firmware od 11.7.2022
Zařízení SDS pracuje s různou reprezentací časové značky - ta může být poskytována a zpracována jako počet sekund od určeného data (tzv. EPOCH čas), nebo v "položkově-rozpadnuté" formě ve formě jednotlivých časových údajů (hodina, minuta, sekunda atd.), uložených ve společné struktuře.
Za účelem převodu jsou k dispozici tyto funkce:
unsigned int mktime(void * timeptr); void gmtime(unsigned int * timer, void * timeptr); void localtime(unsigned int * timer, void * timeptr);
Struktura "tm"
Položky označené jako " * timeptr " jsou ukazatele na strukturu tm.
Struktura tm je pro účely FULL-C, definována takto:
struct tm { int tm_sec; // seconds after the minute [0-60] int tm_min; // minutes after the hour [0-59] int tm_hour; // hours since midnight [0-23] int tm_mday; // day of the month [1-31] int tm_mon; // months since January [0-11] int tm_year; // years since 1900 int tm_wday; // days since Sunday [0-6] int tm_yday; // days since January 1 [0-365] // int tm_isdst; // Daylight Saving Time flag int tm_gmtoff; // offset from UTC in seconds };
- tm_isdst : pouze pro čtení, vyplněno funkcí localtime() a gmtime(), hodnota je ignorována funkcí mktime()
- tm_gmtoff : pouze pro čtení, vyplněno funkcí localtime() a gmtime(), hodnota je ignorována funkcí mktime()
Čas v SDS
SDS primárně využívá NTP pro pravidelnou časovou synchronizaci. SDS tedy pravidelně pomocí NTP aktualizuje svůj interní čas, který udržuje platný.
Interně je čas v SDS udržován jako hodnota EPOCH vůči UTC.
Uživatel může nastavit offset (v hodinách) vůči UTC a také zapnout automatický posun pro letní čas (dle pravidel CEST / CET).
V případě, že nechcete aby SDS využívalo NTP, lze NTP v nastavení vypnout. Čas pak musíte celému systému dodat sami, zápisem do příslušných indexů (viz seznam). Typicky se toto používá pokud získáváte čas z jiných zdrojů (GSM/LTE nebo např. LoRA síť).
mktime()
Funkce mktime převede položkově rozpadnutý čas (obsah struktury tm) na epoch čas. Při převodu není aplikován jakýkoliv offset a není aplikován letní čas.
Epoch čas je často vyžadován např. pro známkování dat při přenosu po síti atd. - zejména protože se vždy vleze do 32 bitů, a tak zabírá minimum místa.
gmtime() a localtime()
Funkce převedou hodnotu ze vstupu (na který ukazuje "timer") na obsah struktury (na kterou ukazuje "timeptr").
gmtime() provede přímý "čistý" převod, tedy bez aplikace jakýchkoliv offsetů a posunů.
localtime() provede to samé co gmtime() ale s aplikací (1) letního času a za (2) nastaveného NTP offsetu. Letní čas je aplikován jen pouze pokud je právě aktivní (indikováno v tm_isdst, odpovídá hodnotě na indexu 65). Hodnota offsetu je zapsána do tm_gmtoff - jedná se o hodnotu nastavenou uživatelem v administraci (položka "NTP offset") - respektive lze číst jako proměnnou na indexu 26.
Pozn.: Aktuální systémový lokální čas (tedy UTC čas s aplikací letního času a offsetu) je k dispozici na indexu 4 - a rozpad pak na indexech 5 až 11, viz seznam všech položek.
Kde je funkce time() ?
Funkce time() není v SDS definována, protože UTC čas systému (tedy výstup takovéto funkce) získáte přímo čtením hodnoty na indexu 139.
Příklady
Následující příklad přečte UTC EPOCH čas ze systému (index 139) a převede to na jednotlivé položky do struktury tmp (definována jako: struct tm).
struct tm
{
int tm_sec; // seconds after the minute [0-60]
int tm_min; // minutes after the hour [0-59]
int tm_hour; // hours since midnight [0-23]
int tm_mday; // day of the month [1-31]
int tm_mon; // months since January [0-11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday [0-6]
int tm_yday; // days since January 1 [0-365]
//
int tm_isdst; // Daylight Saving Time flag
int tm_gmtoff; // offset from UTC in seconds
};
void main(void)
{
unsigned int systemUTC;
struct tm tmp;
printf("time converstion test - localtime\n");
// get NTP UTC time
systemUTC = SDS_get_u32(139);
localtime(&systemUTC, (void *)&tmp);
printf("%02u:%02u:%02u\n", tmp.tm_hour, tmp.tm_min, tmp.tm_sec);
printf("%u.%u.%u\n", tmp.tm_mday, tmp.tm_mon+1, tmp.tm_year+1900);
}