{{indexmenu_n>8}} ======== HW 8 - Interaktivní aplikace s meziprocesovou komunikací======== ^ **[[courses:bab36prga:hw:start#ulohy_hw8_a_hw9 | Časný termín]]**| **[[courses:bab36prga:hw:start#Úloha HW8 | 24.04.2021 23:59 PDT]]** | ^ Termín odevzdání | ** 01.05.2021 23:59 PDT** | ^ Povinné zadání | 5b kontrola [[courses:bab36prga:resources:cs:start|Coding stylu]]| ^ Volitelné zadání | není | ^ Bonusové zadání | není | ^ Počet uploadů | bez omezení | ^ Podpora | {{ :courses:bab36prga:hw:bab36prga-hw08.zip |}} | Cílem úlohy je získat zkušenost s využitím pojmenované roury pro komunikaci aplikace v počítači s poskytnutým Modulem a práci s více vlákny pro zpracování více zdrojů událostí. Program vychází ze cvičeních 7, 8, 9 s pojmenovanou rourou a více-vláknové aplikace. Výsledné programy představují dílčí kroky pro snažší implementaci následně HW9. ===== Povinné zadání ===== Realizujte program, kterým bude řízeno blikání LED v Modulu.\\ Program musí obsahovat následující funcionality: * Čte klávesy (bez nutnosti stisku klávesy enter) a reaguje na stisk kláves se znaky 's', 'e', 'h', 'b', a '1'-'5', které přeposílá Modulu. * Při stisku klávesy 'q' ukončuje program svou činnost (koretně zastaví všechna vlákna). * Průběžně zobrazuje stav LED, poslední odeslaný a přijatý příkaz, peridou blikání a počet přijatých informací o počtu rozsvěcení LED ve tvaru: ''\rLED %3s send: '%c' received: '%c', T = %4d ms, ticker = %4d'', kde jednotlivé řidící znaky formátování znamenají: * ''%3s'' je on nebo off podle stavu LED, * ''%c'' je poslední vyslaný znak (' ' po startu'), * další ''%c'' je posledně přijatý znak ('?' v případě nové zprávy zatím bez odpovědi), * ''%4d'' je perioda rozsvěcení/zhasínání LED (uvažujeme doba kdy LED svítí a kdy je zhasnutá je identická, tj. PWM se střídou 1:1) odhadnutá na základě přijatých zpráv od Modulu za časový interval 5 sekund (výpis hodnoty periody je zarovnaný na 4 pozice), * poslední ''%4d'' je počet přijatý znaků 'x' indikující změnu stavu LED při blikání. Pro výpis využijte přepisování řádku znakem '\r'. Po odeslaní znaku 's' a 'e' je stav LED (''on'' nebo ''off'') nastaven až po přijeti potvrzovacího znaku 'a'. Důležitou částí je organizace kódu a dedikování jednotlivých vláken pro 1) čtení z klávesnice; 2) překreslování řádku, 3) čtení z roury; 4) měření periody blikání LED jednou za 5 sekund; případně další hlavní vlákno v boss/worker modelu. Implementačně (na počet řádků) náročnější variantou je realizovat v program frontu zpráv a řešit logiku programu v rámci hlavního vlákna, které přijímá zprávy od ostatních vláken a realizuje příslušné výstupy (tj. pojmenovaná roura a textový výstup na stdout. Benefitem takto organizovaného programu je snadné rozšíření. Jednodušší variantou je dedikovat zápis do roury vláknu pro čtení vstupu z klávesnice a notifikace překreslování z jednolivých vláken na základě přijaté události (tak jako v programu na cvičení 9). == Komunikace mezi aplikací a Modulem == * 'i' - init - může vyslat Modul po startu, žádná reakce není očekávána * 's' - start - vysílá PC, Modul reaguje rozsvícením LED a odpovědí 'a' * '1' - set 1 - vysílá PC, Modul reaguje nastavením periody blikání LED na 50 ms (tj. 50 ms LED svítí a 50 ms je zhasnuta) a odpovědí 'a' * '2' - set 2 - vysílá PC, Modul reaguje nastavením periody blikání LED na 100 ms a odpovědí 'a' * '3' - set 3 - vysílá PC, Modul reaguje nastavením periody blikání LED na 200 ms a odpovědí 'a' * '4' - set 4 - vysílá PC, Modul reaguje nastavením periody blikání LED na 500 ms a odpovědí 'a' * '5' - set 5 - vysílá PC, Modul reaguje nastavením periody blikání LED na 1000 ms a odpovědí 'a' * 'e' - end - vysílá PC, Modul reaguje zhasnutím LED a odpovědí 'a' * 'h' - hello - vysílá PC, Modul reaguje zasláním 'h' * 'b' - bye - vysílá PC, Modul odpovídá 'b' a reaguje opuštěním main() funkce a ovládací program následně po přijetí 'b' ukončuje svou činnost. Aby bylo možné ukončit program po přijetí znaku 'b', je nutné ukončit načítání znaku ze stdin, např. neblokovaným přístup s pollingem podobně jako čtení z roury. Dále Modul v případě, že periodicky bliká LED, vysílá znak 'x' při rozsvícení LED a znak 'o' při zhasnutí LED. ====== Odevzdání a hodnocení ====== Veřejné příklady + Makefile: {{ :courses:bab36prga:hw:bab36prga-hw08.zip |}} --- //[[faiglj@fel.cvut.cz|Jan Faigl]] 2020/05/02 22:42// **Update**: Přídání binárek pro OS X a arch64 Program pokud možno realizujte na cvičení, nahrajte do odevzdávacího systému. Funkčnost programu ověří učitel na cvičení nebo na dalším cvičení. ^ ^ Povinné zadání ^ ^ Název v BRUTE | HW08 | ^ Odevzdávané soubory | ''prga-hw08-main.c'' | ^ Argumenty při spuštění | žádné | ^ Procvičované oblasti | vlákna, pojmenovaná roura |