/// <summary>
        /// Decode a Connection Status packet from a byte stream. If state is Failed, the device will be null.
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="index"></param>
        /// <param name="device"></param>
        /// <returns></returns>
        private static ConnectionState DecodeConnectionStatus(byte[] buffer, ref int index, out Device?device)
        {
            ConnectionStatusPacket status = DeserializePacket <ConnectionStatusPacket>(buffer, ref index);
            ConnectionState        state  = (ConnectionState)status.statusId;

            if (state == ConnectionState.Failed)
            {
                device = null;
                return(state);
            }

            device = DecodeDeviceInfo(status.device, state);
            return(state);
        }
        /// <summary>
        /// Encode a Connection Status packet into the buffer
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="index"></param>
        /// <param name="state"></param>
        /// <param name="device"></param>
        public static void EncodeConnectionStatus(byte[] buffer, ref int index, ConnectionState state, Device device)
        {
            // Encode header
            PacketHeader header = new PacketHeader(PacketTypeCode.ConnectionStatus);

            SerializePacket(buffer, ref index, header);

            // Encode payload
            ConnectionStatusPacket packet = new ConnectionStatusPacket
            {
                statusId = (int)state,
                device   = EncodeDeviceInfo(device)
            };

            SerializePacket(buffer, ref index, packet);

            // Encode footer
            SerializePacket(buffer, ref index, _footer);
        }