FULL-C: TopBoard functions

Verze z 25. 6. 2022, 09:46, kterou vytvořil Adamn (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

FULL-C

Funkce pro práci s TopBoard

Zařízení SDS-BIG lze zakoupit s doplňkovou sandwich deskou (tzv. TopBoard), která poskytuje uživatelské rozhraní (bodový display a klávesnici) a také možnost připojit sběrnici DALI. Tuto desku lze připojit i k dalším modulům SDS (např. SDS-STSW, SDS-SMALL).

Pozor! Je vyžadován firmware SDS od verze 5.12.2016 nebo novější!

Pro obsluhu klávesnice a displaye, můžete použít tyto funkce:

 
         void SDS_TOPB_keyboard_status(unsigned int *changed, unsigned int *actual, unsigned int *calculated[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 ROW, 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);

Pro komunikaci přes DALI sběrnici (SDS je DALI-MASTER) může program použít tyto funkce:

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


Hardware

SDS osazené doplňujícím sandwich modulem (sandwich desek je více různých, a všechny se chovají z hlediska key+LCD stejně) poskytuje uživateli grafický LCD a tlačítkovou klávesnici.

LCD je plně grafické a má 132 x 32 jednobarevných pixelů, adresované jako X=0..131 a Y=0..31. Pixely jsou černé (aktivní - blokují podsvícení), a podsvícení je bíle.

Následující FULL-C funkce umožňují kreslení jednotlivých pixelů, obrazců a nebo textu.

SDS využívá princip obrazového bufferu, kdy veškeré kreslení se provádí nejprve do paměti, odkud se teprve vždy celá tato paměť překlopí (najednou překreslí) do LCD kde to pak uživatel přímo vidí.

Využití paměťového bufferu (screenbuffer) je důležite, protože si tak můžete připravit novou obrazovku, zatímco uživatel stále vidí tu předchozí - lze tak realizovat navazující animace a obecně se zabrání nevzhlednému postupnému překreslování LCD (jaké by bylo při postupném kreslení jednotlivých prvků přímo na LCD).

Klávesnice je obsluhována automaticky a FULL-C program se může pravidelně dotazovat na stav tlačítek. Běžně je osazeno 5 tlačítek, na některých modulech ale jen 2 (z rozměrových důvodů).


Obsluha klávesnice

TOPB nabízí pět kláves (tlačítek), které jsou interně ošetřeny proti zákmitům (nemusíte se dále ve FULL-C programu o toto starat). Některé moduly ale nabízí jen dvě tlačítka.

Každý stisk je zaznamenán, takže k dispozici pro FULL-C program je nejen aktuální stav každého tlačítka (stisknuto/uvolněno), ale i počet stisknutí mezi jednotlivými dotazy programu (takže když uživatel rychle mačká tlačítko, tak FULL-C program vždy ví, kolikrát to bylo).


SDS_TOPB_keyboard_status()

SDS_TOPB_keyboard_status() je jednou ze dvou funkcí ve FULL-C, která zajišťuje kompletní obsluhu zjišťovaní stavu klávesnici. Volat tuto funkci je potřeba jen tak často, jak moc je potřeba mít nízkou odezvu.

Pole calculated[6], navrácené touto funkcí, bude určeno pro počítání plných kliknutí (stisknutí+uvolnění) tlačítka TL1 až TL5. Tato funkce je k dispozici až ve firmware od 6/2022 - dřívější firmware neposkytuje hodnoty.

calculated[0] = vždy nula (nepoužito)
calculated[1] = počet "plných kliknutí" tlačítka TL1 od posledního volání této funkce
calculated[2] = počet "plných kliknutí" tlačítka TL2 od posledního volání této funkce
calculated[3] = počet "plných kliknutí" tlačítka TL3 od posledního volání této funkce 
calculated[4] = počet "plných kliknutí" tlačítka TL4 od posledního volání této funkce 
calculated[5] = počet "plných kliknutí" tlačítka TL5 od posledního volání této funkce 

Každé volání funkce, tato všechna počítadla calculated[] nuluje.

"Plné kliknutí" znamená, že uživatel tlačítko TLx stisknul, a pustil. Tlačítko musí být stisknuto a uvolněno, aby se to započítalo. Dokud je pouze jen stisknuto, ještě stále není započítáno (jen to průběžně uvidíte v hodnotě actual), započítáno jako "plný klik" bude až uživatel tlačítko uvolní.

Hodnota changed ukazuje, zda-li se od posledního zavolání funkce změnil stav některého z tlačítek. Jedná se o akumulovanou funkci, takže zachytí i více stisknutí a uvolnění tlačítka.

bit     7   6   5   4   3   2   1   0  (MSB ... LSB)  
dec     128 64 32  16   8   4   2   1   
význam  0   0   0 TL5 TL4 TL3 TL2 TL1

Příklad: od posledního volání funkce došlo ke změně stavu (stisknuto/uvolněno) tlačítka TL1 a TL3, hodnota changed tedy bude 0b00000101 což je decimálně hodnota 5.

Hodnota actual ukazuje aktuální stav tlačítka (bit v log1 = příslušné tlačítko stisknuto).

bit     7   6   5   4   3   2   1   0  (MSB ... LSB)  
dec     128 64 32  16   8   4   2   1   
význam  0   0   0 TL5 TL4 TL3 TL2 TL1

Příklad: v okamžiku volání funkce má právě uživatel stisknuté tlačítko TL5, hodnota actual tedy bude 0b00010000 což je decimálně hodnota 16.

DOPORUČENÍ: aktualizujte si firmware v SDS, v rámci této funkce došlo k řadě zlepšení z hlediska následné programové obsluhy odezvy na obsluhu tlačítek.

Využití ve vašem programu - stačí sledovat obsah pole changed[], a reagovat na jeho obsah. Pro každé tlačítko je vždy uveden počet plných kliknutí od posledního zeptání se prostřednictvím volání této funkce. Program tak může efektivně reagovat na všechna kliknutí na tlačítka, která uživatel v mezičase udělal (a žádné kliknutí se "neztratí").


SDS_TOPB_keyboard_updn()

Funkce je dostupná ve FULL-C od verze 0x0D (tedy od 06/2022).

Funkce zapisuje hodnoty do dvou předaných polí. Hodnoty jsou interně akumulovány ve firmware SDS, a předány FULL-C programu vždy při zavolání této funkce. Současně dojde k vynulování interních akumulátorů pro všechny tyto hodnoty v SDS. Tím pádem, každé jednotlivé zavolání této funkce, obdrží přesný počet stisků a uvolnění všech tlačítek, od okamžiku posledního volání této funkce (pro úplnost: tato počítadla pro funkci _updn nejsou nulována voláním funkce SDS_TOPB_keyboard_status, ale pouze voláním funkce _updn).


presses[0] = vždy nula (nepoužito)
presses[1] = počet "stisků" tlačítka TL1 od posledního volání této funkce 
presses[2] = počet "stisků" tlačítka TL2 od posledního volání této funkce 
presses[3] = počet "stisků" tlačítka TL3 od posledního volání této funkce 
presses[4] = počet "stisků" tlačítka TL4 od posledního volání této funkce 
presses[5] = počet "stisků" tlačítka TL5 od posledního volání této funkce 

releases[0] = vždy nula (nepoužito)
releases[1] = počet "uvolnění" tlačítka TL1 od posledního volání této funkce 
releases[2] = počet "uvolnění" tlačítka TL2 od posledního volání této funkce 
releases[3] = počet "uvolnění" tlačítka TL3 od posledního volání této funkce 
releases[4] = počet "uvolnění" tlačítka TL4 od posledního volání této funkce 
releases[5] = počet "uvolnění" tlačítka TL5 od posledního volání této funkce 

Při zmáčknutí tlačítka prstem, dojde k započítání "stisku" a po uvolnění dojde k započítání "uvolnění". Jedno "kliknutí" na tlačítko tedy znamená jeden stisk a uvolnění.

SDS interně filtruje zákmity, takže uvedené hodnoty jsou předány už po filtraci.


Obsluha displaye

TOPB nabízí grafický display, na který lze psát a kreslit.

Všechny tyto činnosti probíhají v paměťovém bufferu na pozadí, a teprve na konkrétní příkaz (LCDflip) se tento buffer celý přenese na display. Toto je důležité pro hladké zobrazení, bez blikání nebo poškozené animace - vždy novou scénu nakreslíte do paměťového bufferu, který představuje celý virtuální display, a ten se teprve na daný příkaz přenese na skutečný display a zobrazí se.


SDS_TOPB_LCDflip

Základní funkce pro překreslení (FLIP) paměťového bufferu (virtuálního LCD) na skutečný (hardware) LCD. Principem je provádění veškerých nových kreseb na pozadí, a až nakonec, najednou, se tyto přenesou na skutečný display.

unsigned int FLAGS

== 0 : just FLIP (přenese paměťový screenbuffer na fyzický LCD)
== 1 : CLEAR and FLIP (smaže paměťový screenbuffer a pak jej ihned přenese na fyzický LCD, tzn. v důsledku smaže i celý LCD).

S výhodou můžete použít FLAGS==1 pro okamžité smazání celého displaye.

Běžná se tato funkce volá s FLAGS==0, kdy dojde jen k přenesení celého bufferu na display, což je základní použití této funkce.

Pokud chcete jen smazat paměťový screenbuffer a přitom nesahat na LCD, musíte si pomoct funkcí SDS_TOPB_LCDdraw (nakreslit vyplněný obdélník přes celou obrazovku).


SDS_TOPB_LCDdraw

Kreslení do bufferu.

Nejprve si určíte, jaký vůbec grafický prvek chcete do bufferu nakreslit:

unsigned int DrawTYPE

==   0 : draw a single PIXEL, coordinates: X0,Y0 (the X1,Y1 is ignored)
==  32 : draw one-pixel-wide LINE, coordinates: from X0,Y0 to X1,Y1
==  64 : draw one-pixel-wide ELLIPSE, coordinates: from X0,Y0 to X1,Y1
==  96 : draw RECTANGLE, coordinates: from X0,Y0 to X1,Y1
== 224 : only FLIP (same as STS_TOPB_LCDflip) 

Parametr FLAGS je bitová kombinace, která navíc svým významem závisí na hodnotě DrawTYPE.

unsigned int FLAGS

(MSB to LSB):  7    6    5     4      3   2     1        0
               RSVD RSVD RSVD [FLIP] [SCI SCI] [FILLED] [ADDITIONALFLAG]

RSVD 
 -> set to zero

[FLIP]
 -> set to 1 if you want immediate FLIP after this function is done

[SCI]

            | pixel/line/ellipse/rectangle | 
------------+------------------------------+-
 SCI == 00  | SET PIXEL   (to color)       |
 SCI == 01  | CLEAR PIXEL (to background)  | 
 SCI == 11  | INVERT PIXEL                 |

[FILLED]
 -> applies only to rectangle and ellipse (when set to 1, fills the internals, following SCI)

[ADDITIONALFLAG]
 -> used ONLY for DrawTYPE==224 where if ADDITIONALFLAG==1 then buffer is CLEARED and then FLIP

Jak lze vidět, je potřeba vždy připravit správnou kombinaci bitů.

POZOR: starší firmware v TOPB desce ne vždy umí všechny možné grafické prvky - zašlete výrobek výrobci pro aktualizaci firmware.

Funkce kreslí do paměťového screenbufferu. Tento buffer se teprve musí překlopit do fyzického LCD pro aktualizaci zobrazeného obrazu. To můžete provést ihned (FLAGS:FLIP) nebo až "nakonec" pokud kreslíte více různých prvků (pak použijte funkci LCDflip).

Funkci SDS_TOPB_LCDdraw() lze také použít pro smazání celé obrazovky LCD:

SDS_TOPB_LCDdraw(0, 0, 0, 0, 224, 1);


SDS_TOPB_LCDtext

Psaní textu do bufferu - tato funkce umí psát pouze na jeden vybraný řádek. Pevný font, ale můžete určit barvu popředí a pozadí. Pozice se určuje pomocí X0 a Y0, kde X0 určuje posun o daný počet pixelů na řádku, a Y0 vybírá řadek (LCD má čtyři řádky).

X0
 -> pixel coordinate [0..131]

ROW
 -> row coordinate [0..3] 

char *ptr
 -> pointer to string

unsigned int len
 -> length of text (excluding trailing zero)
 -> maximum = 22 characters per line

Parametr FLAGS je bitová kombinace, která navíc svým významem závisí na hodnotě DrawTYPE.

unsigned int FLAGS

(MSB to LSB):  7    6    5     4      3   2     1     0
               RSVD RSVD RSVD [FLIP] [SCI SCI]  RSVD  RSVD

RSVD 
 -> set to zero

[FLIP]
 -> set to 1 if you want immediate FLIP after this function is done

[SCI]

            | text           | 
------------+----------------+-
 SCI == 00  | POSITIVE       |
 SCI == 01  | NEGATIVE       |
 SCI == 11  | INVERT TEXT    |

Jak lze vidět, je potřeba vždy připravit správnou kombinaci bitů.


SDS_TOPB_LCDbitmap

Přenos malé bitmapy (blok pixelů) do bufferu - tato funkce umí přenést bitmapu na jeden určený řádek. Pro pokrytí celého displaye, který má čtyři řádky, je tedy potřeba použít tuto funkci čtyřikrát, vždy se správnými parametry.

Pravidla jsou opět podobná jako u předchozích funkcí.

Parametr FLAGS je bitová kombinace.

unsigned int FLAGS

(MSB to LSB):  7    6    5     4     3    2    1     0
               RSVD RSVD RSVD [FLIP] RSVD RSVD RSVD [ADDITIONALFLAG]

RSVD 
 -> set to zero

[FLIP]
 -> set to 1 if you want immediate FLIP after this function is done

[ADDITIONALFLAG]
 -> the (whole) LCD buffer is filled with a DEFAULT LOGO 


Vzorový program

Následující program čte stav klávesnice a zobrazuje tento stav na LCD.

void main(void)
{

 unsigned int changed, i;
 unsigned int actual;
 unsigned int calculated[6];
 unsigned int total[6];

 char text[32];

 printf("START LCD+KEYBOARD TEST\n");

 // clear LCD [OP:111] = FLIP ; clear -> ADDITIONALFLAG = 1
 SDS_TOPB_LCDdraw(0,0,0,0, 0b11100000, 0b00000001); // --- identical to:
 SDS_TOPB_LCDflip(1);

 // main loop
 for (;;)
 {

   // read last known KBD status
   SDS_TOPB_keyboard_status(&changed, &actual, &calculated);

   if (changed)
   {
        // print to console
        printf("%d %d [%d %d %d %d %d %d]\n", changed, actual,
        calculated[0],
        calculated[1],
        calculated[2],
        calculated[3],
        calculated[4],
        calculated[5]);

       // show the live situation:

       // setup text
       snprintf(text, 22+1, "actual = %02X  ch = %02X ", actual, changed);

       // write to LCD
       SDS_TOPB_LCDtext(0, 0, 0, text, strlen(text));

       // we are counting each full button clicks:

       // accumulate
       for (i = 1; i < 6; i++) total[i] += calculated[i];

       // setup text
       snprintf(text, 22+1, "%02u  %02u  %02u  %02u  %02u",  total[1], total[2], total[3], total[4], total[5]);

       // write to LCD
       SDS_TOPB_LCDtext(0, 2, 0, text, strlen(text));


       // redraw LCD
       SDS_TOPB_LCDflip(0);
   }

   // wait 100 msecs = try to make it longer, to simulate harsh conditions = and you will see it yet works !
   // try to change the value to any other to see how it works
   wait(100);

 }

}



Upozornění

Pro správnou funkci sběrnice DALI je vyžadována verze firmware v sandwich desce (TOPB3) od 5.12.2016 nebo novější.

Pokud nemáte jistotu, jakou verzi firmware v sandwich desce máte, zašlete ji výrobci pro bezplatnou aktualizaci.

Pokud se pokusíte používat DALI sběrnici se zařízení které má starší firmware, nebude vám to fungovat.


Sběrnice DALI

Sběrnice DALI je určena k řízení osvětlovacích a dalších prvků, připojených na společnou sběrnici, a to buď skupinově nebo po jednotlivých adresách. Sestava se vždy skládá z DALI-MASTER (což je zde zařízení SDS) a prvků DALI-SLAVE (např. světla, chytré vypínače a tlačítka, pohybová čidla, reléové moduly, atd.).

DALI pracuje na principu dvoudrátové sběrnice, po které se přenáší data mezi DALI-MASTER a vybranými DALI-SLAVE prvky. Buď ve směru BROADCAST, kdy DALI-MASTER posílá zprávu úplne všem DALI-SLAVE prvkům na dané fyzické sběrnici, nebo skupinově (vybraným skupinám GROUPS jednotlivých DALI-SLAVE prvků), popř. zcela adresně (reaguje jen ten DALI-SLAVE prvek, který má konkrétní adresu na kterou je zpráva poslána).

Seznam jednotlivých zpráv, které lze posílat, je uveden v normě DALI a na příslušné stránce této WiKi. Samozřejmě výrobci každého DALI-SLAVE zařízení si určují své detaily (jaké zprávy jsou podporovány daným zařízením a jak na ně bude zařízení reagovat).

Pro použití SDS jako DALI MASTER prvku je potřeba zakoupit SDS osazené doplňkovou sandwich DALI deskou.


Adresování prvků na sběrnici DALI

Vše je popsáno do detailu v příslušné normě.

Na sběrnici je jeden MASTER (zde SDS) a množství SLAVE jednotek - vždy záleží na konkrétním projektu.

Každá SLAVE jednotka má tyto tři určené adresy:

  • BROADCAST - globální konstatní adresa (0xFF) na které slyší naprosto všechny jednotky najednou
  • GROUP - skupinová adresa, tuto adresu má jedna nebo více jednotek společně, nastavuje se na určenou hodnotu podle projektu
  • DIRECT - přímá adresa, tuto adresu má vždy jen jedna jediná jednotka, nastavuje se na určenou hodnotu podle projektu

Každé SLAVE jednotce na sběrnici DALI se tedy nastaví tyto tři hodnoty (0xFF a dvě volitelné). Jaké to jsou, si samozřejmě musíte určit vy sami - protože jen vy víte, jak a co máte zapojeno a k čemu to chcete použít. Skupinové adresy jsou výhodné, protože se dá ovládat více prvků jedním příkazem (např. hromadně zhasnout skupina světel) najednou = bez nutnosti postupného posílání adresných příkazů každé jednotce, což pak není vizuálně pěkné (světla v tomto příkladu by zhasínala postupně).

Jak se adresy nastavují - záleží VŽDY na výrobci dané SLAVE jednotky. Někdy je prostřednictvím jumperů/DIP spínačů/atd. na výrobku, a někdy se to dělá tak, že se jednotka připojí k osobnímu počítači a přes určený program se do ní zapíší tyto adresy (skupinová a přímá adresa).

Pokud se nějaká už instalovaná jednotka pokazí a je potřeba ji nahradit novou (výměna) pak je potřeba tuto novou jednotku správně naadresovat - nastavit jí stejné adresy jaké měla ta původní kterou chcete vyměnit.


Příkazy sběrnice DALI

Základní příkazy jsou předepsány normou DALI.


Způsob komunikace

MASTER (SDS) umí poslat příkaz do SLAVE jednotek na sběrnici, a současně umí i přijmout odpověď (pokud je očekávána odpověď od SLAVE jednotky).

Pokud je požadována odpověď (např. na dotaz na nastavenou hodnotu nebo stav tlačítka), pak je potřeba na MASTERu použít příkazy které adresují SLAVE jednotky pouze přes přímou (DIRECT) adresu !

Vzorový program ukazuje jak poslat dotaz (stav stmívání světla) na SLAVE jednotku a jak ho zobrazit na LCD.


SDS_TOPB_DALI_getReceivedResponse

Tuto funkci je potřeba použít pro ověření výsledku.

unsigned int DALI_RX;
unsigned int RXflags;
RXflags = SDS_TOPB_DALI_getReceivedResponse(&DALI_RX);

Do "DALI_RX" se uloží data (payload) přijatá na sběrnici (pokud jsou platná), a do "RXflags" se uloží stav úspěchu komunikace.

RXflags má několik bitů v dolních 8bitech (LSB) které jsou důležité (vše ostatní v této proměnné je nepoužito):

           MSB                                          LSB
             31  ...   3        2         1        0
RXflags      reserved  INVDATA  REPEATED  FAILURE  GOT-RX
  • Nejdůležitější je flag "GOT-RX". Pokud je tento bit nastaven na 1, pak jsou data v "DALI_RX" platná a mají se použít.
  • Flag "FAILURE" označuje chybový stav sběrnice (zkrat, nadproud, chyba HW vysílače).
  • Flag "REPEATED" informuje že došlo k automatickému opakování vysílaní (dle požadavku normy DALI, viz text dále)
  • Flag "INVDATA" označuje příjem neplatných dat (chyba slave, dva nebo více slave vysílají odpověd najednou - viz příkaz COMPARE, apod.)

Váš FULL-C program musí správně reagovat na všechny tyto flagy a stavy.

Pro detekci přítomnosti SLAVE na vybrané adrese se s výhodou dá využít bit-0 (GOT-RX). Tento bit je také potřeba vždy ověřit (je-li nastavený) pro ověření správného přijetí odpovědi ze SLAVE (očekává-li se odpověď).

Pro detekci zkratu sběrnice se přímo využívá bit-1 ("FAILURE").

Pro informaci, že příkaz byl automaticky opakován, je nastaven bit-2 ("REPEATED"). Tento bit v podstatě můžete ignorovat, je jen informativní.

Pro detekci rušení na sběrnici, nebo detekci dvou (či více) SLAVEs se stejnou adresou (chyba konfigurace SLAVEs), se využije bit-3 (INVDATA).


Speciální funkce

SDS poskytuje přímý přístup na sběrnici. Chcete odeslat příkaz (vždy 2 bajty, adresa+data), tak je SDS jako MASTER odešle. A následně se pokusí přijmou 1 byte odpovědi.

Některé příkazy ale vyžadují opakování - to specifikuje norma DALI. U následujících příkazů to podle této normy dělá SDS za vás (tzn. FULL-C program zavolá funkci pro odeslání příkazu jednou, a SDS to zopakuje dvakrát, tzn. automaticky odešle 2x na sběrnici).

Automatizované opakování v rámci SDS je zde z důvodů že norma DALI požaduje opakování s maximálním prodlením pod 100 milisekund - což typicky přes FULL-C zajistit nelze.


Automaticky opakované příkazy při odesílání z SDS MASTER do sběrnice DALI:

  • Pro ADDRESS==0x01 a současně DATA v hodnotě z rozsahu 0x20 (včetně) do 0x80 (včetně)
  • Pro ADDRESS==0xA5 (Initialize CMD) a libovolné DATA
  • Pro ADDRESS==0xA7 (Randomize CMD) ale jen když DATA==0x00


Doplňující informace

Pokud je na sběrnici DALI porucha, všechny Slave jednotky typicky přecházejí do "neřízeného" režimu. To znamená, že se přestanou chovat podle toho jak byly přes DALI nastaveny, a typicky přejdou do "100% zapnuto" režimu. Toto je v pořádku a výrobci slave jednotek to tak chtějí (tím pádem se slave jednotky chovají jen jako "hloupý napáječ světla" který se dá ovládat vypínačem).

Pozn. před spuštění DALI komunikace vyčkejte ve svém programu (ideálně) několik vteřin, zejména je-li délka vedení DALI sběrnice velká (dlouhé kabely). Chvíli trvá než se celý systém "nabije" a dokud se to nestane, nelze přenášet DALI příkazy.


Vzorový program

Následující program kombinuje jednoduchou obsluhu LCD (display) a DALI sběrnice (SDS je DALI-MASTER). Tento program inicializuje prvek na sběrnici a nastaví jej do režimu zapnutá-zátěž (rozsvíceno) - program využívá BROADCAST adresy a je potřeba jej spustit s jediným DALI-SLAVE prvkem (ballast). Vzorový program je zde pro ověření funkčnosti. Samozřejmě jakmile máte více prvků, tak je můžete adresovat - to už vyžaduje znalost funkce sběrnice DALI a jejího aplikačního protokolu.

Program po inicializaci prvku začne dokola provádět smyčku ztlumení a zesílení světla (DOWN a UP):


unsigned int DALI_TXRX(unsigned char Address, unsigned char Data, unsigned char * Answer)
{
  unsigned int DALI_RX;
  unsigned int RXflags;
  unsigned int timeout;

  // one call to SDS_TOPB_DALI_transmitCommand()
  // blocks typically for 60 msecs
  // and it includes both DALI-TX and DALI-RX procedures
  // so after the call is done (function returns)
  // we do have our response from DALI-SLAVE

  // try to call the function until it goes through
  // (typically, the function return is zero because
  //  it is already TXing the previous command)
  timeout = 200; // 200 msec is very enough
  while (1)
  {
    if (SDS_TOPB_DALI_transmitCommand(Address, Data) == 0)
    {
      // no success yet, most-likely the TOPB is busy with the previous frame

      // can we wait more ?
      if (timeout == 0)
      {
        // failed -> exit
        if (Answer) *Answer = 0xFF; // 0xFF is default DALI failure value
        // exit as FAILED
        return 0;
      } else
      {
        timeout--;
        wait(1);
      };
    } else
    {
      // success - TX OK
      break;
    }
  }

  // OK, we have succeeded with TX

  // read the response
  RXflags = SDS_TOPB_DALI_getReceivedResponse(&DALI_RX);

  // RXflags:
  // bit 0 of RXflags contains the GOT-RX flag
  // you SHOULD use value in RXflags and follow it up

  // only the lowest 8 bits make sense
  /* if (Answer) */
  { 
    *Answer = (unsigned char)DALI_RX;
  }

  // exit as OK
  return 1;

}

void main(void)
{
 unsigned int i;
 
 unsigned int success;
 unsigned char DALI_Answer;
 
 char chx[32];

 // console
 printf("DALI EXAMPLE\n");

 // TOPB LCD: clear and flip
 SDS_TOPB_LCDflip(1);
 // TOPB LCD: print to buffer
 SDS_TOPB_LCDtext(0,0,0,"DALI EXAMPLE", 12);
 // TOPB LCD: flip
 SDS_TOPB_LCDflip(0);

 // --- start sending DALI command ---

 //
 printf("SENDING 'RESET' TO 'BROADCAST'\n");
 success = DALI_TXRX(0b11111111, 0b00100000, &DALI_Answer);
 printf("success:%u (DALI-RX: %u)\n", success, DALI_Answer);

 // give the DALI-SLAVE some time to reset
 wait(50);

 //
 printf("SENDING 'QUERY-STATUS' TO 'BROADCAST'\n");
 success = DALI_TXRX(0b11111111, 0b10010000, &DALI_Answer);
 printf("success:%u (DALI-RX: %u)\n", success, DALI_Answer);

 //
 printf("SENDING 'RECALL-MAX-LEVEL' TO 'BROADCAST'\n");
 success = DALI_TXRX(0b11111111, 0b00000101, &DALI_Answer);
 printf("success:%u (DALI-RX: %u)\n", success, DALI_Answer);

 //
 printf("SENDING 'ON-AND-STEP-UP' TO 'BROADCAST'\n");
 success = DALI_TXRX(0b11111111, 0b00001000, &DALI_Answer);
 printf("success:%u (DALI-RX: %u)\n", success, DALI_Answer);

 // --- demo loop ---

 for (;;)
 {
      // some delay for show
      wait(50);

      // loop -> decrease light intensity
      for (i = 0; i < 30; i++)
      {
          // some delay for show
	  wait(5);

          // DALI COMMAND to BROADCAST-ADDR: "DOWN"
          success = DALI_TXRX(0b11111111, 0b00000010, &DALI_Answer);

          // DALI COMMAND to BROADCAST-ADDR: "QUERY-ACTUAL-LEVEL"
          success = DALI_TXRX(0b11111111, 0b10100000, &DALI_Answer);
          // info print to console
          printf("set level: %u\n", DALI_Answer);
          // info print to LCD
          sprintf(chx, "%u   ", DALI_Answer);
          SDS_TOPB_LCDtext(0,2,0,chx, 15);
	  SDS_TOPB_LCDflip(0);
      }

      // some delay for show
      wait(50);

      // loop -> increase light intensity
      for (i = 0; i < 30; i++)
      {
          // some delay for show
	  wait(5);

          // DALI COMMAND to BROADCAST-ADDR: "UP"
          success = DALI_TXRX(0b11111111, 0b00000001, &DALI_Answer);

          // DALI COMMAND to BROADCAST-ADDR: "QUERY-ACTUAL-LEVEL"
          success = DALI_TXRX(0b11111111, 0b10100000, &DALI_Answer);
          // info print to console
          printf("set level: %u\n", DALI_Answer);
          // info print to LCD
          sprintf(chx, "%u   ", DALI_Answer);
          SDS_TOPB_LCDtext(0,2,0,chx, 15);
          SDS_TOPB_LCDflip(0);

      }

 }

}