Пример #1
0
 private void LogMessage(ArduinoMessage msg)
 {
     if (MessageLogged != null)
     {
         MessageLogged(msg);
     }
 }
Пример #2
0
        public Task <ArduinoMessage> SendMessageAsync(ArduinoMessage msg)
        {
            LogMessage(msg);

            if (!_port.IsOpen)
            {
                return(new Task <ArduinoMessage>(() => new ArduinoMessage()));
            }

            var bytes = msg.ToBytes();

            _port.Write(bytes, 0, bytes.Length);

            var excpectedResponseCmd = Matcher.RequestResponse[msg.Command];

            var tcs = new TaskCompletionSource <ArduinoMessage>();
            var res = new AwaitingMessage
            {
                ExceptedResponseCommand = excpectedResponseCmd,
                Action = (m) =>
                {
                    tcs.TrySetResult(m);
                }
            };

            _messageQueue.Enqueue(res);

            return(tcs.Task);
        }
        public LogEntry(ArduinoMessage msg)
        {
            Date = DateTime.Now;
            Text = $"{msg.Receiver} {msg.Command} {msg.Format} ";

            switch (msg.Format)
            {
            case DataFormat.EMPTY:
                break;

            case DataFormat.VAL:
                Text += DataPackage.GetValue(msg);
                break;

            case DataFormat.PARAM:
                Text += (Parameter)msg.Data[0];
                break;

            case DataFormat.PARAM_VAL:
                var kv = DataPackage.GetKeyValuePackage(msg);
                Text += kv.Parameter + " " + kv.Value;
                break;

            default:
                break;
            }
        }
        public static double GetValue(ArduinoMessage msg)
        {
            var data = msg.Data;

            if (data == null || data.Length != 1)
            {
                throw new ArgumentException("Input array must have exactly one value!");
            }
            return(ShortToFloat(data[0]));
        }
Пример #5
0
 private void ProcessReceivedMessage(ArduinoMessage message)
 {
     LogMessage(message);
     if (_messageQueue.Count > 0 && message.Command == _messageQueue.Peek().ExceptedResponseCommand || message.Command == Command.NACK)
     {
         var msg = _messageQueue.Dequeue();
         msg.Action(message);
     }
     else if (MessageReceived != null)
     {
         MessageReceived(message);
     }
 }
Пример #6
0
        private async void ReceiveData()
        {
            while (!_performClose)
            {
                try
                {
                    var incomingValue = _port.ReadByte();
                    Console.WriteLine("Channel > Incoming: " + incomingValue);
                    if (incomingValue == Constants.MESSAGE_START_BYTE)
                    {
                        //start byte received. construct message
                        var length = _port.ReadByte();
                        await Task.Delay(10);

                        var messageBytes = new byte[length];
                        messageBytes[0] = (byte)incomingValue;
                        messageBytes[1] = (byte)length;
                        await Task.Delay(10);

                        _port.Read(messageBytes, 2, messageBytes.Length - 2);
                        var message = new ArduinoMessage();
                        message.FromBytes(messageBytes);

                        //continue if the message is invalid
                        if (!message.IsValid)
                        {
                            Console.WriteLine("Channel > Received INVALID Message!");
                            continue;
                        }

                        //process the message, either send received handler or continue awaited message
                        ProcessReceivedMessage(message);
                    }
                }
                catch (InvalidOperationException)
                {
                    Debug.WriteLine("Channel > Connection closed. Arduino USB cable removed?");
                    break;
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("Channel > Exception while receiving data!");
                }

                await Task.Delay(10);
            }

            //reset close flag
            _performClose = false;
        }
        public static KeyValuePackage GetKeyValuePackage(ArduinoMessage msg)
        {
            var data = msg.Data;

            if (data == null || data.Length != 2)
            {
                throw new ArgumentException("Input array must have exactly two values!");
            }
            var para  = (Parameter)data[0];
            var value = ShortToFloat(data[1]);

            return(new KeyValuePackage {
                Parameter = para, Value = value
            });
        }