private static void OutputGenericMessage(Communication.MessageTypeFlags flags, string reply)
        {
            if (_partialCodeReply != null)
            {
                reply             = _partialCodeReply + reply;
                _partialCodeReply = null;
            }

            if (flags.HasFlag(Communication.MessageTypeFlags.PushFlag))
            {
                _partialCodeReply = reply;
            }
            else if (reply != "")
            {
                MessageType type = flags.HasFlag(Communication.MessageTypeFlags.ErrorMessageFlag) ? MessageType.Error
                    : flags.HasFlag(Communication.MessageTypeFlags.WarningMessageFlag) ? MessageType.Warning
                    : MessageType.Success;
                Model.Provider.Output(type, reply);
            }
        }
        private static void HandleCodeReply()
        {
            DataTransfer.ReadCodeReply(out Communication.MessageTypeFlags flags, out string reply);

            // TODO implement logging here
            // TODO check for "File %s will print in %" PRIu32 "h %" PRIu32 "m plus heating time" and modify simulation time

            // Deal with generic replies. Keep this check in sync with RepRapFirmware
            if (flags.HasFlag(Communication.MessageTypeFlags.UsbMessage) && flags.HasFlag(Communication.MessageTypeFlags.AuxMessage) &&
                flags.HasFlag(Communication.MessageTypeFlags.HttpMessage) && flags.HasFlag(Communication.MessageTypeFlags.TelnetMessage))
            {
                OutputGenericMessage(flags, reply.TrimEnd());
                return;
            }

            // Check if this is a targeted message. If yes, send it to the corresponding code being executed
            bool replyHandled = false;

            if (flags.HasFlag(Communication.MessageTypeFlags.BinaryCodeReplyFlag))
            {
                foreach (CodeChannel channel in CodeChannels)
                {
                    Communication.MessageTypeFlags channelFlag = (Communication.MessageTypeFlags)(1 << (int)channel);
                    if (flags.HasFlag(channelFlag))
                    {
                        using (Channels[channel].Lock())
                        {
                            replyHandled = Channels[channel].HandleReply(flags, reply);
                        }
                        break;
                    }
                }
            }

            if (!replyHandled && !flags.HasFlag(Communication.MessageTypeFlags.CodeQueueMessage))
            {
                // If the message could not be processed, output a warning. Should never happen except for queued codes
                Console.WriteLine($"[warn] Received out-of-sync code reply ({flags}: {reply.TrimEnd()})");
            }
        }