Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#19

Re: Ampelschaltung mit Delphi über Com Port

  Alt 25. Feb 2010, 09:46
Nja, der Unterschied war jetzt eher Fußgängerampel mit Rot/Grün und eine Ampel mit Rot/Gelb/Grün.

Ideal wäre natürlich, wenn alle Ampeln von einem Basisobjekt abgeleitet werden, damit man für alle die selbe Schnittstelle hat.

Das Umschalten wäre jetzt einfach durch Zuweisen eines der Stati möglich.
Das Objekt würde dann in der Prozedur entsprechend des Wertes seine Anzeige/Ausgänge/LEDs umstellen.



Delphi-Quellcode:
type
  TAmpelStatus = (asAllesAus, asRot, asRotGelb, asGelb, asGruen, asGelbBlinkend);
  TAmpelBasis = class
    procedure Umstellen(NeuerStatus: TAmpelStatus); virtual; abstract;
    procedure ZeichneNeu; virtual; abstract;
  end;
  TAmpelRotGruen = class(TAmpelBasis)
  private
    fBild: TCanvas;
    fX, fY: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    fGeraet: TIrgendwas; // Schnittstelle zum Ausgabegerät;
    fPortRot: Integer; // die Adressen der entsprechenden LED
    fPortGruen: Integer; //
    fStatus: TAmpelStatus;
  public
    constructor Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
      Geraet: TIrgendwas; PortRot, PortGruen: Integer);
    procedure Umstellen(NeuerStatus: TAmpelStatus); override;
    procedure ZeichneNeu; override;
  end;
  TAmpelRotGelbGruen = class(TAmpelBasis)
  private
    fX, fY: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    fPortRot: Integer; // die Adressen der entsprechenden LED
    fPortGelb: Integer; //
    fPortGruen: Integer; //
    fBlinkerAn: Boolean; // einfach bei jedem Zeichnen umschalten und zusammen
    fStatus: TAmpelStatus; // mit asGelbBlinkend auf das Gelb anwenden
  public
    constructor Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
      Geraet: TIrgendwas; PortRot, PortGelb, PortGruen: Integer);
    procedure Umstellen(NeuerStatus: TAmpelStatus); override;
    procedure ZeichneNeu; override;
  end;

constructor TAmpelRotGruen.Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
  Geraet: TIrgendwas; PortRot, PortGruen: Integer);
begin
  fBild := Zeichenflaeche;
  fX := x;
  fY := y;
  fGeraet := Geraet;
  fPortRot := PortRot;
  fPortGruen := PortGruen;
  fStatus := asAllesAus;
  Zeichne;
end;

procedure TAmpelRotGruen.Umstellen(NeuerStatus: TAmpelStatus);
begin
  fStatus := NeuerStatus;
  case fStatus of
    asAllesAus: begin
      fGeraet.Aus(fPortRot);
      fGeraet.Aus(fPortGruen);
    end;
    asRot: begin
      fGeraet.An(fPortRot);
      fGeraet.Aus(fPortGruen);
    end;
    asGruen: begin
      fGeraet.Aus(fPortRot);
      fGeraet.An(fPortGruen);
    end;
    else raise Exception.Create('diesen Status gibt es hier nicht');
  end;
  Zeichne;
end;

procedure TAmpelRotGruen.Zeichne;
begin
  ZeichneRahmenUndWasSonstNochBenötigtWird(fBild);
  case fStatus of
    asRot: ZeichneRotesLicht(fBild);
    asGruen: ZeichneGruenesLicht(fBild);
  end;
end;

// Ampel erstellen
Liste.Add(TAmpelRotGruen.Erstelle(Canvas, 100, 50, Geraet, 1, 2));

// erste Ampel umstellen
Liste[0].Umstellen(asRot);

// alles neu zeichnen
for i := 0 to Liste.Count - 1 do
  Liste[i].Zeichne;

// alles auf Grün stellen (bitte nicht nachmachen)
for i := 0 to Liste.Count - 1 do
  Liste[i].Umstellen(asGruen);
Vorteil ist eben, daß man jetzt einfach für jedes Ampel, welche es in "real" gibt, ein passendes Objekt erstellt, diesem mittteilt welche LEDs zu ihm gehören und so das Steuerprogramm nicht wissen muß, wie es welche LEDs ansteuert.

Im Steurprogramm wird dann z.B. über einen Timer das Programm gefahren und einfach nur noch die Objekte angesteuert
Delphi-Quellcode:
Liste[0].Umstellen(asRot);
Liste[2].Umstellen(asRot);
'ne Sekunde später dann noch
Liste[1].Umstellen(asGruen);
Liste[3].Umstellen(asGruen);
...
(z.B. 'ne Kreuzung mit 4 Ampeln)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat