2022-06-18 01:41:55 +02:00
|
|
|
require("Prototype")
|
|
|
|
require("On")
|
|
|
|
|
|
|
|
-- Versionsnummer. Diese dient vor allem zu Diagnosezwecken.
|
|
|
|
-- Ich weiss jetzt noch nicht, wie viele verschiedene Versionen von dem Script spaeter herumfliegen werden.
|
|
|
|
KsKitVer=0
|
|
|
|
|
|
|
|
-- Grundsätzliche Typen von Signalbildern
|
|
|
|
FAHRT=1
|
|
|
|
HALT=2
|
|
|
|
RANGIERFAHRT=3
|
|
|
|
ERSATZFAHRT=4
|
|
|
|
AUS=5
|
|
|
|
|
|
|
|
-- Grundsignal, entspricht allen Signalen vor EEP 6 sowie dem Unsichtbaren Signal aus dem Grundbestand
|
2022-06-19 01:11:16 +02:00
|
|
|
Signal=Prototype{}
|
|
|
|
Signal.Begriffe={{FAHRT},{HALT}}
|
|
|
|
Signal.Beschreibung="Signal"
|
2022-06-18 01:41:55 +02:00
|
|
|
|
|
|
|
function Signal:init(tab)
|
|
|
|
for k,v in pairs(tab) do
|
|
|
|
local setter = "set_"..tostring(k)
|
|
|
|
if type(self[setter]) == "function" then
|
|
|
|
self[setter](self, v)
|
|
|
|
else
|
|
|
|
error("Signaleigenschaft "..k.." hier nicht erlaubt")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- ID to use with EEPGetSignal/EEPSetSignal
|
|
|
|
function Signal:set_ID(id)
|
2022-06-19 01:11:16 +02:00
|
|
|
if type(Signale) ~= "table" then Signale={} end
|
|
|
|
if Signale[id]~=nil then error("Signal ID "..id.." bereits verwendet") end
|
|
|
|
if type(id) ~= "number" then error("Signal ID muss eine Zahl sein") end
|
2022-06-18 01:41:55 +02:00
|
|
|
self.ID = id
|
2022-06-19 01:11:16 +02:00
|
|
|
Signale[id]=self
|
2022-06-18 01:41:55 +02:00
|
|
|
end
|
|
|
|
Signal.set_1=Signal.set_ID
|
|
|
|
|
|
|
|
-- Anfahrtsgeschwindigkeit ans Haltzeigende Signal
|
|
|
|
function Signal:set_V_halt(v)
|
2022-06-19 01:11:16 +02:00
|
|
|
if type(v) ~= "number" then error("V_halt muss eine Geschwindigkeit sein") end
|
2022-06-18 01:41:55 +02:00
|
|
|
self.V_halt = v
|
|
|
|
end
|
|
|
|
|
2022-06-19 01:11:16 +02:00
|
|
|
-- Unsichtbares Signal: Zum Schalten via GBS
|
|
|
|
-- ggf. auch vor dem Signal zum Ersatz der Haltefunktion
|
|
|
|
function Signal:set_S(S)
|
|
|
|
self.S = S
|
|
|
|
OnSignal(S, function()
|
|
|
|
self:Update()
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Unsichtbares Signal: Zugbeeinflussung, hinter dem Signal
|
2022-06-18 01:41:55 +02:00
|
|
|
function Signal:set_V_regler(id)
|
|
|
|
self.V_regler=id
|
|
|
|
end
|
|
|
|
|
|
|
|
function Signal:set_Begriffe(Begriffe)
|
|
|
|
self.Begriffe=Begriffe
|
|
|
|
end
|
|
|
|
|
2022-06-19 01:11:16 +02:00
|
|
|
function Signal:set_Wege(Wege)
|
|
|
|
if type(Fahrwege)~="table" then Fahrwege={} end
|
|
|
|
self.Wege=Wege
|
|
|
|
-- Eigenen Callback an alle potentiellen Wegelemente koppeln
|
|
|
|
local updateFunk = function()
|
|
|
|
self:Update()
|
|
|
|
end
|
|
|
|
for i=1,#Wege do
|
|
|
|
OnSignal(Wege[i][1], updateFunk)
|
|
|
|
if Wege[i].turns then
|
|
|
|
for j=1,#Wege[i].turns,2 do
|
|
|
|
OnSwitch(Wege[i].turns[j], updateFunk)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Stellung als struct
|
|
|
|
function Signal:Zeige(Stellung)
|
|
|
|
local order={}
|
|
|
|
for i=1,#self.Begriffe do
|
|
|
|
table.insert(order, i)
|
|
|
|
end
|
|
|
|
table.sort(order, function(a,b)
|
|
|
|
local StlgA = self.Begriffe[a]
|
|
|
|
local StlgB = self.Begriffe[b]
|
|
|
|
local props={1,"V_max","H_erwarten","V_erwarten"}
|
|
|
|
for i=1,#props do
|
|
|
|
-- Folgendes Muster: Wenn Stellung A und B sich in einem Merkmal unterscheiden
|
|
|
|
-- UND Stellung A in diesem Merkmal mit der Zielstellung uebereinstimmt,
|
|
|
|
-- DANN ist Stellung A besset geeignet, sonst nicht
|
|
|
|
if StlgA[props[i]] ~= StlgB[props[i]] then
|
|
|
|
if StlgA[props[i]] == Stellung[props[i]] then return true end
|
|
|
|
if StlgB[props[i]] == Stellung[props[i]] then return false end
|
|
|
|
-- Muster: Geschwindigkeitsmerkmal ist vorhanden und kleiner als Ziel, aber der Vergleichsbegriff:
|
|
|
|
-- - zeigt das Merkmal gar nicht
|
|
|
|
-- - zeigt eine hohere Geschwindigkeit als gewollt
|
|
|
|
-- - zeigt eine noch kleinere Geschwindigkeit
|
|
|
|
-- Dann ist der Vergleichsbegriff schlechter geeignet
|
|
|
|
if i == 2 or i == 4 then
|
|
|
|
if StlgA[props[i]] and Stellung[props[i]] and StlgA[props[i]] < Stellung[props[i]] then
|
|
|
|
if StlgB[props[i]] == nil then return true end
|
|
|
|
if StlgB[props[i]] > Stellung[props[i]] then return true end
|
|
|
|
if StlgB[props[i]] < StlgA[props[i]] then return true end
|
|
|
|
end
|
|
|
|
if StlgB[props[i]] and Stellung[props[i]] and StlgB[props[i]] < Stellung[props[i]] then
|
|
|
|
if StlgA[props[i]] == nil then return false end
|
|
|
|
if StlgA[props[i]] > Stellung[props[i]] then return false end
|
|
|
|
if StlgA[props[i]] < StlgB[props[i]] then return false end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end)
|
|
|
|
EEPSetSignal(self.ID, order[1], 1)
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Fahrtstellung aktualisieren
|
|
|
|
function Signal:Update()
|
|
|
|
local Fahrt = true
|
|
|
|
if self.S and EEPGetSignal(self.S) == 2 then
|
|
|
|
Fahrt = false
|
|
|
|
end
|
|
|
|
if not Fahrt then
|
|
|
|
if self:Zeige{HALT} then return end
|
|
|
|
self:Zeige{FAHRT, H_erwarten}
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local Stlg = {FAHRT}
|
|
|
|
if self.Wege then
|
|
|
|
for i=1,#self.Wege do
|
|
|
|
local Weg = self.Wege[i]
|
|
|
|
local match = true
|
|
|
|
local V_max = nil
|
|
|
|
if Weg.turns then
|
|
|
|
for j=1,#Weg.turns,2 do
|
|
|
|
if Weg.turns[j+1] > 1 then V_max = 40 end
|
|
|
|
if EEPGetSwitch(Weg.turns[j]) ~= Weg.turns[j+1] then
|
|
|
|
match = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if match then Stlg.V_max = V_max end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if self:Zeige(Stlg) then return end
|
|
|
|
if self:Zeige{ERSATZFAHRT} then return end
|
|
|
|
end
|
|
|
|
|
|
|
|
function Signal:set_Beschreibung(v)
|
|
|
|
self.Beschreibung=v
|
|
|
|
end
|
|
|
|
|
|
|
|
function Signal:TooltipText()
|
|
|
|
r=self.Beschreibung.." "..tonumber(self.ID).."\n"
|
|
|
|
return r
|
|
|
|
end
|
|
|
|
|
2022-06-18 01:41:55 +02:00
|
|
|
-- Signalbilder 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}
|
|
|
|
|
2022-06-19 01:11:16 +02:00
|
|
|
-- Zusatzsignale
|
2022-06-18 01:41:55 +02:00
|
|
|
Zs1={ERSATZFAHRT}
|
2022-06-19 01:11:16 +02:00
|
|
|
Ra10={HALT, Nur_Rangierfahrten=true} -- Rangierhalttafel
|
|
|
|
Ra11={HALT, Nur_Rangierfahrten=true} -- Wartezeichen
|
2022-06-18 01:41:55 +02:00
|
|
|
Sh1={RANGIERFAHRT} -- war Ra12 bei DR
|
|
|
|
|
2022-06-19 01:11:16 +02:00
|
|
|
Rangierhalttafel=Signal{Begriffe={{FAHRT},Ra10},Beschreibung="Rangierhalttafel"}
|
|
|
|
|
2022-06-18 01:41:55 +02:00
|
|
|
-- V11NHK10024 HL-Signale der DR *V40* - Grundset
|
2022-06-19 01:11:16 +02:00
|
|
|
Hl_Signal_Ausfahrt_V40=Signal{Begriffe={Hl13,Hl1,Hl3a,Zs1,Sh1,Hl13},Beschreibung="Ausfahrsignal"}
|
|
|
|
Hl_Signal_Ausfahrt_Vmax=Signal{Begriffe={Hl13,Hl1,Zs1,Sh1,Hl13},Beschreibung="Ausfahrsignal"}
|
|
|
|
Hl_Signal_Block=Signal{Begriffe={Hl13,Hl1,Zs1,Hl13},Beschreibung="Blocksignal"}
|
|
|
|
Hl_Signal_Einfahrt_V40=Signal{Begriffe={Hl13,Hl1,Hl7,Hl10,Hl3a,Hl9a,Hl12a,Zs1,Hl13},Beschreibung="Einfahrsignal"}
|
|
|
|
Hl_Signal_Selbstblock=Signal{Begriffe={Hl13,Hl1,Hl10,Hl13},Beschreibung="Blocksignal"}
|
|
|
|
Hl_Signal_Vorsignal_V40=Signal{Begriffe={Hl10,Hl7,Hl1},Beschreibung="Vorsignal"}
|
|
|
|
Hl_Signal_Vorsignalwiederholer_V40=Signal{Begriffe={Hl10,Hl7,Hl1},Beschreibung="Vorsignalwdh"}
|
2022-06-18 01:41:55 +02:00
|
|
|
|
|
|
|
-- V11NHK10025 HL-Signale der DR *V60* - Erweiterungsset
|
|
|
|
Hl_Signal_Ausfahrt_V60=Signal{Begriffe={Hl13,Hl1,Hl3b,Hl3a,Zs1,Sh1,Hl13}}
|
|
|
|
Hl_Signal_Einfahrt_V60=Signal{Begriffe={Hl13,Hl1,Hl4,Hl7,Hl10,Hl3b,Hl6b,Hl9b,Hl12b,Hl3a,Hl6a,Hl9a,Hl12a,Zs1,Hl13}}
|
|
|
|
Hl_Signal_Vorsignalwiederholer_V60=Signal{Begriffe={Hl10,Hl7,Hl1}}
|
2022-06-19 01:11:16 +02:00
|
|
|
|
|
|
|
Hl_Zwerg_Rangiersignal=Signal{Begriffe={Ra11,Sh1},Beschreibung="Rangierhaltsignal"}
|