/// <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; } } }