Implementierung Begriffsselektion
This commit is contained in:
parent
4490e324a1
commit
159c336d5a
@ -1,6 +1,5 @@
|
||||
require("Prototype")
|
||||
require("On")
|
||||
serpent=require("serpent")
|
||||
|
||||
-- Versionsnummer. Diese dient vor allem zu Diagnosezwecken.
|
||||
-- Ich weiss jetzt noch nicht, wie viele verschiedene Versionen von dem Script spaeter herumfliegen werden.
|
||||
@ -14,7 +13,9 @@ ERSATZFAHRT=4
|
||||
AUS=5
|
||||
|
||||
-- Grundsignal, entspricht allen Signalen vor EEP 6 sowie dem Unsichtbaren Signal aus dem Grundbestand
|
||||
Signal=Prototype()
|
||||
Signal=Prototype{}
|
||||
Signal.Begriffe={{FAHRT},{HALT}}
|
||||
Signal.Beschreibung="Signal"
|
||||
|
||||
function Signal:init(tab)
|
||||
for k,v in pairs(tab) do
|
||||
@ -29,35 +30,140 @@ end
|
||||
|
||||
-- ID to use with EEPGetSignal/EEPSetSignal
|
||||
function Signal:set_ID(id)
|
||||
if type(id) ~= "number" then error("Signal ID must be a number") end
|
||||
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
|
||||
self.ID = id
|
||||
Signale[id]=self
|
||||
end
|
||||
Signal.set_1=Signal.set_ID
|
||||
|
||||
-- Anfahrtsgeschwindigkeit ans Haltzeigende Signal
|
||||
function Signal:set_V_halt(v)
|
||||
if type(v) ~= "number" then error("V_halt must be number") end
|
||||
if type(v) ~= "number" then error("V_halt muss eine Geschwindigkeit sein") end
|
||||
self.V_halt = v
|
||||
end
|
||||
|
||||
-- Unsichtbares Signal: Zugbeeinflussung
|
||||
-- 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
|
||||
function Signal:set_V_regler(id)
|
||||
self.V_regler=id
|
||||
end
|
||||
|
||||
function Signal:set_Begriffe(Begriffe)
|
||||
self.RFSS=false -- Rangierfahrstrassenstart
|
||||
self.RFSZ=false -- Rangierfahrstrassenziel
|
||||
self.ZFSS=false -- Zugfahrstrassenstart
|
||||
self.ZFSZ=false -- Zugfahrstrassenziel
|
||||
for i=1,#Begriffe do
|
||||
if Begriffe[i][1]==RANGIERFAHRT then self.RFSS=true end
|
||||
if Begriffe[i][1]==HALT then self.RFSZ=true; self.ZFSZ=true end
|
||||
if Begriffe[i][1]==FAHRT then self.ZFSS=true end
|
||||
end
|
||||
self.Begriffe=Begriffe
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
-- Signalbilder OSJD/EZMG/Hl-Signale des Ostblocks
|
||||
-- V_erwarten=60 wird durch V_erwarten=40 signalisiert
|
||||
Hl1={FAHRT}
|
||||
@ -78,20 +184,26 @@ Hl12a={FAHRT, V_max=40, H_erwarten=true}
|
||||
Hl12b={FAHRT, V_max=60, H_erwarten=true}
|
||||
Hl13={HALT}
|
||||
|
||||
-- Zusatzsignale (DS 301 Namen)
|
||||
-- Zusatzsignale
|
||||
Zs1={ERSATZFAHRT}
|
||||
Ra10={HALT, Nur_Rangierfahrten=true} -- Rangierhalttafel
|
||||
Ra11={HALT, Nur_Rangierfahrten=true} -- Wartezeichen
|
||||
Sh1={RANGIERFAHRT} -- war Ra12 bei DR
|
||||
|
||||
Rangierhalttafel=Signal{Begriffe={{FAHRT},Ra10},Beschreibung="Rangierhalttafel"}
|
||||
|
||||
-- V11NHK10024 HL-Signale der DR *V40* - Grundset
|
||||
Hl_Signal_Ausfahrt_V40=Signal{Begriffe={Hl13,Hl1,Hl3a,Zs1,Sh1,Hl13}}
|
||||
Hl_Signal_Ausfahrt_Vmax=Signal{Begriffe={Hl13,Hl1,Zs1,Sh1,Hl13}}
|
||||
Hl_Signal_Block=Signal{Begriffe={Hl13,Hl1,Zs1,Hl13}}
|
||||
Hl_Signal_Einfahrt_V40=Signal{Begriffe={Hl13,Hl1,Hl7,Hl10,Hl3a,Hl9a,Hl12a,Zs1,Hl13}}
|
||||
Hl_Signal_Selbstblock=Signal{Begriffe={Hl13,Hl1,Hl10,Hl13}}
|
||||
Hl_Signal_Vorsignal_V40=Signal{Begriffe={Hl10,Hl7,Hl1}}
|
||||
Hl_Signal_Vorsignalwiederholer_V40=Signal{Begriffe={Hl10,Hl7,Hl1}}
|
||||
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"}
|
||||
|
||||
-- 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}}
|
||||
|
||||
Hl_Zwerg_Rangiersignal=Signal{Begriffe={Ra11,Sh1},Beschreibung="Rangierhaltsignal"}
|
||||
|
Loading…
Reference in New Issue
Block a user