Sergey Pastor / grbl_1_
Committer:
Sergunb
Date:
Mon Sep 04 12:05:05 2017 +0000
Revision:
0:9dcf85d9b2f3
Initial commit

Who changed what in which revision?

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