Esempio n. 1
0
        //---------------------------------------------------------------------------------------//

        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);
        }
Esempio n. 2
0
        //-------------------------------------------------------------------------------------------------//

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