using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HengShan_Pump_TQC_IFSF.MessageEntity { /// /// overall ack for a message. /// public enum MessageAcknowledgeStatus { ACK_PositiveAcknowledgeDataReceived = 0x00, NAK_RecipientNodeNotReachable = 0x01, NAK_ApplicationOutOfOrderOrNonExistentOnTheRecipientNode = 0x02, NAK_InconsistentMessage_BlockMissing = 0x03, NAK_MessageRefused_SomeOfTheDataIsNotAcceptable_DetailedInformationFollows = 0x05, NAK_MessageRrefused_UnknownDatabaseAddress_OrIllegalWriteToMultipleDatabaseAddress = 0x06, NAK_MessageRefusedReceivingDeviceIsBusy = 0x07, NAK_MessageRefusedMessageUnexpected = 0x08, NAK_DeviceAlreadyLocked = 0x09 } /// /// specific ack for a dataId within a msg. /// public enum MessageDataAcknowledgeStatus { ACK_PositiveAcknowledgeDataReceived = 0x00, NAK_InvalidValue = 0x01, NAK_NotWritable = 0x02, NAK_CommandRefusedInThatState = 0x03, NAK_DataDoesNotExistInThisDevice = 0x04, NAK_CommandNotUnderstood = 0x05, NAK_CommandNotAccepted = 0x06, } public class AcknowledgeMessage : IfsfMessage { public AcknowledgeMessage() { } public AcknowledgeMessage(byte recipientSubnet, byte recipientNode, byte originatorSubnet, byte originatorNode, byte ackForWhichMessageToken, byte[] databaseId, MessageAcknowledgeStatus acknowledgeOverallStatus) { base.RecipientSubnet = recipientSubnet; base.RecipientNode = recipientNode; base.OriginatorSubnet = originatorSubnet; base.OriginatorNode = originatorNode; base.MessageCode = MessageCode.IFSF_MESSAGE_CODE_APPLICATION; base.MessageType = MessageType.IFSF_MESSAGE_TYPE_ACK; base.MessageToken = ackForWhichMessageToken; base.DatabaseId = databaseId; this.OverallStatus = acknowledgeOverallStatus; } //public byte[] DatabaseId => base.RawDatabaseData.Skip(base.RawDatabaseData[0]).Take(base.RawDatabaseData[0]).ToArray(); public MessageAcknowledgeStatus OverallStatus { get { var r = Enum.ToObject(typeof(MessageAcknowledgeStatus), base.RawDatabaseData.Skip(base.RawDatabaseData[0] + 1).First()); return (MessageAcknowledgeStatus)r; } set { base.RawDatabaseData.Add((byte)value); } } public IEnumerable> DataIdAcks { get { var dataIdsPart = base.RawDatabaseData.Skip(base.RawDatabaseData[0] + 2); var results = new List>(); int passedPair = 0; while (true) { if (!dataIdsPart.Skip(passedPair * 2).Any()) break; byte[] nextPair = dataIdsPart.Skip(passedPair * 2).Take(2).ToArray(); var r = Enum.ToObject(typeof(MessageDataAcknowledgeStatus), nextPair[1]); results.Add( new Tuple(nextPair[0], (MessageDataAcknowledgeStatus)r)); passedPair++; } return results; } } public override string ToLogString() { return base.ToLogString() + ", OverallStatus: " + this.OverallStatus + ", detail: " + (this.DataIdAcks.Any() ? this.DataIdAcks.Select(d => d.Item1.ToString("X").PadLeft(2, '0') + "-" + d.Item2).Aggregate((acc, n) => acc + "; " + n) : ""); } } }