//---------------------------------------------------------------------------------------// protected bool AddPacket(byte[] buffer, int startIndex) { LCDPacket packet = CreatePacket(buffer, startIndex); ushort calculatedCRC = CRCGenerator.GenerateCRC(buffer, startIndex, packet.DataLength + 2, CRCGenerator.CRC_SEED); Trace.WriteLine("AddPacket(): " + packet.PacketType.ToString()); switch (packet.PacketType) { case LCDPacket.LCDPacketType.NORMAL_RESPONSE: AddResponsePacket(packet); break; case LCDPacket.LCDPacketType.NORMAL_REPORT: AddReportPacket(packet); break; case LCDPacket.LCDPacketType.ERROR_RESPONSE: AddResponsePacket(packet); break; } if (calculatedCRC != packet.CRC) { Trace.WriteLine("CRC ERROR!:" + " Calculated CRC = 0x" + Convert.ToString(calculatedCRC, 16) + " Packet CRC = 0x" + Convert.ToString(packet.CRC, 16) ); return(false); } return(true); }
//-------------------------------------------------------------------------------------------------// private LCDPacket Send(byte packetType, byte[] data, int dataLength) { ushort crc; if ((data == null && dataLength != 0) || (data != null && dataLength > data.Length)) { throw new ArgumentException("bad data sent to Send"); } // // Create packet buffer and enter header information // byte[] packetBuffer = new byte[dataLength + 4]; packetBuffer[0] = packetType; packetBuffer[1] = (byte)dataLength; // // Enter data if there is any // if (dataLength != 0) { Array.Copy(data, 0, packetBuffer, 2, dataLength); } // // Calculate and enter the checksum into the last two bytes of the packet // crc = CRCGenerator.GenerateCRC(packetBuffer, dataLength + 2, CRCGenerator.CRC_SEED); packetBuffer[2 + dataLength + 1] = (byte)(crc >> 8); packetBuffer[2 + dataLength] = (byte)crc; // // Send the request and return the response // lock (responseSignal) { responsePacket = null; // Write the packet to the serial LCD this.SendData(packetBuffer, packetBuffer.Length); // Wait for the response packet if (Monitor.Wait(responseSignal, MAX_RESPONSE_TIME)) { return(responsePacket); } } return(null); }