322 lines
16 KiB
C#
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() });
|
|
}
|
|
}
|
|
}
|
|
}
|