public override float Update(float elapsedSeconds) { if (TCSEmergencyBraking()) { allowConnect = true; } if (client == null && allowConnect) { TcpClient c = new TcpClient(); c.Connect("127.0.0.1", 5090); client = new TCPClient(c); client.WriteLine("register(train_brake)"); client.WriteLine("register(emergency_pushb)"); client.WriteLine("register(power)"); client.WriteLine("register(speed)"); } if (client != null) { string line = client.ReadLine(); while (line != null) { string val = line.Substring(line.IndexOf('=') + 1); if (line.StartsWith("train_brake=")) { Value = float.Parse(val.Replace('.', ',')); } else if (line.StartsWith("emergency_pushb=")) { EBPB = val != "0" && val != "false"; } else if (line.StartsWith("power=")) { power = val == "1" || val == "true"; } else if (line.StartsWith("speed=")) { speed = MpS.FromKpH(float.Parse(val.Replace('.', ','))); } line = client.ReadLine(); } } if (UpdateValue() == 1) { if (Value > 0.9) { Value = 1; SetUpdateValue(0); } else { float prev = Value; Value += elapsedSeconds / 3; if (Value >= 0.9 && prev < 0.9) { Value = 0.93f; SetUpdateValue(0); } } } if (UpdateValue() == -1) { float prev = Value; Value -= elapsedSeconds / 3; if (Value <= 0) { Value = 0; SetUpdateValue(0); } } if (speed < 6 || !power) { dynavail = false; } else if (Value == 0) { dynavail = true; } if (EBPB || EmergencyBrakingPushButton() || TCSEmergencyBraking() || Value > 0.95f) { CurrentState = State.Emergency; } else if (TCSFullServiceBraking() || Value > 0.90f) { CurrentState = State.FullBrake; } else if (Value > 0.01) { CurrentState = State.Apply; } else { CurrentState = State.Release; } if (Value < 0.01) { applyValue = 0; } else { applyValue = Math.Min(Math.Max((Value - 0.01f) / 0.89f * 0.85f + 0.15f, 0.15f), 1); } float MaxDynForce = DynamicBrakeForce(speed); float TargetForce = applyValue; float TargetDynamicForce = CurrentState == State.Emergency ? 0 : Math.Min(TargetForce, MaxDynForce); float TargetAirForce = TargetForce - TargetDynamicForce; dynamicBrakeValue = MaxDynForce == 0 ? 0 : TargetDynamicForce / MaxDynForce; airBrakeValue = Math.Max(TargetAirForce, 0); if (client != null) { client.WriteLine("dynamic_brake=" + dynamicBrakeValue.ToString().Replace(',', '.')); } SetCurrentValue(Value); return(CurrentValue()); }
public override float Update(float elapsedSeconds) { if (TCSEmergencyBraking()) { allowConnect = true; } if (client == null && allowConnect) { TcpClient c = new TcpClient(); c.Connect("127.0.0.1", 5090); client = new TCPClient(c); client.WriteLine("register(train_brake)"); client.WriteLine("register(emergency_pushb)"); client.WriteLine("register(power)"); client.WriteLine("register(speed)"); } if (client != null) { string line = client.ReadLine(); while (line != null) { string val = line.Substring(line.IndexOf('=') + 1); if (line.StartsWith("train_brake=")) { Value = float.Parse(val.Replace('.', ',')); } else if (line.StartsWith("emergency_pushb=")) { EBPB = val != "0" && val != "false"; } else if (line.StartsWith("power=")) { power = val == "1" || val == "true"; } else if (line.StartsWith("speed=")) { speed = MpS.FromKpH(float.Parse(val.Replace('.', ','))); } line = client.ReadLine(); } } if (UpdateValue() == 1) { if (Value > 0.9) { Value = 1; SetUpdateValue(0); } else { float prev = Value; Value += elapsedSeconds / 3; if (Value >= 0.9 && prev < 0.9) { Value = 0.93f; SetUpdateValue(0); } } } if (UpdateValue() == -1) { float prev = Value; Value -= elapsedSeconds / 3; if (Value <= 0) { Value = 0; SetUpdateValue(0); } } if (EBPB || EmergencyBrakingPushButton() || TCSEmergencyBraking() || Value > 0.95f) { CurrentState = State.Emergency; } else if (TCSFullServiceBraking() || Value > 0.90f) { CurrentState = State.FullBrake; } else if (Value > 0.01) { CurrentState = State.Apply; } else { CurrentState = State.Release; } if (Value < 0.01) { applyValue = 0; } else { applyValue = Math.Min(Math.Max(Value * 0.9f, 0), 1); } airBrakeValue = applyValue; SetCurrentValue(Value); return(CurrentValue()); }