/// <summary>
        /// Reads CAN packages send in WebXi message from the socket data stream.
        /// </summary>
        /// <param name="dataLength">Number of bytes to read and parse.</param>
        /// <param name="messageType">Type of message to parse. 1 means SignalData, and is the only one supported. Other types are ignored.</param>
        public static void ReadCanMessage(int dataLength, UInt16 messageType)
        {
            // Initialize a temporary buffer
            byte[] inputBuffer   = new byte[dataLength];
            int    bytesReceived = 0;

            // Read the full message contents into the temporary buffer
            while (bytesReceived < dataLength)
            {
                bytesReceived += sock.Receive(inputBuffer, bytesReceived, dataLength - bytesReceived, SocketFlags.None);
            }

            // Simple examples - we only care about signal data.

            // Populate a header struct
            AuxSequenceDataHeader auxSequenceHeader;

            auxSequenceHeader.numberOfSequence = BitConverter.ToUInt16(inputBuffer, 0);
            auxSequenceHeader.sequenceId       = BitConverter.ToUInt16(inputBuffer, 4);
            auxSequenceHeader.numberOfValues   = BitConverter.ToUInt16(inputBuffer, 6);

            // Total number of packaged received so far
            totalReceivedCanPackages += auxSequenceHeader.numberOfValues;

            AuxSequenceData auxSequenceData = new AuxSequenceData();

            auxSequenceData.canData = new byte[8];

            int canChanIndex = auxSequenceHeader.sequenceId - 101;

//            if (canChannel>2) canChannel = 0;
            dataError = false;


            int offset = 8;

            for (int i = 0; i < auxSequenceHeader.numberOfValues; i++)
            {
                auxSequenceData.relativeOffsetTime = BitConverter.ToUInt32(inputBuffer, offset);
                auxSequenceData.status             = (Byte)BitConverter.ToChar(inputBuffer, offset + 4);
                auxSequenceData.canMessageInfo     = (Byte)BitConverter.ToChar(inputBuffer, offset + 5);
                auxSequenceData.canDataSize        = (Byte)BitConverter.ToChar(inputBuffer, offset + 6);
                auxSequenceData.canMessageID       = BitConverter.ToUInt32(inputBuffer, offset + 8);
                Array.Copy(inputBuffer, (offset + 12), auxSequenceData.canData, 0, 8);
                idCounter++;
                //if (auxSequenceData.canMessageID == 0xcfe6c17)
                {
                    //Console.WriteLine("CAN Message:  ID=0x{0:x}  Data={1:x} counter={2} channel={3}", auxSequenceData.canMessageID, BitConverter.ToString(auxSequenceData.canData), idCounter, auxSequenceHeader.sequenceId);
                }

                // Console.WriteLine("Info: {0}", auxSequenceData.canMessageInfo);
                //Console.WriteLine("RelTime: {0}", auxSequenceData.relativeOffsetTime);

//                if (obd2Enabled)
//                {
//                    if (auxSequenceData.canData[2] == 0x0c) rpm = ((auxSequenceData.canData[3] << 8) + auxSequenceData.canData[4]) >> 2;
//                    if (auxSequenceData.canData[2] == 0x0d) speed = auxSequenceData.canData[3];
//                    Console.WriteLine("Speed: {0} km/h    RPM: {1}", speed, rpm);
//                }


                if (VerifyData)
                {
                    dataError = false;
                    for (byte n = 0; n < 8; n++)
                    {
                        if (auxSequenceData.canData[n] != dataToTest[n])
                        {
//                                Console.WriteLine("ERROR on: CAN-message={0} byte[{1}] expected={2} received={4})", idCounter, n, dataToTest[n], auxSequenceData.canData[n]);
                            dataError = true;
                        }
                    }

                    if (dataError)
                    {
                        canChanError[canChanIndex + 1]++;
                    }

                    Console.WriteLine("CAN message:{0}  Channel={1}  errors={2}  ID={3:x}  Data={4:x}\r", idCounter, enabledCanChannels[canChanIndex], canChanError[canChanIndex + 1], auxSequenceData.canMessageID, BitConverter.ToString(auxSequenceData.canData));
                }
                else
                {
                    Console.WriteLine("Message={0} Channel={1} SeqID={2} [CAN: ID={3:x}  Data={4:x}]\r", idCounter, enabledCanChannels[canChanIndex], auxSequenceHeader.sequenceId, auxSequenceData.canMessageID, BitConverter.ToString(auxSequenceData.canData));
                }

                offset += 20;
            }
            //Console.WriteLine("Speed: {0} km/h    RPM: {1}", speed, rpm);
        }
        private void _read()
        {
            _header = new Header(m_io, this, m_root);
            switch (header.MessageType)
            {
            case Header.EMessageType.EState: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new State(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.ESequenceData: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new SequenceData(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.EDebug: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new Debug(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.ESync: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new Sync(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.EAuxSequenceData: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new AuxSequenceData(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.EPackage: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new Package(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.EDataQuality: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new DataQuality(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.ENode: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new Node(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.EStatus: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new Status(io___raw_content, this, m_root);
                break;
            }

            case Header.EMessageType.ETrigger: {
                __raw_content = m_io.ReadBytes(header.ContentLength);
                var io___raw_content = new KaitaiStream(__raw_content);
                _content = new Trigger(io___raw_content, this, m_root);
                break;
            }

            default: {
                _content = m_io.ReadBytes(header.ContentLength);
                break;
            }
            }
        }