#pragma once #include "grbl_communication.h" #include "grbl.h" namespace grbl { enum class grbl_machine_state { init, run_program, idle, }; enum class jog_direction { up, down, left, right, up_left, up_right, down_left, down_right }; struct jog_state { bool left_pressed = false; bool right_pressed = false; bool up_pressed = false; bool down_pressed = false; bool z_up_pressed = false; bool z_down_pressed = false; bool speed_fast_pressed = false; bool speed_slow_pressed = false; bool no_jogging() const; }; static bool operator==(const jog_state& a, const jog_state& b) { if (a.left_pressed != b.left_pressed || a.right_pressed != b.right_pressed || a.up_pressed != b.up_pressed || a.down_pressed != b.down_pressed || a.z_up_pressed != b.z_up_pressed || a.z_down_pressed != b.z_down_pressed || a.speed_fast_pressed != b.speed_fast_pressed || a.speed_slow_pressed != b.speed_slow_pressed) { return false; } return true; } static bool operator!=(const jog_state& a, const jog_state& b) { return !(a == b); } struct machine : public transport_callbacks { machine(); ~machine(); void connect(); void run_program(grbl::program pgm); void request_jog(jog_state jog) const; void cancel_jog() const; void on_connected(transport *transport) override; void on_disconnected(transport *transport) override; void on_line_received(std::string line, transport *transport) override; void on_banner(std::string version, transport *transport) override; transport *pipe = nullptr; grbl_machine_state state = grbl_machine_state::init; program running_program; size_t executed_instructions = 0; void continue_program(); }; }