private QcMessage IncrementState(int MotorAddress, QcMessage Datagram) { Motors[MotorAddress].UpdateStatus(Datagram); QcMessage emit = Motors[MotorAddress].EmitTxMessage(Operation[MotorAddress]); if (Motors[MotorAddress].IsComplete()) { if (ProgressRaised[MotorAddress] != RunMode.Complete) { ProgressRaised[MotorAddress] = RunMode.Complete; Progress(MotorAddress, Motors[MotorAddress].Current, Motors[MotorAddress].CommandCount, RunMode.Complete); } Motors[MotorAddress].CleanUp(); } bool allcomplete = true; foreach (KeyValuePair <int, MotorControl> motor in Motors) { allcomplete &= motor.Value.IsComplete(); } if (allcomplete) { Progress(-1, -1, -1, RunMode.Complete); } return(emit); }
public virtual void UpdateStatus(QcMessage Datagram) { if ((Datagram.Type == QcPacketType.Ack || (Datagram.Type == QcPacketType.Data && Datagram.Command == TxMessage.Command)) && Emitted) { Complete = true; } }
public virtual void UpdateStatus(QcMessage Datagram) { TxMessages[CurrentTxMessage].UpdateStatus(Datagram); if (TxMessages[CurrentTxMessage].IsComplete()) { IncrementStatus(); } }
public MessageCommand(QcMessage Datagram) { Datagram.Type = QcPacketType.Command; if (Datagram.Data == null) { Datagram.Data = new List <int>(); } Datagram.MotorAddress = MotorAddress; if (Datagram.Psw == null) { Datagram.Psw = new List <QcPsw>(); } TxMessage = Datagram; Complete = false; Emitted = false; }
public void UpdateStatus(QcMessage Datagram) { if (Datagram.Data == null) { Datagram.Data = new List <int>(); } if (Datagram.Psw == null) { Datagram.Psw = new List <QcPsw>(); } if (CurrentCommand < Commands.Count) { Commands[CurrentCommand].UpdateStatus(Datagram); if (Commands[CurrentCommand].IsComplete()) { CurrentCommand++; } } }
public virtual QcMessage EmitTxMessage(RunMode OperationMode) { this.OperationMode = OperationMode; if (CurrentTxMessage < TxMessages.Count) { TxMessagedEmitted = CurrentTxMessage; QcMessage emit = TxMessages[CurrentTxMessage].EmitTxMessage(OperationMode); if (emit.Type != QcPacketType.NoMessage) { foreach (Delegate action in MotorCommandProgress.GetInvocationList()) { ((MotorCommandProgressHandler)action).BeginInvoke(CurrentTxMessage, TxMessages.Count, RunMode.Emitting, null, null); ((MotorCommandProgressHandler)action).BeginInvoke(CurrentTxMessage, TxMessages.Count, RunMode.Running, null, null); } } return(emit); } return(new QcMessage() { Type = QcPacketType.NoMessage }); }
private void RunCommands(string RxMessage) { lock (Motors) { CommunicationTimer.Enabled = false; List <QcMessage> Emit = new List <QcMessage>(); if (RxMessage != null) { QcMessage datagram = Datagram.ParseResponse(RxMessage); QcMessage emit = IncrementState(datagram.MotorAddress, datagram); if (emit.Type != QcPacketType.NoMessage) { Emit.Add(emit); } } else { foreach (KeyValuePair <int, MotorControl> motor in Motors) { QcMessage emit = IncrementState(motor.Key, new QcMessage() { Type = QcPacketType.NoMessage }); if (emit.Type != QcPacketType.NoMessage) { Emit.Add(emit); } } } if (Emit.Count > 0) { WriteLine(Datagram.TranslateCommand(Emit)); } CommunicationTimer.Enabled = true; } }
public static QcMessage ParseResponse(string Response) { QcMessage r = new QcMessage() { Data = new List <int>(), Psw = new List <QcPsw>() }; string[] components = Response.Split(new char[] { ' ' }); switch (components[0][0]) { case '*': r.Type = QcPacketType.Ack; r.MotorAddress = Convert.ToInt32(components[1], 16); break; case '#': r.Type = QcPacketType.Data; r.MotorAddress = Convert.ToInt32(components[1], 16); if (components.Length > 3) { r.Command = (QcCommand)Convert.ToInt32(components[2], 16); for (int i = 3; i < components.Length; i++) { r.Data.Add(Convert.ToInt32(components[i], 16)); } if (r.Command == 0) { r.Psw = ParsePSW(r.Data[0]); } } else { r.Type = QcPacketType.BadFormat; } break; case '!': r.Type = QcPacketType.Nak; r.MotorAddress = Convert.ToInt32(components[1], 16); if (components.Length == 4) { r.Command = (QcCommand)Convert.ToInt32(components[2], 16); for (int i = 3; i < components.Length; i++) { r.Data.Add(Convert.ToInt32(components[i], 16)); } r.Nak = ParseNak(r.Data[0]); } else { r.Type = QcPacketType.BadFormat; } break; case '@': r.Type = QcPacketType.Command; r.MotorAddress = Convert.ToInt32(components[1], 10); if (components.Length == 4) { r.Command = (QcCommand)Convert.ToInt32(components[2], 10); for (int i = 3; i < components.Length; i++) { r.Data.Add(Convert.ToInt32(components[i], 10)); } } else { r.Type = QcPacketType.BadFormat; } break; default: r.Type = QcPacketType.Unknown; break; } return(r); }
public static string TranslateCommand(QcMessage Message) { List <string> l = Message.Data == null?new List <string>():new List <string>(Message.Data.Select(i => i.ToString()).ToArray()); return(TranslateCommand(Message.MotorAddress, Message.Command, l)); }