From 1ee2b2504a7b64ec16e4f9684256d420733c971e Mon Sep 17 00:00:00 2001 From: bdring Date: Fri, 8 Sep 2023 14:22:08 -0500 Subject: [PATCH 1/5] Basic functionality. --- FluidNC/src/Machine/MachineConfig.cpp | 1 + FluidNC/src/Machine/MachineConfig.h | 2 + FluidNC/src/Main.cpp | 4 ++ FluidNC/src/Status_outputs.cpp | 86 +++++++++++++++++++++++++++ FluidNC/src/Status_outputs.h | 58 ++++++++++++++++++ 5 files changed, 151 insertions(+) create mode 100644 FluidNC/src/Status_outputs.cpp create mode 100644 FluidNC/src/Status_outputs.h diff --git a/FluidNC/src/Machine/MachineConfig.cpp b/FluidNC/src/Machine/MachineConfig.cpp index 170030ddb..21f461066 100644 --- a/FluidNC/src/Machine/MachineConfig.cpp +++ b/FluidNC/src/Machine/MachineConfig.cpp @@ -66,6 +66,7 @@ namespace Machine { handler.section("user_outputs", _userOutputs); handler.section("oled", _oled); + handler.section("status_outputs", _stat_out); Spindles::SpindleFactory::factory(handler, _spindles); diff --git a/FluidNC/src/Machine/MachineConfig.h b/FluidNC/src/Machine/MachineConfig.h index 9541141bc..9f33ae328 100644 --- a/FluidNC/src/Machine/MachineConfig.h +++ b/FluidNC/src/Machine/MachineConfig.h @@ -20,6 +20,7 @@ #include "../Stepper.h" #include "../Config.h" #include "../OLED.h" +#include "../Status_outputs.h" #include "Axes.h" #include "SPIBus.h" #include "I2CBus.h" @@ -74,6 +75,7 @@ namespace Machine { Start* _start = nullptr; Parking* _parking = nullptr; OLED* _oled = nullptr; + Status_Outputs* _stat_out = nullptr; Spindles::SpindleList _spindles; UartChannel* _uart_channels[MAX_N_UARTS] = { nullptr }; diff --git a/FluidNC/src/Main.cpp b/FluidNC/src/Main.cpp index 6da6ed47e..2e47ccc3e 100644 --- a/FluidNC/src/Main.cpp +++ b/FluidNC/src/Main.cpp @@ -96,6 +96,10 @@ void setup() { config->_oled->init(); } + if (config->_stat_out) { + config->_stat_out->init(); + } + config->_stepping->init(); // Configure stepper interrupt timers plan_init(); diff --git a/FluidNC/src/Status_outputs.cpp b/FluidNC/src/Status_outputs.cpp new file mode 100644 index 000000000..f1034ee82 --- /dev/null +++ b/FluidNC/src/Status_outputs.cpp @@ -0,0 +1,86 @@ +// Copyright (c) 2023 - Bart Dring +// Use of this source code is governed by a GPLv3 license that can be found in the LICENSE file. + +/* + This is a class for status "Idle,Run,Hold,Alarm" pins. + + This can be used for Tower lights,etc. +*/ +#include "Status_outputs.h" + +#include "Machine/MachineConfig.h" + +void Status_Outputs::afterParse() {} + +void Status_Outputs::init() { + if (_error) { + return; + } + + if (_Idle_pin.defined()) { + _Idle_pin.setAttr(Pin::Attr::Output); + } + + if (_Run_pin.defined()) { + _Run_pin.setAttr(Pin::Attr::Output); + } + + if (_Hold_pin.defined()) { + _Hold_pin.setAttr(Pin::Attr::Output); + } + + if (_Alarm_pin.defined()) { + _Alarm_pin.setAttr(Pin::Attr::Output); + } + + log_info("Status outputs: " + << " Idle:" << _Idle_pin.name() << " Cycle:" << _Run_pin.name() << " Hold:" << _Hold_pin.name() + << " Alarm:" << _Alarm_pin.name()); + + allChannels.registration(this); + setReportInterval(500); +} + +void Status_Outputs::parse_report() { + if (_report.rfind("<", 0) == 0) { + parse_status_report(); + return; + } +} + +// This is how the OLED driver receives channel data +size_t Status_Outputs::write(uint8_t data) { + char c = data; + if (c == '\r') { + return 1; + } + if (c == '\n') { + parse_report(); + _report = ""; + return 1; + } + _report += c; + return 1; +} + +Channel* Status_Outputs::pollLine(char* line) { + autoReport(); + return nullptr; +} + +void Status_Outputs::parse_status_report() { + if (_report.back() == '>') { + _report.pop_back(); + } + // Now the string is a sequence of field|field|field + size_t pos = 0; + auto nextpos = _report.find_first_of("|", pos); + _state = _report.substr(pos + 1, nextpos - pos - 1); + + log_info("State:" << _state); + + _Idle_pin.write(_state == "Idle"); + _Run_pin.write(_state == "Run"); + _Hold_pin.write(_state.substr(0, 4) == "Hold"); + _Alarm_pin.write(_state == "Alarm"); +} diff --git a/FluidNC/src/Status_outputs.h b/FluidNC/src/Status_outputs.h new file mode 100644 index 000000000..b76e84a08 --- /dev/null +++ b/FluidNC/src/Status_outputs.h @@ -0,0 +1,58 @@ +#pragma once + +#include "Config.h" + +#include "Configuration/Configurable.h" + +#include "Channel.h" + +typedef const uint8_t* font_t; + +class Status_Outputs : public Channel, public Configuration::Configurable { + Pin _Idle_pin; + Pin _Run_pin; + Pin _Hold_pin; + Pin _Alarm_pin; + +public: +private: + std::string _report; + std::string _state; + + void parse_report(); + void parse_status_report(); + + bool _error = false; + +public: + Status_Outputs() : Channel("status_outputs") {} + + Status_Outputs(const Status_Outputs&) = delete; + Status_Outputs(Status_Outputs&&) = delete; + Status_Outputs& operator=(const Status_Outputs&) = delete; + Status_Outputs& operator=(Status_Outputs&&) = delete; + + virtual ~Status_Outputs() = default; + + void init(); + + size_t write(uint8_t data) override; + + Channel* pollLine(char* line) override; + void flushRx() override {} + + bool lineComplete(char*, char) override { return false; } + size_t timedReadBytes(char* buffer, size_t length, TickType_t timeout) override { return 0; } + + // Configuration handlers: + void validate() override {} + + void afterParse() override; + + void group(Configuration::HandlerBase& handler) override { + handler.item("idle_pin", _Idle_pin); + handler.item("run_pin", _Run_pin); + handler.item("hold_pin", _Hold_pin); + handler.item("alarm_pin", _Alarm_pin); + } +}; From 84ab119bc003dd922a3124d300da51154ae18ce8 Mon Sep 17 00:00:00 2001 From: bdring Date: Fri, 8 Sep 2023 16:04:27 -0500 Subject: [PATCH 2/5] Cleanup --- FluidNC/src/Status_outputs.cpp | 8 +++----- FluidNC/src/Status_outputs.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/FluidNC/src/Status_outputs.cpp b/FluidNC/src/Status_outputs.cpp index f1034ee82..812d5e2ee 100644 --- a/FluidNC/src/Status_outputs.cpp +++ b/FluidNC/src/Status_outputs.cpp @@ -10,8 +10,6 @@ #include "Machine/MachineConfig.h" -void Status_Outputs::afterParse() {} - void Status_Outputs::init() { if (_error) { return; @@ -33,9 +31,9 @@ void Status_Outputs::init() { _Alarm_pin.setAttr(Pin::Attr::Output); } - log_info("Status outputs: " - << " Idle:" << _Idle_pin.name() << " Cycle:" << _Run_pin.name() << " Hold:" << _Hold_pin.name() - << " Alarm:" << _Alarm_pin.name()); + // log_info("Status outputs: " + // << " Idle:" << _Idle_pin.name() << " Cycle:" << _Run_pin.name() << " Hold:" << _Hold_pin.name() + // << " Alarm:" << _Alarm_pin.name()); allChannels.registration(this); setReportInterval(500); diff --git a/FluidNC/src/Status_outputs.h b/FluidNC/src/Status_outputs.h index b76e84a08..1e446488c 100644 --- a/FluidNC/src/Status_outputs.h +++ b/FluidNC/src/Status_outputs.h @@ -47,7 +47,7 @@ class Status_Outputs : public Channel, public Configuration::Configurable { // Configuration handlers: void validate() override {} - void afterParse() override; + void afterParse() override {}; void group(Configuration::HandlerBase& handler) override { handler.item("idle_pin", _Idle_pin); From db3b2ed4551ed0502aa6e9a0336597cebfe0719d Mon Sep 17 00:00:00 2001 From: bdring Date: Sun, 10 Sep 2023 10:32:46 -0500 Subject: [PATCH 3/5] Cleanup --- FluidNC/src/Status_outputs.cpp | 5 ----- FluidNC/src/Status_outputs.h | 5 ----- 2 files changed, 10 deletions(-) diff --git a/FluidNC/src/Status_outputs.cpp b/FluidNC/src/Status_outputs.cpp index 812d5e2ee..d93b197d8 100644 --- a/FluidNC/src/Status_outputs.cpp +++ b/FluidNC/src/Status_outputs.cpp @@ -7,14 +7,9 @@ This can be used for Tower lights,etc. */ #include "Status_outputs.h" - #include "Machine/MachineConfig.h" void Status_Outputs::init() { - if (_error) { - return; - } - if (_Idle_pin.defined()) { _Idle_pin.setAttr(Pin::Attr::Output); } diff --git a/FluidNC/src/Status_outputs.h b/FluidNC/src/Status_outputs.h index 1e446488c..54083b150 100644 --- a/FluidNC/src/Status_outputs.h +++ b/FluidNC/src/Status_outputs.h @@ -1,9 +1,7 @@ #pragma once #include "Config.h" - #include "Configuration/Configurable.h" - #include "Channel.h" typedef const uint8_t* font_t; @@ -22,8 +20,6 @@ class Status_Outputs : public Channel, public Configuration::Configurable { void parse_report(); void parse_status_report(); - bool _error = false; - public: Status_Outputs() : Channel("status_outputs") {} @@ -46,7 +42,6 @@ class Status_Outputs : public Channel, public Configuration::Configurable { // Configuration handlers: void validate() override {} - void afterParse() override {}; void group(Configuration::HandlerBase& handler) override { From 5063b4af74ac12f86feb1beff3b63025866a714f Mon Sep 17 00:00:00 2001 From: bdring Date: Sun, 10 Sep 2023 13:33:19 -0500 Subject: [PATCH 4/5] Added interval item. --- FluidNC/src/Status_outputs.cpp | 10 ++++------ FluidNC/src/Status_outputs.h | 4 ++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/FluidNC/src/Status_outputs.cpp b/FluidNC/src/Status_outputs.cpp index d93b197d8..2ed99b8f5 100644 --- a/FluidNC/src/Status_outputs.cpp +++ b/FluidNC/src/Status_outputs.cpp @@ -26,12 +26,12 @@ void Status_Outputs::init() { _Alarm_pin.setAttr(Pin::Attr::Output); } - // log_info("Status outputs: " - // << " Idle:" << _Idle_pin.name() << " Cycle:" << _Run_pin.name() << " Hold:" << _Hold_pin.name() - // << " Alarm:" << _Alarm_pin.name()); + log_info("Status outputs" + << " Interval:" << _interval_ms << " Idle:" << _Idle_pin.name() << " Cycle:" << _Run_pin.name() << " Hold:" << _Hold_pin.name() + << " Alarm:" << _Alarm_pin.name()); allChannels.registration(this); - setReportInterval(500); + setReportInterval(_interval_ms); } void Status_Outputs::parse_report() { @@ -70,8 +70,6 @@ void Status_Outputs::parse_status_report() { auto nextpos = _report.find_first_of("|", pos); _state = _report.substr(pos + 1, nextpos - pos - 1); - log_info("State:" << _state); - _Idle_pin.write(_state == "Idle"); _Run_pin.write(_state == "Run"); _Hold_pin.write(_state.substr(0, 4) == "Hold"); diff --git a/FluidNC/src/Status_outputs.h b/FluidNC/src/Status_outputs.h index 54083b150..d31cb5378 100644 --- a/FluidNC/src/Status_outputs.h +++ b/FluidNC/src/Status_outputs.h @@ -17,6 +17,8 @@ class Status_Outputs : public Channel, public Configuration::Configurable { std::string _report; std::string _state; + int _interval_ms = 500; + void parse_report(); void parse_status_report(); @@ -45,9 +47,11 @@ class Status_Outputs : public Channel, public Configuration::Configurable { void afterParse() override {}; void group(Configuration::HandlerBase& handler) override { + handler.item("interval_ms", _interval_ms, 100, 5000); handler.item("idle_pin", _Idle_pin); handler.item("run_pin", _Run_pin); handler.item("hold_pin", _Hold_pin); handler.item("alarm_pin", _Alarm_pin); + } }; From fb2078a557ab556b3985e7a563bac78310af64ff Mon Sep 17 00:00:00 2001 From: bdring Date: Sun, 10 Sep 2023 13:34:20 -0500 Subject: [PATCH 5/5] Update Status_outputs.h --- FluidNC/src/Status_outputs.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/FluidNC/src/Status_outputs.h b/FluidNC/src/Status_outputs.h index d31cb5378..793624288 100644 --- a/FluidNC/src/Status_outputs.h +++ b/FluidNC/src/Status_outputs.h @@ -47,11 +47,10 @@ class Status_Outputs : public Channel, public Configuration::Configurable { void afterParse() override {}; void group(Configuration::HandlerBase& handler) override { - handler.item("interval_ms", _interval_ms, 100, 5000); + handler.item("report_interval_ms", _interval_ms, 100, 5000); handler.item("idle_pin", _Idle_pin); handler.item("run_pin", _Run_pin); handler.item("hold_pin", _Hold_pin); handler.item("alarm_pin", _Alarm_pin); - } };