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.
In the case of pictures that are attached to the article, the source must also be stated. This also applies to your own pictures, which were taken by you. Pictures without source information will be deleted!
  • 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: mit EEP-Bordmitteln
    EEPRegisterSignal(1)
    function EEPOnSignal_1(position)
      print("Signal 1 ist nun in Position "..position)
    end

    folgendes schreiben:

    Lua: mit onSignal
    onSignal[1] = function(position)
      print("Signal 1 ist nun in Position "..position)
    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, 15, EEP 16.4 Expert, 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; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 15 (Dev), 17 (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.

  • 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.

    Ich hab mir für eigene Dinge etwas gebaut, das ich mehrere Funktionen je Callback hab und auch überlegt, ob man mittels __index die Definitionen von Callbacks abfangen und EEPRegisterSignal und dergleichen automatisch aufrufen kann. Jetzt warst du auch schonmal davor, das zu machen. Gab es da irgendwelche Hindernisse?

    EEP 16.2, AMD FX(tm)-4300 Quad-Core Processor 3.80 GHz, 8 GB RAM

    Modellwünsche: BR 185-CL 004 in Blau/Grauer ITL-Lackierung, BR 372 "Knödelpresse" der ČD in Dunkelblau/Hellblau als auch in Rot mit gelben Streifen.

  • Gab es da irgendwelche Hindernisse?

    Hallo :)


    bitte eröffne dafür ein neues Thema in einem passenden Bereich. Vielen Dank für die Unterstützung, das Forum übersichtlich zu halten.


    Gruß Ingo

    Threema - Sicherer und privater Messenger

    Meine Threema-ID

    Warum Threema?


    Win 11x64 Professional, Gigabyte B360M AORUS, Intel Core i7-8700K, 32GB RAM, NVIDIA GeForce GTX 1050 Ti 4GB, Philips 273V7QDAB Full HD

    Windows Firewall und Defender
    EEP 15.1 Expert Patch 2, Plugins: 1

    EEP 16.4 Expert, Plugins: 1,2,3,4

    EEP 17.2 Expert, Plugins: 1,2


  • Gab es da irgendwelche Hindernisse?

    Nein, nicht dass ich wüsste. Wie geschrieben, habe ich die Dinge nur deswegen wieder rausgeworfen, weil sie mit der Grundaufgabe nichts zu tun hatten. Und im Falle der Mehrfach-Callbacks: Weil ich von einer Zuweisung erwarte, dass ein vorheriger Wert überschrieben statt angehängt wird.


    Wenn bei dir irgendetwas nicht funktioniert wie erwartet, beachte bitte Ingos Hinweis und mache ein neues Thema mit einer genau(er)en Fehlerbeschreibung auf.


    Viele Grüße

    Benny

  • Ne, das ist jetzt nicht so, das ich einen Fehler irgendwo hab.


    Ich hatte nur gesehen, das du schon Experimente in die Richtung gemacht hast, und wollte gucken, das ich nicht das Rad neu erfinde, was anderswo schon erfunden wurde.

    LG Nero

    EEP 16.2, AMD FX(tm)-4300 Quad-Core Processor 3.80 GHz, 8 GB RAM

    Modellwünsche: BR 185-CL 004 in Blau/Grauer ITL-Lackierung, BR 372 "Knödelpresse" der ČD in Dunkelblau/Hellblau als auch in Rot mit gelben Streifen.