Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion lib/WUI/nhttp/status_renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <transfers/monitor.hpp>
#include <segmented_json_macros.h>

#include <marlin_server_types/general_response.hpp>

#include <option/buddy_enable_connect.h>
#if BUDDY_ENABLE_CONNECT()
#include <connect/connect.hpp>
Expand All @@ -27,7 +29,15 @@ json::JsonResult StatusRenderer::renderState(size_t resume_point, json::JsonOutp

uint32_t time_to_end = marlin_vars().time_to_end;
uint32_t time_to_pause = marlin_vars().time_to_pause;
auto link_state = printer_state::get_state(false);
auto state_with_dialog = printer_state::get_state_with_dialog(false);
auto link_state = state_with_dialog.device_state;
bool has_dialog = state_with_dialog.dialog.has_value();
uint32_t dialog_id = has_dialog ? state_with_dialog.dialog->dialog_id.to_uint32_t() : 0;
uint32_t dialog_code = state_with_dialog.code_num();
const Response *dialog_buttons = state_with_dialog.buttons();
// Optional user-facing message (currently populated by Prusa's M0 handler
// — see src/marlin_stubs/M0.cpp; the pointer is packed into PhaseData).
const char *dialog_message = has_dialog ? state_with_dialog.dialog->text : nullptr;

// Keep the indentation of the JSON in here!
// clang-format off
Expand Down Expand Up @@ -76,6 +86,18 @@ json::JsonResult StatusRenderer::renderState(size_t resume_point, json::JsonOutp
JSON_FIELD_INT("fan_hotend", marlin_vars().active_hotend().heatbreak_fan_rpm) JSON_COMMA;
JSON_FIELD_INT("fan_print", marlin_vars().active_hotend().print_fan_rpm);
JSON_OBJ_END;
if (has_dialog) {
JSON_COMMA;
JSON_FIELD_OBJ("dialog");
JSON_FIELD_INT("id", dialog_id) JSON_COMMA;
JSON_FIELD_INT("code", dialog_code) JSON_COMMA;
JSON_FIELD_STR("message", dialog_message ? dialog_message : "") JSON_COMMA;
JSON_FIELD_STR("button0", (dialog_buttons && dialog_buttons[0] != Response::_none) ? to_str(dialog_buttons[0]) : "") JSON_COMMA;
JSON_FIELD_STR("button1", (dialog_buttons && dialog_buttons[0] != Response::_none && dialog_buttons[1] != Response::_none) ? to_str(dialog_buttons[1]) : "") JSON_COMMA;
JSON_FIELD_STR("button2", (dialog_buttons && dialog_buttons[0] != Response::_none && dialog_buttons[1] != Response::_none && dialog_buttons[2] != Response::_none) ? to_str(dialog_buttons[2]) : "") JSON_COMMA;
JSON_FIELD_STR("button3", (dialog_buttons && dialog_buttons[0] != Response::_none && dialog_buttons[1] != Response::_none && dialog_buttons[2] != Response::_none && dialog_buttons[3] != Response::_none) ? to_str(dialog_buttons[3]) : "");
JSON_OBJ_END;
}
JSON_OBJ_END;
JSON_END;
// clang-format on
Expand Down
2 changes: 2 additions & 0 deletions lib/WUI/nhttp/status_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ namespace nhttp::handler {
class StatusState {
public:
std::optional<transfers::TransferId> transfer_id { std::nullopt };
size_t iter = 0;
bool need_comma = false;
StatusState(std::optional<transfers::TransferId> id)
: transfer_id(id) {}
};
Expand Down
20 changes: 17 additions & 3 deletions src/state/printer_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -422,12 +422,26 @@ StateWithDialog get_state_with_dialog(bool ready) {
const Response *buttons = ClientResponses::get_available_responses(GetEnumFromPhaseIndex<PhasesLoadUnload>(data.GetPhase())).data();
return { state, attention_code, fsm_gen, buttons };
}
} // TODO: handle normal load unload
} else {
// Normal (non-printing) load/unload: expose dialog if there are buttons
auto phase = GetEnumFromPhaseIndex<PhasesLoadUnload>(data.GetPhase());
const auto &responses = ClientResponses::get_available_responses(phase);
if (responses[0] != Response::_none) {
return { state, ErrCode::CONNECT_FILAMENT_RUNOUT, fsm_gen, responses.data() };
}
}
break;
case ClientFSM::QuickPause: {
const Response *available_responses = ClientResponses::get_available_responses(GetEnumFromPhaseIndex<PhasesQuickPause>(data.GetPhase())).data();
return { state, ErrCode::CONNECT_QUICK_PAUSE, fsm_gen, available_responses };
break;
StateWithDialog result { state, ErrCode::CONNECT_QUICK_PAUSE, fsm_gen, available_responses };
// Prusa's M0 handler (src/marlin_stubs/M0.cpp) packs the message
// pointer (parser.string_arg) into PhaseData. Unpack it so remote
// clients can see the user-facing text (e.g. "Insert magnets").
const char *msg = fsm::deserialize_data<const char *>(data.GetData());
if (result.dialog.has_value()) {
result.dialog->text = msg;
}
return result;
}
#if ENABLED(CRASH_RECOVERY)
case ClientFSM::CrashRecovery:
Expand Down