FULL-C: 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.

Rozdělení

FULL-C programovací jazyk je plnohodnotným ANSI-C programovacím jazykem. Podporuje vybrané funkce knihovny STDLIB-C a přidává sadu funkcí, které jsou specifické pro zařízení SDS.


Standardní funkce

FULL-C podporuje omezený seznam standardních funkcí. Tak jak je postupně FULL-C rozšiřován, jsou přidávány i další standardní fukce do seznamu podporovaných funkcí.

Všechny standardní funkce v následujícím seznamu mají své chování ve FULL-C implementováno tak jak se očekává podle libc.

.
          int isalnum(int c);
          int isalpha(int c);
          int isblank(int c);
          int iscntrl(int c);
          int isdigit(int c);
          int isgraph(int c);
          int islower(int c);
          int isprint(int c);
          int ispunct(int c);
          int isspace(int c);
          int isupper(int c);
          int isxdigit(int c);
          int tolower(int c);
          int toupper(int c);
          int isascii(int c);
          int toascii(int c);
 
        float atof (char *str);
          int atoi(char *str);
          int atol(char *str); 
          int strtol(char *str, char **endptr, int base);
 unsigned int strtoul(char *str, char **endptr, int base);
          int abs(int n);
          int labs(int n);
 
          int rand(void);
 
        void *malloc (int size);
        void *calloc (int num, int size);
        void *realloc(void *ptr,int size);
        void  free(void *ptr);
        void *memset(void *ptr, int value, int num);
        void *memcpy(void *destination, void * source, int num);
         int  memcmp(void *ptr1, void *ptr2, int num);
 
        char *strcpy(char *destination, char *source);
        char *strncpy(char *destination, char *source, int num);
         int  strcmp(char *str1, char *str2);
         int  strncmp(char *str1, char *str2, int num);
        char *strcat(char *destination, char *source);
        char *strncat(char *destination, char *source, int num);
         int  strlen(char *str);
        char *strchr(char *str, int character);
        char *strstr(char *str1, char *str2);

Funkce základního vstupu a výstupu:

.
          int printf(char *format, ...);

          int sprintf(char *str, char *format, ...);
          int snprintf(char *str, int n, char *format, ...);
          int sscanf(char *s, char *format, ...);

Základní funkce pro práci s 32-bit float (a převody na int):

.
        float fabs(float f);
        float round(float f);
        float ceil(float f);
        float floor(float f);
          int ftoi(float f);
      int64_t ftoi64(float f);

Upozornění

Pozor:
všechny funkce, které pracují s ukazateli, jsou vnitřně (při provádění FC kódu v SDS) hlídány na "povolený rozsah" do které lze zapisovat (popř. ze kterého lze číst). Tato vnitřní ochrana v SDS má za úkol zabránit poškození programu nebo jeho pádu, pokud programátor udělá chybu (např. snaží se do malého bufferu zapsat více, než by se do něj mohlo vlézt, což by např. způsobilo nechtěné přepsání nesouvisejících proměnných uložených v paměti právě za tímto bufferem). Nespoléhejte se však při tvorbě programu na tuto ochranu, ta je zde především proto aby zabránila pádu SDS a jeho činnosti (vykonávání vašeho FC programu).

Pozor:
Seznamte se s principy standardu C90 a C99. Např. převody proměnných na unsigned při smísených výpočtech (signed a unsigned), nebo paramtery a návratové hodnoty printf/sprintf a zejména snprintf, princip porovnávání signed a unsigned čísel, a další podstatné prvky jazyka C, které jsou nejčastěji přehlédnuty a pak zbytečně způsobují nečekané, nechtěné chování programu.


SDS - vlastní funkce

Zde je seznam funkcí pro interakci se zařízením SDS.


Funkce pro zápis do konzole (tu lze zobrazit jako webovou stránku "echo.html"), detaily jsou zde.

.
          int putchar(int character);
          int puts(char *str);
          int printf(char *format, ...);
         void echoclear(void);

Zatímco SDS-C využívá pro ovládání SDS zápis do a čtení z pole sys[index] - ve FULL-C je to realizováno pomocí následujících set a get funkcí:

.
         void SDS_set_i32(unsigned int index, signed int value);
   signed int SDS_get_i32(unsigned int index);

         void SDS_set_i64(unsigned int index, int64_t value);
   signed int SDS_get_i64(unsigned int index);
 
         void SDS_set_u32(unsigned int index, unsigned int value);
 unsigned int SDS_get_u32(unsigned int index);

         void SDS_set_u64(unsigned int index, uint64_t value);
 unsigned int SDS_get_u64(unsigned int index);
 
         void SDS_set_f32(unsigned int index, float value);
        float SDS_get_f32(unsigned int index);
 
         void SDS_set_a(unsigned int index, void *ptr, unsigned int len);
         void SDS_get_a(unsigned int index, void *ptr, unsigned int maxlen);

