Termín odevzdání | |
---|---|
Povinné zadání | |
Volitelné zadání | 5b |
Bonusové zadání | není |
Počet uploadů | bez omezení |
Výchozí soubory | bab36prga-hw9.zip |
Výchozí soubory | Doporučený postup při vypracování HW9 |
Cílem úlohy je rozvést zkušenosti s využitím pojmenované roury pro komunikaci aplikace v počítači s poskytnutým Modulem a s prací s více vlákny pro zpracování více zdrojů událostí.
io_open_write()
blokované. Řešením je tak spustit program generátoru signálu./binaries/bab36prga-hw9-sigen
nebo vyčítání roury programem tail -f /tmp/sigen.in
.
Implementujete více-vláknový program, který bude komunikovat s programem generujícím signál (sigen
) prostřednictvím pojmenované roury, ovládat generování signálu (nastavovat parametry) a vyčítat generovaný signál, který zobrazí v grafickém okně s využitím přiložené knihovny xwin_otk_plot
založené na grafické knihovně otk_lib
. Komunikační protokol probíhá prostřednictvím zpráv definovaných v přiložených souborech messages.h
a messages.c
, které obsahují funkce pro marshaling a unmarshaling struktur zpráv do/z pole bajtů.
Od programu se očekává následující funkcionalita:
sigen
(pojmenovaná roura) a hlavní vlákna.
event_queue.h
a event_queue.c
.
xwin_set_plot()
a xwin_redraw_plot()
.
message.h
.
g
reaguje zasláním zprávy MSG_GET_VERSION
a následně zobrazí odpověď.
s
reaguje zasláním zprávy MSG_SET_SIGNAL
s aktuálním nastavením generátoru signálu.
r
reaguje zasláním požadavku na generování signálu MSG_SIGNAL
, který následně přijme a zobrazí v grafu. Signál je zaslán v jedné nebo několika zprávách o maximální delce 128 hodnot.
a
.
c
reaguje smazáním grafu.
q
.
MSG_SIGNAL
) ideálně každý s jiným nastavením. Program bude po stisku klávesy b
automaticky komunikovat s generátorem, spouštět genrování signálu a nastavovat jeho parametry. Generování je možné kdykoliv přerušit stiskem klávesy a
(abort).
Ovladací aplikace sigen
je více-vláknovým program, který reaguje na stisk kláves, vstup z pojmenované roury a zapisuje do pojmenované roury. Program má dva volitelné argumenty, kterými jsou pojmenovaná roura vstupu a pojmenovaná roura výstupu. Výchozí hodnoty odpovídají volání:
./sigen /tmp/sigen.in /tmp/sigen.out
Po spouštení program zasílá (zapisuje do výstupní pojmenované roury) zprávu MSG_STARTUP
, která obsahuje textovou zprávu “PRG-SIGEN”. Program reaguje na příjem zpráv (viz komunikační protokol) a generuje signál, jehož parametry lze měnit zasláním zprávy MSG_SET_SIGNAL
Program reaguje na stisk následujících kláves
a
- ABORT - Přerušení generování (posílání signálu) a zaslání zprávy MSG_ABORT
.
r
- REBOOT - Soft “restart” generátoru, zašle zprávu MSG_STARTUP
podobně jako při spuštení programu.
q
- QUIT Ukončení programu.
Program na Nucleo desce počítá konkrétní část fraktálu podle zadaných parametrů, které jsou z ovládací aplikace zasílány po sériovém portu. Vlastní výpočet probíhá tak, že řídicí aplikace zašle zprávu MSG_COMPUTE
, která specifikuje část výpočtu tzv. chunk ID (cid). Výchozím bodem obdélníkového výřezu pro výpočet je dán komplexním číslem $re + im j$ a počtem hodnot (sloupců) na reálné ose (z leva do prava) a počtem hodnot (řádku) na imaginární ose (zhora dolů). Krok sloupce a řádku, spolu s hodnotou komplexního čísla $c$ a počtem kroků je součástí zprávy MSG_SET_COMPUTE
. Definice jednotlivých zpráv odpovídá definici složeného typu struct message
v souboru message.h
// Definition of the communication messages typedef enum { MSG_OK, // ack of the received message MSG_ERROR, // report error on the previously received command MSG_ABORT, // abort - from user button or from serial port MSG_DONE, // report the requested work has been done MSG_GET_VERSION, // request version of the firmware MSG_VERSION, // send version of the firmware as major,minor, patch level, e.g., 1.0p1 MSG_STARTUP, // init message (id, up to 9 bytes long string, cksum) MSG_SET_SIGNAL, // set signal parameters MSG_SIGNAL, // request signal of a batch of tasks (chunk_id) MSG_SIGNAL_DATA, // computed result (chunk_id, result) MSG_NBR } message_type; typedef struct { uint8_t major; uint8_t minor; uint8_t patch; } msg_version; typedef struct { uint8_t message[STARTUP_MSG_LEN]; } msg_startup; #define HEART_RATE_MEAN_MIN 10.0 #define HEART_RATE_MEAN_MAX 200.0 #define LOW_FREQ_MIN 0.1 #define LOW_FREQ_MAX 0.5 #define HIGH_FREQ_MIN 0.25 #define HIGH_FREQ_MAX 1.0 #define LOW_HIGH_FREQ_RATIO_MIN 0.0 #define LOW_HIGH_FREQ_RATIO_MAX 1.0 typedef struct { double heart_rate_mean; // default: 60; 10--200; double low_frequency; // default: 0.1; 0.1--0.5; double high_frequency; //default: 0.25; 0.25--1.0; double low_high_frequency_ratio; //default: 0.5 0-1; } msg_set_signal; typedef struct { uint8_t cid; // chunk id uint8_t n; // actual no. of valid data values float values[SIGNAL_DATA_SIZE]; } msg_signal_data; typedef struct { uint8_t type; // message type uint8_t cksum; // message command union { msg_version version; msg_startup startup; msg_set_signal set_signal; msg_signal_data signal_data; } data; } message;
Inicializační zpráva MSG_STARTUP
je definována jako
message msg = { .data.startup.message = { 'P', 'R', 'G', '-', 'S', 'I', 'G', 'E', 'N' } };
MSG_STARTUP
MSG_GET_VERSION
odpovídá MSG_VERSION
nebo MSG_ERROR
MSG_SET_SIGNAL
odpovídá Nucleo MSG_OK
nebo MSG_ERROR
(v případě, že požadované parametry jsou mimo definovaný rozsah).
MSG_SIGNAL
odpovídá MSG_OK
a zahajuje generování signálu nebo v případě chyby posílá MSG_ERROR
. Generovaný signál je posílán postupně v několika zprávách MSG_SIGNAL_DATA
. Po dokončení výpočtu zasílá zprávu MSG_DONE
.
MSG_ABORT
, na kterou odpovídá MSG_OK
a přeruší a ukončí aktuáně probíhající generování/zasílání signálu.
MSG_ABORT
.
V případě zaslání zprávy MSG_SET_SIGNAL
nebo i MSG_SIGNAL
jsou nastaveny nové hodnoty a generování signálu pokračuje podle posledně zadaných hodnot. Kdykoliv (i v případě běžícího generování signálu) je možné si vyžádat verzi programu zasláním zprávy MSG_GET_VERSION
, na kterou generátor promptně odpovídá MSG_VERSION
.
Typický průběh komunikace mezi PC a Nucleo deskou může vypadat například následovně:
MSG_STARTUP
MSG_GET_VERSION
MSG_VERSION
MSG_SET_SIGNAL
MSG_OK
MSG_SIGNAL
MSG_OK
MSG_COMPUTE_DATA
MSG_COMPUTE_DATA
MSG_COMPUTE_DATA
MSG_COMPUTE_DATA
MSG_COMPUTE_DATA
MSG_DONE
Doporučený postup implementace a tipy k implementaci naleznete zde Doporučení a tipy pro HW9
Odevzdávejte zip archiv, který bude obsahovat všechny podpůrné soubory, které jste dostali k dispozici, implementovanou logiku aplikace prga-hw09-main.c
, implementovanou frontu event_queue.c
, a všechny další soubory, které využíváte.
Program pokud možno realizujte na cvičení, nahrajte do odevzdávacího systému. Funkčnost programu ověří učitel.
Povinné zadání | |
---|---|
Název v BRUTE | HW9 |
Odevzdávané soubory | prga-hw9-main.c , event_queue.c , podpůrné soubory |
Argumenty při spuštění | žádné |
Procvičované oblasti | vlákna, pojmenovaná roura |