Search
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()
./binaries/bab36prga-hw9b-sigen
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ů.
sigen
xwin_otk_plot
otk_lib
messages.h
messages.c
Od programu se očekává následující funkcionalita:
event_queue.h
event_queue.c
xwin_set_plot()
xwin_redraw_plot()
message.h
g
MSG_GET_VERSION
s
MSG_SET_SIGNAL
r
MSG_SIGNAL
a
c
q
b
libxmu-dev
apt install libxmu-dev
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
MSG_STARTUP
Program reaguje na stisk následujících kláves
MSG_ABORT
Program sigen generuje signál dle zadaných parametrů, které jsou zasílány z ovládací aplikace zprávou MSG_SET_SIGNAL. Vlastní generování probíhá tak, že řídicí aplikace zašle zprávu MSG_SIGNAL, na kterou sigen reaguje zasláním několika zpráva MSG_SIGNAL_DATA s obsahem hodnot definující konkrétní rozsah signálu. Definice jednotlivých zpráv odpovídá definici složeného typu struct message v souboru message.h.
MSG_SIGNAL_DATA
struct message
// 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_VERSION
MSG_ERROR
MSG_OK
MSG_DONE
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_COMPUTE_DATA
Doporučený postup implementace a tipy k implementaci naleznete zde Doporučení a tipy pro HW 9B
Odevzdávejte zip archiv, který bude obsahovat všechny podpůrné soubory, které jste dostali k dispozici, implementovanou logiku aplikace prga-hw9b-main.c, implementovanou frontu event_queue.c, a všechny další soubory, které využíváte.
prga-hw9b-main.c
Program pokud možno realizujte na cvičení, nahrajte do odevzdávacího systému. Funkčnost programu ověří učitel.