From d4878f781c48ae510aa4613c024cf5598e2e13a0 Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Wed, 22 Jun 2022 22:44:30 +0000 Subject: [PATCH] Es geht voran... --- Install_00/Begriffe.lua | 62 +++++++++++ Install_00/Install.ini | 1 + Install_00/kskit.lua | 220 +++++++++++++++++++++------------------- 3 files changed, 176 insertions(+), 107 deletions(-) create mode 100644 Install_00/Begriffe.lua diff --git a/Install_00/Begriffe.lua b/Install_00/Begriffe.lua new file mode 100644 index 0000000..8f174da --- /dev/null +++ b/Install_00/Begriffe.lua @@ -0,0 +1,62 @@ +-- Grundsätzliche Typen von Signalbildern +HALT=1 +FAHRT=2 +RANGIERFAHRT=3 +ERSATZFAHRT=4 +AUS=5 + +-- Hv-Signalsystem +Hp0={HALT} +Hp1={FAHRT} +Hp2={FAHRT, V_max=40} +Hp1Vr0={FAHRT, H_erwarten=true} +Hp1Vr1={FAHRT} +Hp1Vr2={FAHRT, V_erwarten=40} +Hp2Vr0={FAHRT, V_max=40, H_erwarten=true} +Hp2Vr1={FAHRT, V_max=40} +Hp2Vr2={FAHRT, V_max=40, V_erwarten=40} + +-- OSJD/EZMG/Hl-Signale des Ostblocks +-- V_erwarten=60 wird durch V_erwarten=40 signalisiert +Hl1={FAHRT} +Hl2={FAHRT, V_max=100} +Hl3a={FAHRT, V_max=40} +Hl3b={FAHRT, V_max=60} +Hl4={FAHRT, V_erwarten=100} +Hl5={FAHRT, V_max=100, V_erwarten=100} +Hl6a={FAHRT, V_max=40, V_erwarten=100} +Hl6b={FAHRT, V_max=60, V_erwarten=100} +Hl7={FAHRT, V_erwarten=40} +Hl8={FAHRT, V_max=100, V_erwarten=40} +Hl9a={FAHRT, V_max=40, V_erwarten=40} +Hl9b={FAHRT, V_max=60, V_erwarten=40} +Hl10={FAHRT, H_erwarten=true} +Hl11={FAHRT, V_max=100, H_erwarten=true} +Hl12a={FAHRT, V_max=40, H_erwarten=true} +Hl12b={FAHRT, V_max=60, H_erwarten=true} +Hl13={HALT} + +-- Zusatzsignale (DS 301 Namen) +Zs1={ERSATZFAHRT} +Sh1={RANGIERFAHRT} -- war Ra12 bei DR + +function BegriffErklaeren(Begriff) + if Begriff[1]==HALT then return "Halt" end + if Begriff[1]==RANGIERFAHRT then return "Rangierfahrt" end + if Begriff[1]==ERSATZFAHRT then return "Fahrt auf Ersatzsignal" end + if Begriff[1]==AUS then return "Signal ausgeschaltet" end + local txt = "Fahrt" + if Begriff.H_erwarten ~= nil then + txt = "Halt erwarten" + if Begriff.kurz ~= nil then + txt = "Halt im verkürzten Abstand" + end + end + if Begriff.V_max then + txt = txt.." mit "..tostring(Begriff.V_max).." km/h" + end + if Begriff.V_erwarten then + txt = txt..", "..tostring(Begriff.V_erwarten).." km/h erwarten" + end + return txt +end diff --git a/Install_00/Install.ini b/Install_00/Install.ini index f856455..6b497cf 100644 --- a/Install_00/Install.ini +++ b/Install_00/Install.ini @@ -3,3 +3,4 @@ EEPVersion = 10 File001 = "On.lua","LUA\On.lua" File002 = "Prototype.lua","LUA\Prototype.lua" File003 = "kskit.lua","LUA\kskit.lua" +File004 = "Begriffe.lua","LUA\Begriffe.lua" diff --git a/Install_00/kskit.lua b/Install_00/kskit.lua index 4b91d8e..023a106 100644 --- a/Install_00/kskit.lua +++ b/Install_00/kskit.lua @@ -1,3 +1,6 @@ +require("BetterContacts_BH2"){printErrors=true, deprecatedUseGlobal=true} +require("Begriffe") + -- Tabelle in einen String umwandeln, rekursiv -- Funktionswerte werden ignoriert function __tostring(self) @@ -111,9 +114,6 @@ function AnimiereZugStromabnehmer(Zug, Richtung) end end -FAHRT=1 -HALT=2 - function leseSignal(Signal) if EEPGetSignal(Signal) == 1 then return {FAHRT} @@ -123,7 +123,8 @@ function leseSignal(Signal) end local GefundeneSignale={} -local Zugaktionen={} +local Zugaktionen=ladeTabelle(1) +local SignalChanged={} setmetatable(Zugaktionen, { __index=function(table, key) @@ -134,7 +135,6 @@ setmetatable(Zugaktionen, { function KsKitInit() GefundeneSignale={} - Zugaktionen=ladeTabelle(1) for Signal=1,1000 do if EEPGetSignal(Signal) > 0 and EEPGetSignal(Signal+1000) > 0 then @@ -144,14 +144,16 @@ function KsKitInit() for i=1,#GefundeneSignale do local Signal = GefundeneSignale[i] + local FSignal = Signal + 1000 EEPRegisterSignal(Signal) _G["EEPOnSignal_"..tostring(Signal)]=function(Stellung) - + SignalChanged[Signal]=true end - EEPRegisterSignal(Signal+1000) - _G["EEPOnSignal_"..tostring(Signal+1000)]=function(FStellung) + EEPRegisterSignal(FSignal) + _G["EEPOnSignal_"..tostring(FSignal)]=function(FStellung) + SignalChanged[FSignal]=true if FStellung > 1 then - print("Fahrstrasse ",string.format("%04d-%02d", Signal+1000, FStellung-1)," geschalten") + print("Fahrstrasse ",string.format("%04d-%02d", FSignal, FStellung-1)," geschalten") end end end @@ -174,92 +176,94 @@ function KsKitMain() local SignalHaltegruende = {} for Zugname, Data in pairs(Zugaktionen) do - local ok, V = EEPGetTrainSpeed(Zugname) - if ok then - local Haltegrund = "Kein Plan" - - -- Wenn wir stehen, merken wir uns unsere Ankunftszeit - if V > -5 and V < 5 then - if Zugaktionen[Zugname].A == nil then - Zugaktionen[Zugname].A = EEPTime - if Zugaktionen[Zugname].V then - EEPSetTrainSpeed(Zugname, 0) - if Zugaktionen[Zugname].R then - AnimiereZugStromabnehmer(Zugname, 0) - end - end - end - -- Ankunftszeit loeschen falls wir unterwegs sind - elseif Zugaktionen[Zugname].A then - Zugaktionen[Zugname].A = nil - Zugaktionen[Zugname].S = nil - Zugaktionen[Zugname].R = nil - Zugaktionen[Zugname].V = nil - end - - if Zugaktionen[Zugname].W then - Haltegrund = "Planhalt" - end - - -- Wartezeit loeschen falls abgesessen - if Zugaktionen[Zugname].W and Zugaktionen[Zugname].A then - local Wartedauer = EEPTime - Zugaktionen[Zugname].A - if Wartedauer < 0 then - Wartedauer = Wartedauer + 24*60*60 - end - if Wartedauer > Zugaktionen[Zugname].W then - Zugaktionen[Zugname].W = nil - end - end - - -- Fahrstrasse schalten - if not Zugaktionen[Zugname].W and Zugaktionen[Zugname].S then - local ZSignal = Zugaktionen[Zugname].S - local FSignal = ZSignal + 1000 - local Fahrstrassen = {} - if Zugaktionen[Zugname].FS then - Fahrstrassen = Zugaktionen[Zugname].FS - elseif Selbstblock_Default then - Fahrstrassen = {1} - end - if #Fahrstrassen > 0 then - if EEPGetSignal(FSignal) == 1 then - Schaltauftraege[FSignal] = 1+Fahrstrassen[math.random(#Fahrstrassen)] - end - Haltegrund = "FS angefordert" - end - end - - -- Haltegrund merken, das wir ihn spaeter im Signal-Tooltip darstellen koennen - if Zugaktionen[Zugname].S then - SignalHaltegruende[Zugaktionen[Zugname].S] = Haltegrund - end - - if Zugaktionen[Zugname].S then - local Begriff = leseSignal(Zugaktionen[Zugname].S) - if Begriff[1] ~= HALT then - if Zugaktionen[Zugname].V then - if Zugaktionen[Zugname].B and Zugaktionen[Zugname].B + 5 < EEPTime then - EEPSetTrainSpeed(Zugname, Zugaktionen[Zugname].V) - Zugaktionen[Zugname].V = nil - Zugaktionen[Zugname].B = nil - elseif not Zugaktionen[Zugname].B then - AnimiereZugStromabnehmer(Zugname, Zugaktionen[Zugname].V>0 and 1 or -1) - Zugaktionen[Zugname].B = EEPTime - Zugaktionen[Zugname].R = nil - end - else - Zugaktionen[Zugname].S = nil - end - end - end - - else - -- Zug aus den Augen verloren... - Zugaktionen[Zugname]=nil + local ok, V_ist = EEPGetTrainSpeed(Zugname) + if not ok or next(Zugaktionen[Zugname]) == nil then + Zugaktionen[Zugname] = nil end end + for Zugname, Data in pairs(Zugaktionen) do + local Haltegrund = "Kein Plan" + local ok, V_ist = EEPGetTrainSpeed(Zugname) + + -- Wenn wir stehen, merken wir uns unsere Ankunftszeit + if V_ist == 0 then + if Zugaktionen[Zugname].A == nil then + Zugaktionen[Zugname].A = EEPTime + if Zugaktionen[Zugname].V then + EEPSetTrainSpeed(Zugname, 0) + if Zugaktionen[Zugname].R then + AnimiereZugStromabnehmer(Zugname, 0) + end + end + end + -- Ankunftszeit loeschen falls wir unterwegs sind + elseif Zugaktionen[Zugname].A then + Zugaktionen[Zugname].A = nil + Zugaktionen[Zugname].S = nil + Zugaktionen[Zugname].R = nil + Zugaktionen[Zugname].V = nil + end + + if Zugaktionen[Zugname].W then + Haltegrund = "Planhalt" + end + + -- Wartezeit loeschen falls abgesessen + if Zugaktionen[Zugname].W and Zugaktionen[Zugname].A then + local Wartedauer = EEPTime - Zugaktionen[Zugname].A + if Wartedauer < 0 then + Wartedauer = Wartedauer + 24*60*60 + end + if Wartedauer > Zugaktionen[Zugname].W then + Zugaktionen[Zugname].W = nil + end + end + + -- Fahrstrasse schalten + if not Zugaktionen[Zugname].W and Zugaktionen[Zugname].S then + local ZSignal = Zugaktionen[Zugname].S + local FSignal = ZSignal + 1000 + local Fahrstrassen = {} + if Zugaktionen[Zugname].FS then + Fahrstrassen = Zugaktionen[Zugname].FS + elseif Selbstblock_Default then + Fahrstrassen = {1} + end + if #Fahrstrassen > 0 then + if EEPGetSignal(FSignal) == 1 then + Schaltauftraege[FSignal] = 1+Fahrstrassen[math.random(#Fahrstrassen)] + end + Haltegrund = "FS angefordert" + end + end + + -- Haltegrund merken, das wir ihn spaeter im Signal-Tooltip darstellen koennen + if Zugaktionen[Zugname].S then + SignalHaltegruende[Zugaktionen[Zugname].S] = Haltegrund + end + + if Zugaktionen[Zugname].S then + local Begriff = leseSignal(Zugaktionen[Zugname].S) + if Begriff[1] ~= HALT then + if Zugaktionen[Zugname].V then + if Zugaktionen[Zugname].B and Zugaktionen[Zugname].B + 5 < EEPTime then + EEPSetTrainSpeed(Zugname, Zugaktionen[Zugname].V) + Zugaktionen[Zugname].V = nil + Zugaktionen[Zugname].B = nil + elseif not Zugaktionen[Zugname].B then + AnimiereZugStromabnehmer(Zugname, Zugaktionen[Zugname].V>0 and 1 or -1) + Zugaktionen[Zugname].B = EEPTime + Zugaktionen[Zugname].R = nil + end + else + Zugaktionen[Zugname].S = nil + end + end + end + + end + speicherTabelle(1, Zugaktionen) EEPChangeInfoSignal(1, __tostring(Zugaktionen)) for k,v in pairs(Schaltauftraege) do @@ -272,12 +276,16 @@ function KsKitMain() local name = string.format("%04d", Signal) if Name and Name[Signal] then name=Name[Signal] end local txt = "Signal "..name - local Stellung = EEPGetSignal(Signal) - if Stellung == 1 then - txt = txt.."\nFahrt" - else - txt = txt.."\nHalt" + local Begriff = leseSignal(Signal) + local Farbe = "" + if Begriff[1] ~= HALT then + if Begriff.H_erwarten or Begriff.V_max then + Farbe = "" + else + Farbe = "" + end end + txt = txt.."\n"..Farbe..BegriffErklaeren(Begriff).."" txt = txt.."" local FStellung = EEPGetSignal(Signal+1000) if FStellung > 1 then @@ -306,18 +314,16 @@ end function S(Signal) Zugaktionen[Zugname].S = Signal - -- Geschwindigkeit fuer Weiterfahrt ermitteln - local _, V = EEPGetTrainSpeed(Zugname) - Zugaktionen[Zugname].V = math.floor(V) speicherTabelle(1, Zugaktionen) end -function R(Signal) - Zugaktionen[Zugname].S = Signal - -- Geschwindigkeit fuer Weiterfahrt ermitteln - local _, V = EEPGetTrainSpeed(Zugname) - Zugaktionen[Zugname].V = math.floor(-V) - -- Merken, das ein Richtungswechsel animiert werden soll - Zugaktionen[Zugname].R = 1 +function V(V_soll) + local _, V_ist = EEPGetTrainSpeed(Zugname) + -- Negieren, falls Zug rueckwarts faehrt + if V_ist < 0 then V_soll = -V_soll end + -- Mit dieser Division teste ich, ob beide Geschwindigkeiten das selbe Vorzeichen haben + -- Falls Vorzeichen ungleich, beim naechsten Halt Fahrtrichtungswechsel + if V_soll/V_ist < 0 then Zugaktionen[Zugname].R = 1 end + Zugaktionen[Zugname].V = V_soll speicherTabelle(1, Zugaktionen) end