private void LogMessage(ArduinoMessage msg) { if (MessageLogged != null) { MessageLogged(msg); } }
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])); }
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); } }
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 }); }