Example #1
0
        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);
        }
Example #2
0
 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();
     }
 }
Example #4
0
 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;
 }
Example #5
0
        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
     });
 }
Example #7
0
 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;
     }
 }
Example #8
0
        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);
        }
Example #9
0
        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));
        }