Begriffe: Experimentelles Stellen von Signalen
This commit is contained in:
parent
06c07c0f72
commit
65c39c6cf7
60
Begriffe.lua
60
Begriffe.lua
@ -424,14 +424,14 @@ function SignalmodelleAusAnlagendatei(Datei)
|
|||||||
for capture in string.gmatch(xml, "<Meldung .- name=\".-\" Key_Id=\"%d*\"") do
|
for capture in string.gmatch(xml, "<Meldung .- name=\".-\" Key_Id=\"%d*\"") do
|
||||||
local Model, ID = string.match(capture, 'name=\"(.-)\" Key_Id=\"(%d+)\"')
|
local Model, ID = string.match(capture, 'name=\"(.-)\" Key_Id=\"(%d+)\"')
|
||||||
if not string.match(Model, "system/") then
|
if not string.match(Model, "system/") then
|
||||||
Signalmodelle[ID]=Model
|
Signalmodelle[tonumber(ID)]=Model
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return Signalmodelle
|
return Signalmodelle
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Signalbegriff lesen
|
||||||
function leseSignalMitModell(ID, Modell, Stellung)
|
function leseSignalMitModell(ID, Modell, Stellung)
|
||||||
local Stellung = Stellung or EEPGetSignal(ID)
|
local Stellung = Stellung or EEPGetSignal(ID)
|
||||||
if SignalModellBegriffe[Modell] ~= nil then
|
if SignalModellBegriffe[Modell] ~= nil then
|
||||||
@ -441,3 +441,59 @@ function leseSignalMitModell(ID, Modell, Stellung)
|
|||||||
return Defaults[Stellung]
|
return Defaults[Stellung]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Signalbegriff setzen
|
||||||
|
-- Faktisch sortiert diese Funktion alle Begriffe je nachdem, wie gut sie der gesuchten Stellung entsprechen
|
||||||
|
-- Der erste (besten-passende) Begriff wird dann gesetzt
|
||||||
|
-- Die Funktion ist zwar saumaessig kompliziert, kann aber bei Geschwindigkeitsabstufungen auf gerigere Geschwindigkeiten zurueckfallen.
|
||||||
|
-- Speziell bei Hl-Signalen, die sich einen VS-Begriff fuer V40 und V60 teilen, ist das nuetzlich.
|
||||||
|
-- Bei Signalen mit einer sehr schlechten Auswahl an Begriffen kommt hier vielleicht Murks raus
|
||||||
|
-- Das sollte man vielleicht genauer testen
|
||||||
|
function stelleSignalMitModell(ID, Modell, Stellung)
|
||||||
|
local Begriffe = SignalModellBegriffe[Modell]
|
||||||
|
-- Achso, wir sortieren nicht die richtige Begriffstabelle, sondern eine Ersatztabelle mit den Indexen.
|
||||||
|
-- Ist performanter. Und wir zerschiessen uns nicht die Begriffstabelle, weil wir die ja per Referenz haben.
|
||||||
|
local order={}
|
||||||
|
for i=1,#Begriffe do
|
||||||
|
table.insert(order, i)
|
||||||
|
end
|
||||||
|
-- Sortieraufruf mit Sortierlabda
|
||||||
|
table.sort(order, function(a,b)
|
||||||
|
local StlgA = Begriffe[a]
|
||||||
|
local StlgB = Begriffe[b]
|
||||||
|
local props={1,"Zugfahrt","V_max","H_erwarten","V_erwarten","Kurz"}
|
||||||
|
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
|
||||||
|
-- Wir muessen das auch andersherum mit Stellung B machen
|
||||||
|
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
|
||||||
|
-- Und das dann jeweils in beide Richtungen
|
||||||
|
if i == 3 or i == 5 then -- 3 ist V_max, 5 ist V_erwarten
|
||||||
|
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)
|
||||||
|
-- Begriff aktiv schalten... der Wert in unserer Indextabelle ist der Index in die Begriffstabelle
|
||||||
|
-- und damit auch genau der Wert, den EEP fuer die numerische Stellung braucht
|
||||||
|
EEPSetSignal(ID, order[1], 1)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user