Implementierung Begriffsselektion

This commit is contained in:
Nero 2022-06-18 23:11:16 +00:00
parent 4490e324a1
commit 159c336d5a
1 changed files with 134 additions and 22 deletions

View File

@ -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"}