Dále jsou k dispozici tyto funkce pro práci s pamětí DataFlash :

.
 unsigned int DF_read_page(unsigned int pageindex, void *pagedata);
 unsigned int DF_write_page(unsigned int pageindex, void *pagedata);
 unsigned int DF_erase_page(unsigned int pageindex);

Funkce pro obsluhu sériových rozhraní :

.
         void SDS_serial_config(unsigned int busID, unsigned int BaudRateCfg, unsigned int DataSizeCfg, unsigned int StopBitsCfg, unsigned int ParityCfg);
         void SDS_serial_writeCH(unsigned int busID, unsigned char writeChar);
         void SDS_serial_write(unsigned int busID, char *ptr, unsigned int len);
 unsigned int SDS_serial_read(unsigned int busID, char *ptr, unsigned int maxlen);

Funkce pro řízení displaye a klávesnice v SDS-BIG zařízení :

.
         void SDS_TOPB_keyboard_status(unsigned int *changed, unsigned int *actual, unsigned int *intermediatePresses[6]);
         void SDS_TOPB_keyboard_updn(unsigned int *presses[6], unsigned int *releases[6]);

         void SDS_TOPB_LCDdraw(unsigned int X0, unsigned int Y0, unsigned int X1, unsigned int Y1, unsigned int DrawTYPE, unsigned int FLAGS);
         void SDS_TOPB_LCDtext(unsigned int X0, unsigned int Y0, unsigned int FLAGS, char *ptr, unsigned int len);
         void SDS_TOPB_LCDbitmap(unsigned int X0, unsigned int ROW, unsigned int FLAGS, char *ptr, unsigned int len);
         void SDS_TOPB_LCDflip(unsigned int FLAGS);

Funkce pro úplné řízení sběrnice DALI (DALI-MASTER přes doplněk SDS-BIG) :

.
 unsigned int SDS_TOPB_DALI_transmitCommand(unsigned int DALIaddress, unsigned int DALIdata);
 unsigned int SDS_TOPB_DALI_getReceivedResponse(unsigned int *ReceivedResponse);

Funkce pro řízení PWM výstupů :

.
         void SDS_PWMx_disableOutput(unsigned int PWMx);
         void SDS_PWMx_setDutyAsPercents(unsigned int PWMx, unsigned int generatorFrequency, unsigned int Percents);
         void SDS_PWMx_setDutyAsUSECS(unsigned int PWMx, unsigned int USECS);

Funkce pro komunikaci s rozšiřující (sandwich) deskou přes I2C sběrnici :

.
          int SDS_I2C_rw(unsigned int address, char *WrPtr, unsigned int WrLen, char *RdPtr, unsigned int RdLen);

Funkce pro řízení běhu FC programu a ostatní nezařazené funkce:

.
         void SDS_reset_program(unsigned int key);
         void SDS_set_wdg(unsigned int newTimeOut);
         void SDS_kick_wdg(unsigned int key);

         void SDS_heap_stats(unsigned int *currentAllocatedBytes, unsigned int *totalFreeBytes, unsigned int *biggestFreeBlockAvailable);

         void SDS_disable_onewire(void);
         void SDS_rescan_onewire(unsigned int BUSnr);

Poznámka: pokud nepoužíváte na zařízení sběrnici 1-W, pak je doporučeno vypnout využítí této sběrnice pomocí SDS_disable_onewire(), viz detaily pro tuto funkci.

Funkce pro symetrickou kryptografii a práci s daty jsou popsány zde :

.
 unsigned int SDS_crypto(unsigned int Algorithm, unsigned int *CounterBlock, void *PayloadData, unsigned int PayloadDataSize);
 
 unsigned int SDS_ToBase64(void * inputBuf, void * outputBuf, unsigned int inputLen, unsigned int FLAGS);
 unsigned int SDS_FromBase64(void * inputBuf, void * outputBuf, unsigned int inputLen, unsigned int FLAGS);


Dále jsou k dispozici tyto funkce pro práci se sítí:

Funkce pro odeslání HTTP GET nebo HTTP POST dotazu na webový server:

.
         void http_get(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int Port, char *HostName, char *GETtext, void *ReceiveDataBuffer, 
                       unsigned int MaximalReceiveDataLength);
 
 unsigned int http_get_status(unsigned int *httpResponseValue, unsigned int *receivedDataSize);
 
         void http_post(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int Port, char *HostName, char *GETtext, void *ReceiveDataBuffer, 
                        unsigned int MaximalReceiveDataLength, char *POSTtext);
 
         void http_close(void);

Funkce pro odeslání emailu:

.
         void smtp_send(char *TargetEmailAddress, char *EmailSubject, char *TextContent);
 unsigned int smtp_send_status(void);

Funkce pro odeslání libovolného UDP paketu:

.
         void udp_send(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int Port, void *PayloadData, unsigned int PayloadLength);
 unsigned int udp_send_status(void);

