private void Train()
        {
            if (SelectedMLPointsSet == null) return;

            IsTrainingEnabled = false;
            TrainCommand.RaiseCanExecuteChanged();
            _trainer = new Trainer(_candlesService, _brokersService);
            var pointsSet = SelectedMLPointsSet;

            _trainer.TrainAsync(pointsSet)
                .ContinueWith(o =>
                {
                    _dispatcher.Invoke(() =>
                    {
                        IsTrainingEnabled = true;
                        TrainCommand.RaiseCanExecuteChanged();
                    });
                });
        }
Exemplo n.º 2
0
        private void ParseTrainCommand(TrainCommand Command, string[] Arguments, int Index, Expression Expression, ref RouteData Data, bool PreviewOnly)
        {
            switch (Command)
            {
            case TrainCommand.Interval:
            {
                if (!PreviewOnly)
                {
                    List <double> intervals = new List <double>();
                    for (int k = 0; k < Arguments.Length; k++)
                    {
                        double o;
                        if (!NumberFormats.TryParseDoubleVb6(Arguments[k], out o))
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "Interval " + k.ToString(Culture) + " is invalid in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            continue;
                        }

                        if (o == 0)
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "Interval " + k.ToString(Culture) + " must be non-zero in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            continue;
                        }

                        if (o > 43200 && Plugin.CurrentOptions.EnableBveTsHacks)
                        {
                            //Southern Blighton- Treston park has a runinterval of well over 24 hours, and there are likely others
                            //Discard this
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "Interval " + k.ToString(Culture) + " is greater than 12 hours in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            continue;
                        }

                        if (o < 120 && Plugin.CurrentOptions.EnableBveTsHacks)
                        {
                            /*
                             * An AI train follows the same schedule / rules as the player train
                             * ==>
                             * x Waiting time before departure at the first station (30s to 1min is 'normal')
                             * x Time to accelerate to linespeed
                             * x Time to clear (as a minimum) the protecting signal on station exit
                             *
                             * When the runinterval is below ~2minutes, on large numbers of routes, this
                             * shows up as a train overlapping the player train (bad....)
                             */
                            o = 120;
                        }

                        intervals.Add(o);
                    }

                    intervals.Sort();
                    if (intervals.Count > 0)
                    {
                        CurrentRoute.PrecedingTrainTimeDeltas = intervals.ToArray();
                    }
                }
            }
            break;

            case TrainCommand.Velocity:
            {
                if (!PreviewOnly)
                {
                    double limit = 0.0;
                    if (Arguments.Length >= 1 && Arguments[0].Length > 0 && !NumberFormats.TryParseDoubleVb6(Arguments[0], out limit))
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, "Speed is invalid in Train.Velocity at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                        limit = 0.0;
                    }

                    Plugin.CurrentOptions.PrecedingTrainSpeedLimit = limit <= 0.0 ? double.PositiveInfinity : Data.UnitOfSpeed * limit;
                }
            }
            break;

            case TrainCommand.Folder:
            case TrainCommand.File:
            {
                if (PreviewOnly)
                {
                    if (Arguments.Length < 1)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, Command + " is expected to have one argument at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else
                    {
                        if (Path.ContainsInvalidChars(Arguments[0]))
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "FolderName contains illegal characters in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                        }
                        else
                        {
                            Plugin.CurrentOptions.TrainName = Arguments[0];
                        }
                    }
                }
            }
            break;

            case TrainCommand.Run:
            case TrainCommand.Rail:
            {
                if (!PreviewOnly)
                {
                    if (Index < 0)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, "RailTypeIndex is out of range in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else
                    {
                        int val = 0;
                        if (Arguments.Length >= 1 && Arguments[0].Length > 0 && !NumberFormats.TryParseIntVb6(Arguments[0], out val))
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "RunSoundIndex is invalid in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            val = 0;
                        }

                        if (val < 0)
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "RunSoundIndex is expected to be non-negative in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            val = 0;
                        }

                        if (Index >= Data.Structure.Run.Length)
                        {
                            Array.Resize(ref Data.Structure.Run, Index + 1);
                        }

                        Data.Structure.Run[Index] = val;
                    }
                }
            }
            break;

            case TrainCommand.Flange:
            {
                if (!PreviewOnly)
                {
                    if (Index < 0)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, "RailTypeIndex is out of range in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else
                    {
                        int val = 0;
                        if (Arguments.Length >= 1 && Arguments[0].Length > 0 && !NumberFormats.TryParseIntVb6(Arguments[0], out val))
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "FlangeSoundIndex is invalid in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            val = 0;
                        }

                        if (val < 0)
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "FlangeSoundIndex expected to be non-negative in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            val = 0;
                        }

                        if (Index >= Data.Structure.Flange.Length)
                        {
                            Array.Resize(ref Data.Structure.Flange, Index + 1);
                        }

                        Data.Structure.Flange[Index] = val;
                    }
                }
            }
            break;

            case TrainCommand.TimetableDay:
            {
                if (!PreviewOnly)
                {
                    if (Index < 0)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, "TimetableIndex is expected to be non-negative in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else if (Arguments.Length < 1)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, Command + " is expected to have one argument at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else
                    {
                        if (Path.ContainsInvalidChars(Arguments[0]))
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "FileName " + Arguments[0] + " contains illegal characters in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                        }
                        else
                        {
                            while (Index >= Data.TimetableDaytime.Length)
                            {
                                int n = Data.TimetableDaytime.Length;
                                Array.Resize(ref Data.TimetableDaytime, n << 1);
                                for (int i = n; i < Data.TimetableDaytime.Length; i++)
                                {
                                    Data.TimetableDaytime[i] = null;
                                }
                            }

                            string f = string.Empty;
                            if (!string.IsNullOrEmpty(TrainPath))
                            {
                                f = Path.CombineFile(TrainPath, Arguments[0]);
                            }

                            if (!System.IO.File.Exists(f))
                            {
                                f = Path.CombineFile(ObjectPath, Arguments[0]);
                            }

                            if (System.IO.File.Exists(f))
                            {
                                Plugin.CurrentHost.RegisterTexture(f, new TextureParameters(null, null), out Data.TimetableDaytime[Index]);
                            }
                            else
                            {
                                Plugin.CurrentHost.AddMessage(MessageType.Error, false, "DaytimeTimetable " + Index + " with FileName " + Arguments[0] + " was not found in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            }
                        }
                    }
                }
            }
            break;

            case TrainCommand.TimetableNight:
            {
                if (!PreviewOnly)
                {
                    if (Index < 0)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, "TimetableIndex is expected to be non-negative in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else if (Arguments.Length < 1)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, Command + " is expected to have one argument at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else
                    {
                        if (Path.ContainsInvalidChars(Arguments[0]))
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "FileName " + Arguments[0] + " contains illegal characters in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                        }
                        else
                        {
                            while (Index >= Data.TimetableNighttime.Length)
                            {
                                int n = Data.TimetableNighttime.Length;
                                Array.Resize(ref Data.TimetableNighttime, n << 1);
                                for (int i = n; i < Data.TimetableNighttime.Length; i++)
                                {
                                    Data.TimetableNighttime[i] = null;
                                }
                            }

                            string f = string.Empty;
                            if (!string.IsNullOrEmpty(TrainPath))
                            {
                                f = Path.CombineFile(TrainPath, Arguments[0]);
                            }

                            if (!System.IO.File.Exists(f))
                            {
                                f = Path.CombineFile(ObjectPath, Arguments[0]);
                            }

                            if (System.IO.File.Exists(f))
                            {
                                Plugin.CurrentHost.RegisterTexture(f, new TextureParameters(null, null), out Data.TimetableNighttime[Index]);
                            }
                            else
                            {
                                Plugin.CurrentHost.AddMessage(MessageType.Error, false, "DaytimeTimetable " + Index + " with FileName " + Arguments[0] + " was not found in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                            }
                        }
                    }
                }
            }
            break;

            case TrainCommand.Destination:
            {
                if (!PreviewOnly)
                {
                    if (Arguments.Length < 1)
                    {
                        Plugin.CurrentHost.AddMessage(MessageType.Error, false, Command + " is expected to have one argument at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                    }
                    else
                    {
                        if (!NumberFormats.TryParseIntVb6(Arguments[0], out Plugin.CurrentOptions.InitialDestination))
                        {
                            Plugin.CurrentHost.AddMessage(MessageType.Error, false, "Destination is expected to be an Integer in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
                        }
                    }
                }
            }
            break;
            }
        }
Exemplo n.º 3
0
        static private async Task ReceiveDataFromAzure()
        {
            if (strconn == "")
            {
                return;
            }
            DeviceClient deviceClient = DeviceClient.CreateFromConnectionString(strconn, TransportType.Http1);

            Message receivedMessage = null;
            string  messageData;

            while (true)
            {
                try
                {
                    receivedMessage = await deviceClient.ReceiveAsync();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine($"Error receiving from Azure Iot Hub: {ex.Message}");
                }


                if (receivedMessage != null)
                {
                    bool ballOK = true;
                    // {"command":"addprogram","message":"{\"DateTimeStart\":\"2016-06-02T03:04:05+00:00\",\"Duration\":\"00:02:05\",\"SprinklerNumber\":3}"}
                    //MessageIoT temp = new MessageIoT();
                    //temp.command = "test";
                    //temp.message = JsonConvert.SerializeObject(new SprinklerProgram(new DateTimeOffset(2016, 6, 2, 3, 4, 5, new TimeSpan(0, 0, 0)), new TimeSpan(0, 2, 5), 3));
                    //var ret = JsonConvert.SerializeObject(temp);
                    //SendDataToAzure(ret);
                    messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes());
                    MessageIoT cmdmsg = null;
                    try
                    {
                        cmdmsg = JsonConvert.DeserializeObject <MessageIoT>(messageData);
                    }
                    catch (Exception)
                    {
                        try
                        {
                            await deviceClient.RejectAsync(receivedMessage);

                            ballOK = false;
                        }
                        catch (Exception)
                        {
                            ballOK = false;
                        }
                    }
                    if (!ballOK)
                    {
                    }
                    else
                    {
                        if (string.Compare(cmdmsg.command, TrainCmd, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            try
                            {
                                //{"command":"train","message":"{\"TrainNumber\":\"3\",\"Speed\":\"0\"}"}
                                var traincmd = JsonConvert.DeserializeObject <TrainCommand>(cmdmsg.message);
                                if ((traincmd.TrainNumber >= 0) && (traincmd.TrainNumber < myParamRail.NumberOfTrains))
                                {
                                    if (traincmd.Speed == 0)
                                    {
                                        myLego.SingleOutputPWM(LegoPWM.BRK, (LegoPWMOutput)myParamRail.Trains[traincmd.TrainNumber].RedBlue, (LegoChannel)(myParamRail.Trains[traincmd.TrainNumber].Channel - 1));
                                    }
                                    else if ((traincmd.Speed >= 8) || (traincmd.Speed <= -8))
                                    {
                                        myLego.SingleOutputPWM(traincmd.Speed > 0 ? LegoPWM.FWD7: LegoPWM.REV7, (LegoPWMOutput)myParamRail.Trains[traincmd.TrainNumber].RedBlue, (LegoChannel)(myParamRail.Trains[traincmd.TrainNumber].Channel - 1));
                                    }
                                    else
                                    {
                                        myLego.SingleOutputCST(traincmd.Speed > 0 ? LegoCST.INC_PWM : LegoCST.DEC_PWM, (LegoPWMOutput)myParamRail.Trains[traincmd.TrainNumber].RedBlue, (LegoChannel)(myParamRail.Trains[traincmd.TrainNumber].Channel - 1));
                                    }
                                }
                                else
                                {
                                    ballOK = false;
                                }
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                        else if (string.Compare(cmdmsg.command, SignalCmd, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            try
                            {
                                //{"command":"signal","message":"{\"SignaSwitchNumber\":\"1\",\"State\":\"false\"}"}
                                var sgcmd = JsonConvert.DeserializeObject <SignalSwitchCommand>(cmdmsg.message);
                                if ((sgcmd.SignaSwitchNumber >= 0) && (sgcmd.SignaSwitchNumber < mySignal.NumberOfSignals))
                                {
                                    mySignal.ChangeSignal(sgcmd.SignaSwitchNumber, sgcmd.State);
                                }
                                else
                                {
                                    ballOK = false;
                                }
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                        else if (string.Compare(cmdmsg.command, SwitchCmd, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            try
                            {
                                //{ "command":"switch","message":"{\"SignaSwitchNumber\":\"1\",\"State\":\"false\"}"}
                                var sgcmd = JsonConvert.DeserializeObject <SignalSwitchCommand>(cmdmsg.message);
                                if ((sgcmd.SignaSwitchNumber >= 0) && (sgcmd.SignaSwitchNumber < mySwitch.NumberOfSwitch))
                                {
                                    mySwitch.ChangeSwitch(sgcmd.SignaSwitchNumber, sgcmd.State);
                                }
                                else
                                {
                                    ballOK = false;
                                }
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                        else if (string.Compare(cmdmsg.command, GetStausCmd, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            try
                            {
                                cmdmsg.message = JsonConvert.SerializeObject(myParamRail);
                                SendDataToAzure(JsonConvert.SerializeObject(cmdmsg));
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                        else if (string.Compare(cmdmsg.command, GetSignalStatus, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            try
                            {
                                SignalSwitchCommand[] sig = new SignalSwitchCommand[myParamRail.NumberOfSignals];
                                for (byte i = 0; i < sig.Length; i++)
                                {
                                    sig[i].SignaSwitchNumber = i;
                                    sig[i].State             = mySignal.GetSignal(i);
                                }
                                cmdmsg.message = JsonConvert.SerializeObject(sig);
                                SendDataToAzure(JsonConvert.SerializeObject(cmdmsg));
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                        else if (string.Compare(cmdmsg.command, GetSwitchStatus, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            try
                            {
                                SignalSwitchCommand[] sig = new SignalSwitchCommand[myParamRail.NumberOfSwitchs];
                                for (byte i = 0; i < sig.Length; i++)
                                {
                                    sig[i].SignaSwitchNumber = i;
                                    sig[i].State             = mySwitch.GetSwitch(i);
                                }
                                cmdmsg.message = JsonConvert.SerializeObject(sig);
                                SendDataToAzure(JsonConvert.SerializeObject(cmdmsg));
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                        else if (string.Compare(cmdmsg.command, GetTrainStatus, StringComparison.OrdinalIgnoreCase) == 0)
                        {
                            try
                            {
                                TrainCommand[] tra = new TrainCommand[myParamRail.NumberOfTrains];
                                for (byte i = 0; i < tra.Length; i++)
                                {
                                    tra[i].TrainNumber = i;
                                    //TODO: need to implement capturing train speed
                                    //tra[i].Speed =
                                }
                                cmdmsg.message = JsonConvert.SerializeObject(tra);
                                SendDataToAzure(JsonConvert.SerializeObject(cmdmsg));
                            }
                            catch (Exception)
                            {
                                ballOK = false;
                            }
                        }
                    }

                    try
                    {
                        if (ballOK)
                        {
                            await deviceClient.CompleteAsync(receivedMessage);
                        }
                        else
                        {
                            await deviceClient.RejectAsync(receivedMessage);
                        }
                    }
                    catch (Exception)
                    {
                        try
                        {
                            await deviceClient.RejectAsync(receivedMessage);
                        }
                        catch (Exception)
                        {
                        }
                        //throw;
                    }
                }
            }
        }