mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
251 lines
9.2 KiB
Lua
251 lines
9.2 KiB
Lua
--------------------------------------------------------------------------------
|
|
-- БАРС для 81-722
|
|
--------------------------------------------------------------------------------
|
|
Metrostroi.DefineSystem("81_722_BARS")
|
|
TRAIN_SYSTEM.DontAccelerateSimulation = true
|
|
|
|
|
|
function TRAIN_SYSTEM:Initialize()
|
|
self.Train:LoadSystem("ALSCoil")
|
|
self.Power = 0
|
|
self.ARSPower = 0
|
|
|
|
-- Internal state
|
|
self.Active = 0
|
|
|
|
self.SpeedLimit = 0
|
|
self.NextLimit = 0
|
|
self.Ring = 0
|
|
self.Overspeed = false
|
|
|
|
self.Brake = false
|
|
self.Brake2 = false
|
|
self.Drive = false
|
|
self.Braking = false
|
|
self.PN1 = 0
|
|
self.PN2 = 0
|
|
self.RVTB = 0
|
|
|
|
|
|
self.NoFreq = 0
|
|
self.F1 = 0
|
|
self.F2 = 0
|
|
self.F3 = 0
|
|
self.F4 = 0
|
|
self.F5 = 0
|
|
self.F6 = 0
|
|
end
|
|
|
|
function TRAIN_SYSTEM:Outputs()
|
|
return {"Active","Ring","Brake","Brake2","Drive","PN1","PN2", "SpeedLimit", "RVTB"}
|
|
end
|
|
|
|
function TRAIN_SYSTEM:Inputs()
|
|
return {"NoFreq","F1","F2","F3","F4","F5","F6"}
|
|
end
|
|
|
|
function TRAIN_SYSTEM:TriggerInput(name,value)
|
|
end
|
|
|
|
function TRAIN_SYSTEM:Think(dT)
|
|
local Train = self.Train
|
|
local ALS = Train.ALSCoil
|
|
local speed = ALS.Speed
|
|
local Power = self.Power
|
|
local EnableALS = Power and Train.ALS.Value > 0.5-- and Train.BUKP.Active > 0
|
|
if EnableALS ~= (ALS.Enabled==1) then
|
|
ALS:TriggerInput("Enable",EnableALS and 1 or 0)
|
|
end
|
|
|
|
self.NoFreq = ALS.NoFreq
|
|
self.F1 = ALS.F1
|
|
self.F2 = ALS.F2
|
|
self.F3 = ALS.F3
|
|
self.F4 = ALS.F4
|
|
self.F5 = ALS.F5
|
|
self.F6 = ALS.F6
|
|
self.RealF5 = self.F5*(1-self.F6)
|
|
if (self.F1+self.F2+self.F3+self.F4+self.F5+self.F6) == 0 then self.NoFreq = 1 end
|
|
|
|
-- Speed check and update speed data
|
|
if CurTime() - (self.LastSpeedCheck or 0) > 0.5 then
|
|
self.LastSpeedCheck = CurTime()
|
|
end
|
|
-- ARS system placeholder logic
|
|
self.KVT = (Train.PB.Value > 0.5 or Train.Vigilance.Value > 0.5)-- and not self.PBBlock
|
|
--[[if self.PBBlock == nil and self.NoFreq then
|
|
self.PBBlock = Train.PB.Value > 0.5 or Train.Vigilance.Value > 0.5
|
|
end
|
|
if self.PBBlock and Train.PB.Value < 0.5 and Train.Vigilance.Value < 0.5 then self.PBBlock = false end
|
|
if self.PBBlock ~= nil and not self.NoFreq then self.PBBlock = nil end]]
|
|
local Active = Power and self.ARSPower
|
|
if self.KVT and not self.AttentionPedalTimer then
|
|
self.AttentionPedalTimer = CurTime() + 1
|
|
end
|
|
|
|
if self.KVT and self.AttentionPedalTimer and (CurTime() - self.AttentionPedalTimer) > 0 then
|
|
self.AttentionPedal = true
|
|
end
|
|
if not self.KVT and (self.AttentionPedalTimer or self.AttentionPedal) then
|
|
self.AttentionPedal = false
|
|
self.AttentionPedalTimer = nil
|
|
end
|
|
if EnableALS then
|
|
local V = math.floor(speed +0.05)
|
|
local Vlimit = 0
|
|
if self.F4 then Vlimit = 40 end
|
|
if self.F3 then Vlimit = 60 end
|
|
if self.F2 then Vlimit = 70 end
|
|
if self.F1 then Vlimit = 80 end
|
|
|
|
--if ( self.KVT) and (Vlimit ~= 0) and (V > Vlimit) then self.Overspeed = true end
|
|
--if ( self.KVT) and (Vlimit == 0) and (V > 20) then self.Overspeed = true end
|
|
--if (not self.KVT) and (V > Vlimit) and (V > (self.RealNoFreq and 0 or 3)) then self.Overspeed = true end
|
|
--if ( self.KVT) and (Vlimit == 0) and self.Train.ARSType and self.Train.ARSType == 3 and not self.Train["PA-KSD"].VRD then self.Overspeed = true end
|
|
--self.Ring = self.Overspeed and (speed > 5)
|
|
|
|
-- Determine next limit and current limit
|
|
self.SpeedLimit = Vlimit+0.5
|
|
self.NextLimit = Vlimit
|
|
if self.F1 then self.NextLimit = 80 end
|
|
if self.F2 then self.NextLimit = 70 end
|
|
if self.F3 then self.NextLimit = 60 end
|
|
if self.F4 then self.NextLimit = 40 end
|
|
if self.F5 then self.NextLimit = 20 end
|
|
else
|
|
local V = math.floor(speed +0.05)
|
|
self.SpeedLimit = 0
|
|
self.NextLimit = 0
|
|
end
|
|
|
|
if Active then
|
|
if Train.Pneumatic.RVTBLeak == 0 then
|
|
self.RVTB = 1
|
|
end
|
|
if self.Starting and CurTime() - self.Starting > 7 then
|
|
if speed > 7 then
|
|
self.Starting = nil
|
|
else
|
|
self.Starting = false
|
|
end
|
|
end
|
|
if speed < 0.1 and self.Starting == false and self.KVT then
|
|
self.Starting = nil
|
|
end
|
|
local Drive = self.Drive > 0
|
|
local Brake = self.Brake > 0
|
|
local Brake2 = self.Brake2 > 0
|
|
local SpeedLimit = self.SpeedLimit
|
|
if self.SpeedLimit < 20 then SpeedLimit = 20 end
|
|
if self.AttentionPedal or Train.VRD.Value > 0.5 then SpeedLimit = 20 end
|
|
if speed > SpeedLimit
|
|
or (self.Starting == false or self.Starting and CurTime() - self.Starting > 7)
|
|
--or (self.F1 or self.F2 or self.F3 or self.F4) and self.KVT and speed > 20
|
|
or not EnableALS and not self.NoFreq
|
|
or (self.NoFreq) and not self.KVT
|
|
or not self.NoFreq and self.RealF5 and (not self.KVT or not self.F6 and not self.VRD)
|
|
or self.Braking and not Brake then
|
|
if not Brake and self.SpeedLimit > 20 then self.Braking = true end
|
|
if not Brake and (self.SpeedLimit > 20 or speed > 0.1) then self.Ringing = true end
|
|
Brake = true
|
|
elseif speed < SpeedLimit and not self.Braking then
|
|
Brake = false
|
|
Brake2 = false
|
|
end
|
|
if (self.Braking or self.Ringing) and self.KVT and (self.NoFreq or EnableALS) then
|
|
self.Braking = false
|
|
self.Ringing = false
|
|
end
|
|
if self.Ringing and self.KVT then
|
|
self.Ringing = false
|
|
end
|
|
if self.Ringing then
|
|
self.RVTB = 0
|
|
end
|
|
if speed < 3 and self.PN1 == 0 and Train.BUKP.PowerCommand <= 0 then
|
|
self.PN1 = 1
|
|
self.PN2Timer = CurTime()
|
|
if self.Starting then self.Starting = nil end
|
|
end
|
|
if (Train.BUKP.PowerCommand > 0.1 or self.NoFreq and self.KVT) and self.PN1 > 0 then
|
|
if not self.Starting and not self.NoFreq then
|
|
self.Starting = CurTime()
|
|
end
|
|
self.PN1 = 0
|
|
end
|
|
if self.PN1 > 0 and (--[[ Train.BUKP.PN2 > 0 or --]] self.PN2Timer and CurTime()-self.PN2Timer > 1) and self.PN2 == 0 then
|
|
self.PN2 = 1
|
|
self.PN2Timer = nil
|
|
end
|
|
if self.PN1 < 1 then self.PN2 = 0 end
|
|
if self.BPSArmed then self.PN2 = 1 end
|
|
|
|
if Brake and not Brake2 and not self.Brake2Timer then self.Brake2Timer = CurTime() end
|
|
if Brake and not Brake2 and self.Brake2Timer and CurTime() - self.Brake2Timer > 1.5 then
|
|
self.Brake2Timer = nil
|
|
Brake2 = true
|
|
end
|
|
if not Brake and (Brake2 or self.Brake2Timer) then
|
|
self.Brake2Timer = nil
|
|
Brake2 = false
|
|
end
|
|
if Train.VRD.Value > 0.5 and self.RealF5 and self.VRD == nil then
|
|
self.VRD = false
|
|
end
|
|
if (Train.VRD.Value < 0.5 or not self.RealF5) and self.VRD ~= nil then
|
|
self.VRD = nil
|
|
end
|
|
if self.VRD == false and speed <= 0.1 then
|
|
self.VRD = true
|
|
end
|
|
|
|
--[[ self.BPSMeter = self.BPSMeter or 0
|
|
if Train.Speed*Train.SpeedSign < 0 or self.BPSMeter < 0 then
|
|
self.BPSMeter = self.BPSMeter + math.min(0,Train.Speed*Train.SpeedSign*1000/3600)*dT
|
|
if Train.Speed*Train.SpeedSign > 0.1 then
|
|
self.BPSMeter = 0
|
|
end
|
|
if -self.BPSMeter > 1.5 then
|
|
self.BPSArmed = true
|
|
end
|
|
end
|
|
if Train.BUV.Reverser == 0 and self.BPSArmed then self.BPSArmed = nil end--]]
|
|
--speed >= SpeedLimit-3 and (Train.BUKP.PowerCommand > 5 or Train:ReadTrainWire(19) > 0) or
|
|
self.DriveOff = speed >= SpeedLimit-2
|
|
Drive = not self.DriveOff and (
|
|
not self.NoFreq and EnableALS and self.RealF5 and self.KVT and (self.F6 or self.VRD)
|
|
or (self.NoFreq or not EnableALS) and self.KVT
|
|
or not self.NoFreq and EnableALS and not self.RealF5
|
|
) and not Brake and not self.BPSArmed
|
|
self.Ring = self.Ringing and 1 or 0
|
|
self.Brake = Brake and 1 or 0
|
|
self.Brake2 = Brake2 and 1 or 0
|
|
self.Drive = Drive and 1 or 0
|
|
if self.RVTBReset then
|
|
self.RVTB = 1
|
|
self.RVTBReset = false
|
|
end
|
|
else
|
|
if self.RVTB == 0 and not self.RVTBReset then
|
|
if not self.RVTBResetTimer then self.RVTBResetTimer = CurTime() end
|
|
end
|
|
if not self.RVTBReset and self.RVTB == 1 or self.RVTBResetTimer and CurTime()-self.RVTBResetTimer > 3 then
|
|
self.RVTBReset = trueя
|
|
self.RVTBResetTimer = nil
|
|
end
|
|
self.RVTB = (self.KVT or Train.VAH.Value > 0.5) and 1 or 0
|
|
self.Brake = 0
|
|
self.Brake2 = 0
|
|
self.Brake2Timer = nil
|
|
self.Drive = 0
|
|
self.Ring = 0
|
|
self.PN1 = 0
|
|
self.PN2 = Train.RCARS.Value*Train.BUKP.Active
|
|
self.Starting = nil
|
|
self.Braking = true
|
|
self.Ringing = true
|
|
self.BPSArmed = nil
|
|
end
|
|
self.Active = Active and 1 or 0
|
|
end
|