mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
init
This commit is contained in:
250
lua/metrostroi/systems/_obsolete/sys_81_722_bars.lua
Normal file
250
lua/metrostroi/systems/_obsolete/sys_81_722_bars.lua
Normal file
@@ -0,0 +1,250 @@
|
||||
--------------------------------------------------------------------------------
|
||||
-- БАРС для 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
|
||||
Reference in New Issue
Block a user