(* 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.