(* ZADANIE: Zaprojektuj i zapisz w jezyku Modula-2 program, ktory wykorzystujac *)
(* procesy wspolbiezne, symuluje prace zakladu wykonujacego naprawy i instalacje *)
(* dalekopisow. Zakladamy, ze zaklad dysponuje dwoma zalogami wykonujacymi *)
(* naprawy i jedna zaloga instalujaca dalekopisy. Zgloszenia napraw i instalacji *)
(* nowych dalekopisow naplywaja w sposob losowy. Zadanie uzytkownika moze być *)
(* zrealizowane, jesli zaklad dysponuje wolna zaloga oraz niezbednymi *)
(* materialami i czesciami. Nowe dalekopisy oraz czesci zamienne zaklad *)
(* otrzymuje z roznych hurtowni i przechowuje we wlasnym magazynie. Dzialanie *)
(* programu nalezy zilustrowac w trybie tekstowym lub graficznym na ekranie *)
(* monitora. *)
MODULE archiv1;
FROM Process IMPORT SIGNAL,SEND,WAIT,Init,StartProcess,Awaited;
FROM IO IMPORT WrStr,WrLn,WrCard,KeyPressed;
FROM Window IMPORT Clear,GotoXY,WinDef,WinType,SingleFrame,White,Black,Color,
Open,SetTitle,Use,TitleMode,TextBackground,CursorOff;
FROM Lib IMPORT RANDOMIZE,RANDOM,Delay;
CONST
SkyLight=WinDef(40,0,79,4,White,Black,FALSE,TRUE,FALSE,TRUE,
SingleFrame,White,Black);
SkyLight1=WinDef(0,0,39,4,White,Black,FALSE,TRUE,FALSE,TRUE,
SingleFrame,White,Black);
SkyLight2=WinDef(25,5,50,9,White,Black,FALSE,TRUE,FALSE,TRUE,
SingleFrame,White,Black);
SkyLight3=WinDef(0,10,39,14,White,Black,FALSE,TRUE,FALSE,TRUE,
SingleFrame,White,Black);
SkyLight4=WinDef(40,10,79,14,White,Black,FALSE,TRUE,FALSE,TRUE,
SingleFrame,White,Black);
SkyLight5=WinDef(25,15,50,19,White,Black,FALSE,TRUE,FALSE,TRUE,
SingleFrame,White,Black);
SkyLight6=WinDef(25,20,50,24,White,Black,FALSE,TRUE,FALSE,TRUE,
SingleFrame,White,Black);
Blink=Color(8H);
VAR praca_1,praca_2,praca_instalujacej,wolna:SIGNAL;
hurt_cz,hurt_dal,zal_1,zal_2,zal_i,zak_nap,mag:WinType;
(* Poczatek monitora *)
MODULE monitor [4];
IMPORT SIGNAL,WAIT,SEND,Init,Awaited;
IMPORT WrStr,WrCard,WrLn,GotoXY,Delay,Use,Clear,KeyPressed;
IMPORT hurt_dal,mag,hurt_cz;
EXPORT do_magazynu_dalekopisow_nowych,do_magazynu_czesci,biore_nowy,biore_czesc;
CONST ilosc_dalekopisow=10;
ilosc_czesci=5;
VAR magazyn_czesci:ARRAY[0..ilosc_czesci-1] OF BOOLEAN;
magazyn_dalekopisow:ARRAY [0..ilosc_dalekopisow-1] OF BOOLEAN;
indeks,index,indeks1,index1,licznik,licznik_czesci:CARDINAL;
(* zmienne warunkowe *)
nie_ma_dalekopisow,sa_dalekopisy:SIGNAL;
nie_ma_nowych_czesci,sa_czesci:SIGNAL;
(* Procedury monitora *)
PROCEDURE do_magazynu_dalekopisow_nowych;
BEGIN
IF licznik=ilosc_dalekopisow THEN
Use(hurt_dal);
GotoXY(0,0);
IF licznik#ilosc_dalekopisow THEN
WrStr("KTOS INNY JEST W MAGAZYNIE");
ELSE
WrStr(" MAGAZYN JEST PELNY");
END;
Delay(1000);
WAIT(nie_ma_dalekopisow);
END;
magazyn_dalekopisow[indeks]:=TRUE;
indeks:=(indeks+1)MOD ilosc_dalekopisow;
INC(licznik);
Use(hurt_dal);
Clear;
GotoXY(0,1);
WrStr("DOSTARCZYLEM NOWY DALEKOPIS");
Delay(1000);
Clear;
WrStr("WOLNY");
Delay(1000);
Use(mag);
GotoXY(13,1);
WrCard(licznik,2);
Delay(1000);
IF Awaited(sa_dalekopisy) THEN
SEND(sa_dalekopisy);
END;
END do_magazynu_dalekopisow_nowych;
PROCEDURE biore_nowy(VAR dalekopis:BOOLEAN);
BEGIN
IF licznik=0 THEN WAIT(sa_dalekopisy) END;
dalekopis:=magazyn_dalekopisow[index];
magazyn_dalekopisow[index]:=FALSE;
index:=(index+1)MOD ilosc_dalekopisow;
DEC(licznik);
Use(mag);
GotoXY(13,1);
WrCard(licznik,2);
Delay(1000);
IF Awaited(nie_ma_dalekopisow) THEN
SEND(nie_ma_dalekopisow);
END;
END biore_nowy;
PROCEDURE do_magazynu_czesci;
BEGIN
IF licznik_czesci=ilosc_czesci THEN
Use(hurt_cz);
GotoXY(0,0);
IF licznik_czesci#ilosc_czesci THEN
WrStr("KTOS INNY JEST W MAGAZYNIE");
ELSE
WrStr("MAGAZYN JEST PELNY");
END;
Delay(1000);
WAIT(nie_ma_nowych_czesci);
END;
magazyn_czesci[indeks1]:=TRUE;
indeks1:=(indeks1+1)MOD ilosc_czesci;
INC(licznik_czesci);
Use(hurt_cz);
Clear;
GotoXY(0,1);
WrStr("DOSTARCZYLEM NOWY PAKIET CZESCI");
Delay(1000);
Clear;
WrStr("WOLNY");
Delay(1000);
Use(mag);
GotoXY(13,2);
WrCard(licznik_czesci,2);
Delay(1000);
IF Awaited(sa_czesci) THEN
SEND (sa_czesci);
END;
END do_magazynu_czesci;
PROCEDURE biore_czesc(VAR czesc:BOOLEAN);
BEGIN
IF licznik_czesci=0 THEN WAIT(sa_czesci) END;
czesc:=magazyn_czesci[index1];
magazyn_czesci[index1]:=FALSE;
index1:=(index1+1) MOD ilosc_czesci;
DEC(licznik_czesci);
Use(mag);
GotoXY(13,2);
WrCard(licznik_czesci,2);
Delay(1000);
IF Awaited(nie_ma_nowych_czesci) THEN
SEND(nie_ma_nowych_czesci);
END;
END biore_czesc;
(* Inicjacja monitora *)
BEGIN
licznik:=0;
licznik_czesci:=0;
indeks:=0;
index:=0;
indeks1:=0;
index1:=0;
Init(nie_ma_dalekopisow);
Init(sa_dalekopisy);
Init(nie_ma_nowych_czesci);
Init(sa_czesci);
END monitor;
(* Koniec monitora *)
PROCEDURE hurtownik_nowych_dalekopisow;
BEGIN
LOOP
IF KeyPressed() THEN HALT; END;
Use(hurt_dal);
GotoXY(0,0);
WrStr("PRACUJE ");WrLn;
Delay(1000);
do_magazynu_dalekopisow_nowych;
END;(*loop*)
END hurtownik_nowych_dalekopisow;
PROCEDURE hurtownik_nowych_czesci;
BEGIN
LOOP
IF KeyPressed() THEN HALT; END;
Use(hurt_cz);
GotoXY(0,1);
WrStr("PRACUJE ");WrLn;
Delay(1000);
do_magazynu_czesci;
END;(*loop*)
END hurtownik_nowych_czesci;
PROCEDURE zaloga_naprawcza_1;
VAR dal1:BOOLEAN;
BEGIN
Use(zal_1);
GotoXY(1,1);
WrStr("JESZCZE NIE PRACOWALA");
LOOP
IF KeyPressed() THEN HALT; END;
WAIT(praca_1);
Use(zal_1);
Clear;
GotoXY(1,1);
WrStr("PRACUJE");
biore_czesc(dal1);
IF dal1=TRUE THEN
Use(zal_1);
GotoXY(1,2);
WrStr("NAPRAWILEM");
Delay(1000);
ELSE
Use(zal_1);
GotoXY(1,2);
WrStr("NIE MA NOWYCH CZESCI");
Delay(1000);
END;
Clear;
WrStr("WOLNA");
SEND(wolna);
END;(*loop*)
END zaloga_naprawcza_1;
PROCEDURE zaloga_naprawcza_2;
VAR dal2:BOOLEAN;
BEGIN
Use(zal_2);
GotoXY(1,1);
WrStr("JESZCZE NIE PRACOWALA");
LOOP
IF KeyPressed() THEN HALT; END;
WAIT(praca_2);
Use(zal_2);
Clear;
GotoXY(1,1);
WrStr("PRACUJE");
biore_czesc(dal2);
IF dal2=TRUE THEN
Use(zal_2);
GotoXY(1,2);
WrStr("NAPRAWILEM");
Delay(1000);
ELSE
Use(zal_2);
GotoXY(1,2);
WrStr("NIE MA NOWYCH CZESCI");
Delay(1000);
END;
Clear;
WrStr("WOLNA");
SEND(wolna);
END;(*loop*)
END zaloga_naprawcza_2;
PROCEDURE zaloga_instalujaca;
VAR ins:BOOLEAN;
BEGIN
Use(zal_i);
GotoXY(1,1);
WrStr("JESZCZE NIE PRACOWALA");
LOOP
IF KeyPressed() THEN HALT; END;
WAIT(praca_instalujacej);
Use(zal_i);
Clear;
GotoXY(1,1);
WrStr("PRACUJE");
biore_nowy(ins);
IF ins=TRUE THEN
Use(zal_i);
GotoXY(1,2);
WrStr("ZAINSTALOWALEM");
Delay(1000);
ELSE
Use(zal_i);
GotoXY(1,2);
WrStr("NIE MA NOWYCH DALEKOPISOW");
Delay(1000);
END;
Clear;
WrStr("WOLNA");
SEND(wolna);
END;(*loop*)
END zaloga_instalujaca;
PROCEDURE zgloszenia():CARDINAL;
VAR co_chce:CARDINAL;
BEGIN
RANDOMIZE;
co_chce:=RANDOM(3);
RETURN co_chce;
END zgloszenia;
PROCEDURE zaklad_napraw;
VAR generacja:CARDINAL;
BEGIN
LOOP
IF KeyPressed() THEN HALT; END;
generacja:=zgloszenia();
Use(zak_nap);
Clear;
IF generacja=0 THEN
WrStr("zadanie instalacji");WrLn;
WrStr("NIECH PRACUJE");WrLn;
WrStr("zaloga instalujaca");
ELSIF generacja=1 THEN
WrStr("zadanie naprawy");WrLn;
WrStr(" NIECH PRACUJE");WrLn;
WrStr("zaloga naprawcza 1");
ELSIF generacja=2 THEN
WrStr("zadanie naprawy");WrLn;
WrStr("NIECH PRACUJE");WrLn;
WrStr("zaloga naprawcza 2");
END;
IF generacja=0 THEN
SEND(praca_instalujacej);
ELSIF generacja=1 THEN
SEND(praca_1);
ELSIF generacja=2 THEN
SEND(praca_2);
END;
END;(*loop*)
END zaklad_napraw;
(* Wlasciwy poczatek programu*)
BEGIN
Clear;
GotoXY(0,23);
TextBackground(Blink);
WrStr(" DOWOLNY KLAWISZ");WrLn;
WrStr("WYJSCIE Z PROGRAMU !");
CursorOff;
hurt_cz:=Open(SkyLight);
SetTitle(hurt_cz,'HURTOWNIK CZESCI',CenterUpperTitle);
hurt_dal:=Open(SkyLight1);
SetTitle(hurt_dal,'HURTOWNIK DALEKOPISOW',CenterUpperTitle);
zak_nap:=Open(SkyLight2);
SetTitle(zak_nap,'ZAKLAD NAPRAW',CenterUpperTitle);
zal_1:=Open(SkyLight3);
SetTitle(zal_1,'ZALOGA NAPRAWCZA 1',CenterUpperTitle);
zal_2:=Open(SkyLight4);
SetTitle(zal_2,'ZALOGA NAPRAWCZA 2',CenterUpperTitle);
zal_i:=Open(SkyLight5);
SetTitle(zal_i,'ZALOGA INSTALUJACA',CenterUpperTitle);
mag:=Open(SkyLight6);
SetTitle(mag,'MAGAZYN',CenterUpperTitle);
Use(mag);
WrStr("NOWYCH JEST: 0");WrLn;
WrStr("CZESCI JEST: 0");WrLn;
Init(praca_1);
Init(praca_2);
Init(praca_instalujacej);
Init(wolna);
(* Start procesow sekwencyjnych programu wspolbieznego *)
StartProcess(hurtownik_nowych_dalekopisow,600,6);
StartProcess(hurtownik_nowych_czesci,600,6);
StartProcess(zaloga_naprawcza_1,600,5);
StartProcess(zaloga_naprawcza_2,600,5);
StartProcess(zaloga_instalujaca,600,5);
zaklad_napraw;
END archiv1.