FULL-C: time functions

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

TBD