Zu Teilproblem a)![]() |
Zu Teilproblem b)![]() |




Zu Teilproblem a) Sender![]() |
Zu Teilproblem b) Empfaenger![]() |
procedure TGUI.FormCreate(Sender: TObject); begin // alle benoetigten Objekte erschaffen Daten := TBitFolge.Create; NetzHw := TNetzHw.Create; Send := TSender.Create; // und den Sender an die Netzhardware binden Send.Binde( NetzHw ); end; procedure TGUI.FormDestroy(Sender: TObject); begin // die Objekte wieder freigeben Send.Free; NetzHw.Free; Daten.Free; end; procedure TGUI.OnTimerTick(Sender: TObject); begin // gibt den Tick weiter an den Sender. Send.TimerTick; end; |
constructor TSender.Create;
begin
inherited Create;
Puffer := TBitFolge.Create;
CountDown := 0;
Zustand := Warte;
end;
procedure TSender.Binde( Netz : TNetzHw );
// dann kennt der Sender die Netzhardware, die eigentlich dem GUI gehoert.
begin
NetzHw := Netz;
end;
procedure TSender.Sende( Daten : TBitFolge );
begin
// das ganze eigentlich nur, wenn wir nicht schon gerade am Senden sind
// Der Aufruf der Methode Sende fuert zum Uebergang in den Zustand Sende
zustand := SendeAB;
Countdown := Taktlaenge;
// Wir kopieren die zu sendenden Daten in einen Puffer
Puffer.fromBitFolge( Daten );
end;
procedure TSender.TimerTick;
// Das GUI teilt uns mit, dass der Timer getickt hat.
begin
// Wir verarbeiten dies.
case Zustand of
Warte : // nichts
begin
NetzHw.SetSendeLeitung(Aus);
end;
SendeAB : // AB ist der Anfangsbegrenzer
begin
NetzHw.SetSendeLeitung(An);
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := SendeBit1;
CountDown := Taktlaenge;
end;
end;
SendeBit1 :
begin
case Puffer.getBit(1) of
Null : NetzHw.SetSendeLeitung( Aus );
Eins : NetzHw.SetSendeLeitung( An );
end;
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := SendeBit2;
CountDown := Taktlaenge;
end;
end;
SendeBit2 :
begin
case Puffer.getBit(2) of
Null : NetzHw.SetSendeLeitung( Aus );
Eins : NetzHw.SetSendeLeitung( An );
end;
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := SendeBit3;
CountDown := Taktlaenge;
end;
end;
und so weiter für SendeBit3, SendeBit4, SendeBit5, SendeBit6, SendeBit7
SendeBit8 :
begin
case Puffer.getBit(8) of
Null : NetzHw.SetSendeLeitung( Aus );
Eins : NetzHw.SetSendeLeitung( An );
end;
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := SendePB;
CountDown := Taktlaenge;
end;
end;
SendePB :
begin
case Puffer.getParitaet of
Null : NetzHw.SetSendeLeitung( Aus );
Eins : NetzHw.SetSendeLeitung( An );
end;
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := SendeEB;
CountDown := Taktlaenge;
end;
end;
SendeEB :
begin
NetzHw.SetSendeLeitung( Aus );
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := Warte;
end;
end;
end;
end;
|
procedure TGUI.FormCreate(Sender: TObject); begin // alle benoetigten Objekte erschaffen Daten := TBitFolge.Create; NetzHw := TNetzHw.Create; Empfaenger := TEmpfaenger.Create; // und den Empfaenger an die Netzhardware binden Empfaenger.Binde( NetzHw ); end; procedure TGUI.FormDestroy(Sender: TObject); begin // die Objekte wieder freigeben Empfaenger.Free; NetzHw.Free; Daten.Free; end; procedure TGUI.OnTimerTick(Sender: TObject); begin // gibt den Tick weiter an den Empfaenger. Empfaenger.TimerTick; end; |
const Takt=10;
type TEmpfaengerZustand = ( Warte, EmpfangeAB, EmpfangeBit1, EmpfangeBit2,
EmpfangeBit3, EmpfangeBit4, EmpfangeBit5, EmpfangeBit6, EmpfangeBit7,
EmpfangeBit8, EmpfangeEB );
procedure TEmpfaenger.Binde( Netz : TNetzHw );
// dann kennt der Empfaenger die Netzhardware, die eigentlich dem GUI gehoert.
begin
NetzHw := Netz;
end;
procedure TEmpfaenger.TimerTick;
// Das GUI teilt uns mit, dass der Timer getickt hat.
begin
// Wir verarbeiten dies.
// Was ist zu tun, wenn der Timer tickt?
Warte :
begin
if ( NetzHw.GetEmpfangsLeitung = An ) then
begin
zustand := EmpfangeAB;
CountDown := Takt;
end;
end;
EmpfangeAB :
begin
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := EmpfangeBit1;
CountDown := Takt div 2;
end;
end;
EmpfangeBit1 :
begin
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
// Leitung auslesen
case NetzHw.GetEmpfangsLeitung of
An : BitFolge.setBit(1, Eins);
Aus : BitFolge.setBit(1, Null);
end;
// in Folgezustand wechseln und dort warten
zustand := EmpfangeBit2;
CountDown := Takt;
end;
end;
EmpfangeBit2 :
begin
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
// Leitung auslesen
case NetzHw.GetEmpfangsLeitung of
An : BitFolge.setBit(2, Eins);
Aus : BitFolge.setBit(2, Null);
end;
// in Folgezustand wechseln und dort warten
zustand := EmpfangeBit3;
CountDown := Takt;
end;
end;
und so weiter für EmpfangeBit3, EmpfangeBit4, EmpfangeBit5, EmpfangeBit6, EmpfangeBit7
EmpfangeBit8 :
begin
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
// Leitung auslesen
case NetzHw.GetEmpfangsLeitung of
An : BitFolge.setBit(8, Eins);
Aus : BitFolge.setBit(8, Null);
end;
// in Folgezustand wechseln und dort warten
zustand := EmpfangeEB;
CountDown := Takt;
end;
end;
EmpfangeEB :
begin
CountDown := CountDown-1;
if ( CountDown = 0 ) then
begin
zustand := Warte;
CountDown := 0;
end;
end;
end;
end;
|