using Edge.Core.Parser.BinaryParser.Attributes; using Edge.Core.Parser.BinaryParser.MessageEntity; using System; namespace PetroChinaOnlineWatchPlugin.MessageEntity { public enum MessageCode { IFSF_MESSAGE_CODE_APPLICATION = 0, IFSF_MESSAGE_CODE_HEARTBEAT = 1, IFSF_MESSAGE_CODE_COMMUNICATION = 2 } public enum MessageType { IFSF_MESSAGE_TYPE_READ = 0x00, IFSF_MESSAGE_TYPE_ANSWER = 0x20, IFSF_MESSAGE_TYPE_WRITE = 0x40, /// /// message type is an event, and need Ack. /// IFSF_MESSAGE_TYPE_UNSOLICITED_ACK = 0x60, IFSF_MESSAGE_TYPE_UNSOLICITED_WITHOUT_ACK = 0x80, IFSF_MESSAGE_TYPE_ACK = 0xE0 } public abstract class MessageBase : MessageTemplateBase { [Format(1, EncodingType.BIN, -9990)] [Range(0, 255, "Recipient subnet must range in 1 to 255")] public byte RecipientSubnet { get; set; } [Format(1, EncodingType.BIN, -9980)] [Range(0, 127, "Recipient node must range in 1 to 127, but now is {0}")] public byte RecipientNode { get; set; } [Format(1, EncodingType.BIN, -9970)] [Range(0, 255, "Originator subnet must range in 1 to 255")] public byte OriginatorSubnet { get; set; } [Format(1, EncodingType.BIN, -9960)] [Range(0, 127, "Originator node must range in 1 to 127, but now is {0}")] public byte OriginatorNode { get; set; } [Format(1, EncodingType.BIN, -9950)] public MessageCode MessageCode { get; set; } /// /// 000xxxxx (bit map) /// 000 indicates the message type is READ /// xxxxx is the token created by the originator of the message /// 010xxxxx /// 010 indicates message type is WRITE /// xxxxx is the token /// 111xxxxx /// 111 indicates type ACKNOWLEDGE /// xxxxx is the token /// [Format(1, EncodingType.BIN, -9940)] public byte RawMessageStatusAndToken { get; protected set; } public MessageType MessageType { get { return (MessageType)(this.RawMessageStatusAndToken & 0xE0); } set { //1F = 0001 1111 this.RawMessageStatusAndToken = (byte)((this.RawMessageStatusAndToken & 0x1F) + ((byte)value)); } } public byte MessageToken { get { return (byte)(this.RawMessageStatusAndToken & 0x1F); } set { if (value > 0x1F) throw new ArgumentOutOfRangeException("Message Token max value is 0x1F"); //E0 = 1110 0000 this.RawMessageStatusAndToken = (byte)((this.RawMessageStatusAndToken & 0xE0) + value); } } public abstract override string ToString(); } }