Exemplo n.º 1
0
        public static byte[] CreatePacket(byte command, byte[] payload = null)
        {
            List <byte> packetBuilder = new List <byte>();

            if (payload != null && payload.Length > MAX_PAYLOAD_LEN)
            {
                throw new Exception("HLDC payload too large");
            }

            packetBuilder.Add(HLDC_FRAME_DELIMITER);

            // Build the packet header
            HeaderStruct header = new HeaderStruct()
            {
                command = command,
                length  = (byte)((payload != null) ? payload.Length : 0)
            };

            packetBuilder.AddRange(EscapeBytes(StructInterop.StructToByteArray <HeaderStruct>(header)));

            // Build the packet payload
            UInt16 crc = 0;

            if (payload != null)
            {
                byte[] escapedPayload = EscapeBytes(payload);
                packetBuilder.AddRange(escapedPayload);
                crc = CalculateCrc(escapedPayload);
            }

            // BUild the packet footer
            FooterStruct footer = new FooterStruct()
            {
                crc = crc,
            };

            packetBuilder.AddRange(EscapeBytes(StructInterop.StructToByteArray <FooterStruct>(footer)));

            packetBuilder.Add(HLDC_FRAME_DELIMITER);

            if (packetBuilder.Count > MAX_PACKET_LEN)
            {
                throw new Exception("HLDC packet too large");
            }

            return(packetBuilder.ToArray());
        }
Exemplo n.º 2
0
 public static byte[] CreatePacket <T>(byte command, T struc)
 {
     byte[] payload = StructInterop.StructToByteArray <T>(struc);
     return(CreatePacket(command, payload));
 }
Exemplo n.º 3
0
 /// <summary>
 /// Wrapper for TransferPacket(byte command, byte[] payload)
 /// </summary>
 /// <remarks>
 /// Doesn't expect a response. Any response data is discarded,
 /// but will still block until a response is received.
 /// </remarks>
 /// <typeparam name="T">Struct type for payload</typeparam>
 /// <param name="command">Command to send</param>
 /// <param name="payload">Payload struct</param>
 protected void TransferPacket <T>(byte command, T payload)
 {
     byte[] payload_bytes = StructInterop.StructToByteArray <T>(payload);
     TransferPacket(command, payload_bytes);
 }
Exemplo n.º 4
0
 /// <summary>
 /// Wrapper for TransferPacket(byte command, byte[] payload)
 /// </summary>
 ///
 /// <typeparam name="T">Struct type for payload</typeparam>
 /// <typeparam name="R">Struct type for response</typeparam>
 /// <param name="command">Command to send</param>
 /// <param name="payload">Payload struct</param>
 /// <returns>Response struct</returns>
 protected R TransferPacket <T, R>(byte command, T payload)
 {
     byte[] payload_bytes  = StructInterop.StructToByteArray <T>(payload);
     byte[] response_bytes = TransferPacket(command, payload_bytes);
     return(StructInterop.ByteArrayToStruct <R>(response_bytes));
 }