Moin!
Ich würde gerne in gewisse Tastatur-Trigger im Script eine Verzögerung einbauen. Der Trigger soll nachdem er ausgelöst wurd eine kurze Zeit nicht auf weiteres Drücken der Taste reagieren. Der Hintergrund wäre der, dass ich einige Funktionen gerne auf das Rädchen beim G29-Lenkrad lege (Scheibenwischer) oder bei meiner LaWi-Seitenkonsole auf das dortige Scrollrad (Lichtsteuerung oder Menü-Blättern). Beides ist leider so sensibel, dass da beim Betätigen ganz leicht zwei mal der Trigger ausgelöst wird. Das würde ich gerne nun verhindern.. Ich dachte da an die Trigger in den Scripten, denn ich wüsste nicht wie ich das zum Beispiel in JoyToKey lösen könnte. Zumindest um es auszuprobieren würd ich gerne eine Scriptseitige Lösung mal austesten.
Verzögerung in Trigger einbauen
- wurstbrot
- Unerledigt
Als Gast kannst du nur Inhalte in deiner ausgewählten Sprache sehen. Registrierte Nutzer können die Sichtbarkeit anderer Sprachen in ihrem Kontrollzentrum aktivieren, weitere Infos hier.
Alle Themen sind in den Foren mit einer Sprachflagge gekennzeichnet:
-
-
-
Ich bin mir nicht 100% sicher, ob ich dein Problem bzw. Anliegen richtig verstanden habe. Du willst also eine Art "Timeout" haben, dass, wenn ein Trigger einmal ausgelöst wird, er für eine Zeitspanne von x Sekunden quasi blockiert und nicht ausgeführt wird, bis diese Zeitspanne eben um ist. Quasi ein Cooldown. Das kannst du relativ einfach mit etwas Gescripte lösen.
Hier mal ein Beispiel:
Code: script.osc
Alles anzeigenDieser Script-Abschnitt muss in jedem Frame ausgeführt werden. Du musst ihn also in deinen Bus-Frame einfügen bzw. in ein passendes frame-Makro {frame} 'Aktualisiere den Cooldown-Timer (allerdings begrenzt auf die Cooldown-Zeit, um einen Überlauf zu verhindern. (L.L.dein_trigger_cooldownTimer) (L.S.Timegap) + (C.L.dein_trigger_cooldownTime) min (S.L.dein_trigger_cooldownTimer) {end} {trigger:dein_trigger} 'Führe den Trigger nur aus, wenn der Cooldown abgelaufen ist (L.L.dein_trigger_cooldownTimer) (C.L.dein_trigger_cooldownTime) >= {if} 'Hier kommt dein eigentlicher Trigger-Code hin '...und am Ende den Cooldown-Timer auf 0 setzen (um den Cooldown quasi zu "starten") 0 (S.L.dein_trigger_cooldownTime) {endif} {end}
Folgende Variable (kannst sie letztendlich auch anders nennen) muss in die Varlist eingetragen werden:
Die gewünschte Cooldown-Zeit legst du am elegantesten in einer Constfile fest:
Code: constfile.txtHier die gewünschte Cooldown-Zeit (in Sekunden) für deinen Trigger eintragen (hier z.B. eine Sekunde) [const] dein_trigger_cooldownTime 1
Ich hoffe, das ist alles so verständlich, sonst frag' gerne nach.
-
-
Es muss irgendwo hin, wo der Code in jedem Frame ausgeführt wird.
Auf Nummer sicher gehst du auf jeden Fall, wenn du das direkt in den {frame}-Bereich des Busses direkt irgendwo einfügst.
Allerdings haben ja auch manche "Buskomponenten" eigene Frame-Makros, die aus dem {frame} heraus aufgerufen werden.
Dort könntest du es theoretisch genau so eintragen. Das ist ziemlich Banane.
-
One can also forego the need for continuous / per-frame timing, by opportunistically, on a per-trigger-invocation basis, comparing GetTime against its value recorded during the previous (completed) trigger run (if any):
Code
Alles anzeigen' disclaimer: untested {trigger:dein_trigger} (L.S.GetTime) s0 (L.L.dein_trigger_letzte_ausfuehrungszeit) s1 ' Allow trigger to run if: ' a) It never run before (timing variable unset); or l1 ! ' b) the OMSI situation got saved / reloaded (GetTime will then restart from ' zero, and this test circumvents the need to wait, potentially for a long ' time, until the pre-save GetTime is attained once more); or l0 l1 - s2 0 < || ' c) the cooldown period simply elapsed l2 (C.L.dein_trigger_cooldownTimer) >= || {if} ' ensure cooldown l0 (S.L.dein_trigger_letzte_ausfuehrungszeit) ' --- actual trigger logic goes here --- {endif} {end}
Pros:
- Might spare the odd microsecond due to not running on each and every frame (can be improved even further by splitting the if-statement into a bunch of if-elses -- to the further detriment of readability)
- Generally speaking (beyond triggers), GetTime-based timing is advantageous when it comes to AI vehicles, as these might experience halts in script execution owing to despawns / respawns, hence being provided with no hard guarantee that their {frame} will indeed run uninterruptedly once per game frame
Cons:
- (Subjectively) less readable
- Extra logic needed to account for the edge case of the OMSI situation getting saved / reloaded during a cooldown period
- Harder for other code to observe the state of timing and take concurrent action (think e.g. inter-trigger coordination)
-
Es muss irgendwo hin, wo der Code in jedem Frame ausgeführt wird.
Auf Nummer sicher gehst du auf jeden Fall, wenn du das direkt in den {frame}-Bereich des Busses direkt irgendwo einfügst.
Allerdings haben ja auch manche "Buskomponenten" eigene Frame-Makros, die aus dem {frame} heraus aufgerufen werden.
Dort könntest du es theoretisch genau so eintragen. Das ist ziemlich Banane.
Gestern auf die schnelle noch ausprobiert im NLC beim Display, das ganze hatte aber dazu geführt dass das Display komplett den Dienst aufgegeben hat
Ich hatte den frame in die MAN_Cockpit.osc integriert wo die Trigger sind. vielleicht war das das Problem.
ist aber schon gaga ein Script zu ändern weil die Hardware eine Macke hat
Aber sonst wüsste ich nicht wie und das Rädchen wäre unbenutzt.
-
Versuche, den Frame-Teil beim NLC z.B. in das Macro "cockpit_frame" einzufügen (Bei mir Zeile 1792 in der cockpit.osc).
Einfach am Anfang (oder Ende) des Makros mit hinzufügen, in etwa so:
Code
Alles anzeigen{macro:cockpit_frame} 'Aktualisiere den Cooldown-Timer (allerdings begrenzt auf die Cooldown-Zeit, um einen Überlauf zu verhindern. (L.L.dein_trigger_cooldownTimer) (L.S.Timegap) + (C.L.dein_trigger_cooldownTime) min (S.L.dein_trigger_cooldownTimer) 'Ab hier einfach alles so belassen, wie es da ist. 'Übertragen der Schalterstellungen: (L.L.cp_drehschalter_mode) (S.L.cp_drehschalter_mode) (L.L.cp_drehschalter_pos) (S.L.cp_drehschalter_pos) (L.L.cp_retarder_sw) (S.L.antrieb_retarder_sw) (L.L.cp_wischer_schnell_sw) (S.L.wiper_schnell_sw) (L.L.cp_wischer_einaus_sw) (S.L.wiper_einaus_sw) (L.L.cp_wischer_intervall_sw) (S.L.wiper_intervall_sw) (L.L.cp_wischer_wascher_sw) (S.L.wiper_wascher_sw) (M.L.uhr_frame) (M.L.hupe_frame) (M.L.blinkerhebel_frame) (M.L.wischerhebel_frame) (M.L.wischer_drehschalter_frame) (M.L.tankuhr_frame) (M.L.Tachonadel_frame) (M.L.Drehzahlnadel_frame) (M.L.cockpitlights_frame) (M.L.odometer_frame) (M.L.engine_thermometer_frame) (M.L.Elektrorollos) (M.L.Dachluken) (M.L.Fahrtenschreiber) (M.L.Warnsummer) (M.L.Schluessel) (M.L.Dash_Verstellung) (M.L.Retarderhebel) (M.L.fahrertuer_frame) (M.L.Tempomat) (M.L.Radio_Frame) (L.L.vis_Fahrgastpendel) 0 > {if} (M.L.Fahrgastpendel) {endif} {end}