+ str.append("Alarm");
+ } else if(homing) {
+ running = true;
+ str.append("Home");
+ } else if(feed_hold) {
+ str.append("Hold");
+ } else if(this->conveyor->is_idle()) {
+ str.append("Idle");
+ } else {
+ running = true;
+ str.append("Run");
+ }
+
+ if(running) {
+ float mpos[3];
+ robot->get_current_machine_position(mpos);
+ // current_position/mpos includes the compensation transform so we need to get the inverse to get actual position
+ if(robot->compensationTransform) robot->compensationTransform(mpos, true); // get inverse compensation transform
+
+ 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]));
+ 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()));
+ if(n > sizeof(buf)) n= sizeof(buf);
+ str.append(buf, n);
+ }
+#endif
+
+ // 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)));
+ 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)));
+ 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()));
+ if(n > sizeof(buf)) n= sizeof(buf);
+ str.append(buf, n);
+ }
+#endif
+
+ // 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)));
+ 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);