Beispiel #1
0
        private static Item BufferedDecodeItem(byte[] bytes, ref int index)
        {
            byte formatCodeValue = bytes[index];
            var  format          = (SecsFormat)(formatCodeValue & 0b_111111_00);
            byte lengthBits      = (byte)(formatCodeValue & 0b_000000_11);

            index++;

            byte[] itemLengthBytes = new byte[4];
            Array.Copy(bytes, index, itemLengthBytes, 0, lengthBits);
            Array.Reverse(itemLengthBytes, 0, lengthBits);
            int dataLength = BitConverter.ToInt32(itemLengthBytes, 0);             // max to 3 byte dataLength

            index += lengthBits;

            if (format == SecsFormat.List)
            {
                if (dataLength == 0)
                {
                    return(Item.L());
                }

                var list = new List <Item>(dataLength);
                for (int i = 0; i < dataLength; i++)
                {
                    list.Add(StreamDecoder.BufferedDecodeItem(bytes, ref index));
                }

                return(Item.L(list));
            }
            var item = Item.BytesDecode(format, bytes, index, dataLength);

            index += dataLength;
            return(item);
        }
Beispiel #2
0
        private void parseMessage(byte[] bytes, int length, bool isMessageComplelte = false)
        {
            if (isMessageComplelte == true)
            {
            }
            else
            {
                if (length == 14 && isHeader == true)
                {
                    //it is a header

                    isHeader = false;
                    Array.Copy(bytes, messageBytes, length);


                    byte[] messageLengths = new byte[4];
                    Array.Copy(bytes, 0, messageLengths, 0, 4);
                    Array.Reverse(messageLengths, 0, 4);
                    _messageDataLength = (int)BitConverter.ToUInt32(messageLengths, 0);

                    MsgHeader = MessageHeader.Decode(bytes, 4);
                }
                else
                {
                    isHeader = true;

                    if (_messageDataLength - 10 == length)
                    {
                        //it is the message
                        int  index = 0;
                        Item item  = decoder.BufferedDecodeItem(bytes, ref index);
                        Msg = new SecsMessage(MsgHeader.S, MsgHeader.F, MsgHeader.ReplyExpected, "", item);
                        SecsDataReceivedEventArgs arg = new SecsDataReceivedEventArgs(Msg, SCESEquipment);
                        DataReceived(SocketClient, arg);
                    }
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Decoder step 1: get message header 10 bytes
        /// </summary>
        /// <param name="length"></param>
        /// <param name="need"></param>
        /// <returns>The decoder step to execute next.</returns>
        private int DecoderStep1GetMessageHeader(ref int length, out int need)
        {
            if (!StreamDecoder.CheckAvailable(length, 10, out need))
            {
                return(1);
            }

            this.messageHeader      = MessageHeader.Decode(new ReadOnlySpan <byte>(this.Buffer, this.decodeIndex, 10));
            this.decodeIndex       += 10;
            this.messageDataLength -= 10;
            length -= 10;
            if (this.messageDataLength == 0)
            {
                if (this.messageHeader.MessageType == MessageType.DataMessage)
                {
                    this.dataMessageHandler(this.messageHeader, new SecsMessage(this.messageHeader.S, this.messageHeader.F, string.Empty, replyExpected: this.messageHeader.ReplyExpected));
                }
                else
                {
                    this.controlMessageHandler(this.messageHeader);
                }

                return(0);
            }

            if (length >= this.messageDataLength)
            {
                Trace.WriteLine("Get Complete Data Message with total data");
                this.dataMessageHandler(this.messageHeader, new SecsMessage(this.messageHeader.S, this.messageHeader.F, string.Empty, StreamDecoder.BufferedDecodeItem(this.Buffer, ref this.decodeIndex), this.messageHeader.ReplyExpected));
                length -= (int)this.messageDataLength;
                this.messageDataLength = 0;
                return(0);                //completeWith message received
            }
            return(this.DecoderStep2GetItemHeader(ref length, out need));
        }