/// <summary> Read from the serial line if a useful chunk is present. /// </summary> /// <remarks> /// In this case a "useful chunk" means that either the payload size /// and endpoint of a new message or the complete payload of a message /// are present. /// </remarks> /// <returns> /// True if there was enough data to read, otherwise false. /// </returns> bool readAndProcess() { byte[] endpoint = new byte[2]; byte[] payloadSize = new byte[2]; switch (waitingState) { case waitingStates.NewMessage: if (serialPort.BytesToRead >= 4) { // Read new payload size and endpoint serialPort.Read(payloadSize, 0, 2); serialPort.Read(endpoint, 0, 2); if (BitConverter.IsLittleEndian) { // Data is transmitted big-endian, so flip. Array.Reverse(payloadSize); Array.Reverse(endpoint); } currentPayloadSize = BitConverter.ToUInt16(payloadSize, 0); currentEndpoint = BitConverter.ToUInt16(endpoint, 0); #if DEBUG Console.WriteLine("Message metadata received:"); Console.WriteLine("\tPLS: " + currentPayloadSize.ToString()); Console.WriteLine("\tEP: " + currentEndpoint.ToString()); #endif waitingState = waitingStates.Payload; return(true); } break; case waitingStates.Payload: if (serialPort.BytesToRead >= currentPayloadSize) { // All of the payload's been received, so read it. byte[] buffer = new byte[currentPayloadSize]; serialPort.Read(buffer, 0, currentPayloadSize); RaiseRawMessageReceived(currentEndpoint, buffer); // Reset state waitingState = waitingStates.NewMessage; currentEndpoint = 0; currentPayloadSize = 0; return(true); } break; } // If this hasn't returned yet there wasn't anything interesting to // read. return(false); }
/// <summary> Read from the serial line if a useful chunk is present. /// </summary> /// <remarks> /// In this case a "useful chunk" means that either the payload size /// and endpoint of a new message or the complete payload of a message /// are present. /// </remarks> /// <returns> /// True if there was enough data to read, otherwise false. /// </returns> bool readAndProcess() { byte[] endpoint = new byte[2]; byte[] payloadSize = new byte[2]; switch (waitingState) { case waitingStates.NewMessage: if (serialPort.BytesToRead >= 4) { // Read new payload size and endpoint serialPort.Read(payloadSize, 0, 2); serialPort.Read(endpoint, 0, 2); if (BitConverter.IsLittleEndian) { // Data is transmitted big-endian, so flip. Array.Reverse(payloadSize); Array.Reverse(endpoint); } currentPayloadSize = BitConverter.ToUInt16(payloadSize, 0); currentEndpoint = BitConverter.ToUInt16(endpoint, 0); #if DEBUG Console.WriteLine("Message metadata received:"); Console.WriteLine("\tPLS: " + currentPayloadSize.ToString()); Console.WriteLine("\tEP: " + currentEndpoint.ToString()); #endif waitingState = waitingStates.Payload; return true; } break; case waitingStates.Payload: if (serialPort.BytesToRead >= currentPayloadSize) { // All of the payload's been received, so read it. byte[] buffer = new byte[currentPayloadSize]; serialPort.Read(buffer, 0, currentPayloadSize); RaiseRawMessageReceived(currentEndpoint, buffer); // Reset state waitingState = waitingStates.NewMessage; currentEndpoint = 0; currentPayloadSize = 0; return true; } break; } // If this hasn't returned yet there wasn't anything interesting to // read. return false; }