Clewar feed hold when alarm is cleared
[clinton/Smoothieware.git] / src / libs / Kernel.cpp
index 43f1cb8..58793d3 100644 (file)
 #include "EndstopsPublicAccess.h"
 #include "Configurator.h"
 #include "SimpleShell.h"
+#include "TemperatureControlPublicAccess.h"
+
+#ifndef NO_TOOLS_LASER
+#include "Laser.h"
+#endif
 
 #include "platform_memory.h"
 
@@ -35,6 +40,7 @@
 #include <array>
 #include <string>
 
+#define laser_checksum CHECKSUM("laser")
 #define baud_rate_setting_checksum CHECKSUM("baud_rate")
 #define uart0_checksum             CHECKSUM("uart0")
 
@@ -175,17 +181,17 @@ std::string Kernel::get_query_string()
 
     str.append("<");
     if(halted) {
-        str.append("Alarm,");
+        str.append("Alarm");
     } else if(homing) {
         running = true;
-        str.append("Home,");
+        str.append("Home");
     } else if(feed_hold) {
-        str.append("Hold,");
+        str.append("Hold");
     } else if(this->conveyor->is_idle()) {
-        str.append("Idle,");
+        str.append("Idle");
     } else {
         running = true;
-        str.append("Run,");
+        str.append("Run");
     }
 
     if(running) {
@@ -196,14 +202,17 @@ std::string Kernel::get_query_string()
 
         char buf[128];
         // machine position
-        size_t n = snprintf(buf, sizeof(buf), "%1.4f,%1.4f,%1.4f,", robot->from_millimeters(mpos[0]), robot->from_millimeters(mpos[1]), robot->from_millimeters(mpos[2]));
-        str.append("MPos:").append(buf, n);
+        size_t n = snprintf(buf, sizeof(buf), "%1.4f,%1.4f,%1.4f", robot->from_millimeters(mpos[0]), robot->from_millimeters(mpos[1]), robot->from_millimeters(mpos[2]));
+        if(n > sizeof(buf)) n= sizeof(buf);
+
+        str.append("|MPos:").append(buf, n);
 
 #if MAX_ROBOT_ACTUATORS > 3
         // deal with the ABC axis (E will be A)
         for (int i = A_AXIS; i < robot->get_number_registered_motors(); ++i) {
             // current actuator position
-            n = snprintf(buf, sizeof(buf), "%1.4f,", robot->from_millimeters(robot->actuators[i]->get_current_position()));
+            n = snprintf(buf, sizeof(buf), ",%1.4f", robot->from_millimeters(robot->actuators[i]->get_current_position()));
+            if(n > sizeof(buf)) n= sizeof(buf);
             str.append(buf, n);
         }
 #endif
@@ -211,21 +220,46 @@ std::string Kernel::get_query_string()
         // work space position
         Robot::wcs_t pos = robot->mcs2wcs(mpos);
         n = snprintf(buf, sizeof(buf), "%1.4f,%1.4f,%1.4f", robot->from_millimeters(std::get<X_AXIS>(pos)), robot->from_millimeters(std::get<Y_AXIS>(pos)), robot->from_millimeters(std::get<Z_AXIS>(pos)));
-        str.append("WPos:").append(buf, n);
-        str.append(">\r\n");
+        if(n > sizeof(buf)) n= sizeof(buf);
+
+        str.append("|WPos:").append(buf, n);
+        // current feedrate
+        float fr= robot->from_millimeters(conveyor->get_current_feedrate()*60.0F);
+        n = snprintf(buf, sizeof(buf), "|F:%1.4f", fr);
+        if(n > sizeof(buf)) n= sizeof(buf);
+        str.append(buf, n);
+        float sr= robot->get_s_value();
+        n = snprintf(buf, sizeof(buf), "|S:%1.4f", sr);
+        if(n > sizeof(buf)) n= sizeof(buf);
+        str.append(buf, n);
+
+        // current Laser power
+        #ifndef NO_TOOLS_LASER
+            Laser *plaser= nullptr;
+            if(PublicData::get_value(laser_checksum, (void *)&plaser) && plaser != nullptr) {
+               float lp= plaser->get_current_power();
+                n = snprintf(buf, sizeof(buf), "|L:%1.4f", lp);
+                if(n > sizeof(buf)) n= sizeof(buf);
+                str.append(buf, n);
+            }
+        #endif
 
     } else {
         // return the last milestone if idle
         char buf[128];
         // machine position
         Robot::wcs_t mpos = robot->get_axis_position();
-        size_t n = snprintf(buf, sizeof(buf), "%1.4f,%1.4f,%1.4f,", robot->from_millimeters(std::get<X_AXIS>(mpos)), robot->from_millimeters(std::get<Y_AXIS>(mpos)), robot->from_millimeters(std::get<Z_AXIS>(mpos)));
-        str.append("MPos:").append(buf, n);
+        size_t n = snprintf(buf, sizeof(buf), "%1.4f,%1.4f,%1.4f", robot->from_millimeters(std::get<X_AXIS>(mpos)), robot->from_millimeters(std::get<Y_AXIS>(mpos)), robot->from_millimeters(std::get<Z_AXIS>(mpos)));
+        if(n > sizeof(buf)) n= sizeof(buf);
+
+        str.append("|MPos:").append(buf, n);
+
 #if MAX_ROBOT_ACTUATORS > 3
         // deal with the ABC axis (E will be A)
         for (int i = A_AXIS; i < robot->get_number_registered_motors(); ++i) {
             // current actuator position
-            n = snprintf(buf, sizeof(buf), "%1.4f,", robot->from_millimeters(robot->actuators[i]->get_current_position()));
+            n = snprintf(buf, sizeof(buf), ",%1.4f", robot->from_millimeters(robot->actuators[i]->get_current_position()));
+            if(n > sizeof(buf)) n= sizeof(buf);
             str.append(buf, n);
         }
 #endif
@@ -233,10 +267,32 @@ std::string Kernel::get_query_string()
         // work space position
         Robot::wcs_t pos = robot->mcs2wcs(mpos);
         n = snprintf(buf, sizeof(buf), "%1.4f,%1.4f,%1.4f", robot->from_millimeters(std::get<X_AXIS>(pos)), robot->from_millimeters(std::get<Y_AXIS>(pos)), robot->from_millimeters(std::get<Z_AXIS>(pos)));
-        str.append("WPos:").append(buf, n);
-        str.append(">\r\n");
+        if(n > sizeof(buf)) n= sizeof(buf);
+        str.append("|WPos:").append(buf, n);
 
+        float fr= robot->from_millimeters(robot->get_feed_rate());
+        n = snprintf(buf, sizeof(buf), "|F:%1.4f", fr);
+        if(n > sizeof(buf)) n= sizeof(buf);
+        str.append(buf, n);
     }
+
+    // if not grbl mode get temperatures
+    if(!is_grbl_mode()) {
+        struct pad_temperature temp;
+        // scan all temperature controls
+        std::vector<struct pad_temperature> controllers;
+        bool ok = PublicData::get_value(temperature_control_checksum, poll_controls_checksum, &controllers);
+        if (ok) {
+            char buf[32];
+            for (auto &c : controllers) {
+                size_t n= snprintf(buf, sizeof(buf), "|%s:%1.1f,%1.1f", c.designator.c_str(), c.current_temperature, c.target_temperature);
+                if(n > sizeof(buf)) n= sizeof(buf);
+                str.append(buf, n);
+            }
+        }
+    }
+
+    str.append(">\n");
     return str;
 }
 
@@ -258,6 +314,7 @@ void Kernel::call_event(_EVENT_ENUM id_event, void * argument)
     bool was_idle = true;
     if(id_event == ON_HALT) {
         this->halted = (argument == nullptr);
+        if(!this->halted && this->feed_hold) this->feed_hold= false; // also clear feed hold
         was_idle = conveyor->is_idle(); // see if we were doing anything like printing
     }