onSignal: Callback-Funktionen einfacher und sicherer definieren

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
  • Vor ein paar Tagen wunderte ich mich, warum meine EEPOnSignal_X()-Funktionen nicht aufgerufen werden.

    Wie sich herausstellte, hatte ich den EEPRegisterSignal()-Aufruf vergessen :ay_1:


    Damit dieser und andere Fehler nicht nochmal passieren, habe ich ein kleines Lua-Modul geschrieben: onSignal.


    Damit kann man statt

    LUA Source Code: mit EEP-Bordmitteln
    1. EEPRegisterSignal(1)
    2. function EEPOnSignal_1(position)
    3. print("Signal 1 ist nun in Position "..position)
    4. end

    folgendes schreiben:

    LUA Source Code: mit onSignal
    1. onSignal[1] = function(position)
    2. print("Signal 1 ist nun in Position "..position)
    3. end


    Zugegeben, das ist jetzt nicht so viel kürzer, im wesentlichen spart man sich den Aufruf von EEPRegisterSignal(1). Das macht onSignal nämlich automatisch, sobald man eine Callback-Funktion definiert.
    Gleichzeitig prüft onSignal aber noch ein paar Dinge:

    • Ist die angegebene ID eine Zahl? (vermutlich schon, das schafft man wohl noch)
    • Gibt es überhaupt ein Signal mit der angegebenen ID? (wenn nicht, deutet das auf einen Tippfehler hin)
    • Wurde nicht vorher schon eine Callback-Funktion für dieses Signal definiert? (wenn doch, würde die Funktion überschrieben. Und dann wundert man sich, warum die vorherige Funktion nicht mehr aufgerufen wird.)

    Das frühzeitige Melden von Fehlern kann euch später eine langwierige Fehlersuche ersparen.


    Und weil die ID nicht mehr Teil des Funktionsnamens ist, kann auch einfach eine Variable dafür eingesetzt werden - sowas wie _ENV["EEPOnSignal_"..id] ist dann nicht mehr nötig.


    Ich hoffe, der eine oder andere kann etwas damit anfangen.


    Einen Download und genauere Infos findet ihr auf meiner Homepage.


    Viele Grüße

    Benny


    PS: Für Weichen funktioniert das ganze natürlich auch - das läuft dann über onSwitch[id].

  • Hallo Benny (BH2) ,


    das ist das Schöne an Deinen Unzufriedenheiten mit EEP - immer profitieren wir anderen davon!


    Danke sagt

    ruetzi

    EEP 5, HomeNos 5/8/13/15, EEP 8, 10, 11, 13, 14, EEP 15.1 Expert Patch 2, Plugin 1
    PC Intel Core i5-4460 QUAD-Core 3.2 GHz, 16 GB PC1600 DDR3-RAM, 250 GB SSD, nVidia GeForce GTX 750Ti - 2 GB DDR5, Windows 8.1
    Notebook Pentium Dual Core 2 GHz, 4 GB DDR3-RAM, Intel GMA3000 Grafik


    EEP - immerhin das Beste vom Schlechten - mit Tendenz zum Besseren!

  • Hallo Benny (BH2) ,


    ich hätte da noch eine kleine Erweiterungs-Idee (weil ich mir selbst so etwas ähnliches geschrieben hatte, wenn auch mit einem anderen Grundansatz):


    Angenommen, Du willst bei zwei oder mehr Signalen in fast der gleichen Weise reagieren. Weiter angenommen, Du hast bereits eine Funktion, die das alles macht und nur eine winzig kleine Fallunterscheidung für die Signale hat. Dann wäre es doch schön, wenn Du eben diese Funktion bei beiden onSignal[x]-Einträgen verwenden könntest. Um kein Durcheinander zu produzieren und um Deine bisherige Logik weiter verwenden zu können, müsste die Signal-ID allerdings als zweiter Parameter übergeben werden (kleine Unschönheit). Also so etwas wie:

    Und das gleiche natürlich für onSwitch.


    Nur so als Idee, falls Du es noch erweitern willst.


    Gruß

    Christopher

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 16GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 13.2 Plugins 1+2, 14.1 (Dev), 15 (Dev); HomeNOS 14 (Dev)
    Laptop: Intel i5 3230M; 64bit; 2,6 GHz; 8GB RAM; GeForce GT740M (1 GB); Win 8.1; EEP 6, 13.2 Plugins 1+2; HomeNOS 13 (User)

  • Hallo Christopher,

    ich habe mein Skript extra einfach gehalten, nach dem Motto: Mache eine Sache, aber mache die gut.

    Ich hatte anfangs tatsächlich noch mehr Funktionen drin (mehrere Callback-Funktionen für ein Signal, oder onSignalOrSwitch), aber die habe ich wieder rausgeworfen, weil sie mit der Grundaufgabe nicht direkt etwas zu tun haben.


    Die zusätzliche ID-Übergabe ist eigentlich ein ganz anderes Thema als die "Einfach-Schreibweise", die ich mit onSignal erreichen wollte.

    Mit einer Funktion, die eine Funktion zurückgibt, kannst du dein Beispiel aber trotzdem einfach erreichen:


    Im Übrigen habe ich auf diese Weise auch mein Modul geschrieben: onSignal und onSwitch sind ja fast genau gleich.


    Viele Grüße

    Benny


    PS: Wer meinen Code studieren will, ohne ihn erst runterzuladen und zu entpacken, kann das auf GitHub tun.