/// <summary> /// Sends a command, verifies the ack. /// </summary> /// <param name="cmd1"></param> /// <param name="cmd2"></param> public PowerLineModemMessage.MessageResponse SendCommand(PowerLineModemMessage message) { // Only one message sending at a time. log.Debug("Start <<"); try { lock (this) { // Lock access around the port when sending/receiving. lock (port) { // Clear input first. port_DataReceived(this, null); byte[] preamble = new byte[2]; preamble[0] = START_OF_MESSAGE; preamble[1] = (byte)message.MessageType; byte[] payload = message.PayloadByteArray(); sending = message; port.Write(preamble, 0, preamble.Length); port.Write(payload, 0, payload.Length); log.DebugFormat(" Output [{0}-{1}]", BitConverter.ToString(preamble), BitConverter.ToString(payload)); } return(WaitForResponse(message)); } } finally { log.Debug(">> End"); } }
private PowerLineModemMessage.MessageResponse WaitForResponse(PowerLineModemMessage message) { // See if we have some data. if (receivedAck.WaitOne(2000)) { return(sendingResponse); } else { return(PowerLineModemMessage.MessageResponse.Unknown); } }
/// <summary> /// Disposes the port. /// </summary> public void Dispose() { this.port.Dispose(); this.message = PowerLineModemMessage.Message.UserResetDetected; this.port = null; this.readData = 0; this.receivedAck.Dispose(); this.receivedAck = null; this.sending = null; this.sendingResponse = PowerLineModemMessage.MessageResponse.Unknown; this.state = ReadState.START; this.data = null; this.depth = 0; }
private void ReadMessages(byte[] input, int size) { List <PowerLineModemMessage> receivedMessages = new List <PowerLineModemMessage>(); lock (port) { string strDebug = "Input: ["; // First we look for a 0x2, which they all start with. for (int i = 0; i < size; i++) { int data = input[i]; strDebug += String.Format("{0:x2}-", data, readData, (this.data == null ? 0 :this.data.Length), state.ToString()); switch (state) { case ReadState.START: if (data == START_OF_MESSAGE) { state = ReadState.MESSAGE_TYPE; } break; case ReadState.MESSAGE_TYPE: // This next one is the message type. message = (PowerLineModemMessage.Message)data; state = ReadState.MESSAGE_DATA; this.data = new byte[MessageFactory.SizeOfMessage(message, sending)]; readData = 0; break; case ReadState.MESSAGE_DATA: if (readData < this.data.Length) { this.data[readData++] = (byte)data; } if (readData >= this.data.Length) { // If this is a response, update the request with the response data. if (sending != null && message == sending.MessageType) { sendingResponse = sending.VerifyResponse(this.data); sending = null; receivedAck.Set(); } else { // Create the received message. PowerLineModemMessage packet = MessageFactory.GetReceivedMessage(message, this.data); if (packet != null) { receivedMessages.Add(packet); } } state = ReadState.START; } break; } } log.Debug(strDebug + "]"); } if (ReceivedMessage != null) { // Switch context so we don't end up deadlocked. ThreadPool.QueueUserWorkItem(delegate { foreach (PowerLineModemMessage mess in receivedMessages) { ReceivedMessage(this, new RecievedMessageEventArgs(mess)); } }); } }
public RecievedMessageEventArgs(PowerLineModemMessage message) { this.message = message; }