Beispiel #1
0
        private TimeSpan GetFrequencyTimeSpan(MessageFrequency frequency)
        {
            switch (frequency)
            {
            case MessageFrequency.Minute:
                return(new TimeSpan(0, 1, 0));

            case MessageFrequency.Hour:
                return(new TimeSpan(1, 0, 0));

            case MessageFrequency.Day:
                return(new TimeSpan(1, 0, 0, 0));

            default:
                return(new TimeSpan());
            }
        }
Beispiel #2
0
/* Blank message snippet to copy from for new messages:
 *
 *  public X()
 *  {
 *      Id = MessageId.X;
 *      Flags = 0;
 *      Frequency = MessageFrequency.X;
 *  }
 *
 #region DeSerialise
 *  protected override void DeSerialise(byte[] buf, ref int o, int length)
 *  {
 *  }
 #endregion DeSerialise
 *
 *  public override string ToString()
 *  {
 *      return $"{base.ToString()}: Y={Y}, Z={Z}";
 *  }
 */

    /// <summary>
    /// Creates a message based on the data in the given buffer.
    /// </summary>
    /// <param name="buf"></param>
    /// <param name="o"></param>
    /// <returns></returns>
    public static Message DeSerializeMessage(byte[] buf, ref int o)
    {
        if (buf.Length - o < 6)
        {
            throw new Exception("Message.CreateMessage: Not enough room in buffer.");
        }

        #region Header
        PacketFlags packetFlags    = (PacketFlags)buf[o++];
        UInt32      sequenceNumber = (((UInt32)buf[o++]) << 24)
                                     + (((UInt32)buf[o++]) << 16)
                                     + (((UInt32)buf[o++]) << 8)
                                     + (((UInt32)buf[o++]) << 0);
        byte   extraHeaderLength = buf[o++];
        byte[] extraHeader       = new byte[extraHeaderLength];
        for (int i = 0; i < extraHeaderLength; i++)
        {
            extraHeader[i] = buf[o++];
        }
        #endregion Header

        #region AppendedAcks
        List <UInt32> acks      = new List <UInt32>();
        int           ackLength = 0;
        if ((packetFlags & PacketFlags.Ack) != 0)
        {
            byte nAcks = buf[buf.Length - 1];
            ackLength = nAcks * 4 + 1;
            int ackOffset = buf.Length - ackLength;
            for (int i = 0; i < nAcks; i++)
            {
                UInt32 ack = BinarySerializer.DeSerializeUInt32_Be(buf, ref ackOffset, buf.Length);
                acks.Add(ack);
            }
        }
        #endregion AppendedAcks

        #region MessageId
        MessageFrequency frequency = MessageFrequency.High;
        UInt32           id        = buf[o++];
        if (id == 0xff)
        {
            id        = (id << 8) + buf[o++];
            frequency = MessageFrequency.Medium;

            if (id == 0xffff)
            {
                id        = id << 16;
                id       += ((UInt32)buf[o++]) << 8;
                id       += ((UInt32)buf[o++]) << 0;
                frequency = id < 0xfffffffa ? MessageFrequency.Low : MessageFrequency.Fixed;
            }
        }

        if (id == (UInt32)MessageId.Wrapper)
        {
            id = 0xffff0000 + buf[o++];
        }

        if (Enum.IsDefined(typeof(MessageId), id) == false || MessageCreator.ContainsKey((MessageId)id) == false)
        {
            string idString = "";
            switch (frequency)
            {
            case MessageFrequency.High:
            case MessageFrequency.Medium:
                idString = $"{frequency} {id & 0xff} (0x{id:x8})";
                break;

            case MessageFrequency.Low:
                idString = $"{frequency} {id & 0xffff} (0x{id:x8})";
                break;

            case MessageFrequency.Fixed:
                idString = $"{frequency} 0x{id:x8}";
                break;
            }

            // Only log unknown messages the first time to reduce spam and lag:
            if (UnknownMessageIds.Contains(id) == false)
            {
                Logger.LogError($"BinarySerializer.DeSerializeMessage: Unknown message id {idString}");
                UnknownMessageIds.Add(id);
            }

            return(new Message
            {
                Flags = packetFlags,
                SequenceNumber = sequenceNumber,
                Acks = acks,
                ExtraHeader = extraHeader
            });
        }
        MessageId messageId = (MessageId)id;
        #endregion MessageId

        #region DataBuffer
        byte[] dataBuffer = buf;
        int    dataOffset = o;
        int    dataLen    = buf.Length - ackLength;
        if ((packetFlags & PacketFlags.ZeroCode) != 0)
        {
            dataBuffer = BinarySerializer.ExpandZerocode(buf, o, dataLen - o);
            dataOffset = 0;
            dataLen    = dataBuffer.Length;
        }
        #endregion DataBuffer

        Message message = MessageCreator[messageId]();
        message.Flags          = packetFlags;
        message.SequenceNumber = sequenceNumber;
        message.ExtraHeader    = extraHeader;
        message.Acks           = acks;

        message.DeSerialise(dataBuffer, ref dataOffset, dataLen);
        //Logger.LogDebug ($"Message.DeSerialiseMessage: {message}");
        return(message);
    }