Esempio n. 1
0
        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());
        }
Esempio n. 2
0
 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());
 }