Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
grbl/report.c@0:9dcf85d9b2f3, 2017-09-04 (annotated)
- Committer:
- Sergunb
- Date:
- Mon Sep 04 12:05:05 2017 +0000
- Revision:
- 0:9dcf85d9b2f3
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New 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 |