Funkce pro dotaz na přidělenou IP adresu pro DNS jméno:

.
         void dns_resolv(char *domainNameInput);
 unsigned int dns_resolv_status(unsigned int *IP0value, unsigned int *IP1value, unsigned int *IP2value, unsigned int *IP3value);

Funkce pro odesílání SNMP TRAP zpráv:

.
         void snmp_send_trap(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int PDUspecificType, unsigned int tableIndex);
 unsigned int snmp_send_trap_status(void);

Funkce pro odesílání ICMP PING paketů:

.
         void ping_send(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int sendPingSequenceValue);
 unsigned int ping_send_status(unsigned int *pingReceivedSequence, unsigned int *pingReceivedRTTmsec);

Funkce pro komunikaci MQTT (klient) (viz také MQTT):

.
         void mqtt_connect(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int TCPport, char *ClientID, char *username, char *password,
                           unsigned int KeepAliveSec);
         void mqtt_disconnect(void);
         void mqtt_publish(char *FullTopicName, char *Value);
         void mqtt_subscribe(unsigned int TableIndex, char *FullTopicName);
         void mqtt_unsubscribe_index(unsigned int TableIndex);
         void mqtt_unsubscribe_name(char *FullTopicName);

Funkce pro komunikaci MODBUS-TCP (klient) (viz také MODBUS-TCP):

.
         void modbus_tcp_connect(unsigned int IP0, unsigned int IP1, unsigned int IP2, unsigned int IP3, unsigned int TCPport, unsigned int reserved);
         void modbus_tcp_disconnect(void);
         void modbus_tcp_read(unsigned int UID, unsigned int Function, unsigned int Item, unsigned int Count);
         void modbus_tcp_writesingle(unsigned int UID, unsigned int Function, unsigned int StartItem, int Value);
         void modbus_tcp_writemultiple(unsigned int UID, unsigned int Function, unsigned int StartItem, unsigned int Count, int * writeArray);

Dále jsou k dispozici tyto funkce pro práci se soubory na SD kartě:

Funkce pro práci s SD kartou a soubory:

.
          int file_open(unsigned int * p_file_handle, char * file_path, char * open_mode);
          int file_close(unsigned int * p_file_handle);
          int file_read(unsigned int file_handle, void * buffer, unsigned int bytes_to_read, unsigned int * bytes_read);
          int file_write(unsigned int file_handle, void * buffer, unsigned int bytes_to_write, unsigned int * bytes_written);
          int file_sync(unsigned int file_handle);
          int file_lseek(unsigned int file_handle, uint64_t new_position);
     uint64_t file_tell(unsigned int file_handle);
          int file_eof(unsigned int file_handle);
          int file_truncate(unsigned int file_handle);
          int file_expand(unsigned int file_handle, uint64_t new_size, unsigned int op_mode);
     uint64_t file_size(unsigned int file_handle);
          int file_error(unsigned int file_handle);
          int file_stat(char * file_path, void * existing_file_stat_structure);
          int file_unlink(char * file_path);
          int file_rename(char * file_path_from, char * file_path_to);
          int file_mkdir(char * file_path);
 
         void SDS_disable_sdc(unsigned int key);

Funkce pro práci s časem:

.
 unsigned int mktime(struct tm * timeptr);
         void gmtime(unsigned int * timer, struct tm * timeptr);
         void localtime(unsigned int * timer, struct tm * timeptr);

          int SDS_set_RTC(unsigned int epochtime, void * timeptr);


Zvyklosti při používání parametrů

Všechny číselné parametry jsou (zde uvedeným) funkcím předávány jako 32bitové čísla (int nebo unsigned int).

Všechny textové parametry jsou předávány jako char * - dbejte na případné správné přetypování, když chcete funkci předat parametr s jiným výchozím typem.

Všechny datové parametry (datové pole - payload), ať už obsahují obecné binární data nebo čistý text, jsou předávány jako void * - a je na vás provádět správná přetypování aby vše fungovalo.


Parametr IP-adresa

Všechny funkce kterým se předává IP adresa (nebo ty, které hodnotu typu IP-adresa vracejí), pracují se čtyřmi nezávislými čísly (čtyři nezávislé proměnné), které dohromady tvoří jednu IP adresu.

Příklad: úplná_IP = IP0.IP1.IP2.IP3

Výsledná IP adresa je v každé funkci "složena" právě ze čtyř vstupních proměnných IP0 až IP3, které dohromady tvoří jednu celou IP adresu. Nejedná se tedy o čtyři různé adresy, jedná se o jedinou celou IP adresu, rozpadlou na části a předanou do funkce po těchto částech.


Informace

Zde uvedené funkce jsou podporovány ve všech verzích FULL-C od října 2015. Všechny nově přidané funkce vyžadují aktualizaci zařízení SDS a EXE programu.