Markup cleanup + fixed precision DRO display.
This commit is contained in:
@@ -51,14 +51,13 @@ public:
|
|||||||
|
|
||||||
Window *window;
|
Window *window;
|
||||||
grbl::jog_state jog;
|
grbl::jog_state jog;
|
||||||
TextBox *txtStatus;
|
TextBox *txt_status;
|
||||||
TextBox *txtMessage;
|
TextBox *txtMessage;
|
||||||
nanogui::Color colRed = nanogui::Color(255, 0, 0, 255);
|
nanogui::Color color_red = nanogui::Color(255, 0, 0, 255);
|
||||||
nanogui::Color colGreen = nanogui::Color(0, 255, 0, 255);
|
nanogui::Color colGreen = nanogui::Color(0, 255, 0, 255);
|
||||||
nanogui::Color colBg;
|
|
||||||
int last_alarm = 0;
|
int last_alarm = 0;
|
||||||
grbl::program pgm;
|
grbl::program pgm;
|
||||||
Button *btnLoadProgram, *btnCheckProgram, *btnRunProgram;
|
Button *btn_load_program, *btn_check_program, *btn_run_program;
|
||||||
|
|
||||||
std::vector<std::string> jog_distances = {"0.01", "0.1", "1", "10"};
|
std::vector<std::string> jog_distances = {"0.01", "0.1", "1", "10"};
|
||||||
std::vector<std::string> jog_feed_rates = {"5", "100", "500", "1000"};
|
std::vector<std::string> jog_feed_rates = {"5", "100", "500", "1000"};
|
||||||
@@ -69,6 +68,7 @@ public:
|
|||||||
float cam_zoom = 0;
|
float cam_zoom = 0;
|
||||||
glm::quat cam_src_rotation = glm::quat(1.0, 0.0, 0.0, 0.0); // identity quaternion
|
glm::quat cam_src_rotation = glm::quat(1.0, 0.0, 0.0, 0.0); // identity quaternion
|
||||||
|
|
||||||
|
Widget *info_layer;
|
||||||
TabWidget *tab_widget;
|
TabWidget *tab_widget;
|
||||||
VScrollPanel *settings_vscroll;
|
VScrollPanel *settings_vscroll;
|
||||||
Widget *settings_layer;
|
Widget *settings_layer;
|
||||||
@@ -78,16 +78,13 @@ public:
|
|||||||
TextBox *mpos_x_text, *mpos_y_text, *mpos_z_text;
|
TextBox *mpos_x_text, *mpos_y_text, *mpos_z_text;
|
||||||
ComboBox *cbo_work_offset, *cbo_tool, *cbo_jog_feed_rates, *cbo_jog_distance;
|
ComboBox *cbo_work_offset, *cbo_tool, *cbo_jog_feed_rates, *cbo_jog_distance;
|
||||||
Button *btn_keyboard_jog;
|
Button *btn_keyboard_jog;
|
||||||
|
std::stringstream dro_ss;
|
||||||
|
|
||||||
|
|
||||||
SenderApp() : Screen(Vector2i(1024, 768), "GRBL Sender") {
|
SenderApp() : Screen(Vector2i(1024, 768), "GRBL Sender") {
|
||||||
inc_ref();
|
inc_ref();
|
||||||
|
|
||||||
// save regular button color
|
|
||||||
colBg = theme()->m_button_gradient_bot_focused;
|
|
||||||
|
|
||||||
// create main window
|
|
||||||
window = new Window(this, "Machine status");
|
window = new Window(this, "Machine status");
|
||||||
// window->set_fixed_height((Screen::size().y() - 40) / 2);
|
|
||||||
window->set_position(Vector2i(0, 0));
|
window->set_position(Vector2i(0, 0));
|
||||||
window->set_layout(new BoxLayout(nanogui::Orientation::Vertical));
|
window->set_layout(new BoxLayout(nanogui::Orientation::Vertical));
|
||||||
|
|
||||||
@@ -96,221 +93,30 @@ public:
|
|||||||
tab_widget->set_selected_index(index);
|
tab_widget->set_selected_index(index);
|
||||||
});
|
});
|
||||||
|
|
||||||
tab_widget->set_fixed_height((this->height() - 80) / 2);
|
info_layer = tab_widget->add<Widget>();
|
||||||
|
tab_widget->append_tab("Info", info_layer);
|
||||||
|
|
||||||
Widget *layer = new Widget(tab_widget);
|
info_layer->set_layout(new GroupLayout(10, 20, 30, 0));
|
||||||
layer->set_layout(new GroupLayout(10, 20, 30, 0));
|
info_layer->add<Label>("");
|
||||||
tab_widget->append_tab("Info", layer);
|
|
||||||
|
|
||||||
layer->add<Label>("");
|
add_status_markup();
|
||||||
auto status_holder = layer->add<Widget>();
|
add_dro_markup();
|
||||||
status_holder->set_layout(new BoxLayout(Orientation::Vertical, Alignment::Fill, 0, 0));
|
add_jogging_markup();
|
||||||
|
add_work_parameters_markup();
|
||||||
|
|
||||||
auto status_text_holder = status_holder->add<Widget>();
|
perform_layout();
|
||||||
status_text_holder->set_layout(new GridLayout(Orientation::Horizontal, 3, nanogui::Alignment::Fill, 0, 0));
|
|
||||||
|
|
||||||
status_text_holder->add<Label>("Status", "sans-bold", 20);
|
m_render_pass = new RenderPass({this});
|
||||||
|
m_render_pass->set_clear_color(0, Color(0.3f, 0.3f, 0.32f, 1.f));
|
||||||
txtStatus = status_text_holder->add<TextBox>();
|
m_render_pass->set_depth_test(RenderPass::DepthTest::Always, true);
|
||||||
txtStatus->set_editable(false);
|
m_render_pass->set_cull_mode(RenderPass::CullMode::Disabled);
|
||||||
txtStatus->set_fixed_width(300);
|
}
|
||||||
|
|
||||||
auto *btnReset = status_text_holder->add<Button>("Reset");
|
|
||||||
btnReset->set_background_color(colRed);
|
|
||||||
btnReset->set_callback([&] {
|
|
||||||
cnc.request_reset();
|
|
||||||
});
|
|
||||||
|
|
||||||
//
|
|
||||||
status_text_holder->add<Label>("");
|
|
||||||
|
|
||||||
txtMessage = status_text_holder->add<TextBox>("");
|
|
||||||
txtMessage->set_fixed_width(300);
|
|
||||||
|
|
||||||
status_text_holder->add<Label>("");
|
|
||||||
|
|
||||||
// buttons
|
|
||||||
auto status_btn_holder = status_holder->add<Widget>();
|
|
||||||
status_btn_holder->set_layout(new GridLayout(Orientation::Horizontal, 2, Alignment::Fill, 6, 6));
|
|
||||||
|
|
||||||
auto *btnHome = new Button(status_btn_holder, "Home", FA_HOME);
|
|
||||||
btnHome->set_callback([&] {
|
|
||||||
cnc.request_home();
|
|
||||||
});
|
|
||||||
|
|
||||||
auto *btnUnlock = new Button(status_btn_holder, "Unlock", FA_UNLOCK);
|
|
||||||
btnUnlock->set_callback([&] {
|
|
||||||
cnc.request_unlock();
|
|
||||||
});
|
|
||||||
|
|
||||||
// buttons to change state
|
|
||||||
auto *btnCycleStart = status_btn_holder->add<Button>("Cycle Start", FA_PLAY);
|
|
||||||
btnCycleStart->set_callback([&] {
|
|
||||||
cnc.request_cycle_start();
|
|
||||||
});
|
|
||||||
auto *btnFeedHold = status_btn_holder->add<Button>("Feed Hold", FA_PAUSE);
|
|
||||||
btnFeedHold->set_callback([&] {
|
|
||||||
cnc.request_feed_hold();
|
|
||||||
});
|
|
||||||
|
|
||||||
// DRO
|
|
||||||
layer->add<Label>("DRO", "sans-bold", 20);
|
|
||||||
Widget *mpos = new Widget(layer);
|
|
||||||
mpos->set_layout(new GridLayout(Orientation::Horizontal, 1, Alignment::Middle, 0, 6));
|
|
||||||
|
|
||||||
auto x_holder = mpos->add<Widget>();
|
|
||||||
x_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
|
||||||
auto lbl = x_holder->add<Label>("X", "sans-bold", 20);
|
|
||||||
lbl->set_fixed_width(30);
|
|
||||||
mpos_x_text = x_holder->add<TextBox>(std::to_string(cnc.get_status().machine_pos[0]));
|
|
||||||
mpos_x_text->set_fixed_width(200);
|
|
||||||
auto zero_btn = x_holder->add<ToolButton>(FA_BAN);
|
|
||||||
zero_btn->set_flags(Button::Flags::NormalButton);
|
|
||||||
zero_btn->set_tooltip("Zero axis");
|
|
||||||
zero_btn->set_callback([&]() {
|
|
||||||
cnc.zero_offset_axis(cbo_work_offset->selected_index(), 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
auto y_holder = mpos->add<Widget>();
|
|
||||||
y_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
|
||||||
lbl = y_holder->add<Label>("Y", "sans-bold", 20);
|
|
||||||
lbl->set_fixed_width(30);
|
|
||||||
mpos_y_text = y_holder->add<TextBox>(std::to_string(cnc.get_status().machine_pos[1]));
|
|
||||||
mpos_y_text->set_fixed_width(200);
|
|
||||||
zero_btn = y_holder->add<ToolButton>(FA_BAN);
|
|
||||||
zero_btn->set_flags(Button::Flags::NormalButton);
|
|
||||||
zero_btn->set_tooltip("Zero axis");
|
|
||||||
zero_btn->set_callback([&]() {
|
|
||||||
cnc.zero_offset_axis(cbo_work_offset->selected_index(), 1);
|
|
||||||
});
|
|
||||||
|
|
||||||
auto z_holder = mpos->add<Widget>();
|
|
||||||
z_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
|
||||||
lbl = z_holder->add<Label>("Z", "sans-bold", 20);
|
|
||||||
lbl->set_fixed_width(30);
|
|
||||||
mpos_z_text = z_holder->add<TextBox>(std::to_string(cnc.get_status().machine_pos[0]));
|
|
||||||
mpos_z_text->set_fixed_width(200);
|
|
||||||
zero_btn = z_holder->add<ToolButton>(FA_BAN);
|
|
||||||
zero_btn->set_flags(Button::Flags::NormalButton);
|
|
||||||
zero_btn->set_tooltip("Zero axis");
|
|
||||||
zero_btn->set_callback([&]() {
|
|
||||||
cnc.zero_offset_axis(cbo_work_offset->selected_index(), 2);
|
|
||||||
});
|
|
||||||
|
|
||||||
auto axis_btns_holder = mpos->add<Widget>();
|
|
||||||
axis_btns_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
|
||||||
|
|
||||||
auto zero_all_btn = axis_btns_holder->add<Button>("Zero all");
|
|
||||||
zero_all_btn->set_callback([&]() {
|
|
||||||
cnc.zero_offset(cbo_work_offset->selected_index());
|
|
||||||
});
|
|
||||||
|
|
||||||
auto goto_zero_btn = axis_btns_holder->add<Button>("Goto 0");
|
|
||||||
goto_zero_btn->set_callback([&]() {
|
|
||||||
cnc.go_to_zero(true, true, true);
|
|
||||||
});
|
|
||||||
|
|
||||||
// jogging
|
|
||||||
layer->add<Label>("Jogging", "sans-bold", 20);
|
|
||||||
auto holder = new Widget(layer);
|
|
||||||
|
|
||||||
holder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 0));
|
|
||||||
|
|
||||||
// feed and distance
|
|
||||||
auto jogParamsHolder = holder->add<Widget>();
|
|
||||||
jogParamsHolder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 4));
|
|
||||||
|
|
||||||
jogParamsHolder->add<Label>("Feed", "sans-bold");
|
|
||||||
cbo_jog_feed_rates = jogParamsHolder->add<ComboBox>(jog_feed_rates);
|
|
||||||
cbo_jog_feed_rates->set_selected_index(2);
|
|
||||||
jogParamsHolder->add<Label>("mm/min");
|
|
||||||
|
|
||||||
jogParamsHolder->add<Label>("Distance", "sans-bold");
|
|
||||||
cbo_jog_distance = jogParamsHolder->add<ComboBox>(jog_distances);
|
|
||||||
cbo_jog_distance->set_selected_index(2);
|
|
||||||
jogParamsHolder->add<Label>("mm");
|
|
||||||
|
|
||||||
jogParamsHolder->add<Label>("Keyboard Jog", "sans-bold");
|
|
||||||
btn_keyboard_jog = jogParamsHolder->add<Button>("", FA_KEYBOARD);
|
|
||||||
btn_keyboard_jog->set_flags(Button::Flags::ToggleButton);
|
|
||||||
jogParamsHolder->add<Label>("");
|
|
||||||
|
|
||||||
// X and Y
|
|
||||||
auto jogBtnsHolder = holder->add<Widget>();
|
|
||||||
jogBtnsHolder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 6));
|
|
||||||
|
|
||||||
jogBtnsHolder->add<Label>("");
|
|
||||||
auto jog_btn = jogBtnsHolder->add<Button>("", FA_ARROW_ALT_CIRCLE_UP);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
// FIXME: get rid of std::stof
|
|
||||||
cnc.request_jog_fixed(grbl::jog_direction::y_up,
|
|
||||||
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
|
||||||
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
|
||||||
});
|
|
||||||
jogBtnsHolder->add<Label>("");
|
|
||||||
|
|
||||||
jog_btn = jogBtnsHolder->add<Button>("", FA_ARROW_ALT_CIRCLE_LEFT);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
// FIXME: get rid of std::stof
|
|
||||||
cnc.request_jog_fixed(grbl::jog_direction::x_down,
|
|
||||||
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
|
||||||
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
|
||||||
});
|
|
||||||
|
|
||||||
jog_btn = jogBtnsHolder->add<Button>("", FA_HOME);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
cnc.go_to_zero(true, true, false);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
jog_btn = jogBtnsHolder->add<Button>("", FA_ARROW_ALT_CIRCLE_RIGHT);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
// FIXME: get rid of std::stof
|
|
||||||
cnc.request_jog_fixed(grbl::jog_direction::x_up,
|
|
||||||
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
|
||||||
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
|
||||||
});
|
|
||||||
|
|
||||||
jogBtnsHolder->add<Label>("");
|
|
||||||
jog_btn = jogBtnsHolder->add<Button>("", FA_ARROW_ALT_CIRCLE_DOWN);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
// FIXME: get rid of std::stof
|
|
||||||
cnc.request_jog_fixed(grbl::jog_direction::y_down,
|
|
||||||
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
|
||||||
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
|
||||||
});
|
|
||||||
jogBtnsHolder->add<Label>("");
|
|
||||||
|
|
||||||
|
|
||||||
// z up/down
|
|
||||||
auto jogZBtnsHolder = holder->add<Widget>();
|
|
||||||
jogZBtnsHolder->set_layout(new BoxLayout(Orientation::Vertical, Alignment::Fill, 0, 6));
|
|
||||||
|
|
||||||
jog_btn = jogZBtnsHolder->add<Button>("", FA_CHEVRON_UP);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
// FIXME: get rid of std::stof
|
|
||||||
cnc.request_jog_fixed(grbl::jog_direction::z_up,
|
|
||||||
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
|
||||||
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
|
||||||
});
|
|
||||||
|
|
||||||
jog_btn = jogZBtnsHolder->add<Button>("", FA_HOME);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
cnc.go_to_zero(0, 0, true);
|
|
||||||
});
|
|
||||||
|
|
||||||
jog_btn = jogZBtnsHolder->add<Button>("", FA_CHEVRON_DOWN);
|
|
||||||
jog_btn->set_callback([&]() {
|
|
||||||
// FIXME: get rid of std::stof
|
|
||||||
cnc.request_jog_fixed(grbl::jog_direction::z_down,
|
|
||||||
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
|
||||||
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
|
||||||
});
|
|
||||||
|
|
||||||
|
void add_work_parameters_markup() {
|
||||||
// work parameters
|
// work parameters
|
||||||
layer->add<Label>("Work parameters", "sans-bold", 20);
|
info_layer->add<Label>("Work parameters", "sans-bold", 20);
|
||||||
auto work_holder = layer->add<Widget>();
|
auto work_holder = info_layer->add<Widget>();
|
||||||
work_holder->set_layout(new BoxLayout(nanogui::Orientation::Horizontal, Alignment::Fill, 6, 6));
|
work_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Fill, 6, 6));
|
||||||
|
|
||||||
auto work_data_holder = work_holder->add<Widget>();
|
auto work_data_holder = work_holder->add<Widget>();
|
||||||
work_data_holder->set_layout(new GridLayout(Orientation::Horizontal, 2, Alignment::Fill, 6, 6));
|
work_data_holder->set_layout(new GridLayout(Orientation::Horizontal, 2, Alignment::Fill, 6, 6));
|
||||||
@@ -327,51 +133,249 @@ public:
|
|||||||
std::vector<std::string> tool_items = {"None"};
|
std::vector<std::string> tool_items = {"None"};
|
||||||
cbo_tool = work_data_holder->add<ComboBox>(tool_items);
|
cbo_tool = work_data_holder->add<ComboBox>(tool_items);
|
||||||
|
|
||||||
auto work_btns_holder = work_holder->add<Widget>();
|
auto work_btn_holder = work_holder->add<Widget>();
|
||||||
work_btns_holder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 6));
|
work_btn_holder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 6));
|
||||||
|
|
||||||
|
|
||||||
btnLoadProgram = work_btns_holder->add<Button>("Load");
|
btn_load_program = work_btn_holder->add<Button>("Load");
|
||||||
btnLoadProgram->set_callback([&] {
|
btn_load_program->set_callback([&] {
|
||||||
auto path = file_dialog(
|
auto path = file_dialog(
|
||||||
{{"gcode", "G-Code files"},
|
{{"gcode", "G-Code files"},
|
||||||
{"nc", "G-Code files"},
|
{"nc", "G-Code files"},
|
||||||
{"ngc", "G-Code files"}}, true);
|
{"ngc", "G-Code files"}}, true);
|
||||||
|
|
||||||
// btnCheckProgram->set_background_color(colBg);
|
|
||||||
// btnRunProgram->set_background_color(colBg);
|
|
||||||
|
|
||||||
if (pgm.load_from_file(path)) {
|
if (pgm.load_from_file(path)) {
|
||||||
// btnCheckProgram->set_enabled(true);
|
init_program_geometry();
|
||||||
// btnRunProgram->set_enabled(true);
|
|
||||||
this->init_program_geometry();
|
|
||||||
} else {
|
} else {
|
||||||
// btnCheckProgram->set_enabled(false);
|
|
||||||
// btnRunProgram->set_enabled(false);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
btnLoadProgram->set_tooltip("Load program");
|
btn_load_program->set_tooltip("Load program");
|
||||||
|
|
||||||
btnCheckProgram = work_btns_holder->add<Button>("Check");
|
btn_check_program = work_btn_holder->add<Button>("Check");
|
||||||
// btnCheckProgram->set_enabled(false);
|
// btnCheckProgram->set_enabled(false);
|
||||||
btnCheckProgram->set_callback([&] {
|
btn_check_program->set_callback([&] {
|
||||||
cnc.check_program(pgm);
|
cnc.check_program(pgm);
|
||||||
});
|
});
|
||||||
btnCheckProgram->set_tooltip("Check program");
|
btn_check_program->set_tooltip("Check program");
|
||||||
|
|
||||||
btnRunProgram = work_btns_holder->add<Button>("Run");
|
btn_run_program = work_btn_holder->add<Button>("Run");
|
||||||
// btnRunProgram->set_enabled(false);
|
// btnRunProgram->set_enabled(false);
|
||||||
btnRunProgram->set_callback([&] {
|
btn_run_program->set_callback([&] {
|
||||||
cnc.run_program(pgm, "G" + std::to_string(cbo_work_offset->selected_index() + 54));
|
cnc.run_program(pgm, "G" + std::to_string(cbo_work_offset->selected_index() + 54));
|
||||||
});
|
});
|
||||||
btnRunProgram->set_tooltip("Execute program");
|
btn_run_program->set_tooltip("Execute program");
|
||||||
|
}
|
||||||
|
|
||||||
perform_layout();
|
void add_status_markup() {
|
||||||
|
auto status_holder = info_layer->add<Widget>();
|
||||||
|
status_holder->set_layout(new BoxLayout(Orientation::Vertical, Alignment::Fill, 0, 0));
|
||||||
|
|
||||||
m_render_pass = new RenderPass({this});
|
auto status_text_holder = status_holder->add<Widget>();
|
||||||
m_render_pass->set_clear_color(0, Color(0.3f, 0.3f, 0.32f, 1.f));
|
status_text_holder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 0));
|
||||||
m_render_pass->set_depth_test(RenderPass::DepthTest::Always, true);
|
|
||||||
m_render_pass->set_cull_mode(RenderPass::CullMode::Disabled);
|
status_text_holder->add<Label>("Status", "sans-bold", 20);
|
||||||
|
|
||||||
|
txt_status = status_text_holder->add<TextBox>();
|
||||||
|
txt_status->set_editable(false);
|
||||||
|
txt_status->set_fixed_width(300);
|
||||||
|
|
||||||
|
auto *btn_reset = status_text_holder->add<Button>("Reset");
|
||||||
|
btn_reset->set_background_color(color_red);
|
||||||
|
btn_reset->set_callback([&] {
|
||||||
|
cnc.request_reset();
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
status_text_holder->add<Label>("");
|
||||||
|
|
||||||
|
txtMessage = status_text_holder->add<TextBox>("");
|
||||||
|
txtMessage->set_fixed_width(300);
|
||||||
|
|
||||||
|
status_text_holder->add<Label>("");
|
||||||
|
|
||||||
|
// buttons
|
||||||
|
auto status_btn_holder = status_holder->add<Widget>();
|
||||||
|
status_btn_holder->set_layout(new GridLayout(Orientation::Horizontal, 2, Alignment::Fill, 6, 6));
|
||||||
|
|
||||||
|
auto *btn_homing = new Button(status_btn_holder, "Homing", FA_HOME);
|
||||||
|
btn_homing->set_callback([&] {
|
||||||
|
cnc.request_home();
|
||||||
|
});
|
||||||
|
|
||||||
|
auto *btn_unlock = new Button(status_btn_holder, "Unlock", FA_UNLOCK);
|
||||||
|
btn_unlock->set_callback([&] {
|
||||||
|
cnc.request_unlock();
|
||||||
|
});
|
||||||
|
|
||||||
|
// buttons to change state
|
||||||
|
auto *btn_cycle_start = status_btn_holder->add<Button>("Cycle Start", FA_PLAY);
|
||||||
|
btn_cycle_start->set_callback([&] {
|
||||||
|
cnc.request_cycle_start();
|
||||||
|
});
|
||||||
|
auto *btn_feed_hold = status_btn_holder->add<Button>("Feed Hold", FA_PAUSE);
|
||||||
|
btn_feed_hold->set_callback([&] {
|
||||||
|
cnc.request_feed_hold();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_jogging_markup() {
|
||||||
|
// jogging
|
||||||
|
info_layer->add<Label>("Jogging", "sans-bold", 20);
|
||||||
|
auto holder = new Widget(info_layer);
|
||||||
|
|
||||||
|
holder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 0));
|
||||||
|
|
||||||
|
// feed and distance
|
||||||
|
auto jog_params_holder = holder->add<Widget>();
|
||||||
|
jog_params_holder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 4));
|
||||||
|
|
||||||
|
jog_params_holder->add<Label>("Feed", "sans-bold");
|
||||||
|
cbo_jog_feed_rates = jog_params_holder->add<ComboBox>(jog_feed_rates);
|
||||||
|
cbo_jog_feed_rates->set_selected_index(2);
|
||||||
|
jog_params_holder->add<Label>("mm/min");
|
||||||
|
|
||||||
|
jog_params_holder->add<Label>("Distance", "sans-bold");
|
||||||
|
cbo_jog_distance = jog_params_holder->add<ComboBox>(jog_distances);
|
||||||
|
cbo_jog_distance->set_selected_index(2);
|
||||||
|
jog_params_holder->add<Label>("mm");
|
||||||
|
|
||||||
|
jog_params_holder->add<Label>("Keyboard Jog", "sans-bold");
|
||||||
|
btn_keyboard_jog = jog_params_holder->add<Button>("", FA_KEYBOARD);
|
||||||
|
btn_keyboard_jog->set_flags(Button::ToggleButton);
|
||||||
|
jog_params_holder->add<Label>("");
|
||||||
|
|
||||||
|
// X and Y
|
||||||
|
auto jog_btn_holder = holder->add<Widget>();
|
||||||
|
jog_btn_holder->set_layout(new GridLayout(Orientation::Horizontal, 3, Alignment::Fill, 0, 6));
|
||||||
|
|
||||||
|
jog_btn_holder->add<Label>("");
|
||||||
|
auto jog_btn = jog_btn_holder->add<Button>("", FA_ARROW_ALT_CIRCLE_UP);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
// FIXME: get rid of std::stof
|
||||||
|
cnc.request_jog_fixed(grbl::jog_direction::y_up,
|
||||||
|
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
||||||
|
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
||||||
|
});
|
||||||
|
jog_btn_holder->add<Label>("");
|
||||||
|
|
||||||
|
jog_btn = jog_btn_holder->add<Button>("", FA_ARROW_ALT_CIRCLE_LEFT);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
// FIXME: get rid of std::stof
|
||||||
|
cnc.request_jog_fixed(grbl::jog_direction::x_down,
|
||||||
|
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
||||||
|
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
||||||
|
});
|
||||||
|
|
||||||
|
jog_btn = jog_btn_holder->add<Button>("", FA_HOME);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
cnc.go_to_zero(true, true, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
jog_btn = jog_btn_holder->add<Button>("", FA_ARROW_ALT_CIRCLE_RIGHT);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
// FIXME: get rid of std::stof
|
||||||
|
cnc.request_jog_fixed(grbl::jog_direction::x_up,
|
||||||
|
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
||||||
|
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
||||||
|
});
|
||||||
|
|
||||||
|
jog_btn_holder->add<Label>("");
|
||||||
|
jog_btn = jog_btn_holder->add<Button>("", FA_ARROW_ALT_CIRCLE_DOWN);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
// FIXME: get rid of std::stof
|
||||||
|
cnc.request_jog_fixed(grbl::jog_direction::y_down,
|
||||||
|
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
||||||
|
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
||||||
|
});
|
||||||
|
jog_btn_holder->add<Label>("");
|
||||||
|
|
||||||
|
|
||||||
|
// z up/down
|
||||||
|
auto jog_z_btn_holder = holder->add<Widget>();
|
||||||
|
jog_z_btn_holder->set_layout(new BoxLayout(Orientation::Vertical, Alignment::Fill, 0, 6));
|
||||||
|
|
||||||
|
jog_btn = jog_z_btn_holder->add<Button>("", FA_CHEVRON_UP);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
// FIXME: get rid of std::stof
|
||||||
|
cnc.request_jog_fixed(grbl::jog_direction::z_up,
|
||||||
|
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
||||||
|
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
||||||
|
});
|
||||||
|
|
||||||
|
jog_btn = jog_z_btn_holder->add<Button>("", FA_HOME);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
cnc.go_to_zero(false, false, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
jog_btn = jog_z_btn_holder->add<Button>("", FA_CHEVRON_DOWN);
|
||||||
|
jog_btn->set_callback([&]() {
|
||||||
|
// FIXME: get rid of std::stof
|
||||||
|
cnc.request_jog_fixed(grbl::jog_direction::z_down,
|
||||||
|
std::stof(jog_distances[cbo_jog_distance->selected_index()]),
|
||||||
|
std::stof(jog_feed_rates[cbo_jog_feed_rates->selected_index()]));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_dro_markup() {
|
||||||
|
dro_ss << std::setprecision(4) << std::fixed;
|
||||||
|
|
||||||
|
// DRO
|
||||||
|
info_layer->add<Label>("DRO", "sans-bold", 20);
|
||||||
|
auto dro_holder = info_layer->add<Widget>();
|
||||||
|
dro_holder->set_layout(new GridLayout(Orientation::Horizontal, 1, Alignment::Middle, 0, 6));
|
||||||
|
|
||||||
|
auto x_holder = dro_holder->add<Widget>();
|
||||||
|
x_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
||||||
|
auto lbl = x_holder->add<Label>("X", "sans-bold", 20);
|
||||||
|
lbl->set_fixed_width(30);
|
||||||
|
mpos_x_text = x_holder->add<TextBox>(std::to_string(cnc.get_status().machine_pos[0]));
|
||||||
|
mpos_x_text->set_fixed_width(200);
|
||||||
|
auto zero_btn = x_holder->add<ToolButton>(FA_BAN);
|
||||||
|
zero_btn->set_flags(Button::NormalButton);
|
||||||
|
zero_btn->set_tooltip("Zero axis");
|
||||||
|
zero_btn->set_callback([&]() {
|
||||||
|
cnc.zero_offset_axis(cbo_work_offset->selected_index(), 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
auto y_holder = dro_holder->add<Widget>();
|
||||||
|
y_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
||||||
|
lbl = y_holder->add<Label>("Y", "sans-bold", 20);
|
||||||
|
lbl->set_fixed_width(30);
|
||||||
|
mpos_y_text = y_holder->add<TextBox>(std::to_string(cnc.get_status().machine_pos[1]));
|
||||||
|
mpos_y_text->set_fixed_width(200);
|
||||||
|
zero_btn = y_holder->add<ToolButton>(FA_BAN);
|
||||||
|
zero_btn->set_flags(Button::NormalButton);
|
||||||
|
zero_btn->set_tooltip("Zero axis");
|
||||||
|
zero_btn->set_callback([&]() {
|
||||||
|
cnc.zero_offset_axis(cbo_work_offset->selected_index(), 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
auto z_holder = dro_holder->add<Widget>();
|
||||||
|
z_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
||||||
|
lbl = z_holder->add<Label>("Z", "sans-bold", 20);
|
||||||
|
lbl->set_fixed_width(30);
|
||||||
|
mpos_z_text = z_holder->add<TextBox>(std::to_string(cnc.get_status().machine_pos[0]));
|
||||||
|
mpos_z_text->set_fixed_width(200);
|
||||||
|
zero_btn = z_holder->add<ToolButton>(FA_BAN);
|
||||||
|
zero_btn->set_flags(Button::NormalButton);
|
||||||
|
zero_btn->set_tooltip("Zero axis");
|
||||||
|
zero_btn->set_callback([&]() {
|
||||||
|
cnc.zero_offset_axis(cbo_work_offset->selected_index(), 2);
|
||||||
|
});
|
||||||
|
|
||||||
|
auto axis_btn_holder = dro_holder->add<Widget>();
|
||||||
|
axis_btn_holder->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 0, 6));
|
||||||
|
|
||||||
|
auto zero_all_btn = axis_btn_holder->add<Button>("Zero all");
|
||||||
|
zero_all_btn->set_callback([&]() {
|
||||||
|
cnc.zero_offset(cbo_work_offset->selected_index());
|
||||||
|
});
|
||||||
|
|
||||||
|
auto goto_zero_btn = axis_btn_holder->add<Button>("Goto 0");
|
||||||
|
goto_zero_btn->set_callback([&]() {
|
||||||
|
cnc.go_to_zero(true, true, true);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void refresh_offset() const {
|
void refresh_offset() const {
|
||||||
@@ -384,13 +388,13 @@ public:
|
|||||||
tab_widget->append_tab("Parameters", parameters_vscroll);
|
tab_widget->append_tab("Parameters", parameters_vscroll);
|
||||||
|
|
||||||
parameters_layer = new Widget(parameters_vscroll);
|
parameters_layer = new Widget(parameters_vscroll);
|
||||||
parameters_layer->set_layout(new GridLayout(Orientation::Horizontal, 1, Alignment::Middle));
|
parameters_layer->set_layout(new GridLayout(Orientation::Horizontal, 1, Alignment::Minimum));
|
||||||
|
|
||||||
auto& parameters = cnc.get_parameters();
|
auto& parameters = cnc.get_parameters();
|
||||||
|
|
||||||
for (auto& entry: parameters) {
|
for (auto& entry: parameters) {
|
||||||
auto w = parameters_layer->add<Widget>();
|
auto w = parameters_layer->add<Widget>();
|
||||||
w->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Middle, 2, 2));
|
w->set_layout(new BoxLayout(Orientation::Horizontal, Alignment::Minimum, 0, 0));
|
||||||
auto x = w->add<Label>(entry.first, "sans-bold", 20);
|
auto x = w->add<Label>(entry.first, "sans-bold", 20);
|
||||||
x->set_fixed_width(50);
|
x->set_fixed_width(50);
|
||||||
|
|
||||||
@@ -451,6 +455,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool resize_event(const Vector2i& size) override {
|
bool resize_event(const Vector2i& size) override {
|
||||||
|
// window->set_fixed_height(this->height() / 2);
|
||||||
|
tab_widget->set_fixed_height((this->height() - 30));
|
||||||
|
perform_layout();
|
||||||
|
|
||||||
return Screen::resize_event(size);
|
return Screen::resize_event(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,12 +490,12 @@ public:
|
|||||||
// if (report == last_report) return;
|
// if (report == last_report) return;
|
||||||
|
|
||||||
// if (last_report.status != report.status) {
|
// if (last_report.status != report.status) {
|
||||||
txtStatus->set_value(grbl::status_to_string(cnc.get_status().status));
|
txt_status->set_value(grbl::status_to_string(cnc.get_status().status));
|
||||||
|
|
||||||
if (cnc.get_status().status == grbl::machine_status::alarm) {
|
if (cnc.get_status().status == grbl::machine_status::alarm) {
|
||||||
txtStatus->set_tooltip(grbl::alarm_to_string(last_alarm));
|
txt_status->set_tooltip(grbl::alarm_to_string(last_alarm));
|
||||||
} else {
|
} else {
|
||||||
txtStatus->set_tooltip(cnc.get_status().sub_status);
|
txt_status->set_tooltip(cnc.get_status().sub_status);
|
||||||
}
|
}
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -497,9 +505,18 @@ public:
|
|||||||
|
|
||||||
void update_dro() {
|
void update_dro() {
|
||||||
auto work_pos = cnc.get_work_pos();
|
auto work_pos = cnc.get_work_pos();
|
||||||
mpos_x_text->set_value(std::to_string(work_pos[0]));
|
|
||||||
mpos_y_text->set_value(std::to_string(work_pos[1]));
|
dro_ss.str("");
|
||||||
mpos_z_text->set_value(std::to_string(work_pos[2]));
|
dro_ss << work_pos[0];
|
||||||
|
mpos_x_text->set_value(dro_ss.str());
|
||||||
|
|
||||||
|
dro_ss.str("");
|
||||||
|
dro_ss << work_pos[1];
|
||||||
|
mpos_y_text->set_value(dro_ss.str());
|
||||||
|
|
||||||
|
dro_ss.str("");
|
||||||
|
dro_ss << work_pos[2];
|
||||||
|
mpos_z_text->set_value(dro_ss.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_banner(std::string line) override {
|
void on_banner(std::string line) override {
|
||||||
@@ -515,12 +532,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void on_check_completed(bool success, size_t failed_index, size_t error) override {
|
void on_check_completed(bool success, size_t failed_index, size_t error) override {
|
||||||
btnCheckProgram->set_background_color(success ? colGreen : colRed);
|
btn_check_program->set_background_color(success ? colGreen : color_red);
|
||||||
if (success) {
|
if (success) {
|
||||||
btnRunProgram->set_enabled(true);
|
btn_run_program->set_enabled(true);
|
||||||
new MessageDialog(this, MessageDialog::Type::Information, "Check result", "Program checked successfully");
|
new MessageDialog(this, MessageDialog::Type::Information, "Check result", "Program checked successfully");
|
||||||
} else {
|
} else {
|
||||||
btnRunProgram->set_enabled(false);
|
btn_run_program->set_enabled(false);
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
auto i = pgm.instruction_at(failed_index);
|
auto i = pgm.instruction_at(failed_index);
|
||||||
ss << "Program check failed at line " << i.line << " (" << i.command << "). Error: " << error << ", "
|
ss << "Program check failed at line " << i.line << " (" << i.command << "). Error: " << error << ", "
|
||||||
@@ -530,7 +547,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void on_run_completed(bool success, size_t failed_index, size_t error) override {
|
void on_run_completed(bool success, size_t failed_index, size_t error) override {
|
||||||
btnRunProgram->set_background_color(success ? colGreen : colRed);
|
btn_run_program->set_background_color(success ? colGreen : color_red);
|
||||||
if (success) {
|
if (success) {
|
||||||
new MessageDialog(this, MessageDialog::Type::Information, "Run result", "Program executed successfully");
|
new MessageDialog(this, MessageDialog::Type::Information, "Run result", "Program executed successfully");
|
||||||
} else {
|
} else {
|
||||||
@@ -682,7 +699,7 @@ public:
|
|||||||
Widget::draw(ctx);
|
Widget::draw(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void draw_contents() {
|
void draw_contents() override {
|
||||||
auto fb_size = framebuffer_size();
|
auto fb_size = framebuffer_size();
|
||||||
|
|
||||||
// start rendering
|
// start rendering
|
||||||
|
|||||||
Reference in New Issue
Block a user