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()})"); } }