===== Event DigInputEvent ===== \\ ==== Einleitung ==== Dieses Event ermöglicht es, Signale beliebiger Eingänge an angeschlossener Cockpit-XP Hardware auszuwerten und darauf zu reagieren. Das kann ein IR-Empfänger sein, ein Taster, etc. \\ ==== Syntax ==== ^ Parameter ^ Beschreibung ^ | Cockpit.Slot | Auslösender Slot oder Status des Eingang (0 = aus, 1 = ein) | | Cockpit.Parameter | , z.B. USBBox 1-x | | Cockpit.Station | , z.B Eingänge an USBBox E1-E8 | \\ ==== Codebeispiel ==== Werden die Sensoren an Eingang 6 und 7 ''(Cockpit.Station)'' der USB-Box Nummer 2 ''(Cockpit.Parameter)'' in der Liste im Geräte-Manager der Rennbahn ausgelöst, wird ein Relais für eine gewisse Zeit ein- und danach wieder ausgeschaltet. Der Code ist in ein kritisches Event eingebettet. Das verhindert, dass ein weiteres Auslösen eines Sensors in den Ablauf eingreift. Es wird gewartet, bis die Befehlsfolge durchgelaufen ist. Erst danach beginnt die Ausführung erneut. { Pascal Script Engine } { Event: DigInputEvent } { Parameter: Cockpit.Slot=, Cockpit.Station=, Cockpit.Parameter= } begin if (Cockpit.Parameter = 2) and ((Cockpit.Station = 7) or (Cockpit.Station = 6)) then begin cpEnterCriticalSectionEvent; cpSetOutput('LichtRelais', true); cpsleep(2600); cpSetOutput('LichtRelais', false); cpsleep(100); cpLeaveCriticalSectionEvent; end; end. \\ === Optimierungen === Es hat sich gezeigt, dass man die Abfrage der Eingänge spürbar beschleunigen kann, wenn man die Abfrage im AddOn richtig setzt. So ist zum Beispiel ein ... if (Cockpit.Parameter = 1) and ((Cockpit.Station = 1) or (Cockpit.Station = 2)) then begin ... end; ... sowie ein ... if Cockpit.Parameter = 1 then begin case Cockpit.Station of 1: ...; 2: ...; else ...; end; end; ... deutlich langsamer als \\ ... if (Cockpit.Parameter = 1) and (Cockpit.Station = 1) then begin ... end; if (Cockpit.Parameter = 1) and (Cockpit.Station = 2) then begin ... end; ... Durch geschicktes Programmieren kann man hier evtl. noch die eine oder andere ms herauskitzeln. Ein Performancenachteil bringt auch das Arbeiten mit Package-Variablen innerhalb einer if ... then Abfrage. Beispiel:\\ ... if (Cockpit.Parameter = cpGetIntegerVar('USBBox')) and (Cockpit.Station = cpGetIntegerVar('Eingang')) then begin ... end; ... Besser, hier zeitlich gesehen, ist die "harte" Programmierung auf die richtige USBBox bzw. den Eingang. Beispiel: ... if (Cockpit.Parameter = 1) and (Cockpit.Station = 6) then begin ... end; ... \\ ==== Hinweise ==== Sucht man im Internet nach Antworten, ob die If ... then oder die Case ... of Anweisung schneller arbeitet, gelangt man regelmäßig und in sehr vielen Programmiersprachen zu dem Schluss, dass die Case ... of Anweisung aufgrund spezieller Optimierungen im Compiler bei mehr als 5 Argumenten Geschwindigkeitsvorteile bietet. Leider lässt sich das nicht konkret in der AddOn-Sprache messen, so dass die tatsächlich schnellere Methode wohl im Dunkeln bleiben wird. Korrekt ist jedoch, dass der Einsatz von Package-Variablen Performance-Nachteile gegenüber festen Werten oder lokalen Varialben aufweist. \\ ---- [[cockpit-xp:start|Start]] - [[cockpit-xp:faq|FAQ]] - [[cockpit-xp:glossar|Glossar]] - [[cockpit-xp:sitemap|Sitemap]] - [[cockpit-xp:impressum|Impressum]]