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(); }); }); }
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; } }
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; } } } }