public EventMessage(byte[] msgPacket) { short msgCRC; short expectedCRC; if (msgPacket == null) { throw new ArgumentNullException("msgPacket"); } byte head = msgPacket[VSCP_POS_HEAD]; _ignoreCRC = ((head & VSCP_NO_CRC_CALC) == VSCP_NO_CRC_CALC); _ignoreCRC = true; int incomming_packet_length = msgPacket.Length; short dataSize = EventHelper.GetDataSize(msgPacket); int msgLength = msgPacket.Length + VSCP_HEADER_SIZE; msgLength += (_ignoreCRC) ? 0 : VSCP_SIZE_CRC; if (msgLength > VSCP_MAX_DATA_SIZE) { throw new ApplicationException(string.Format("Invalid event message length: {0}", msgLength)); } _priority = (EVENT_PRIORITY)(head >> 5); if (_ignoreCRC == false) { msgCRC = EventHelper.GetCRC(msgPacket); expectedCRC = EventHelper.CalcCRC(msgPacket, msgLength - VSCP_SIZE_CRC); if (msgCRC != expectedCRC) { throw new ApplicationException(string.Format("Invalid event message CRC '{0}' instead of {1}", msgCRC, expectedCRC)); } } _event = EventHelper.GetEventCode(msgPacket); _address = new byte [EventMessage.VSCP_SIZE_ADDRESS]; Buffer.BlockCopy(msgPacket, VSCP_POS_ADDRESS, _address, 0, VSCP_SIZE_ADDRESS); _data = new Byte [dataSize]; Buffer.BlockCopy(msgPacket, VSCP_POS_DATA, _data, 0, dataSize); }
public Byte[] GetBytes() { short crc; Byte[] packet; packet = new Byte[this.Length]; // Head packet[VSCP_POS_HEAD] = this.HeadByte; // Event Class and Type Buffer.BlockCopy( BitConverter.GetBytes(IPAddress.HostToNetworkOrder(this.EventClass)), 0, packet, EventMessage.VSCP_POS_CLASS, EventMessage.VSCP_SIZE_CLASS); Buffer.BlockCopy( BitConverter.GetBytes(IPAddress.HostToNetworkOrder(this.EventType)), 0, packet, EventMessage.VSCP_POS_TYPE, EventMessage.VSCP_SIZE_TYPE); // Address Buffer.BlockCopy(this.AddressBytes, 0, packet, VSCP_POS_ADDRESS, VSCP_SIZE_ADDRESS); // Data Size Buffer.BlockCopy(this.DataSizeBytes, 0, packet, VSCP_POS_DATA_SIZE, VSCP_SIZE_DATA_SIZE); // Data - limited to 512-25=487 bytes Buffer.BlockCopy(this.DataBytes, 0, packet, VSCP_POS_DATA, this.DataSize); if (!_ignoreCRC) { crc = EventHelper.CalcCRC(packet, packet.Length - VSCP_SIZE_CRC); Buffer.BlockCopy( BitConverter.GetBytes(IPAddress.HostToNetworkOrder(crc)), 0, packet, packet.Length - VSCP_SIZE_CRC, VSCP_SIZE_CRC); } return(packet); }