コード例 #1
0
        public static FrameIHeader Read(ReadOnlySpan <byte> buffer, int apduLength)
        {
            var sendSeqNo    = (ushort)Bytes.GetNFromBytes(buffer[0], buffer[1]);
            var recieveSeqNo = (ushort)Bytes.GetNFromBytes(buffer[2], buffer[3]);
            var bAsduTypeId  = buffer[4];
            var asduTypeId   = Enum.IsDefined(typeof(AsduTypeId), bAsduTypeId)
                ? (AsduTypeId)bAsduTypeId
                : AsduTypeId.Unknown;

            var(isSequence, infoObjectsCount) = ReadByte7(buffer[5]);
            var(isTest, isNegative, cot)      = ReadByte8(buffer[6]);
            var org      = buffer[7];
            var ushortLE = new UshortLittleEndian {
                LSB = buffer[8], MSB = buffer[9]
            };
            var ca = ushortLE.V;

            return(new FrameIHeader(sendSeqNo, recieveSeqNo, asduTypeId, isSequence, isTest, isNegative, cot, org, ca, infoObjectsCount, apduLength));
        }
コード例 #2
0
        public int TryWrite(Span <byte> buffer)
        {
            // :0 start byte
            buffer[0] = Constants.StartByte;

            // :1 length of APDU
            buffer[1] = (byte)ApduLength;

            // APCI (4 bytes)
            var(b2, b3) = Bytes.GetBytesFromN(SendSeqNo);
            var(b4, b5) = Bytes.GetBytesFromN(RecieveSeqNo);
            buffer[2]   = b2;
            buffer[3]   = b3;
            buffer[4]   = b4;
            buffer[5]   = b5;

            // ASDU
            // :6 type identification
            buffer[6] = (byte)AsduTypeId;

            // :7 SQ | number of information objects
            buffer[7] = CreateByte7(IsSequence, InfoObjectsCount);

            // :8 T | P/N | COT
            buffer[8] = CreateByte8(IsTest, IsNegativeConfirmation, CauseOfTransmission);

            // :9 ORG
            buffer[9] = OriginatorAddress;

            // :10-11 CA (2 bytes)
            var ca = new UshortLittleEndian {
                V = CommonAddress
            };

            buffer[10] = ca.LSB;
            buffer[11] = ca.MSB;

            return(Constants.FrameIHeaderLength);
        }