using System; using System.Collections.Generic; using System.Text; using DTS.Common.DASResource; using DTS.Common.Enums.DASFactory; namespace DTS.DASLib.Command { /// /// this is an abstraction of the common functions and behaviors of the CommandPackets /// 6/14/2010 - dtm /// public abstract class CommandPacketBase { /// /// the state of command packet /// public enum PacketState { #pragma warning disable 1591 OK, TooShort, Unknown #pragma warning restore 1591 }; /// /// corresponding strings for CommandStatus enum /// 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 }; /// /// the status of the packet /// public DFConstantsAndEnums.CommandStatus Status; /// /// the command, use SetCommand to assign /// private byte _Command; /// /// string description of the command, for logging /// private string _CommandDescription; /// /// assigns a command to the packet structure /// /// byte command information /// string describing command public void SetCommand(byte command, string commandDescription) { _Command = command; _CommandDescription = commandDescription; } /// /// returns command (byte) information /// /// public byte GetCommand() { return _Command; } /// /// returns a string description of command /// /// public string GetCommandDescription() { return _CommandDescription; } /// /// wether or not to log /// public bool ShouldLog; public bool AlreadyRun { get; set; } public byte[] OriginalBytes; /// /// the command put into byte array form, for executing to hardware /// /// public abstract byte[] ToBytes(); /// /// 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 /// public object Type; /// /// produce a string representing the command /// /// formatted string public override string ToString() { return GetCommand().ToString(); //return this.Command.ToString(); } public UInt16 SequenceNumber; /// /// 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 /// /// byte to be converted /// CommandType, an enum contained in inheritting classes public abstract object ConvertByteToCommandType(byte b); /// /// verify if the packet is valid or not /// /// /// public abstract PacketState VerifyPacket(byte[] Bytes); /// /// 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 /// public abstract void GetNextSequenceNumber(); /// /// triggers the packet's logic to compute a checksum or CRC /// different packets may use different methods (slice-crc, ribeye-checksum) /// public abstract void ComputeCRCs(); /// /// 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 /// /// outgoing command packet /// two dimensional array of string log data public void GetPacketLogHeader(CommandPacketBase commandPacket, ref List> lines, DateTime executeTime) { lines.Add(new List()); 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() { Status.ToString() }); } } /// /// returns a header for the log entry for a command packet /// /// two dimensional array of string log data public void GetPacketLogHeader(ref List> lines) { lines.Add(new List()); lines[0].Add(string.Format("{0} - {1} [{2:00000000}]", Type.ToString(), GetCommandDescription(), SequenceNumber)); if (Status != DFConstantsAndEnums.CommandStatus.StatusNoError) { lines.Add(new List() { Status.ToString() }); } } } }