mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
init
This commit is contained in:
723
lua/metrostroi/systems/_obsolete/sys_autodrive.lua
Normal file
723
lua/metrostroi/systems/_obsolete/sys_autodrive.lua
Normal file
@@ -0,0 +1,723 @@
|
||||
--------------------------------------------------------------------------------
|
||||
-- Àâòîâåäåíèå
|
||||
--------------------------------------------------------------------------------
|
||||
Metrostroi.DefineSystem("Autodrive")
|
||||
TRAIN_SYSTEM.DontAccelerateSimulation = true
|
||||
|
||||
function TRAIN_SYSTEM:Initialize()
|
||||
self.MU = -0.25
|
||||
self.Horlifts = {
|
||||
[114] = true,
|
||||
}
|
||||
end
|
||||
|
||||
function TRAIN_SYSTEM:Outputs()
|
||||
return {}
|
||||
end
|
||||
|
||||
function TRAIN_SYSTEM:Inputs()
|
||||
return {}
|
||||
end
|
||||
|
||||
function TRAIN_SYSTEM:TriggerInput(name,value)
|
||||
end
|
||||
|
||||
TRAIN_SYSTEM.Corrections = {
|
||||
[0] = {
|
||||
},
|
||||
[1] = {
|
||||
[108] = -3.23,
|
||||
[109] = -2.79,
|
||||
[110] = -3.09,
|
||||
[111] = -3.17,
|
||||
[112] = -3.17,
|
||||
[113] = -3.18,
|
||||
[114] = -3.21,
|
||||
[115] = -3.21,
|
||||
[116] = -3.22,
|
||||
[117] = -3.21,
|
||||
[118] = -3.02,
|
||||
[119] = -3.20,
|
||||
[121] = -3.17,
|
||||
[122] = -4.10,
|
||||
[123] = -1.98,
|
||||
},
|
||||
[2] = {
|
||||
[123] = -1.98,
|
||||
[122] = -4.10,--
|
||||
[121] = -3.17,
|
||||
[119] = -3.20,
|
||||
[118] = -3.02,
|
||||
[117] = -3.21,
|
||||
[116] = -3.22,
|
||||
[115] = -3.21,
|
||||
[114] = -3.21,
|
||||
[113] = -3.18,
|
||||
[112] = -3.17,
|
||||
[111] = -3.17,
|
||||
[110] = -3.09,
|
||||
[109] = -2.79,
|
||||
[108] = -3.23,
|
||||
}
|
||||
}
|
||||
function TRAIN_SYSTEM:GetStationRK(dX,horlift)
|
||||
-- Calculate RK position based on distance and autodrive profile
|
||||
local TargetBrakeRKPosition = 1
|
||||
local speed = self.Train.ALS_ARS.Speed
|
||||
if dX < 160 then TargetBrakeRKPosition = speed > 55 and 3 or 1 end
|
||||
if dX < 86.25 then TargetBrakeRKPosition = 6 end
|
||||
if dX < 53.21 + (horlift and 10 or 0) then TargetBrakeRKPosition = 10 end
|
||||
if dX < 20.13 then TargetBrakeRKPosition = 15 end
|
||||
if dX < 8 then
|
||||
TargetBrakeRKPosition = 15
|
||||
--if dX < 10 and speed > 15 then TargetBrakeRKPosition = 18
|
||||
--else
|
||||
--else
|
||||
if dX < 6 then TargetBrakeRKPosition = 16 end
|
||||
--if dX < 2.64 then TargetBrakeRKPosition = 18 end
|
||||
if horlift and dX < 4 and speed > 6 then TragetBrakeRKPosition = 17 end
|
||||
if dX < 3 then TargetBrakeRKPosition = 18 end
|
||||
--if horlift and dX < 1.5 then TargetBrakeRKPosition = 19 end
|
||||
--if VZ then TargetBrakeRKPosition = 18 end
|
||||
end
|
||||
--if dX < 15 then TargetBrakeRKPosition = 16 end
|
||||
return TargetBrakeRKPosition
|
||||
end
|
||||
|
||||
function TRAIN_SYSTEM:Autodrive(StationBraking)
|
||||
local Train= self.Train
|
||||
-- Calculate distance to station
|
||||
local dX = self.Train.UPO.Distance
|
||||
--local speedLimit = (Train.ALS_ARS.Signal0 or Train.ALS_ARS.RealNoFreq) and 0 or Train.ALS_ARS.Signal40 and 40 or Train.ALS_ARS.Signal60 and 60 or Train.ALS_ARS.Signal70 and 70 or Train.ALS_ARS.Signal80 and 80 or 0
|
||||
local speedLimit = 0--(self.Train.ALS_ARS.Signal0 or self.Train.ALS_ARS.RealNoFreq) and 0 or self.Train.ALS_ARS.Signal40 and 40 or self.Train.ALS_ARS.Signal60 and 60 or self.Train.ALS_ARS.Signal70 and 70 or self.Train.ALS_ARS.Signal80 and 80 or 0
|
||||
if self.Train.ALS_ARS.AVSpeedLimit and self.Train.ALS_ARS.AVSpeedLimit > 20 then
|
||||
speedLimit = self.Train.ALS_ARS.AVSpeedLimit
|
||||
end
|
||||
local OnStation = dX < (160+35*self.MU - (speedLimit == 40 and 30 or 0)) and not self.StartMoving and Metrostroi.AnnouncerData[self.Train.UPO.Station]and Metrostroi.AnnouncerData[self.Train.UPO.Station][1]
|
||||
if StationBraking and (dX >= (160+35*self.MU - (speedLimit == 40 and 30 or 0)) or not OnStation) then self.Train.UPO.StationAutodrive = false return end
|
||||
-- Target and real RK position (0 if not braking)
|
||||
local TargetBrakeRKPosition = 0
|
||||
|
||||
local RKPosition = math.floor(Train.RheostatController.Position+0.5)
|
||||
|
||||
-- Calculate next speed limit
|
||||
|
||||
-- Get angle
|
||||
local Slope = Train:GetAngles().pitch
|
||||
|
||||
-- Check speed constraints
|
||||
if Train.ALS_ARS.Speed > (speedLimit - 6) then self.NoAcceleration = true end
|
||||
if Train.ALS_ARS.Speed < (speedLimit - 10) then self.NoAcceleration = false end
|
||||
|
||||
local Brake = false
|
||||
local Accelerate = false
|
||||
|
||||
local threshold = 1.0 + (Slope > 1 and 1 or 0)
|
||||
|
||||
-- Slow down on slopes
|
||||
if Train.ALS_ARS.Speed > speedLimit - 5 - (self.NoAcceleration and 4 or 7) then
|
||||
if Slope > 1 then
|
||||
if speedLimit == 40 then
|
||||
TargetBrakeRKPosition = 7
|
||||
elseif speedLimit > 40 then
|
||||
TargetBrakeRKPosition = 1
|
||||
Brake = (Train.ALS_ARS.Speed > speedLimit - 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Slow down if overspeeding soon
|
||||
if (Train.ALS_ARS.Speed > (speedLimit - threshold)) then
|
||||
TargetBrakeRKPosition = 18
|
||||
end
|
||||
|
||||
-- How smooth braking should be (higher self.MU = more gentle braking)
|
||||
-- Full stop command
|
||||
if Train.ALS_ARS.SpeedLimit < 30 then TargetBrakeRKPosition = 18 Brake = true end
|
||||
-- Calculate RK position based on distance and autodrive profile
|
||||
if OnStation then
|
||||
TargetBrakeRKPosition = self:GetStationRK(dX)
|
||||
else
|
||||
if dX > (160+35*self.MU - (speedLimit == 40 and 30 or 0)) then self.StartMoving = nil end
|
||||
end
|
||||
|
||||
-- Generate commands
|
||||
local ElectricBrakeActive = FullStop or TargetBrakeRKPosition > 0
|
||||
local AcceleratingActive = not ElectricBrakeActive and not self.NoAcceleration and Slope < 1
|
||||
|
||||
-- Generate brake rheostat rotation
|
||||
local RheostatBrakeRotating = Brake or RKPosition < TargetBrakeRKPosition
|
||||
-- Generate accel rheostat rotation
|
||||
local PP = math.floor(Train.PositionSwitch.Position + 0.5) == 2
|
||||
|
||||
local AmpNorm = true --Train.Electric.Itotal < (350 - (Train:GetPhysicsObject():GetMass()-30000)/24) * math.floor(Train.PositionSwitch.Position + 0.5)
|
||||
local RheostatAccelRotating = AcceleratingActive
|
||||
|
||||
if Slope < -2 and (math.floor(Train.PositionSwitch.Position + 0.5) == 2 and RKPosition == 10 and Train.Electric.Itotal > 500) then
|
||||
--if PP and (8 <= RKPosition and RKPosition <= 12) then
|
||||
RheostatAccelRotating = false
|
||||
--end
|
||||
end
|
||||
local PneumaticValve1 = ((dX < 1.55) and (Train.ALS_ARS.Speed > 0.1) and OnStation and TargetBrakeRKPosition == 18) or (Train.ALS_ARS.Speed > (Train.ALS_ARS.SpeedLimit - threshold))
|
||||
--or (Train:ReadCell(6) > 0 and Train:ReadCell(18) < 1 and Slope > 1)
|
||||
if dX < 2 and Train.ALS_ARS.Speed < 0.5 then self.AutodriveReset = true end
|
||||
--Disable autodrive on end of station brake
|
||||
--local StatID = Metrostroi.WorkingStations[self.Train.UPO.Station] or Metrostroi.WorkingStations[self.Train.UPO.Station + (self.Path == 1 and 1 or -1)] or 0
|
||||
|
||||
if (TargetBrakeRKPosition == 18 and Train.ALS_ARS.Speed < 0.1 and not self.StartMoving and OnStation) or (self.StartMoving and 10 < dX and dX < 160) then
|
||||
if (TargetBrakeRKPosition == 18 and Train.ALS_ARS.Speed < 0.1 and not self.StartMoving and OnStation) then
|
||||
self.Train.UPO.StationAutodrive = false
|
||||
|
||||
--
|
||||
--self.VUDOverride = true
|
||||
--[[
|
||||
--local self.Train.UPO.Station = self.Train:ReadCell(49160) > 0 and self.Train:ReadCell(49160) or self.Train:ReadCell(49161)
|
||||
if self.Train.UPO.Station == 0 then return end
|
||||
local StatID = Metrostroi.WorkingStations[self.Train.UPO.Station] or Metrostroi.WorkingStations[self.Train.UPO.Station + (self.Path == 1 and 1 or -1)] or 0
|
||||
if not StationBraking then--GetConVarNumber("metrostroi_paksd_autoopen",0) > 0 and not StationBraking then
|
||||
local Curr = Metrostroi.AnnouncerData[self.Train.UPO.Station]
|
||||
if Curr[2] then
|
||||
Train:WriteCell(32,1)
|
||||
else
|
||||
Train:WriteCell(31,1)
|
||||
end
|
||||
timer.Simple(0.1,function()
|
||||
if not IsValid(Train) then return end
|
||||
Train:WriteCell(32,0)
|
||||
Train:WriteCell(31,0)
|
||||
end)
|
||||
Train.ADoorDisable:TriggerInput("Set",1)
|
||||
end
|
||||
]]
|
||||
end
|
||||
self.AutodriveReset = true
|
||||
return
|
||||
end
|
||||
|
||||
-- Enter commands
|
||||
--Train:WriteCell(1, AcceleratingActive and 1 or 0) --Engage engines
|
||||
--Train:WriteCell(2, (RheostatAccelRotating or (ElectricBrakeActive and (RheostatBrakeRotating or RKPosition == 18 and not OnStation))) and 1 or 0) --X2/T2
|
||||
--Train:WriteCell(3, (Train.ALS_ARS.Speed > 30 and RheostatAccelRotating) and 1 or 0) --X3
|
||||
--Train:WriteCell(6, ElectricBrakeActive and 1 or 0) --Engage brakes
|
||||
--Train:WriteCell(20,(ElectricBrakeActive or not self.NoAcceleration) and 1 or 0) -- Engage power circuits
|
||||
local KVPos = 0
|
||||
if ElectricBrakeActive then
|
||||
if (RheostatBrakeRotating or RKPosition == 18 and not OnStation) and not Train:GetPackedBool(35) then
|
||||
KVPos = -3
|
||||
else
|
||||
KVPos = -1
|
||||
end
|
||||
elseif AcceleratingActive then
|
||||
if Train.ALS_ARS.Speed > 30 and RheostatAccelRotating and not Train:GetPackedBool(35) then
|
||||
KVPos = 3
|
||||
elseif RheostatAccelRotating and not Train:GetPackedBool(35) then
|
||||
KVPos = 2
|
||||
else
|
||||
KVPos = 1
|
||||
end
|
||||
end
|
||||
if (KVPos == -1) and Train:GetPackedBool(35) then
|
||||
if not self.VZTimer1 then self.VZTimer1 = CurTime() + 1 end
|
||||
else
|
||||
self.VZTimer1 = nil
|
||||
end
|
||||
if self.VZTimer1 and self.VZTimer1 < CurTime() then
|
||||
PneumaticValve1 = true
|
||||
end
|
||||
if OnStation then
|
||||
self.Train.R25p:TriggerInput("Set",self.OldRheostatBrakeRotating ~= RheostatBrakeRotating)
|
||||
self.OldRheostatBrakeRotating = RheostatBrakeRotating
|
||||
end
|
||||
Train:WriteCell(29, PneumaticValve1 and 1 or 0) -- Engage PN1
|
||||
Train:TriggerInput("KVControllerAutodriveSet",KVPos)
|
||||
--Train:WriteCell(25,(ElectricBrakeActive and self.TargetBrakeRKPosition > 17) and 1 or 0) -- Engage power circuits
|
||||
self.Brake = ElectricBrakeActive
|
||||
self.Accelerate = AcceleratingActive
|
||||
self.Rotating = RheostatBrakeRotating and true or RheostatAccelRotating and false or nil
|
||||
end
|
||||
|
||||
TRAIN_SYSTEM.Commands = {
|
||||
{
|
||||
[108] = {
|
||||
{9999,2.5},
|
||||
},
|
||||
[109] = {
|
||||
{9999,2.5},
|
||||
{1366,0},
|
||||
{1217,3},
|
||||
{981,0},
|
||||
{684,3},
|
||||
{338,0},
|
||||
{259,2.5},
|
||||
{152,-6},
|
||||
},
|
||||
[110] = {
|
||||
{9999,2.5},
|
||||
{1003,0},
|
||||
{1016,-1},
|
||||
{820,0},
|
||||
{136,-6},
|
||||
},
|
||||
[111] = {
|
||||
{9999,2.5},
|
||||
{860,0},
|
||||
{335,-1},
|
||||
{233,0},
|
||||
{153,-6},
|
||||
},
|
||||
[112] = {
|
||||
{9999,2.5},
|
||||
{1809,3},
|
||||
{1645,0},
|
||||
{1446,-4},
|
||||
{1402,-4},
|
||||
{1286,0},
|
||||
{1220,-4},
|
||||
{1049,0},
|
||||
{541,-5},
|
||||
{403,0},
|
||||
{138,-6},
|
||||
},
|
||||
},
|
||||
{
|
||||
[111] = {
|
||||
{9999,2.5},
|
||||
{1651,3},
|
||||
{1464,0},
|
||||
{1260,2.5},
|
||||
{1232,2.5},
|
||||
{893,0},
|
||||
{847,2.5},
|
||||
{712,0},
|
||||
{491,-4},
|
||||
{288,0},
|
||||
{216,2.5},
|
||||
{156,0},
|
||||
{170,-6},
|
||||
},
|
||||
[110] = {
|
||||
{9999,2.5},
|
||||
{805,3},
|
||||
{770,0},
|
||||
{127,-6},
|
||||
},
|
||||
[109] = {
|
||||
{9999,3},
|
||||
{1043,0},
|
||||
{419,2.5},
|
||||
{353,3},
|
||||
{224,0},
|
||||
{176,-6},
|
||||
},
|
||||
[108] = {
|
||||
{9999,2.5},
|
||||
{1433,0},
|
||||
{1345,-1},
|
||||
{1339,-2},
|
||||
{1167,-1},
|
||||
{1075,0},
|
||||
{817,-1},
|
||||
{650,0},
|
||||
{167,-6},
|
||||
},
|
||||
}
|
||||
}
|
||||
function TRAIN_SYSTEM:GetCurrentCommand()
|
||||
self.Commands = {
|
||||
{
|
||||
[108] = {
|
||||
{9999,2.5},
|
||||
},
|
||||
[109] = {
|
||||
{9999,2.5},
|
||||
{1366,0},
|
||||
{1217,3},
|
||||
{981,0},
|
||||
{684,3},
|
||||
{338,0},
|
||||
{259,2.5},
|
||||
{152,-6},
|
||||
},
|
||||
[110] = {
|
||||
{9999,2.5},
|
||||
{1003,0},
|
||||
{1016,-1},
|
||||
{850,0},
|
||||
{150,-6},
|
||||
},
|
||||
[111] = {
|
||||
{9999,2.5},
|
||||
{860,0},
|
||||
{335,-1},
|
||||
{233,0},
|
||||
{153,-6},
|
||||
},
|
||||
[112] = {
|
||||
{9999,2.5},
|
||||
{1809,3},
|
||||
{1645,0},
|
||||
{1446,-4},
|
||||
--{1402,-4},
|
||||
{1286,0},
|
||||
{1220,-4},
|
||||
{1018,0}, --1049
|
||||
{541,-5},
|
||||
{390,0},
|
||||
{150,-6},
|
||||
},
|
||||
[113] = {
|
||||
{9999,2.5},
|
||||
{678,0},
|
||||
{294,-1},
|
||||
{130,-6},
|
||||
},
|
||||
[114] = {
|
||||
{9999,3},
|
||||
{540,0},
|
||||
{150,-7},
|
||||
},
|
||||
[115] = {
|
||||
{9999,2.5},
|
||||
{1470,0},
|
||||
{1400,-4},
|
||||
{1288,0},
|
||||
{1207,2.5},
|
||||
{1101,3},
|
||||
{940,0},
|
||||
{896,-5},
|
||||
{761,0},
|
||||
{180,-6},
|
||||
},
|
||||
[116] = {
|
||||
{9999,3},
|
||||
{1190,0},
|
||||
{684,-5},
|
||||
{560,0},
|
||||
{140,-6},
|
||||
},
|
||||
[117] = {
|
||||
{9999,3},
|
||||
{1482,0},
|
||||
{974,-5},
|
||||
{866,0},
|
||||
{140,-6},
|
||||
},
|
||||
[118] = {
|
||||
{9999,3},
|
||||
{1780,0},
|
||||
{1750,-2},
|
||||
{1621,0},
|
||||
{1490,-4},
|
||||
{1273,0},
|
||||
{844,-4},
|
||||
{637,0},
|
||||
{557,-4},
|
||||
{416,0},
|
||||
{204,2.5},
|
||||
{165,0},
|
||||
{90,-6},
|
||||
},
|
||||
[119] = {
|
||||
{9999,2.5},
|
||||
{1650,0},
|
||||
{1148,2.5},
|
||||
{894,0},
|
||||
{630,-5},
|
||||
{498,0},
|
||||
{380,-2},
|
||||
{288,0},
|
||||
{222,-6},
|
||||
},
|
||||
[120] = {
|
||||
{9999,2.5},
|
||||
{1659,0},
|
||||
{1489,-5},
|
||||
{1405,0},
|
||||
{677,-1},
|
||||
{442,0},
|
||||
{158,-1},
|
||||
{80,-2},
|
||||
{75,-1},
|
||||
{65,-2},
|
||||
{60,-1},
|
||||
{55,-2},
|
||||
{50,-1},
|
||||
},
|
||||
[121] = {
|
||||
{9999,0},
|
||||
{3040,2.5},
|
||||
{2946,3},
|
||||
{2703,0},
|
||||
{1994,3},
|
||||
{1787,0},
|
||||
{1440,-5},
|
||||
{1311,0},
|
||||
{1074,-1},
|
||||
{1008,-2},
|
||||
{935,0},
|
||||
{145,-6},
|
||||
},
|
||||
[122] = {
|
||||
{9999,2.5},
|
||||
{2054,3},
|
||||
{1840,0},
|
||||
{1567,-5},
|
||||
{1370,0},
|
||||
{1154,-5},
|
||||
{870,0},
|
||||
{634,-5},
|
||||
{370,-0},
|
||||
{147,-6},
|
||||
},
|
||||
[123] = {
|
||||
{9999,3},
|
||||
{2855,0},
|
||||
{2684,-1},
|
||||
{2532,0},
|
||||
{1793,-5},
|
||||
{1548,0},
|
||||
{757,-1},
|
||||
{652,0},
|
||||
{137,-6},
|
||||
}
|
||||
},
|
||||
{
|
||||
[111] = {
|
||||
{9999,2.5},
|
||||
{1651,3},
|
||||
{1464,0},
|
||||
{1260,2.5},
|
||||
{1232,2.5},
|
||||
{893,0},
|
||||
{847,2.5},
|
||||
{712,0},
|
||||
{491,-4},
|
||||
{288,0},
|
||||
{216,2.5},
|
||||
{156,0},
|
||||
{170,-6},
|
||||
},
|
||||
[110] = {
|
||||
{9999,2.5},
|
||||
{805,3},
|
||||
{770,0},
|
||||
{150,-6},
|
||||
},
|
||||
[109] = {
|
||||
{9999,3},
|
||||
{1043,0},
|
||||
{419,2.5},
|
||||
{353,3},
|
||||
{224,0},
|
||||
{176,-6},
|
||||
},
|
||||
[108] = {
|
||||
{9999,2.5},
|
||||
{1433,0},
|
||||
{1345,-1},
|
||||
{1339,-2},
|
||||
{1167,-1},
|
||||
{1075,0},
|
||||
{817,-1},
|
||||
{650,0},
|
||||
{167,-6},
|
||||
},
|
||||
}
|
||||
}
|
||||
if (Metrostroi.TrainPositions[self.Train] and Metrostroi.TrainPositions[self.Train][1]) then
|
||||
self.PathID = Metrostroi.TrainPositions[self.Train][1].path.id
|
||||
end
|
||||
if not self.Commands[self.PathID] or not self.Commands[self.PathID][self.Train.UPO.Station] then return 2 end
|
||||
if self.Train:ReadCell(49165) < 20 and not self.OnStation then return 2 end
|
||||
local max-- = self.Train:ReadCell(49165)
|
||||
local pos = 0
|
||||
for k,v in ipairs(self.Commands[self.PathID][self.Train.UPO.Station]) do
|
||||
if v[1] > self.Train:ReadCell(49165) then
|
||||
max = v[1]
|
||||
pos = v[2]
|
||||
end
|
||||
end
|
||||
local speedLimit = 0--(self.Train.ALS_ARS.Signal0 or self.Train.ALS_ARS.RealNoFreq) and 0 or self.Train.ALS_ARS.Signal40 and 40 or self.Train.ALS_ARS.Signal60 and 60 or self.Train.ALS_ARS.Signal70 and 70 or self.Train.ALS_ARS.Signal80 and 80 or 0
|
||||
if self.Train.ALS_ARS.AVSpeedLimit and self.Train.ALS_ARS.AVSpeedLimit > 20 then
|
||||
speedLimit = self.Train.ALS_ARS.AVSpeedLimit
|
||||
end
|
||||
--if self.Train.Speed > speedLimit-1 and pos > 0 then pos = 0 end
|
||||
local RKPosition = math.floor(self.Train.RheostatController.Position+0.5)
|
||||
local PP = math.floor(self.Train.PositionSwitch.Position + 0.5) == 2
|
||||
if pos == 2.5 then
|
||||
return (not PP or RKPosition >= 7) and 3 or 1
|
||||
elseif pos > -4 then
|
||||
return pos
|
||||
elseif pos == -4 then
|
||||
return not self.Train:GetPackedBool(35) and RKPosition < 7 and -3 or -1
|
||||
elseif pos == -5 then
|
||||
return self.Train.Speed > speedLimit-5 and -2 or -1
|
||||
elseif pos == -6 or pos == -7 then
|
||||
self.OnStation = true
|
||||
local S = self.Train.UPO.Distance
|
||||
local RK = self:GetStationRK(S,pos == -7)
|
||||
|
||||
if (RK >= 18 and self.Train.ALS_ARS.Speed < 0.1 and not self.StartMoving and self.OnStation) then
|
||||
self.Train.UPO.StationAutodrive = false
|
||||
--self.VUDOverride = true
|
||||
|
||||
--local self.Train.UPO.Station = self.Train:ReadCell(49160) > 0 and self.Train:ReadCell(49160) or self.Train:ReadCell(49161)
|
||||
if self.Train.UPO.Station == 0 then self.AutodriveReset = true return end
|
||||
--local StatID = Metrostroi.WorkingStations[self.Train.UPO.Station] or Metrostroi.WorkingStations[self.Train.UPO.Station + (self.Path == 1 and 1 or -1)] or 0
|
||||
if not StationBraking then
|
||||
local Curr = Metrostroi.AnnouncerData[self.Train.UPO.Station]
|
||||
if Curr[2] then
|
||||
self.Train:WriteCell(32,1)
|
||||
else
|
||||
self.Train:WriteCell(31,1)
|
||||
end
|
||||
timer.Simple(0.1,function()
|
||||
if not IsValid(self.Train) then return end
|
||||
self.Train:WriteCell(32,0)
|
||||
self.Train:WriteCell(31,0)
|
||||
end)
|
||||
self.Train.ADoorDisable:TriggerInput("Set",1)
|
||||
end
|
||||
self.AutodriveReset = true
|
||||
self.KVPos = 0
|
||||
end
|
||||
return (not self.Train:GetPackedBool(35) and (RK > RKPosition or RK >= 18)) and (RK == 19 and -4 or-3) or -1
|
||||
end
|
||||
end
|
||||
function TRAIN_SYSTEM:BoardAutodrive()
|
||||
local Train= self.Train
|
||||
|
||||
-- Calculate distance to station
|
||||
local dX = self.Train.UPO.Distance
|
||||
if dX > 160 then self.StartMoving = nil end
|
||||
local OnStation = dX < 160 and not self.StartMoving and Metrostroi.AnnouncerData[self.Train.UPO.Station]and Metrostroi.AnnouncerData[self.Train.UPO.Station][1]
|
||||
--if StationBraking and (dX >= (160+35*self.MU - (speedLimit == 40 and 30 or 0)) or not OnStation) then self.Train.UPO.StationAutodrive = false return end
|
||||
-- Target and real RK position (0 if not braking)
|
||||
local TargetBrakeRKPosition = 0
|
||||
|
||||
local Command = self:GetCurrentCommand()
|
||||
local KVPos = Command
|
||||
local VZP = self.Train.KSAUP and self.Train.VZP.Value > 0.5
|
||||
local Vn2 = KVPos == -4
|
||||
if VZP and KVPos > 0 then
|
||||
KVPos = 0
|
||||
elseif ElectricBrakeActive then
|
||||
if (RheostatBrakeRotating or RKPosition == 18 and not OnStation) and not Train:GetPackedBool(35) then
|
||||
KVPos = -3
|
||||
else
|
||||
KVPos = -1
|
||||
end
|
||||
elseif AcceleratingActive then
|
||||
if Train.ALS_ARS.Speed > 30 and RheostatAccelRotating and not Train:GetPackedBool(35) then
|
||||
KVPos = 3
|
||||
elseif RheostatAccelRotating and not Train:GetPackedBool(35) then
|
||||
KVPos = 2
|
||||
else
|
||||
KVPos = 1
|
||||
end
|
||||
end
|
||||
if Vn2 then KVPos = 0 end
|
||||
if OnStation then
|
||||
self.Train.R25p:TriggerInput("Set",self.OldRheostatBrakeRotating ~= RheostatBrakeRotating)
|
||||
self.OldRheostatBrakeRotating = RheostatBrakeRotating
|
||||
end
|
||||
--Train:WriteCell(29, PneumaticValve1 and 1 or 0) -- Engage PN1
|
||||
Train:TriggerInput("KVControllerAutodriveSet",KVPos)
|
||||
--Train:WriteCell(25,(ElectricBrakeActive and self.TargetBrakeRKPosition > 17) and 1 or 0) -- Engage power circuits
|
||||
self.Brake = ElectricBrakeActive
|
||||
self.Accelerate = AcceleratingActive
|
||||
self.KVPos = KVPos
|
||||
self.Rotating = RheostatBrakeRotating and true or RheostatAccelRotating and false or nil
|
||||
end
|
||||
|
||||
function TRAIN_SYSTEM:Enable()
|
||||
if not self.AutodriveEnabled and not self.AutodriveReset then
|
||||
self.AutodriveEnabled = true
|
||||
self.StartMoving = true
|
||||
end
|
||||
end
|
||||
function TRAIN_SYSTEM:Disable()
|
||||
self.AutodriveReset = true
|
||||
end
|
||||
function TRAIN_SYSTEM:Think()
|
||||
self.TrainCorrections = {
|
||||
["Em"] = 0,
|
||||
["717"] = 0,
|
||||
}
|
||||
local S = self.Train.UPO.Distance
|
||||
self.Time = self.Time or CurTime()
|
||||
if (CurTime() - self.Time) > 0.1 and self.Train.A29 and self.Train.A29.Value < 0.5 then
|
||||
self.Time = CurTime()
|
||||
--RunConsoleCommand("say",Format("station:%.2f,%.2f\t distance:%.2f",self.Train.UPO.Station,self.Train:ReadCell(49165),S))
|
||||
end
|
||||
if self.Train.KSAUP then return end
|
||||
if self.Train.VZP then
|
||||
if self.Train.BCCD and self.Train.BCCD.Value > 0 and self.Train.ADoorDisable.Value > 0 then
|
||||
self.Train.ADoorDisable:TriggerInput("Set",0)
|
||||
self.OnStation = false
|
||||
self.AutodriveEnabled = false
|
||||
self.ReadyToStart = true
|
||||
end
|
||||
--[[if Train:CPPIGetOwner() and Train:CPPIGetOwner():GetName() ~= "glebqip(RUS)" and (self.AutodriveEnabled or not self.AutodriveReset) then
|
||||
self.AutodriveReset = true
|
||||
else]]
|
||||
|
||||
if self.AutodriveReset then
|
||||
self.Train:TriggerInput("KVControllerAutodriveSet",0)
|
||||
self.NoAcceleration = nil
|
||||
self.Train:WriteCell(8,0)
|
||||
self.Train:WriteCell(29,0)
|
||||
self.AutodriveEnabled = false
|
||||
self.OnStation = false
|
||||
end
|
||||
|
||||
if (self.Train.VZP.Value < 0.5 or (self.Train.Blok and self.Train.Blok == 4)) and self.AutodriveReset then
|
||||
self.AutodriveReset = false
|
||||
end
|
||||
--Disable autodrive, if KV pos is not zero, ARS or ALS not enabled, Reverser position is not forward or Driver value pos is > 2
|
||||
if self.Train.Blok and self.Train.Blok ~= 1 then
|
||||
if (self.Train.Pneumatic.BrakeLinePressure < 4.8 or self.Train.Pneumatic.BrakeCylinderPressure > 1.8) and not self.BCTimer then
|
||||
self.BCTimer = CurTime()+3
|
||||
end
|
||||
if self.Train.Pneumatic.BrakeLinePressure >= 4.8 and self.Train.Pneumatic.BrakeCylinderPressure <= 1.8 then
|
||||
self.BCTimer = nil
|
||||
end
|
||||
if self.BCTimer and CurTime() - self.BCTimer > 0 then
|
||||
self:Disable()
|
||||
end
|
||||
if self.Train.KV.ControllerPosition ~= 0.0 or not self.Train.ALS_ARS.EnableARS or self.Train.KV.ReverserPosition ~= 1.0 or self.Train.Panel.SD < 0.5 then
|
||||
self:Disable()
|
||||
end
|
||||
if self.Train.ALS_ARS["33G"] > 0.5 then
|
||||
self:Disable()
|
||||
end
|
||||
end
|
||||
--if self.OnStation and self.Train.UPO.StationAutodrive and self.AutodriveWorking and not self.VRD and self.Train.ALS_ARS.EnableARS and self.Train.KV.ReverserPosition == 1.0 and self.Train.Pneumatic.DriverValvePosition <= 2 and self.self.Train.Panel.SD > 0.5 then
|
||||
--self:Autodrive(true)
|
||||
--elseif self.Train.UPO.StationAutodrive then
|
||||
--self.Train.UPO.StationAutodrive = false
|
||||
--end
|
||||
if self.AutodriveEnabled then
|
||||
if self.Train.Blok ~= 1 and not self.KSAUP then
|
||||
self:Autodrive()
|
||||
else
|
||||
self:BoardAutodrive()
|
||||
end
|
||||
end
|
||||
if self.ReadyToStart and self.Train.Panel["SD"] > 0.5 then
|
||||
self.ReadyToStart = nil
|
||||
self.AutodriveReset = false
|
||||
end
|
||||
if self.Blocks == 2 and self["PA-KSD"].StationAutodrive then
|
||||
self:Autodrive(true)
|
||||
end
|
||||
--end
|
||||
end
|
||||
if self.RealControllerPosition ~= self.Train.KV.RealControllerPosition and self.Train.Blok == 1 and self.Train.A5 and self.Train.A5.Value > 0.5 then
|
||||
local dX = self.Train.UPO.Distance
|
||||
--RunConsoleCommand("say",self.Train.KV.RealControllerPosition,dX,self.Train.UPO.Station,(Metrostroi.TrainPositions[self.Train] and Metrostroi.TrainPositions[self.Train][1]) and Metrostroi.TrainPositions[self.Train][1].path.id or "unk",math.floor(self.Train.RheostatController.Position+0.5))
|
||||
--file.Append("puav.txt",Format("%d\t%s\t%d\t%s\t%d\n",self.Train.KV.RealControllerPosition,dX,self.Train.UPO.Station,(Metrostroi.TrainPositions[self.Train] and Metrostroi.TrainPositions[self.Train][1]) and Metrostroi.TrainPositions[self.Train][1].path.id or "unk",math.floor(self.Train.RheostatController.Position+0.5)))
|
||||
self.RealControllerPosition = self.Train.KV.RealControllerPosition
|
||||
end
|
||||
--self:GetCurrentCommand()
|
||||
end
|
||||
Reference in New Issue
Block a user