Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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;
 }