Committer:
Sergunb
Date:
Mon Sep 04 12:04:13 2017 +0000
Revision:
0:8f0d870509fe
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sergunb 0:8f0d870509fe 1 /*
Sergunb 0:8f0d870509fe 2 report.c - reporting and messaging methods
Sergunb 0:8f0d870509fe 3 Part of Grbl
Sergunb 0:8f0d870509fe 4
Sergunb 0:8f0d870509fe 5 Copyright (c) 2012-2016 Sungeun K. Jeon for Gnea Research LLC
Sergunb 0:8f0d870509fe 6
Sergunb 0:8f0d870509fe 7 Grbl is free software: you can redistribute it and/or modify
Sergunb 0:8f0d870509fe 8 it under the terms of the GNU General Public License as published by
Sergunb 0:8f0d870509fe 9 the Free Software Foundation, either version 3 of the License, or
Sergunb 0:8f0d870509fe 10 (at your option) any later version.
Sergunb 0:8f0d870509fe 11
Sergunb 0:8f0d870509fe 12 Grbl is distributed in the hope that it will be useful,
Sergunb 0:8f0d870509fe 13 but WITHOUT ANY WARRANTY; without even the implied warranty of
Sergunb 0:8f0d870509fe 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Sergunb 0:8f0d870509fe 15 GNU General Public License for more details.
Sergunb 0:8f0d870509fe 16
Sergunb 0:8f0d870509fe 17 You should have received a copy of the GNU General Public License
Sergunb 0:8f0d870509fe 18 along with Grbl. If not, see <http://www.gnu.org/licenses/>.
Sergunb 0:8f0d870509fe 19 */
Sergunb 0:8f0d870509fe 20
Sergunb 0:8f0d870509fe 21 /*
Sergunb 0:8f0d870509fe 22 This file functions as the primary feedback interface for Grbl. Any outgoing data, such
Sergunb 0:8f0d870509fe 23 as the protocol status messages, feedback messages, and status reports, are stored here.
Sergunb 0:8f0d870509fe 24 For the most part, these functions primarily are called from protocol.c methods. If a
Sergunb 0:8f0d870509fe 25 different style feedback is desired (i.e. JSON), then a user can change these following
Sergunb 0:8f0d870509fe 26 methods to accomodate their needs.
Sergunb 0:8f0d870509fe 27 */
Sergunb 0:8f0d870509fe 28
Sergunb 0:8f0d870509fe 29 #include "grbl.h"
Sergunb 0:8f0d870509fe 30
Sergunb 0:8f0d870509fe 31
Sergunb 0:8f0d870509fe 32 // Internal report utilities to reduce flash with repetitive tasks turned into functions.
Sergunb 0:8f0d870509fe 33 void report_util_setting_prefix(uint8_t n) { serial_write('$'); print_uint8_base10(n); serial_write('='); }
Sergunb 0:8f0d870509fe 34 static void report_util_line_feed() { printPgmString(PSTR("\r\n")); }
Sergunb 0:8f0d870509fe 35 static void report_util_feedback_line_feed() { serial_write(']'); report_util_line_feed(); }
Sergunb 0:8f0d870509fe 36 static void report_util_gcode_modes_G() { printPgmString(PSTR(" G")); }
Sergunb 0:8f0d870509fe 37 static void report_util_gcode_modes_M() { printPgmString(PSTR(" M")); }
Sergunb 0:8f0d870509fe 38 // static void report_util_comment_line_feed() { serial_write(')'); report_util_line_feed(); }
Sergunb 0:8f0d870509fe 39 static void report_util_axis_values(float *axis_value) {
Sergunb 0:8f0d870509fe 40 uint8_t idx;
Sergunb 0:8f0d870509fe 41 for (idx=0; idx<N_AXIS; idx++) {
Sergunb 0:8f0d870509fe 42 printFloat_CoordValue(axis_value[idx]);
Sergunb 0:8f0d870509fe 43 if (idx < (N_AXIS-1)) { serial_write(','); }
Sergunb 0:8f0d870509fe 44 }
Sergunb 0:8f0d870509fe 45 }
Sergunb 0:8f0d870509fe 46
Sergunb 0:8f0d870509fe 47 /*
Sergunb 0:8f0d870509fe 48 static void report_util_setting_string(uint8_t n) {
Sergunb 0:8f0d870509fe 49 serial_write(' ');
Sergunb 0:8f0d870509fe 50 serial_write('(');
Sergunb 0:8f0d870509fe 51 switch(n) {
Sergunb 0:8f0d870509fe 52 case 0: printPgmString(PSTR("stp pulse")); break;
Sergunb 0:8f0d870509fe 53 case 1: printPgmString(PSTR("idl delay")); break;
Sergunb 0:8f0d870509fe 54 case 2: printPgmString(PSTR("stp inv")); break;
Sergunb 0:8f0d870509fe 55 case 3: printPgmString(PSTR("dir inv")); break;
Sergunb 0:8f0d870509fe 56 case 4: printPgmString(PSTR("stp en inv")); break;
Sergunb 0:8f0d870509fe 57 case 5: printPgmString(PSTR("lim inv")); break;
Sergunb 0:8f0d870509fe 58 case 6: printPgmString(PSTR("prb inv")); break;
Sergunb 0:8f0d870509fe 59 case 10: printPgmString(PSTR("rpt")); break;
Sergunb 0:8f0d870509fe 60 case 11: printPgmString(PSTR("jnc dev")); break;
Sergunb 0:8f0d870509fe 61 case 12: printPgmString(PSTR("arc tol")); break;
Sergunb 0:8f0d870509fe 62 case 13: printPgmString(PSTR("rpt inch")); break;
Sergunb 0:8f0d870509fe 63 case 20: printPgmString(PSTR("sft lim")); break;
Sergunb 0:8f0d870509fe 64 case 21: printPgmString(PSTR("hrd lim")); break;
Sergunb 0:8f0d870509fe 65 case 22: printPgmString(PSTR("hm cyc")); break;
Sergunb 0:8f0d870509fe 66 case 23: printPgmString(PSTR("hm dir inv")); break;
Sergunb 0:8f0d870509fe 67 case 24: printPgmString(PSTR("hm feed")); break;
Sergunb 0:8f0d870509fe 68 case 25: printPgmString(PSTR("hm seek")); break;
Sergunb 0:8f0d870509fe 69 case 26: printPgmString(PSTR("hm delay")); break;
Sergunb 0:8f0d870509fe 70 case 27: printPgmString(PSTR("hm pulloff")); break;
Sergunb 0:8f0d870509fe 71 case 30: printPgmString(PSTR("rpm max")); break;
Sergunb 0:8f0d870509fe 72 case 31: printPgmString(PSTR("rpm min")); break;
Sergunb 0:8f0d870509fe 73 case 32: printPgmString(PSTR("laser")); break;
Sergunb 0:8f0d870509fe 74 default:
Sergunb 0:8f0d870509fe 75 n -= AXIS_SETTINGS_START_VAL;
Sergunb 0:8f0d870509fe 76 uint8_t idx = 0;
Sergunb 0:8f0d870509fe 77 while (n >= AXIS_SETTINGS_INCREMENT) {
Sergunb 0:8f0d870509fe 78 n -= AXIS_SETTINGS_INCREMENT;
Sergunb 0:8f0d870509fe 79 idx++;
Sergunb 0:8f0d870509fe 80 }
Sergunb 0:8f0d870509fe 81 serial_write(n+'x');
Sergunb 0:8f0d870509fe 82 switch (idx) {
Sergunb 0:8f0d870509fe 83 case 0: printPgmString(PSTR(":stp/mm")); break;
Sergunb 0:8f0d870509fe 84 case 1: printPgmString(PSTR(":mm/min")); break;
Sergunb 0:8f0d870509fe 85 case 2: printPgmString(PSTR(":mm/s^2")); break;
Sergunb 0:8f0d870509fe 86 case 3: printPgmString(PSTR(":mm max")); break;
Sergunb 0:8f0d870509fe 87 }
Sergunb 0:8f0d870509fe 88 break;
Sergunb 0:8f0d870509fe 89 }
Sergunb 0:8f0d870509fe 90 report_util_comment_line_feed();
Sergunb 0:8f0d870509fe 91 }
Sergunb 0:8f0d870509fe 92 */
Sergunb 0:8f0d870509fe 93
Sergunb 0:8f0d870509fe 94 static void report_util_uint8_setting(uint8_t n, int val) {
Sergunb 0:8f0d870509fe 95 report_util_setting_prefix(n);
Sergunb 0:8f0d870509fe 96 print_uint8_base10(val);
Sergunb 0:8f0d870509fe 97 report_util_line_feed(); // report_util_setting_string(n);
Sergunb 0:8f0d870509fe 98 }
Sergunb 0:8f0d870509fe 99 static void report_util_float_setting(uint8_t n, float val, uint8_t n_decimal) {
Sergunb 0:8f0d870509fe 100 report_util_setting_prefix(n);
Sergunb 0:8f0d870509fe 101 printFloat(val, n_decimal);
Sergunb 0:8f0d870509fe 102 report_util_line_feed(); // report_util_setting_string(n);
Sergunb 0:8f0d870509fe 103 }
Sergunb 0:8f0d870509fe 104
Sergunb 0:8f0d870509fe 105 // Handles the primary confirmation protocol response for streaming interfaces and human-feedback.
Sergunb 0:8f0d870509fe 106 // For every incoming line, this method responds with an 'ok' for a successful command or an
Sergunb 0:8f0d870509fe 107 // 'error:' to indicate some error event with the line or some critical system error during
Sergunb 0:8f0d870509fe 108 // operation. Errors events can originate from the g-code parser, settings module, or asynchronously
Sergunb 0:8f0d870509fe 109 // from a critical error, such as a triggered hard limit. Interface should always monitor for these
Sergunb 0:8f0d870509fe 110 // responses.
Sergunb 0:8f0d870509fe 111 void report_status_message(uint8_t status_code)
Sergunb 0:8f0d870509fe 112 {
Sergunb 0:8f0d870509fe 113 switch(status_code) {
Sergunb 0:8f0d870509fe 114 case STATUS_OK: // STATUS_OK
Sergunb 0:8f0d870509fe 115 printPgmString(PSTR("ok\r\n")); break;
Sergunb 0:8f0d870509fe 116 default:
Sergunb 0:8f0d870509fe 117 printPgmString(PSTR("error:"));
Sergunb 0:8f0d870509fe 118 print_uint8_base10(status_code);
Sergunb 0:8f0d870509fe 119 report_util_line_feed();
Sergunb 0:8f0d870509fe 120 }
Sergunb 0:8f0d870509fe 121 }
Sergunb 0:8f0d870509fe 122
Sergunb 0:8f0d870509fe 123 // Prints alarm messages.
Sergunb 0:8f0d870509fe 124 void report_alarm_message(uint8_t alarm_code)
Sergunb 0:8f0d870509fe 125 {
Sergunb 0:8f0d870509fe 126 printPgmString(PSTR("ALARM:"));
Sergunb 0:8f0d870509fe 127 print_uint8_base10(alarm_code);
Sergunb 0:8f0d870509fe 128 report_util_line_feed();
Sergunb 0:8f0d870509fe 129 delay_ms(500); // Force delay to ensure message clears serial write buffer.
Sergunb 0:8f0d870509fe 130 }
Sergunb 0:8f0d870509fe 131
Sergunb 0:8f0d870509fe 132 // Prints feedback messages. This serves as a centralized method to provide additional
Sergunb 0:8f0d870509fe 133 // user feedback for things that are not of the status/alarm message protocol. These are
Sergunb 0:8f0d870509fe 134 // messages such as setup warnings, switch toggling, and how to exit alarms.
Sergunb 0:8f0d870509fe 135 // NOTE: For interfaces, messages are always placed within brackets. And if silent mode
Sergunb 0:8f0d870509fe 136 // is installed, the message number codes are less than zero.
Sergunb 0:8f0d870509fe 137 void report_feedback_message(uint8_t message_code)
Sergunb 0:8f0d870509fe 138 {
Sergunb 0:8f0d870509fe 139 printPgmString(PSTR("[MSG:"));
Sergunb 0:8f0d870509fe 140 switch(message_code) {
Sergunb 0:8f0d870509fe 141 case MESSAGE_CRITICAL_EVENT:
Sergunb 0:8f0d870509fe 142 printPgmString(PSTR("Reset to continue")); break;
Sergunb 0:8f0d870509fe 143 case MESSAGE_ALARM_LOCK:
Sergunb 0:8f0d870509fe 144 printPgmString(PSTR("'$H'|'$X' to unlock")); break;
Sergunb 0:8f0d870509fe 145 case MESSAGE_ALARM_UNLOCK:
Sergunb 0:8f0d870509fe 146 printPgmString(PSTR("Caution: Unlocked")); break;
Sergunb 0:8f0d870509fe 147 case MESSAGE_ENABLED:
Sergunb 0:8f0d870509fe 148 printPgmString(PSTR("Enabled")); break;
Sergunb 0:8f0d870509fe 149 case MESSAGE_DISABLED:
Sergunb 0:8f0d870509fe 150 printPgmString(PSTR("Disabled")); break;
Sergunb 0:8f0d870509fe 151 case MESSAGE_SAFETY_DOOR_AJAR:
Sergunb 0:8f0d870509fe 152 printPgmString(PSTR("Check Door")); break;
Sergunb 0:8f0d870509fe 153 case MESSAGE_CHECK_LIMITS:
Sergunb 0:8f0d870509fe 154 printPgmString(PSTR("Check Limits")); break;
Sergunb 0:8f0d870509fe 155 case MESSAGE_PROGRAM_END:
Sergunb 0:8f0d870509fe 156 printPgmString(PSTR("Pgm End")); break;
Sergunb 0:8f0d870509fe 157 case MESSAGE_RESTORE_DEFAULTS:
Sergunb 0:8f0d870509fe 158 printPgmString(PSTR("Restoring defaults")); break;
Sergunb 0:8f0d870509fe 159 case MESSAGE_SPINDLE_RESTORE:
Sergunb 0:8f0d870509fe 160 printPgmString(PSTR("Restoring spindle")); break;
Sergunb 0:8f0d870509fe 161 case MESSAGE_SLEEP_MODE:
Sergunb 0:8f0d870509fe 162 printPgmString(PSTR("Sleeping")); break;
Sergunb 0:8f0d870509fe 163 }
Sergunb 0:8f0d870509fe 164 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 165 }
Sergunb 0:8f0d870509fe 166
Sergunb 0:8f0d870509fe 167
Sergunb 0:8f0d870509fe 168 // Welcome message
Sergunb 0:8f0d870509fe 169 void report_init_message()
Sergunb 0:8f0d870509fe 170 {
Sergunb 0:8f0d870509fe 171 printPgmString(PSTR("\r\nGrbl " GRBL_VERSION " ['$' for help]\r\n"));
Sergunb 0:8f0d870509fe 172 }
Sergunb 0:8f0d870509fe 173
Sergunb 0:8f0d870509fe 174 // Grbl help message
Sergunb 0:8f0d870509fe 175 void report_grbl_help() {
Sergunb 0:8f0d870509fe 176 printPgmString(PSTR("[HLP:$$ $# $G $I $N $x=val $Nx=line $J=line $SLP $C $X $H ~ ! ? ctrl-x]\r\n"));
Sergunb 0:8f0d870509fe 177 }
Sergunb 0:8f0d870509fe 178
Sergunb 0:8f0d870509fe 179
Sergunb 0:8f0d870509fe 180 // Grbl global settings print out.
Sergunb 0:8f0d870509fe 181 // NOTE: The numbering scheme here must correlate to storing in settings.c
Sergunb 0:8f0d870509fe 182 void report_grbl_settings() {
Sergunb 0:8f0d870509fe 183 // Print Grbl settings.
Sergunb 0:8f0d870509fe 184 report_util_uint8_setting(0,settings.pulse_microseconds);
Sergunb 0:8f0d870509fe 185 report_util_uint8_setting(1,settings.stepper_idle_lock_time);
Sergunb 0:8f0d870509fe 186 report_util_uint8_setting(2,settings.step_invert_mask);
Sergunb 0:8f0d870509fe 187 report_util_uint8_setting(3,settings.dir_invert_mask);
Sergunb 0:8f0d870509fe 188 report_util_uint8_setting(4,bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE));
Sergunb 0:8f0d870509fe 189 report_util_uint8_setting(5,bit_istrue(settings.flags,BITFLAG_INVERT_LIMIT_PINS));
Sergunb 0:8f0d870509fe 190 report_util_uint8_setting(6,bit_istrue(settings.flags,BITFLAG_INVERT_PROBE_PIN));
Sergunb 0:8f0d870509fe 191 report_util_uint8_setting(10,settings.status_report_mask);
Sergunb 0:8f0d870509fe 192 report_util_float_setting(11,settings.junction_deviation,N_DECIMAL_SETTINGVALUE);
Sergunb 0:8f0d870509fe 193 report_util_float_setting(12,settings.arc_tolerance,N_DECIMAL_SETTINGVALUE);
Sergunb 0:8f0d870509fe 194 report_util_uint8_setting(13,bit_istrue(settings.flags,BITFLAG_REPORT_INCHES));
Sergunb 0:8f0d870509fe 195 report_util_uint8_setting(20,bit_istrue(settings.flags,BITFLAG_SOFT_LIMIT_ENABLE));
Sergunb 0:8f0d870509fe 196 report_util_uint8_setting(21,bit_istrue(settings.flags,BITFLAG_HARD_LIMIT_ENABLE));
Sergunb 0:8f0d870509fe 197 report_util_uint8_setting(22,bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE));
Sergunb 0:8f0d870509fe 198 report_util_uint8_setting(23,settings.homing_dir_mask);
Sergunb 0:8f0d870509fe 199 report_util_float_setting(24,settings.homing_feed_rate,N_DECIMAL_SETTINGVALUE);
Sergunb 0:8f0d870509fe 200 report_util_float_setting(25,settings.homing_seek_rate,N_DECIMAL_SETTINGVALUE);
Sergunb 0:8f0d870509fe 201 report_util_uint8_setting(26,settings.homing_debounce_delay);
Sergunb 0:8f0d870509fe 202 report_util_float_setting(27,settings.homing_pulloff,N_DECIMAL_SETTINGVALUE);
Sergunb 0:8f0d870509fe 203 report_util_float_setting(30,settings.rpm_max,N_DECIMAL_RPMVALUE);
Sergunb 0:8f0d870509fe 204 report_util_float_setting(31,settings.rpm_min,N_DECIMAL_RPMVALUE);
Sergunb 0:8f0d870509fe 205 #ifdef VARIABLE_SPINDLE
Sergunb 0:8f0d870509fe 206 report_util_uint8_setting(32,bit_istrue(settings.flags,BITFLAG_LASER_MODE));
Sergunb 0:8f0d870509fe 207 #else
Sergunb 0:8f0d870509fe 208 report_util_uint8_setting(32,0);
Sergunb 0:8f0d870509fe 209 #endif
Sergunb 0:8f0d870509fe 210 // Print axis settings
Sergunb 0:8f0d870509fe 211 uint8_t idx, set_idx;
Sergunb 0:8f0d870509fe 212 uint8_t val = AXIS_SETTINGS_START_VAL;
Sergunb 0:8f0d870509fe 213 for (set_idx=0; set_idx<AXIS_N_SETTINGS; set_idx++) {
Sergunb 0:8f0d870509fe 214 for (idx=0; idx<N_AXIS; idx++) {
Sergunb 0:8f0d870509fe 215 switch (set_idx) {
Sergunb 0:8f0d870509fe 216 case 0: report_util_float_setting(val+idx,settings.steps_per_mm[idx],N_DECIMAL_SETTINGVALUE); break;
Sergunb 0:8f0d870509fe 217 case 1: report_util_float_setting(val+idx,settings.max_rate[idx],N_DECIMAL_SETTINGVALUE); break;
Sergunb 0:8f0d870509fe 218 case 2: report_util_float_setting(val+idx,settings.acceleration[idx]/(60*60),N_DECIMAL_SETTINGVALUE); break;
Sergunb 0:8f0d870509fe 219 case 3: report_util_float_setting(val+idx,-settings.max_travel[idx],N_DECIMAL_SETTINGVALUE); break;
Sergunb 0:8f0d870509fe 220 }
Sergunb 0:8f0d870509fe 221 }
Sergunb 0:8f0d870509fe 222 val += AXIS_SETTINGS_INCREMENT;
Sergunb 0:8f0d870509fe 223 }
Sergunb 0:8f0d870509fe 224 }
Sergunb 0:8f0d870509fe 225
Sergunb 0:8f0d870509fe 226
Sergunb 0:8f0d870509fe 227 // Prints current probe parameters. Upon a probe command, these parameters are updated upon a
Sergunb 0:8f0d870509fe 228 // successful probe or upon a failed probe with the G38.3 without errors command (if supported).
Sergunb 0:8f0d870509fe 229 // These values are retained until Grbl is power-cycled, whereby they will be re-zeroed.
Sergunb 0:8f0d870509fe 230 void report_probe_parameters()
Sergunb 0:8f0d870509fe 231 {
Sergunb 0:8f0d870509fe 232 // Report in terms of machine position.
Sergunb 0:8f0d870509fe 233 printPgmString(PSTR("[PRB:"));
Sergunb 0:8f0d870509fe 234 float print_position[N_AXIS];
Sergunb 0:8f0d870509fe 235 system_convert_array_steps_to_mpos(print_position,sys_probe_position);
Sergunb 0:8f0d870509fe 236 report_util_axis_values(print_position);
Sergunb 0:8f0d870509fe 237 serial_write(':');
Sergunb 0:8f0d870509fe 238 print_uint8_base10(sys.probe_succeeded);
Sergunb 0:8f0d870509fe 239 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 240 }
Sergunb 0:8f0d870509fe 241
Sergunb 0:8f0d870509fe 242
Sergunb 0:8f0d870509fe 243 // Prints Grbl NGC parameters (coordinate offsets, probing)
Sergunb 0:8f0d870509fe 244 void report_ngc_parameters()
Sergunb 0:8f0d870509fe 245 {
Sergunb 0:8f0d870509fe 246 float coord_data[N_AXIS];
Sergunb 0:8f0d870509fe 247 uint8_t coord_select;
Sergunb 0:8f0d870509fe 248 for (coord_select = 0; coord_select <= SETTING_INDEX_NCOORD; coord_select++) {
Sergunb 0:8f0d870509fe 249 if (!(settings_read_coord_data(coord_select,coord_data))) {
Sergunb 0:8f0d870509fe 250 report_status_message(STATUS_SETTING_READ_FAIL);
Sergunb 0:8f0d870509fe 251 return;
Sergunb 0:8f0d870509fe 252 }
Sergunb 0:8f0d870509fe 253 printPgmString(PSTR("[G"));
Sergunb 0:8f0d870509fe 254 switch (coord_select) {
Sergunb 0:8f0d870509fe 255 case 6: printPgmString(PSTR("28")); break;
Sergunb 0:8f0d870509fe 256 case 7: printPgmString(PSTR("30")); break;
Sergunb 0:8f0d870509fe 257 default: print_uint8_base10(coord_select+54); break; // G54-G59
Sergunb 0:8f0d870509fe 258 }
Sergunb 0:8f0d870509fe 259 serial_write(':');
Sergunb 0:8f0d870509fe 260 report_util_axis_values(coord_data);
Sergunb 0:8f0d870509fe 261 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 262 }
Sergunb 0:8f0d870509fe 263 printPgmString(PSTR("[G92:")); // Print G92,G92.1 which are not persistent in memory
Sergunb 0:8f0d870509fe 264 report_util_axis_values(gc_state.coord_offset);
Sergunb 0:8f0d870509fe 265 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 266 printPgmString(PSTR("[TLO:")); // Print tool length offset value
Sergunb 0:8f0d870509fe 267 printFloat_CoordValue(gc_state.tool_length_offset);
Sergunb 0:8f0d870509fe 268 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 269 report_probe_parameters(); // Print probe parameters. Not persistent in memory.
Sergunb 0:8f0d870509fe 270 }
Sergunb 0:8f0d870509fe 271
Sergunb 0:8f0d870509fe 272
Sergunb 0:8f0d870509fe 273 // Print current gcode parser mode state
Sergunb 0:8f0d870509fe 274 void report_gcode_modes()
Sergunb 0:8f0d870509fe 275 {
Sergunb 0:8f0d870509fe 276 printPgmString(PSTR("[GC:G"));
Sergunb 0:8f0d870509fe 277 if (gc_state.modal.motion >= MOTION_MODE_PROBE_TOWARD) {
Sergunb 0:8f0d870509fe 278 printPgmString(PSTR("38."));
Sergunb 0:8f0d870509fe 279 print_uint8_base10(gc_state.modal.motion - (MOTION_MODE_PROBE_TOWARD-2));
Sergunb 0:8f0d870509fe 280 } else {
Sergunb 0:8f0d870509fe 281 print_uint8_base10(gc_state.modal.motion);
Sergunb 0:8f0d870509fe 282 }
Sergunb 0:8f0d870509fe 283
Sergunb 0:8f0d870509fe 284 report_util_gcode_modes_G();
Sergunb 0:8f0d870509fe 285 print_uint8_base10(gc_state.modal.coord_select+54);
Sergunb 0:8f0d870509fe 286
Sergunb 0:8f0d870509fe 287 report_util_gcode_modes_G();
Sergunb 0:8f0d870509fe 288 print_uint8_base10(gc_state.modal.plane_select+17);
Sergunb 0:8f0d870509fe 289
Sergunb 0:8f0d870509fe 290 report_util_gcode_modes_G();
Sergunb 0:8f0d870509fe 291 print_uint8_base10(21-gc_state.modal.units);
Sergunb 0:8f0d870509fe 292
Sergunb 0:8f0d870509fe 293 report_util_gcode_modes_G();
Sergunb 0:8f0d870509fe 294 print_uint8_base10(gc_state.modal.distance+90);
Sergunb 0:8f0d870509fe 295
Sergunb 0:8f0d870509fe 296 report_util_gcode_modes_G();
Sergunb 0:8f0d870509fe 297 print_uint8_base10(94-gc_state.modal.feed_rate);
Sergunb 0:8f0d870509fe 298
Sergunb 0:8f0d870509fe 299 if (gc_state.modal.program_flow) {
Sergunb 0:8f0d870509fe 300 report_util_gcode_modes_M();
Sergunb 0:8f0d870509fe 301 switch (gc_state.modal.program_flow) {
Sergunb 0:8f0d870509fe 302 case PROGRAM_FLOW_PAUSED : serial_write('0'); break;
Sergunb 0:8f0d870509fe 303 // case PROGRAM_FLOW_OPTIONAL_STOP : serial_write('1'); break; // M1 is ignored and not supported.
Sergunb 0:8f0d870509fe 304 case PROGRAM_FLOW_COMPLETED_M2 :
Sergunb 0:8f0d870509fe 305 case PROGRAM_FLOW_COMPLETED_M30 :
Sergunb 0:8f0d870509fe 306 print_uint8_base10(gc_state.modal.program_flow);
Sergunb 0:8f0d870509fe 307 break;
Sergunb 0:8f0d870509fe 308 }
Sergunb 0:8f0d870509fe 309 }
Sergunb 0:8f0d870509fe 310
Sergunb 0:8f0d870509fe 311 report_util_gcode_modes_M();
Sergunb 0:8f0d870509fe 312 switch (gc_state.modal.spindle) {
Sergunb 0:8f0d870509fe 313 case SPINDLE_ENABLE_CW : serial_write('3'); break;
Sergunb 0:8f0d870509fe 314 case SPINDLE_ENABLE_CCW : serial_write('4'); break;
Sergunb 0:8f0d870509fe 315 case SPINDLE_DISABLE : serial_write('5'); break;
Sergunb 0:8f0d870509fe 316 }
Sergunb 0:8f0d870509fe 317
Sergunb 0:8f0d870509fe 318 report_util_gcode_modes_M();
Sergunb 0:8f0d870509fe 319 #ifdef ENABLE_M7
Sergunb 0:8f0d870509fe 320 if (gc_state.modal.coolant) { // Note: Multiple coolant states may be active at the same time.
Sergunb 0:8f0d870509fe 321 if (gc_state.modal.coolant & PL_COND_FLAG_COOLANT_MIST) { report_util_gcode_modes_M(); serial_write('7'); }
Sergunb 0:8f0d870509fe 322 if (gc_state.modal.coolant & PL_COND_FLAG_COOLANT_FLOOD) { report_util_gcode_modes_M(); serial_write('8'); }
Sergunb 0:8f0d870509fe 323 } else { report_util_gcode_modes_M(); serial_write('9'); }
Sergunb 0:8f0d870509fe 324 #else
Sergunb 0:8f0d870509fe 325 report_util_gcode_modes_M();
Sergunb 0:8f0d870509fe 326 if (gc_state.modal.coolant) { serial_write('8'); }
Sergunb 0:8f0d870509fe 327 else { serial_write('9'); }
Sergunb 0:8f0d870509fe 328 #endif
Sergunb 0:8f0d870509fe 329
Sergunb 0:8f0d870509fe 330 #ifdef ENABLE_PARKING_OVERRIDE_CONTROL
Sergunb 0:8f0d870509fe 331 if (sys.override_ctrl == OVERRIDE_PARKING_MOTION) {
Sergunb 0:8f0d870509fe 332 report_util_gcode_modes_M();
Sergunb 0:8f0d870509fe 333 print_uint8_base10(56);
Sergunb 0:8f0d870509fe 334 }
Sergunb 0:8f0d870509fe 335 #endif
Sergunb 0:8f0d870509fe 336
Sergunb 0:8f0d870509fe 337 printPgmString(PSTR(" T"));
Sergunb 0:8f0d870509fe 338 print_uint8_base10(gc_state.tool);
Sergunb 0:8f0d870509fe 339
Sergunb 0:8f0d870509fe 340 printPgmString(PSTR(" F"));
Sergunb 0:8f0d870509fe 341 printFloat_RateValue(gc_state.feed_rate);
Sergunb 0:8f0d870509fe 342
Sergunb 0:8f0d870509fe 343 #ifdef VARIABLE_SPINDLE
Sergunb 0:8f0d870509fe 344 printPgmString(PSTR(" S"));
Sergunb 0:8f0d870509fe 345 printFloat(gc_state.spindle_speed,N_DECIMAL_RPMVALUE);
Sergunb 0:8f0d870509fe 346 #endif
Sergunb 0:8f0d870509fe 347
Sergunb 0:8f0d870509fe 348 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 349 }
Sergunb 0:8f0d870509fe 350
Sergunb 0:8f0d870509fe 351 // Prints specified startup line
Sergunb 0:8f0d870509fe 352 void report_startup_line(uint8_t n, char *line)
Sergunb 0:8f0d870509fe 353 {
Sergunb 0:8f0d870509fe 354 printPgmString(PSTR("$N"));
Sergunb 0:8f0d870509fe 355 print_uint8_base10(n);
Sergunb 0:8f0d870509fe 356 serial_write('=');
Sergunb 0:8f0d870509fe 357 printString(line);
Sergunb 0:8f0d870509fe 358 report_util_line_feed();
Sergunb 0:8f0d870509fe 359 }
Sergunb 0:8f0d870509fe 360
Sergunb 0:8f0d870509fe 361 void report_execute_startup_message(char *line, uint8_t status_code)
Sergunb 0:8f0d870509fe 362 {
Sergunb 0:8f0d870509fe 363 serial_write('>');
Sergunb 0:8f0d870509fe 364 printString(line);
Sergunb 0:8f0d870509fe 365 serial_write(':');
Sergunb 0:8f0d870509fe 366 report_status_message(status_code);
Sergunb 0:8f0d870509fe 367 }
Sergunb 0:8f0d870509fe 368
Sergunb 0:8f0d870509fe 369 // Prints build info line
Sergunb 0:8f0d870509fe 370 void report_build_info(char *line)
Sergunb 0:8f0d870509fe 371 {
Sergunb 0:8f0d870509fe 372 printPgmString(PSTR("[VER:" GRBL_VERSION "." GRBL_VERSION_BUILD ":"));
Sergunb 0:8f0d870509fe 373 printString(line);
Sergunb 0:8f0d870509fe 374 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 375 printPgmString(PSTR("[OPT:")); // Generate compile-time build option list
Sergunb 0:8f0d870509fe 376 #ifdef VARIABLE_SPINDLE
Sergunb 0:8f0d870509fe 377 serial_write('V');
Sergunb 0:8f0d870509fe 378 #endif
Sergunb 0:8f0d870509fe 379 #ifdef USE_LINE_NUMBERS
Sergunb 0:8f0d870509fe 380 serial_write('N');
Sergunb 0:8f0d870509fe 381 #endif
Sergunb 0:8f0d870509fe 382 #ifdef ENABLE_M7
Sergunb 0:8f0d870509fe 383 serial_write('M');
Sergunb 0:8f0d870509fe 384 #endif
Sergunb 0:8f0d870509fe 385 #ifdef COREXY
Sergunb 0:8f0d870509fe 386 serial_write('C');
Sergunb 0:8f0d870509fe 387 #endif
Sergunb 0:8f0d870509fe 388 #ifdef PARKING_ENABLE
Sergunb 0:8f0d870509fe 389 serial_write('P');
Sergunb 0:8f0d870509fe 390 #endif
Sergunb 0:8f0d870509fe 391 #ifdef HOMING_FORCE_SET_ORIGIN
Sergunb 0:8f0d870509fe 392 serial_write('Z');
Sergunb 0:8f0d870509fe 393 #endif
Sergunb 0:8f0d870509fe 394 #ifdef HOMING_SINGLE_AXIS_COMMANDS
Sergunb 0:8f0d870509fe 395 serial_write('H');
Sergunb 0:8f0d870509fe 396 #endif
Sergunb 0:8f0d870509fe 397 #ifdef LIMITS_TWO_SWITCHES_ON_AXES
Sergunb 0:8f0d870509fe 398 serial_write('T');
Sergunb 0:8f0d870509fe 399 #endif
Sergunb 0:8f0d870509fe 400 #ifdef ALLOW_FEED_OVERRIDE_DURING_PROBE_CYCLES
Sergunb 0:8f0d870509fe 401 serial_write('A');
Sergunb 0:8f0d870509fe 402 #endif
Sergunb 0:8f0d870509fe 403 #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN
Sergunb 0:8f0d870509fe 404 serial_write('D');
Sergunb 0:8f0d870509fe 405 #endif
Sergunb 0:8f0d870509fe 406 #ifdef SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED
Sergunb 0:8f0d870509fe 407 serial_write('0');
Sergunb 0:8f0d870509fe 408 #endif
Sergunb 0:8f0d870509fe 409 #ifdef ENABLE_SOFTWARE_DEBOUNCE
Sergunb 0:8f0d870509fe 410 serial_write('S');
Sergunb 0:8f0d870509fe 411 #endif
Sergunb 0:8f0d870509fe 412 #ifdef ENABLE_PARKING_OVERRIDE_CONTROL
Sergunb 0:8f0d870509fe 413 serial_write('R');
Sergunb 0:8f0d870509fe 414 #endif
Sergunb 0:8f0d870509fe 415 #ifndef ENABLE_RESTORE_EEPROM_WIPE_ALL // NOTE: Shown when disabled.
Sergunb 0:8f0d870509fe 416 serial_write('*');
Sergunb 0:8f0d870509fe 417 #endif
Sergunb 0:8f0d870509fe 418 #ifndef ENABLE_RESTORE_EEPROM_DEFAULT_SETTINGS // NOTE: Shown when disabled.
Sergunb 0:8f0d870509fe 419 serial_write('$');
Sergunb 0:8f0d870509fe 420 #endif
Sergunb 0:8f0d870509fe 421 #ifndef ENABLE_RESTORE_EEPROM_CLEAR_PARAMETERS // NOTE: Shown when disabled.
Sergunb 0:8f0d870509fe 422 serial_write('#');
Sergunb 0:8f0d870509fe 423 #endif
Sergunb 0:8f0d870509fe 424 #ifndef ENABLE_BUILD_INFO_WRITE_COMMAND // NOTE: Shown when disabled.
Sergunb 0:8f0d870509fe 425 serial_write('I');
Sergunb 0:8f0d870509fe 426 #endif
Sergunb 0:8f0d870509fe 427 #ifndef FORCE_BUFFER_SYNC_DURING_EEPROM_WRITE // NOTE: Shown when disabled.
Sergunb 0:8f0d870509fe 428 serial_write('E');
Sergunb 0:8f0d870509fe 429 #endif
Sergunb 0:8f0d870509fe 430 #ifndef FORCE_BUFFER_SYNC_DURING_WCO_CHANGE // NOTE: Shown when disabled.
Sergunb 0:8f0d870509fe 431 serial_write('W');
Sergunb 0:8f0d870509fe 432 #endif
Sergunb 0:8f0d870509fe 433 #ifndef HOMING_INIT_LOCK
Sergunb 0:8f0d870509fe 434 serial_write('L');
Sergunb 0:8f0d870509fe 435 #endif
Sergunb 0:8f0d870509fe 436
Sergunb 0:8f0d870509fe 437 // NOTE: Compiled values, like override increments/max/min values, may be added at some point later.
Sergunb 0:8f0d870509fe 438 serial_write(',');
Sergunb 0:8f0d870509fe 439 print_uint8_base10(BLOCK_BUFFER_SIZE - 1);
Sergunb 0:8f0d870509fe 440 serial_write(',');
Sergunb 0:8f0d870509fe 441 print_uint8_base10(RX_BUFFER_SIZE);
Sergunb 0:8f0d870509fe 442
Sergunb 0:8f0d870509fe 443 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 444 }
Sergunb 0:8f0d870509fe 445
Sergunb 0:8f0d870509fe 446
Sergunb 0:8f0d870509fe 447 // Prints the character string line Grbl has received from the user, which has been pre-parsed,
Sergunb 0:8f0d870509fe 448 // and has been sent into protocol_execute_line() routine to be executed by Grbl.
Sergunb 0:8f0d870509fe 449 void report_echo_line_received(char *line)
Sergunb 0:8f0d870509fe 450 {
Sergunb 0:8f0d870509fe 451 printPgmString(PSTR("[echo: ")); printString(line);
Sergunb 0:8f0d870509fe 452 report_util_feedback_line_feed();
Sergunb 0:8f0d870509fe 453 }
Sergunb 0:8f0d870509fe 454
Sergunb 0:8f0d870509fe 455
Sergunb 0:8f0d870509fe 456 // Prints real-time data. This function grabs a real-time snapshot of the stepper subprogram
Sergunb 0:8f0d870509fe 457 // and the actual location of the CNC machine. Users may change the following function to their
Sergunb 0:8f0d870509fe 458 // specific needs, but the desired real-time data report must be as short as possible. This is
Sergunb 0:8f0d870509fe 459 // requires as it minimizes the computational overhead and allows grbl to keep running smoothly,
Sergunb 0:8f0d870509fe 460 // especially during g-code programs with fast, short line segments and high frequency reports (5-20Hz).
Sergunb 0:8f0d870509fe 461 void report_realtime_status()
Sergunb 0:8f0d870509fe 462 {
Sergunb 0:8f0d870509fe 463 uint8_t idx;
Sergunb 0:8f0d870509fe 464 int32_t current_position[N_AXIS]; // Copy current state of the system position variable
Sergunb 0:8f0d870509fe 465 memcpy(current_position, sys_position, sizeof(sys_position));
Sergunb 0:8f0d870509fe 466 float print_position[N_AXIS];
Sergunb 0:8f0d870509fe 467 system_convert_array_steps_to_mpos(print_position, current_position);
Sergunb 0:8f0d870509fe 468
Sergunb 0:8f0d870509fe 469 // Report current machine state and sub-states
Sergunb 0:8f0d870509fe 470 serial_write('<');
Sergunb 0:8f0d870509fe 471 switch (sys.state) {
Sergunb 0:8f0d870509fe 472 case STATE_IDLE: printPgmString(PSTR("Idle")); break;
Sergunb 0:8f0d870509fe 473 case STATE_CYCLE: printPgmString(PSTR("Run")); break;
Sergunb 0:8f0d870509fe 474 case STATE_HOLD:
Sergunb 0:8f0d870509fe 475 if (!(sys.suspend & SUSPEND_JOG_CANCEL)) {
Sergunb 0:8f0d870509fe 476 printPgmString(PSTR("Hold:"));
Sergunb 0:8f0d870509fe 477 if (sys.suspend & SUSPEND_HOLD_COMPLETE) { serial_write('0'); } // Ready to resume
Sergunb 0:8f0d870509fe 478 else { serial_write('1'); } // Actively holding
Sergunb 0:8f0d870509fe 479 break;
Sergunb 0:8f0d870509fe 480 } // Continues to print jog state during jog cancel.
Sergunb 0:8f0d870509fe 481 case STATE_JOG: printPgmString(PSTR("Jog")); break;
Sergunb 0:8f0d870509fe 482 case STATE_HOMING: printPgmString(PSTR("Home")); break;
Sergunb 0:8f0d870509fe 483 case STATE_ALARM: printPgmString(PSTR("Alarm")); break;
Sergunb 0:8f0d870509fe 484 case STATE_CHECK_MODE: printPgmString(PSTR("Check")); break;
Sergunb 0:8f0d870509fe 485 case STATE_SAFETY_DOOR:
Sergunb 0:8f0d870509fe 486 printPgmString(PSTR("Door:"));
Sergunb 0:8f0d870509fe 487 if (sys.suspend & SUSPEND_INITIATE_RESTORE) {
Sergunb 0:8f0d870509fe 488 serial_write('3'); // Restoring
Sergunb 0:8f0d870509fe 489 }
Sergunb 0:8f0d870509fe 490 else {
Sergunb 0:8f0d870509fe 491 if (sys.suspend & SUSPEND_RETRACT_COMPLETE) {
Sergunb 0:8f0d870509fe 492 if (sys.suspend & SUSPEND_SAFETY_DOOR_AJAR) {
Sergunb 0:8f0d870509fe 493 serial_write('1'); // Door ajar
Sergunb 0:8f0d870509fe 494 }
Sergunb 0:8f0d870509fe 495 else {
Sergunb 0:8f0d870509fe 496 serial_write('0');
Sergunb 0:8f0d870509fe 497 } // Door closed and ready to resume
Sergunb 0:8f0d870509fe 498 }
Sergunb 0:8f0d870509fe 499 else {
Sergunb 0:8f0d870509fe 500 serial_write('2'); // Retracting
Sergunb 0:8f0d870509fe 501 }
Sergunb 0:8f0d870509fe 502 }
Sergunb 0:8f0d870509fe 503 break;
Sergunb 0:8f0d870509fe 504 case STATE_SLEEP: printPgmString(PSTR("Sleep")); break;
Sergunb 0:8f0d870509fe 505 }
Sergunb 0:8f0d870509fe 506
Sergunb 0:8f0d870509fe 507 float wco[N_AXIS];
Sergunb 0:8f0d870509fe 508 if (bit_isfalse(settings.status_report_mask, BITFLAG_RT_STATUS_POSITION_TYPE) ||
Sergunb 0:8f0d870509fe 509 (sys.report_wco_counter == 0)) {
Sergunb 0:8f0d870509fe 510 for (idx = 0; idx< N_AXIS; idx++) {
Sergunb 0:8f0d870509fe 511 // Apply work coordinate offsets and tool length offset to current position.
Sergunb 0:8f0d870509fe 512 wco[idx] = gc_state.coord_system[idx] + gc_state.coord_offset[idx];
Sergunb 0:8f0d870509fe 513 if (idx == TOOL_LENGTH_OFFSET_AXIS) { wco[idx] += gc_state.tool_length_offset; }
Sergunb 0:8f0d870509fe 514 if (bit_isfalse(settings.status_report_mask, BITFLAG_RT_STATUS_POSITION_TYPE)) {
Sergunb 0:8f0d870509fe 515 print_position[idx] -= wco[idx];
Sergunb 0:8f0d870509fe 516 }
Sergunb 0:8f0d870509fe 517 }
Sergunb 0:8f0d870509fe 518 }
Sergunb 0:8f0d870509fe 519
Sergunb 0:8f0d870509fe 520 // Report machine position
Sergunb 0:8f0d870509fe 521 if (bit_istrue(settings.status_report_mask, BITFLAG_RT_STATUS_POSITION_TYPE)) {
Sergunb 0:8f0d870509fe 522 printPgmString(PSTR("|MPos:"));
Sergunb 0:8f0d870509fe 523 }
Sergunb 0:8f0d870509fe 524 else {
Sergunb 0:8f0d870509fe 525 printPgmString(PSTR("|WPos:"));
Sergunb 0:8f0d870509fe 526 }
Sergunb 0:8f0d870509fe 527 report_util_axis_values(print_position);
Sergunb 0:8f0d870509fe 528
Sergunb 0:8f0d870509fe 529 // Returns planner and serial read buffer states.
Sergunb 0:8f0d870509fe 530 #ifdef REPORT_FIELD_BUFFER_STATE
Sergunb 0:8f0d870509fe 531 if (bit_istrue(settings.status_report_mask, BITFLAG_RT_STATUS_BUFFER_STATE)) {
Sergunb 0:8f0d870509fe 532 printPgmString(PSTR("|Bf:"));
Sergunb 0:8f0d870509fe 533 print_uint8_base10(plan_get_block_buffer_available());
Sergunb 0:8f0d870509fe 534 serial_write(',');
Sergunb 0:8f0d870509fe 535 print_uint8_base10(serial_get_rx_buffer_available());
Sergunb 0:8f0d870509fe 536 }
Sergunb 0:8f0d870509fe 537 #endif
Sergunb 0:8f0d870509fe 538
Sergunb 0:8f0d870509fe 539 #ifdef USE_LINE_NUMBERS
Sergunb 0:8f0d870509fe 540 #ifdef REPORT_FIELD_LINE_NUMBERS
Sergunb 0:8f0d870509fe 541 // Report current line number
Sergunb 0:8f0d870509fe 542 plan_block_t * cur_block = plan_get_current_block();
Sergunb 0:8f0d870509fe 543 if (cur_block != NULL) {
Sergunb 0:8f0d870509fe 544 uint32_t ln = cur_block->line_number;
Sergunb 0:8f0d870509fe 545 if (ln > 0) {
Sergunb 0:8f0d870509fe 546 printPgmString(PSTR("|Ln:"));
Sergunb 0:8f0d870509fe 547 printInteger(ln);
Sergunb 0:8f0d870509fe 548 }
Sergunb 0:8f0d870509fe 549 }
Sergunb 0:8f0d870509fe 550 #endif
Sergunb 0:8f0d870509fe 551 #endif
Sergunb 0:8f0d870509fe 552
Sergunb 0:8f0d870509fe 553 // Report realtime feed speed
Sergunb 0:8f0d870509fe 554 #ifdef REPORT_FIELD_CURRENT_FEED_SPEED
Sergunb 0:8f0d870509fe 555 #ifdef VARIABLE_SPINDLE
Sergunb 0:8f0d870509fe 556 printPgmString(PSTR("|FS:"));
Sergunb 0:8f0d870509fe 557 printFloat_RateValue(st_get_realtime_rate());
Sergunb 0:8f0d870509fe 558 serial_write(',');
Sergunb 0:8f0d870509fe 559 printFloat(sys.spindle_speed, N_DECIMAL_RPMVALUE);
Sergunb 0:8f0d870509fe 560 #else
Sergunb 0:8f0d870509fe 561 printPgmString(PSTR("|F:"));
Sergunb 0:8f0d870509fe 562 printFloat_RateValue(st_get_realtime_rate());
Sergunb 0:8f0d870509fe 563 #endif
Sergunb 0:8f0d870509fe 564 #endif
Sergunb 0:8f0d870509fe 565
Sergunb 0:8f0d870509fe 566 #ifdef REPORT_FIELD_PIN_STATE
Sergunb 0:8f0d870509fe 567 uint8_t lim_pin_state = limits_get_state();
Sergunb 0:8f0d870509fe 568 uint8_t ctrl_pin_state = system_control_get_state();
Sergunb 0:8f0d870509fe 569 uint8_t prb_pin_state = probe_get_state();
Sergunb 0:8f0d870509fe 570 if (lim_pin_state | ctrl_pin_state | prb_pin_state) {
Sergunb 0:8f0d870509fe 571 printPgmString(PSTR("|Pn:"));
Sergunb 0:8f0d870509fe 572 if (prb_pin_state) { serial_write('P'); }
Sergunb 0:8f0d870509fe 573 if (lim_pin_state) {
Sergunb 0:8f0d870509fe 574 if (bit_istrue(lim_pin_state, bit(X_AXIS))) { serial_write('X'); }
Sergunb 0:8f0d870509fe 575 if (bit_istrue(lim_pin_state, bit(Y_AXIS))) { serial_write('Y'); }
Sergunb 0:8f0d870509fe 576 if (bit_istrue(lim_pin_state, bit(Z_AXIS))) { serial_write('Z'); }
Sergunb 0:8f0d870509fe 577 }
Sergunb 0:8f0d870509fe 578 if (ctrl_pin_state) {
Sergunb 0:8f0d870509fe 579 #ifdef ENABLE_SAFETY_DOOR_INPUT_PIN
Sergunb 0:8f0d870509fe 580 if (bit_istrue(ctrl_pin_state, CONTROL_PIN_INDEX_SAFETY_DOOR)) { serial_write('D'); }
Sergunb 0:8f0d870509fe 581 #endif
Sergunb 0:8f0d870509fe 582 if (bit_istrue(ctrl_pin_state, CONTROL_PIN_INDEX_RESET)) { serial_write('R'); }
Sergunb 0:8f0d870509fe 583 if (bit_istrue(ctrl_pin_state, CONTROL_PIN_INDEX_FEED_HOLD)) { serial_write('H'); }
Sergunb 0:8f0d870509fe 584 if (bit_istrue(ctrl_pin_state, CONTROL_PIN_INDEX_CYCLE_START)) { serial_write('S'); }
Sergunb 0:8f0d870509fe 585 }
Sergunb 0:8f0d870509fe 586 }
Sergunb 0:8f0d870509fe 587 #endif
Sergunb 0:8f0d870509fe 588
Sergunb 0:8f0d870509fe 589 #ifdef REPORT_FIELD_WORK_COORD_OFFSET
Sergunb 0:8f0d870509fe 590 if (sys.report_wco_counter > 0) { sys.report_wco_counter--; }
Sergunb 0:8f0d870509fe 591 else {
Sergunb 0:8f0d870509fe 592 if (sys.state & (STATE_HOMING | STATE_CYCLE | STATE_HOLD | STATE_JOG | STATE_SAFETY_DOOR)) {
Sergunb 0:8f0d870509fe 593 sys.report_wco_counter = (REPORT_WCO_REFRESH_BUSY_COUNT - 1); // Reset counter for slow refresh
Sergunb 0:8f0d870509fe 594 }
Sergunb 0:8f0d870509fe 595 else { sys.report_wco_counter = (REPORT_WCO_REFRESH_IDLE_COUNT - 1); }
Sergunb 0:8f0d870509fe 596 if (sys.report_ovr_counter == 0) { sys.report_ovr_counter = 1; } // Set override on next report.
Sergunb 0:8f0d870509fe 597 printPgmString(PSTR("|WCO:"));
Sergunb 0:8f0d870509fe 598 report_util_axis_values(wco);
Sergunb 0:8f0d870509fe 599 }
Sergunb 0:8f0d870509fe 600 #endif
Sergunb 0:8f0d870509fe 601
Sergunb 0:8f0d870509fe 602 #ifdef REPORT_FIELD_OVERRIDES
Sergunb 0:8f0d870509fe 603 if (sys.report_ovr_counter > 0) { sys.report_ovr_counter--; }
Sergunb 0:8f0d870509fe 604 else {
Sergunb 0:8f0d870509fe 605 if (sys.state & (STATE_HOMING | STATE_CYCLE | STATE_HOLD | STATE_JOG | STATE_SAFETY_DOOR)) {
Sergunb 0:8f0d870509fe 606 sys.report_ovr_counter = (REPORT_OVR_REFRESH_BUSY_COUNT - 1); // Reset counter for slow refresh
Sergunb 0:8f0d870509fe 607 }
Sergunb 0:8f0d870509fe 608 else { sys.report_ovr_counter = (REPORT_OVR_REFRESH_IDLE_COUNT - 1); }
Sergunb 0:8f0d870509fe 609 printPgmString(PSTR("|Ov:"));
Sergunb 0:8f0d870509fe 610 print_uint8_base10(sys.f_override);
Sergunb 0:8f0d870509fe 611 serial_write(',');
Sergunb 0:8f0d870509fe 612 print_uint8_base10(sys.r_override);
Sergunb 0:8f0d870509fe 613 serial_write(',');
Sergunb 0:8f0d870509fe 614 print_uint8_base10(sys.spindle_speed_ovr);
Sergunb 0:8f0d870509fe 615
Sergunb 0:8f0d870509fe 616 uint8_t sp_state = spindle_get_state();
Sergunb 0:8f0d870509fe 617 uint8_t cl_state = coolant_get_state();
Sergunb 0:8f0d870509fe 618 if (sp_state || cl_state) {
Sergunb 0:8f0d870509fe 619 printPgmString(PSTR("|A:"));
Sergunb 0:8f0d870509fe 620 if (sp_state) { // != SPINDLE_STATE_DISABLE
Sergunb 0:8f0d870509fe 621 #ifdef VARIABLE_SPINDLE
Sergunb 0:8f0d870509fe 622 #ifdef USE_SPINDLE_DIR_AS_ENABLE_PIN
Sergunb 0:8f0d870509fe 623 serial_write('S'); // CW
Sergunb 0:8f0d870509fe 624 #else
Sergunb 0:8f0d870509fe 625 if (sp_state == SPINDLE_STATE_CW) { serial_write('S'); } // CW
Sergunb 0:8f0d870509fe 626 else { serial_write('C'); } // CCW
Sergunb 0:8f0d870509fe 627 #endif
Sergunb 0:8f0d870509fe 628 #else
Sergunb 0:8f0d870509fe 629 if (sp_state & SPINDLE_STATE_CW) { serial_write('S'); } // CW
Sergunb 0:8f0d870509fe 630 else { serial_write('C'); } // CCW
Sergunb 0:8f0d870509fe 631 #endif
Sergunb 0:8f0d870509fe 632 }
Sergunb 0:8f0d870509fe 633 if (cl_state & COOLANT_STATE_FLOOD) { serial_write('F'); }
Sergunb 0:8f0d870509fe 634 #ifdef ENABLE_M7
Sergunb 0:8f0d870509fe 635 if (cl_state & COOLANT_STATE_MIST) { serial_write('M'); }
Sergunb 0:8f0d870509fe 636 #endif
Sergunb 0:8f0d870509fe 637 }
Sergunb 0:8f0d870509fe 638 }
Sergunb 0:8f0d870509fe 639 #endif
Sergunb 0:8f0d870509fe 640
Sergunb 0:8f0d870509fe 641 serial_write('>');
Sergunb 0:8f0d870509fe 642 report_util_line_feed();
Sergunb 0:8f0d870509fe 643 }
Sergunb 0:8f0d870509fe 644
Sergunb 0:8f0d870509fe 645
Sergunb 0:8f0d870509fe 646 #ifdef DEBUG
Sergunb 0:8f0d870509fe 647 void report_realtime_debug()
Sergunb 0:8f0d870509fe 648 {
Sergunb 0:8f0d870509fe 649
Sergunb 0:8f0d870509fe 650 }
Sergunb 0:8f0d870509fe 651 #endif