Introduced machine state handlers (check and run still need work).

Added proper init handler, fetching settings and parameters and exposing them to UI.
Added spindle rendering.
This commit is contained in:
2023-05-04 14:15:33 +03:00
parent a63d58a1ec
commit cacbe1b8aa
5 changed files with 842 additions and 200 deletions
+99 -1
View File
@@ -1,5 +1,7 @@
#pragma once
#include <map>
#include <unordered_map>
#include "grbl_communication.h"
#include "grbl.h"
@@ -23,6 +25,7 @@ machine_status status_from_string(const std::string& status);
std::string status_to_string(const machine_status& status);
std::string alarm_to_string(int alarm);
std::string error_to_string(size_t error);
std::string setting_description(int number);
struct realtime_status_report {
machine_status status;
@@ -61,6 +64,7 @@ inline bool operator==(const realtime_status_report& a, const realtime_status_re
realtime_status_report parse_status_report(std::string line, grbl::realtime_status_report& result);
enum class grbl_machine_state {
disconnected,
init,
run_program,
check_program,
@@ -105,10 +109,89 @@ struct machine_listener {
virtual void on_banner(std::string line) = 0;
virtual void on_message(std::string message) = 0;
virtual void on_alarm(int alarm) = 0;
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;
};
enum class init_stage {
start,
set_work_pos,
fetch_settings,
fetch_parameters
};
struct machine;
struct machine_state {
virtual void on_connected(machine *m) = 0;
virtual void on_disconnected(machine *m) = 0;
virtual void on_enter(machine *m) = 0;
virtual void on_exit(machine *m) = 0;
virtual void on_line_received(std::string line) = 0;
};
struct machine_state_connect : public machine_state {
void on_connected(machine *m) override;
void on_disconnected(machine *m) override;
void on_enter(machine *m) override;
void on_exit(machine *m) override;
void on_line_received(std::string line) override;
machine *cnc;
};
struct machine_state_init : public machine_state {
void on_connected(machine *m) override;
void on_disconnected(machine *m) override;
void on_enter(machine *m) override;
void on_exit(machine *m) override;
void on_line_received(std::string line) override;
init_stage init_state = init_stage::start;
void move_to_next_init_stage();
machine* cnc;
};
struct machine_state_idle : public machine_state {
void on_connected(machine *m) override;
void on_disconnected(machine *m) override;
void on_enter(machine *m) override;
void on_exit(machine *m) override;
void on_line_received(std::string line) override;
machine *cnc;
};
struct machine_state_check_program : public machine_state {
void on_connected(machine *m) override;
void on_disconnected(machine *m) override;
void on_enter(machine *m) override;
void on_exit(machine *m) override;
void on_line_received(std::string line) override;
};
struct machine_state_run_program : public machine_state {
void on_connected(machine *m) override;
void on_disconnected(machine *m) override;
void on_enter(machine *m) override;
void on_exit(machine *m) override;
void on_line_received(std::string line) override;
};
struct settings_cmp {
bool operator()(const std::string& a, const std::string& b) const {
return std::stoi(a.substr(1)) < std::stoi(b.substr(1));
}
};
struct parameters_cmp {
bool operator()(const std::string& a, const std::string& b) const {
return a < b;
}
};
struct machine : public transport_callbacks {
machine();
~machine();
@@ -121,6 +204,8 @@ struct machine : public transport_callbacks {
void cancel_jog() const;
[[nodiscard]] realtime_status_report get_status() const { return last_report; };
const std::map<std::string, std::string, settings_cmp>& get_settings() const;
const std::map<std::string, std::string, parameters_cmp>& get_parameters() const;
void request_unlock();
void request_home();
@@ -129,15 +214,28 @@ struct machine : public transport_callbacks {
void request_cycle_start();
void request_feed_hold();
protected:
void on_connected(transport *transport) override;
void on_disconnected(transport *transport) override;
void on_line_received(std::string line, transport *transport) override;
void switch_to_state(grbl_machine_state new_state);
friend class machine_state_connect;
friend class machine_state_init;
friend class machine_state_idle;
friend class machine_state_check_program;
friend class machine_state_run_program;
std::map<grbl_machine_state, machine_state *> states;
std::map<std::string, std::string, settings_cmp> settings;
std::map<std::string, std::string, parameters_cmp> parameters;
realtime_status_report last_report{};
machine_listener *listener = nullptr;
transport *pipe = nullptr;
grbl_machine_state state = grbl_machine_state::init;
grbl_machine_state state = grbl_machine_state::disconnected;
program running_program;
size_t executed_instructions = 0;
bool entered_check_mode = false;