diff --git a/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs b/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs index b75f868ed..70d0d587f 100644 --- a/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs +++ b/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs @@ -144,7 +144,7 @@ namespace TBF.BenchControl.Danfoss.VLT2800 string response = responseBuilder.ToString(); responseBuilder.Clear(); - log.Info(Utils.LogMessage("Received ", response)); + log.Info(Telegram.LogTelegram("Received ", response)); } } @@ -157,7 +157,7 @@ namespace TBF.BenchControl.Danfoss.VLT2800 dataToSend = data; dataToSendReady = true; - log.Info(Utils.LogMessage("Sending ", data)); + log.Info(Telegram.LogTelegram("Sending ", data)); return true; } @@ -213,7 +213,7 @@ namespace TBF.BenchControl.Danfoss.VLT2800 msg[9] = (byte)(serialComReference & 0xFF); /// Serial Com Reference Lo msg[10] = (byte)(serialComReference >> 8); /// Serial Com Reference Hi - Utils.CalculateCRC(msg); + Telegram.UpdateTelegramCRC(msg); SendData(msg); } @@ -248,7 +248,7 @@ namespace TBF.BenchControl.Danfoss.VLT2800 msg[9] = (byte)(serialComReference & 0xFF); /// Serial Com Reference Lo msg[10] = (byte)(serialComReference >> 8); /// Serial Com Reference Hi - Utils.CalculateCRC(msg); + Telegram.UpdateTelegramCRC(msg); SendData(msg); } diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj index e94120519..0f30ad48b 100644 --- a/TestBenchFramework/TBF.csproj +++ b/TestBenchFramework/TBF.csproj @@ -856,6 +856,7 @@ ResultsTabPageCtrl.cs + Form diff --git a/TestBenchFramework/Telegram.cs b/TestBenchFramework/Telegram.cs new file mode 100644 index 000000000..f1ace70e6 --- /dev/null +++ b/TestBenchFramework/Telegram.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TBF +{ + public class Telegram + { + const UInt16 crcSeed = 0xFFFF; // Initial crc value + const UInt16 crcGP = 0xA001; // Generating polynomial + + /// + /// For standard CRC16 (remainder of division) + /// to start a new crc, set CRC16 = SEED + /// then for each byte call UpdateCRC(byte, &CRC16); + /// CRC16 will contain the result + /// (if you calculate all of the incoming data + /// INCLUDING the crc, the result should be 0x0000 + /// and if you are sending the crc be sure to + /// send the bytes in the correct order) + /// + static void UpdateCRC(byte b, ref UInt16 crc) + { + crc ^= (UInt16)b; + for (int i = 0; i < 8; i++) + { + bool carry = (crc & 0x0001) != 0; + crc >>= 1; + if (carry) crc ^= crcGP; + } + } + + /// + /// Calculates the CRC from a data telegram (an array of bytes). + /// A complete telegram including two bytes reserved for the CRC + /// must be supplied as an argument. + /// + /// Data telegram + /// Calculated CRC + public static UInt16 ClaculateTelegramCRC(byte[] data) + { + UInt16 crc = crcSeed; + for (int i = 0; i < data.Length - 2; i++) UpdateCRC(data[i], ref crc); + return crc; + } + + /// + /// This function modifies the last 2 bytes in the message buffer + /// by the CRC calculated from the remaining first (Lenght - 2) bytes. + /// A complete telegram including two bytes reserved for the CRC + /// must be supplied as an argument. + /// + /// Data telegram + public static void UpdateTelegramCRC(byte[] data) + { + int len = data.Length; + if (len < 2) return; + + UInt16 crc = ClaculateTelegramCRC(data); + + data[len - 2] = (byte)(crc & 0xFF); + data[len - 1] = (byte)(crc >> 8); + } + + /// + /// This function compares the last 2 bytes in the message buffer + /// with the CRC calculated from the remaining first (Lenght - 2) bytes. + /// A complete telegram including two bytes reserved for the CRC + /// must be supplied as an argument. + /// + /// Data telegram + /// true if the CRC in the telegram is correct + public static bool VerifyTelegramCRC(byte[] data) + { + int len = data.Length; + if (len < 2) return false; + + UInt16 crc = ClaculateTelegramCRC(data); + + return (data[len - 2] == (byte)(crc & 0xFF)) && (data[len - 1] == (byte)(crc >> 8)); + } + + + + /// + /// Calculates the checksum from a data telegram (an array of bytes). + /// A complete telegram including one bytes reserved for the checksum + /// must be supplied as an argument. + /// + /// Data telegram + /// Calculated CRC + public static byte ClaculateTelegramChecksum(byte[] data) + { + byte checksum = 0; + for (int i = 0; i < data.Length - 1; i++) checksum = (byte)(checksum ^ data[i]); + return checksum; + } + + /// + /// This function modifies the last byte in the message buffer + /// by the checksum calculated from the remaining first (Lenght - 1) bytes. + /// A complete telegram including one bytes reserved for the checksum + /// must be supplied as an argument. + /// + /// Data telegram + public static void UpdateTelegramChecksum(byte[] data) + { + int len = data.Length; + if (len < 1) return; + data[len - 1] = ClaculateTelegramChecksum(data); + } + + /// + /// This function compares the last byte in the message buffer + /// with the checksum calculated from the remaining first (Lenght - 1) bytes. + /// A complete telegram including two bytes reserved for the checksum + /// must be supplied as an argument. + /// + /// Data telegram + /// true if the CRC in the telegram is correct + public static bool VerifyTelegramChecksum(byte[] data) + { + int len = data.Length; + if (len < 1) return false; + return (data[len - 1] == ClaculateTelegramChecksum(data)); + } + + + + public static string LogTelegram(string intro, byte[] data) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(80); + + sb.Append(intro); + sb.Append(data.Length.ToString()); + sb.Append(" bytes:"); + foreach (var d in data) + { + sb.Append(" "); + sb.Append(((int)d).ToString("X2")); + } + + return sb.ToString(); + } + + + + public static string LogTelegram(string intro, string data) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(80); + + sb.Append(intro); + sb.Append(data.Length.ToString()); + sb.Append(" bytes:"); + foreach (var d in data) + { + sb.Append(" "); + sb.Append(((int)d).ToString("X2")); + } + + return sb.ToString(); + } + } +} diff --git a/TestBenchFramework/Utils.cs b/TestBenchFramework/Utils.cs index bddc061d3..3266ad506 100644 --- a/TestBenchFramework/Utils.cs +++ b/TestBenchFramework/Utils.cs @@ -250,80 +250,5 @@ namespace TBF } else return value.ToString(); } - - - public static string LogMessage(string intro, byte[] data) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(80); - - sb.Append(intro); - sb.Append(data.Length.ToString()); - sb.Append(" bytes:"); - foreach (var d in data) - { - sb.Append(" "); - sb.Append(((int)d).ToString("X2")); - } - - return sb.ToString(); - } - - public static string LogMessage(string intro, string data) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(80); - - sb.Append(intro); - sb.Append(data.Length.ToString()); - sb.Append(" bytes:"); - foreach (var d in data) - { - sb.Append(" "); - sb.Append(((int)d).ToString("X2")); - } - - return sb.ToString(); - } - - - const UInt16 crcSeed = 0xFFFF; // Initial crc value - const UInt16 crcGP = 0xA001; // Generating polynomial - - /// - /// For standard CRC16 (remainder of division) - /// to start a new crc, set CRC16 = SEED - /// then for each byte call UpdateCRC(byte, &CRC16); - /// CRC16 will contain the result - /// (if you calculate all of the incoming data - /// INCLUDING the crc, the result should be 0x0000 - /// and if you are sending the crc be sure to - /// send the bytes in the correct order) - /// - static void UpdateCRC(byte b, ref UInt16 crc) - { - crc ^= (UInt16)b; - for (int i = 0; i < 8; i++) - { - bool carry = (crc & 0x0001) != 0; - crc >>= 1; - if (carry) crc ^= crcGP; - } - } - - /// - /// This function modifies the last 2 bytes in the message buffer - /// by the crc calculated from the remainin first (Lenght - 2) bytes. - /// - /// - public static void CalculateCRC(byte[] data) - { - int len = data.Length; - - if (len < 2) return; - - UInt16 crc = crcSeed; - for (int i = 0; i < len - 2; i++) UpdateCRC(data[i], ref crc); - data[len - 2] = (byte)(crc & 0xFF); - data[len - 1] = (byte)(crc >> 8); - } } }