Napisać działający kod, w którym...:
Wątek Centralka nadzoruje pracę (wątków) czujników kontrolnych. Nadzorowanie to sprowadza się do:
sprawdzania stanu poszczególnych czujników i sygnalizowania sytuacji alarmowych (gdy średni stan czujników przekracza pewną zadaną wartość krytyczną) oraz
podłączania nowych czujników i wyłączania czujników pracujących - gdy nadejdzie takie żądanie z zewnątrz.
Wątek Sensor reprezentuje pewien czujnik monitorujący stan (np. temperaturę, odkształcenie, ...) jakiegoś urządzenia/elementu. Wartość liczbowa odczytanego stanu ma być przekazana do Centralki, która na tej podstawie podejmuje decyzję o włączeniu lub wyłączeniu alarmu. Można przyjąć, że liczba jednocześnie obsługiwanych czujników będzie ograniczona - np. nie większa niż 10.
Program główny poniżej ilustruje przykładowe operacje, jakie byłyby wykonywane przy pomocy Centralki. Kod programu głównego nie należy do rozwiązania zadania (ale z pewnością przyda się do testowania).
Sterowanie Centralką nie musi wcale odbywać się przy pomocy komunikatów (tak, jak jest w przykładzie). Musi jednak być jasno sprecyzowane, w jaki sposób program główny może dodać nowy Sensor, wyłączyć pracujący Sensor oraz zakończyć pracę Centralki. Sama Centralka musi właściwie reagować na takie wymuszenia z programu głównego, jak również utrzymywać komunikację z czujnikami i na tej podstawie właściwie sterować włączaniem/wyłączaniem alarmu. Sensory muszą właściwie współpracować z Centralką (w tym - kończyć pracę, gdy Centralka tego zażąda).
Rozwiązanie ma się znaleźć w katalogu nazwanym od swojego nazwiska. Niech w katalogu tym będą również wszystkie wykorzystywane moduły.
W rozwiązaniu warto/należy oprzeć się na poniższym kodzie (tzn. kod ten uzupełnić, i/lub zmodyfikować...) :
with Disp; --modul do wspolbieznego wyswietlania na ekranie + ew.inne pomocne moduly ...??...
procedure tresc is
--zmienne globalne ...??...
task type Sensor is -- + ewentualne obslugiwane komunikaty ...??...
end Sensor;
type Sensor_Ptr is access Sensor;
task Centralka is
entry Dodaj_Czujnik(nowy: in Sensor_Ptr); --dodawanie nowego czujnika do monitorowania
entry Zakoncz_Prace_Czujnika(cz: in Sensor_Ptr);
entry Zakoncz_Prace; --wylacza wszystkie czujniki i siebie + ew. inne wejscia ...??...
end Centralka;
task body Sensor is
stan: integer := 0;
begin
loop
-- ...??...
stan := (stan + 1117) mod 7 + 1; --"odczytywanie" stanu czujnika
delay(duration((stan+7)mod 7) / 50.0); --czas "zuzyty" na odczyt
--komunikacja z Centralka / ew. konczenie pracy Sensora / ... TRZEBA NAPISAC!!!
end loop;
end Sensor;
task body Centralka is
Sredni_Stan : Float := 0.0;
Alarm : Boolean := false;
begin
--funkcjonowanie Centralki nadzorujacej Sensory
-- (w tym wyznaczanie wartosci zmiennej Sredni_Stan) TRZEBA NAPISAC!!!
--alarmowanie wygladaloby jakos tak:
if Sredni_Stan > 3.0 then
Alarm := true;
Disp.Screen.Print("ALARM! Sredni stan = " & Float'Image(Sredni_Stan));
else
if Alarm then
Alarm := false;
Disp.Screen.Print("Koniec alarmu.");
end if;
end if;
-- ...??...
end Centralka;
pom1, pom2: Sensor_Ptr;
begin --program glowny zawiera przykladowe wywolania operacji sterujacych praca centralki:
Centralka.Dodaj_Czujnik(new Sensor); -- * dodawanie nowych czujnikow
pom1 := new Sensor; Centralka.Dodaj_Czujnik(pom1); delay 2.0;
Centralka.Dodaj_Czujnik(new Sensor);
pom2 := new Sensor; Centralka.Dodaj_Czujnik(pom2); delay 1.5;
Centralka.Zakoncz_Prace_Czujnika(pom2); delay 2.0; -- * wylaczenie dodanego wczesniej czujnika
Centralka.Dodaj_Czujnik(new Sensor); -- * znow dodanie czujnika
Centralka.Zakoncz_Prace_Czujnika(pom1); delay 5.0; -- * znow wylaczenie czujnika
Centralka.Zakoncz_Prace; -- * wylaczenie centralki (wraz ze wszystkimi czujnikami)
end tresc;