{{indexmenu_n>8}}
======== HW 8 - Interaktivní aplikace s meziprocesovou komunikací========
^ **[[courses:bab36prga:hw:start#Úloha HW8 | Časný termín]]** | **[[courses:bab36prga:hw:start#Úloha HW8 | 27.04.2020 23:59 PDT]]** |
^ Termín odevzdání | ** 02.05.2020 23:59 PDT** |
^ **[[courses:bab36prga:hw:start#Úloha HW8 | Finální termín]]** | **[[courses:bab36prga:hw:start#Úloha HW8 | 9.5.2020 23:59 PDT]]** |
^ Povinné zadání | 3b kontrola [[courses:bab36prga:tutorials:coding_style|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í.
Binární obraz Modul aplikace bude dodán.
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ě semestrální práci.
===== Povinné zadaní =====
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 |