Files
DP44/DataPRO/ICommand/CommandPacketBase.cs
2026-04-17 14:55:32 -04:00

322 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using DTS.Common.DASResource;
using DTS.Common.Enums.DASFactory;
namespace DTS.DASLib.Command
{
/// <summary>
/// this is an abstraction of the common functions and behaviors of the CommandPackets
/// 6/14/2010 - dtm
/// </summary>
public abstract class CommandPacketBase
{
/// <summary>
/// the state of command packet
/// </summary>
public enum PacketState
{
#pragma warning disable 1591
OK,
TooShort,
Unknown
#pragma warning restore 1591
};
/// <summary>
/// corresponding strings for CommandStatus enum
/// </summary>
public static String[] StatusLabels =
{
#pragma warning disable 1591
// 0x00
Strings.CmdStatusNoErr,
// 0x01
Strings.CmdStatusInvalidParam,
// 0x02
Strings.CmdStatusInvalidParamLen,
// 0x03
Strings.CmdStatusInvalidCmdType,
// 0x04
Strings.CmdStatusInvalidCmd,
// 0x05
Strings.CmdStatusInvalidCRC,
// 0x06
Strings.CmdStatusInvalidCmdMode,
// 0x07
Strings.CmdStatusUnimplemented,
// 0x08
Strings.CmdStatusInvalidRecCRC,
// 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
Strings.CmdStatusInvalidDevID,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x10
Strings.CmdStatusFlashErase,
// 0x11
Strings.CmdStatusFlashWrite,
// 0x12
Strings.CmdStatusFlashBlockCRC,
// 0x13
Strings.CmdStatusFlashImageCRC,
// 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x20
Strings.CmdStatusInvalidAttrib,
// 0x21
Strings.CmdStatusAttribSet,
// 0x22
Strings.CmdStatusAttribBackup,
// 0x23
Strings.CmdStatusAttribBuffer,
// 0x24 - 0x2F
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x30 - 0x3F
Strings.CmdStatusSampleRate,
Strings.CmdStatusEventLen,
Strings.CmdStatusArmMode,
Strings.CmdStatusUnimplArmMode,
Strings.CmdStatusEventTooLarge,
Strings.CmdStatusMemFull,
Strings.CmdStatusInvalidSliceCount,
Strings.CmdStatusShortedStart,
Strings.CmdStatusShortedTrigger,
Strings.CmdStatusInvalidPreTrig,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x40 - 0x4F
Strings.CmdStatusStartSDWrite,
Strings.CmdStatusFlushSDBlock,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x50 - 0x5F
Strings.CmdStatusSwitchReq,
Strings.CmdStatusSwitchSetting,
Strings.CmdStatusSwitchChannel,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x60 - 0x6F
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x70 - 0x7F
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x80 - 0x8F
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0x90 - 0x9F
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0xA0 - 0xAF
Strings.CmdStatusSlicebusInvalidHeaderCRC,
Strings.CmdStatusSlicebusInvalidDataCRC,
Strings.CmdStatusSlicebusNullDescriptor,
Strings.CmdStatusSlicebusNotImplemented,
Strings.CmdStatusSlicebusNoResponse,
Strings.CmdStatusSlicebusNullCommandBuffer,
Strings.CmdStatusSlicebusCommandBufferTooShort,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0xB0 - 0xBF
Strings.CmdStatusSetupRequestedSensorRangeTooSmall,
Strings.CmdStatusSetupInvalidStackChannel,
Strings.CmdStatusSetupInvalidChannelRequested,
Strings.CmdStatusSetupInconsistentChannelCountFound,
Strings.CmdStatusSetupNoShuntTargetsSet,
Strings.CmdStatusSetupNoBridgeResistancesSet,
Strings.CmdStatusSetupChannelDoesNotSupportShunt,
Strings.CmdStatusSetupShuntDACOutputExceeded,
Strings.CmdStatusSetupRequestedSensorRangeTooLarge,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0xC0 - 0xCF
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0xD0 - 0xDF
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0xE0 - 0xEF
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
// 0xF0 - 0xFF
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
Strings.CmdStatusUnknown, Strings.CmdStatusUnknown,
#pragma warning restore 1591
};
/// <summary>
/// the status of the packet
/// </summary>
public DFConstantsAndEnums.CommandStatus Status;
/// <summary>
/// the command, use SetCommand to assign
/// </summary>
private byte _Command;
/// <summary>
/// string description of the command, for logging
/// </summary>
private string _CommandDescription;
/// <summary>
/// assigns a command to the packet structure
/// </summary>
/// <param name="command">byte command information</param>
/// <param name="commandDescription">string describing command</param>
public void SetCommand(byte command, string commandDescription)
{
_Command = command;
_CommandDescription = commandDescription;
}
/// <summary>
/// returns command (byte) information
/// </summary>
/// <returns></returns>
public byte GetCommand() { return _Command; }
/// <summary>
/// returns a string description of command
/// </summary>
/// <returns></returns>
public string GetCommandDescription() { return _CommandDescription; }
/// <summary>
/// wether or not to log
/// </summary>
public bool ShouldLog;
public bool AlreadyRun { get; set; }
public byte[] OriginalBytes;
/// <summary>
/// the command put into byte array form, for executing to hardware
/// </summary>
/// <returns></returns>
public abstract byte[] ToBytes();
/// <summary>
/// this is an enum CommandType, inheritting classes implement CommandType themselves, so
/// the we don't know the possible values of the enum in the base class,
/// however we do know we'll need to store and use the enum value
/// </summary>
public object Type;
/// <summary>
/// produce a string representing the command
/// </summary>
/// <returns>formatted string</returns>
public override string ToString()
{
return GetCommand().ToString();
//return this.Command.ToString();
}
public UInt16 SequenceNumber;
/// <summary>
/// each CommandPacket can have it's own enum of commandtypes
/// so, we just let the inheritting classes define them on their own
/// and just request a method of getting the resulting object post
/// conversion back
/// </summary>
/// <param name="b">byte to be converted</param>
/// <returns>CommandType, an enum contained in inheritting classes</returns>
public abstract object ConvertByteToCommandType(byte b);
/// <summary>
/// verify if the packet is valid or not
/// </summary>
/// <param name="Bytes"></param>
/// <returns></returns>
public abstract PacketState VerifyPacket(byte[] Bytes);
/// <summary>
/// get the next sequence number.
/// note sliceDB, slice, and ribeye all have different counters for
/// packets, so they could all have a sequence #1 independently
/// </summary>
public abstract void GetNextSequenceNumber();
/// <summary>
/// triggers the packet's logic to compute a checksum or CRC
/// different packets may use different methods (slice-crc, ribeye-checksum)
/// </summary>
public abstract void ComputeCRCs();
/// <summary>
/// formats a header for the log entry for the response packet
/// incoming (response) packets may have less information, so the
/// associated outgoing packet is also passed in
/// </summary>
/// <param name="commandPacket">outgoing command packet</param>
/// <param name="lines">two dimensional array of string log data</param>
public void GetPacketLogHeader(CommandPacketBase commandPacket, ref List<List<string>> lines, DateTime executeTime)
{
lines.Add(new List<string>());
string type = null != Type ? Type.ToString() : "";
ushort sequence = SequenceNumber;
if (0 == sequence && null != commandPacket) { sequence = commandPacket.SequenceNumber; }
var sSequence = $"[{sequence.ToString("00000000")}]\\[{SequenceNumber.ToString("00000000")}]";
lines[0].Add(string.Format("{0} - {1} {2} - ({3}ms)", type, commandPacket.GetCommandDescription(), sSequence, DateTime.Now.Subtract(executeTime).TotalMilliseconds));
if (Status != DFConstantsAndEnums.CommandStatus.StatusNoError)
{
lines.Add(new List<string>() { Status.ToString() });
}
}
/// <summary>
/// returns a header for the log entry for a command packet
/// </summary>
/// <param name="lines">two dimensional array of string log data</param>
public void GetPacketLogHeader(ref List<List<string>> lines)
{
lines.Add(new List<string>());
lines[0].Add(string.Format("{0} - {1} [{2:00000000}]", Type.ToString(), GetCommandDescription(), SequenceNumber));
if (Status != DFConstantsAndEnums.CommandStatus.StatusNoError)
{
lines.Add(new List<string>() { Status.ToString() });
}
}
}
}