private static int Serialize(LongFrame frame, BinaryWriter writer)
        {
            writer.Write(frame.Start);
            writer.Write((byte)(frame.Data.Length + 3));
            writer.Write((byte)(frame.Data.Length + 3));
            writer.Write(frame.Start);
            writer.Write((byte)frame.Control);
            writer.Write(frame.Address);
            writer.Write((byte)frame.ControlInformation);
            writer.Write(frame.Data, 0, frame.Data.Length);
            writer.Write(frame.Crc);
            writer.Write(frame.Stop);

            return(9 + frame.Data.Length);
        }
示例#2
0
        internal static IReadOnlyCollection <DatapointValue> ParseDatapointValues(LongFrame frame)
        {
            if (frame == null)
            {
                throw new ArgumentException($"{nameof(frame)} cannot be null");
            }

            var list = new List <DatapointValue>();

            var responseData = frame.UserData;

            var numberOfDps = BitConverter.ToInt16(responseData.Slice(4, 2).ToArray().Reverse().ToArray());

            if (numberOfDps == 0)
            {
                throw new RequestException((ErrorCodes)responseData.ToArray()[6]);
            }

            var pos = 6;

            for (int i = 0; i < numberOfDps; i++)
            {
                var dpId     = BitConverter.ToUInt16(ReverseSpan(responseData.Slice(pos, 2)));
                var dpState  = IndexOfSpan(responseData, pos + 2);
                var dpLength = IndexOfSpan(responseData, pos + 3);
                var dpValue  = responseData.Slice(pos + 4, dpLength);

                pos += 4 + dpLength;

                var dp = new DatapointValue
                {
                    Data        = dpValue,
                    DatapointId = dpId,
                    Length      = dpLength,
                    State       = dpState
                };
                list.Add(dp);
            }

            return(list);
        }