diff --git a/grbl_machine.cpp b/grbl_machine.cpp index 884aac9..d75f1de 100644 --- a/grbl_machine.cpp +++ b/grbl_machine.cpp @@ -373,16 +373,25 @@ std::string grbl::setting_description(int number) { case 75: return "Bluetooth service ()\nBluetooth service name."; - case 80: return "Spindle P-gain"; - case 81: return "Spindle I-gain"; - case 82: return "Spindle D-gain"; - case 84: return "Spindle PID max error"; - case 85: return "Spindle PID max I error\nSpindle PID max integrator error"; + case 80: + return "Spindle P-gain"; + case 81: + return "Spindle I-gain"; + case 82: + return "Spindle D-gain"; + case 84: + return "Spindle PID max error"; + case 85: + return "Spindle PID max I error\nSpindle PID max integrator error"; - case 90: return "Spindle sync P-gain"; - case 91: return "Spindle sync I-gain"; - case 92: return "Spindle sync D-gain"; - case 95: return "Spindle sync PID max I error\nSpindle sync PID max integrator error"; + case 90: + return "Spindle sync P-gain"; + case 91: + return "Spindle sync I-gain"; + case 92: + return "Spindle sync D-gain"; + case 95: + return "Spindle sync PID max I error\nSpindle sync PID max integrator error"; case 100: return "X-axis travel resolution (step/mm)\nX-axis travel resolution in steps per millimeter."; @@ -609,6 +618,30 @@ const std::map& grbl::machine::g return parameters; } +void grbl::machine::zero_offset(int which) { + while (awaiting_responses > 0); + pipe->send("G10 L20 P" + std::to_string(1 + which) + " X0 Y0 Z0"); // P1 => G54 + awaiting_responses++; + while (awaiting_responses > 0); + + pipe->send("$#"); + awaiting_responses++; + while (awaiting_responses > 0); + listener->on_parameters_reloaded(); +} + +void grbl::machine::zero_offset_axis(int offset_index, int axis) { + while (awaiting_responses > 0); + pipe->send("G10 L20 P" + std::to_string(1 + offset_index) + " " + char('X' + axis) + "0"); // P1 => G54 + awaiting_responses++; + while (awaiting_responses > 0); + + pipe->send("$#"); + awaiting_responses++; + while (awaiting_responses > 0); + listener->on_parameters_reloaded(); +} + bool grbl::jog_state::no_jogging() const { return !(up_pressed || down_pressed || left_pressed || right_pressed || z_up_pressed || z_down_pressed); } @@ -678,7 +711,7 @@ void grbl::machine_state_init::move_to_next_init_stage() { switch (init_state) { case init_stage::start: init_state = init_stage::set_work_pos; - cnc->pipe->send("$10=0"); + cnc->pipe->send("$10=1"); // machine pos in report, please break; case init_stage::set_work_pos: init_state = init_stage::fetch_settings; @@ -714,18 +747,31 @@ void grbl::machine_state_idle::on_exit(grbl::machine *m) { void grbl::machine_state_idle::on_line_received(std::string line) { if (starts_with(line, "ok")) { + if (cnc->awaiting_responses > 0) { + cnc->awaiting_responses--; + } } else if (starts_with(line, "error")) { + if (cnc->awaiting_responses > 0) { + cnc->awaiting_responses--; + } } else if (starts_with(line, "Grbl")) { cnc->listener->on_banner(line); cnc->reset_machine_state(); } else if (starts_with(line, "<")) { cnc->last_report = parse_status_report(line, cnc->last_report); cnc->listener->on_realtime_status_report(cnc->last_report); - } else if (starts_with(line, "[MSG:")) { cnc->listener->on_message(line.substr(5, line.size() - 6)); } else if (starts_with(line, "ALARM:")) { cnc->listener->on_alarm(std::stoi(line.substr(6))); + } else if (starts_with(line, "$")) { + auto pieces = split_string(line, "="); + cnc->settings[pieces[0]] = pieces[1]; + } else if (starts_with(line, "[G") || starts_with(line, "[H") || starts_with(line, "[T") || starts_with(line, "[P")) { + line = line.substr(1, line.size() - 2); + // TODO: some parameters have more than two : + auto pieces = split_string(line, ":"); + cnc->parameters[pieces[0]] = pieces[1]; } } diff --git a/grbl_machine.h b/grbl_machine.h index 01a1a03..c11f2a6 100644 --- a/grbl_machine.h +++ b/grbl_machine.h @@ -112,6 +112,8 @@ struct machine_listener { virtual void on_init_completed() = 0; virtual void on_run_completed(bool success, size_t failed_index, size_t error) = 0; virtual void on_check_completed(bool success, size_t failed_index, size_t error) = 0; + virtual void on_settings_reloaded() = 0; + virtual void on_parameters_reloaded() = 0; }; @@ -210,10 +212,14 @@ struct machine : public transport_callbacks { void request_unlock(); void request_home(); void request_reset(); - void request_cycle_start(); void request_feed_hold(); + // 0 = G54, 1 = G55, etc + void zero_offset(int which); + + // 0 = G54, 1 = G55, etc axis 0=X, 1=Y, 2=Z + void zero_offset_axis(int offset_index, int axis); protected: void on_connected(transport *transport) override; @@ -232,6 +238,7 @@ protected: std::map settings; std::map parameters; + volatile size_t awaiting_responses = 0; realtime_status_report last_report{}; machine_listener *listener = nullptr; transport *pipe = nullptr; diff --git a/main.cpp b/main.cpp index a5cee6a..e51f97c 100644 --- a/main.cpp +++ b/main.cpp @@ -51,7 +51,6 @@ public: Window *window; grbl::jog_state jog; - Label *m_pos_x, *m_pos_y, *m_pos_z; TextArea *lblStatus, *lblSubstatus; nanogui::Color colRed = nanogui::Color(255, 0, 0, 255); nanogui::Color colGreen = nanogui::Color(0, 255, 0, 255); @@ -60,7 +59,6 @@ public: grbl::program pgm; Button *btnLoadProgram, *btnCheckProgram, *btnRunProgram; - grbl::program_renderer renderer; glm::vec3 cam_target = glm::vec3(0); @@ -74,66 +72,10 @@ public: VScrollPanel *parameters_vscroll; Widget *parameters_layer; TextBox *mpos_x_text, *mpos_y_text, *mpos_z_text; - - void fill_in_settings() { - settings_vscroll = new VScrollPanel(tab_widget); - tab_widget->append_tab("Settings", settings_vscroll); - - settings_layer = new Widget(settings_vscroll); - settings_layer->set_layout(new GridLayout(Orientation::Horizontal, 1, Alignment::Middle)); - - auto& settings = cnc.get_settings(); - - for (auto& s: settings) { - auto w = settings_layer->add(); - w->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 2, 2)); - auto x = w->add