//---------------------------------------------------------------------------------------// 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 void AddReportPacket(LCDPacket packet) { lock (reportSignal) { reportQueue.Enqueue(packet); Monitor.Pulse(reportSignal); } }
//---------------------------------------------------------------------------------------// private void AddResponsePacket(LCDPacket packet) { lock (responseSignal) { responsePacket = packet; Monitor.Pulse(responseSignal); } }
//-------------------------------------------------------------------------------------------------// private byte[] SendReturnData(byte type, byte[] data, int dataLength) { LCDPacket packet = Send(type, data, dataLength); if (packet != null) { return(packet.Data); } else { return(null); } }
//-------------------------------------------------------------------------------------------------// 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); }
//-------------------------------------------------------------------------------------------------// private bool SendReturnBool(byte type, byte[] data, int dataLength) { LCDPacket packet = Send(type, data, dataLength); if (packet != null) { return(type == (packet.Type & ~0xC0) && responsePacket.PacketType == LCDPacket.LCDPacketType.NORMAL_RESPONSE); } else { return(false); } }
//-------------------------------------------------------------------------------------------------// 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; }
//---------------------------------------------------------------------------------------// private void ReportHandler() { const string STRLOG_MethodName = "ReportHandler"; Logfile.WriteCalled(STRLOG_ClassName, STRLOG_MethodName); try { this.reportRunning = true; while (this.reportRunning == true) { lock (this.reportSignal) { if (Monitor.Wait(this.reportSignal, 1000) == false) { // Signal not received before timout continue; } Trace.WriteLine("ReportHandler: reportSignal received - reportQueue.Count=" + reportQueue.Count.ToString()); } // // Get packets from the queue and process // while (reportQueue.Count > 0) { LCDPacket packet = reportQueue.Dequeue(); switch (packet.Type) { case PKTRPT_CAPTURE_DATA: int value = packet.Data[1]; value = (value << 8) + packet.Data[0]; CaptureData = value; Trace.WriteLine("CaptureData=" + value.ToString()); break; case PKTRPT_KEY_ACTIVITY: if (packet.DataLength == 1) { switch (packet.Data[0]) { case 5: Key = LCDKey.Enter; break; case 6: Key = LCDKey.Exit; break; } } break; case PKTRPT_TEMP_SENSOR: break; } } } } catch (Exception ex) { Logfile.WriteError(ex.Message); } Trace.WriteLine(STRLOG_MethodName + ": Exiting"); Logfile.WriteCompleted(STRLOG_ClassName, STRLOG_MethodName); }