#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define STB_IMAGE_STATIC #define STB_IMAGE_IMPLEMENTATION #if defined(_MSC_VER) # pragma warning (disable: 4505) // don't warn about dead code in stb_image.h #elif defined(__GNUC__) # pragma GCC diagnostic ignored "-Wunused-function" #endif #include #include "grbl.h" #include #include #include "grbl_machine.h" #include "string_utils.h" #include "render.h" #include "glm/gtx/quaternion.hpp" #include "nanogui/nanogui.h" #include #include #include // glm::vec3 #include // glm::vec4 #include // glm::mat4 #include // glm::translate, glm::rotate, glm::scale #include // glm::perspective #include // glm::pi using namespace nanogui; grbl::machine cnc{}; class SenderApp : public Screen, public grbl::machine_listener { public: Window *window; grbl::jog_state jog; TextArea *lblStatus, *lblSubstatus; nanogui::Color colRed = nanogui::Color(255, 0, 0, 255); nanogui::Color colGreen = nanogui::Color(0, 255, 0, 255); nanogui::Color colBg; int last_alarm = 0; grbl::program pgm; Button *btnLoadProgram, *btnCheckProgram, *btnRunProgram; grbl::program_renderer renderer; glm::vec3 cam_target = glm::vec3(0); float cam_zoom = 0; glm::quat cam_src_rotation = glm::quat(1.0, 0.0, 0.0, 0.0); // identity quaternion TabWidget *tab_widget; VScrollPanel *settings_vscroll; Widget *settings_layer; VScrollPanel *parameters_vscroll; Widget *parameters_layer; TextBox *mpos_x_text, *mpos_y_text, *mpos_z_text; ComboBox *cboOffset, *cboTool; SenderApp() : Screen(Vector2i(1024, 768), "GRBL Sender") { inc_ref(); // save regular button color colBg = theme()->m_button_gradient_bot_focused; // create main window window = new Window(this, "Machine status"); window->set_fixed_height((Screen::size().y() - 40) / 2); window->set_position(Vector2i(0, 0)); window->set_layout(new BoxLayout(nanogui::Orientation::Vertical)); tab_widget = window->add(); tab_widget->set_callback([&](int index) { if (index == 1 || index == 2) { perform_layout(); } tab_widget->set_selected_index(index); }); tab_widget->set_fixed_height((this->height() - 100) / 2); Widget *layer = new Widget(tab_widget); layer->set_layout(new GroupLayout()); tab_widget->append_tab("Info", layer); new Label(layer, "Status", "sans-bold"); Widget *status_holder = new Widget(layer); status_holder->set_layout(new GridLayout()); lblStatus = layer->add