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) : "");
}
}
}