diff --git a/TinyG2/config_app.cpp b/TinyG2/config_app.cpp index 0eec3df3..8db87122 100755 --- a/TinyG2/config_app.cpp +++ b/TinyG2/config_app.cpp @@ -381,7 +381,7 @@ const cfgItem_t cfgArray[] = { { "sys","ja", _f07, 0, cm_print_ja, get_flu, set_flu, (float *)&cm.junction_acceleration,JUNCTION_ACCELERATION }, { "sys","ct", _f07, 4, cm_print_ct, get_flu, set_flu, (float *)&cm.chordal_tolerance, CHORDAL_TOLERANCE }, - { "sys","st", _f07, 0, sw_print_st, get_ui8, sw_set_st, (float *)&sw.switch_type, SWITCH_TYPE }, +// { "sys","st", _f07, 0, sw_print_st, get_ui8, sw_set_st, (float *)&sw.switch_type, SWITCH_TYPE }, { "sys","mt", _f07, 2, st_print_mt, get_flt, st_set_mt, (float *)&st.motor_idle_timeout, MOTOR_IDLE_TIMEOUT}, { "", "me", _f00, 0, tx_print_str, st_set_me, st_set_me, (float *)&cs.null, 0 }, { "", "md", _f00, 0, tx_print_str, st_set_md, st_set_md, (float *)&cs.null, 0 }, @@ -601,7 +601,7 @@ static stat_t _do_all(cmdObj_t *cmd) // print all parameters * * The above assume USB is the std device */ - +/* static stat_t _set_comm_helper(cmdObj_t *cmd, uint32_t yes, uint32_t no) { if (fp_NOT_ZERO(cmd->value)) { @@ -611,7 +611,7 @@ static stat_t _set_comm_helper(cmdObj_t *cmd, uint32_t yes, uint32_t no) } return (STAT_OK); } - +*/ /* REMOVED - too easy to make the board appear to be bricked static stat_t set_ic(cmdObj_t *cmd) // ignore CR or LF on RX { @@ -628,7 +628,7 @@ static stat_t set_ic(cmdObj_t *cmd) // ignore CR or LF on RX return (STAT_OK); } */ - +/* static stat_t set_ec(cmdObj_t *cmd) // expand CR to CRLF on TX { if (cmd->value > true) { return (STAT_INPUT_VALUE_UNSUPPORTED);} @@ -656,7 +656,7 @@ static stat_t get_rx(cmdObj_t *cmd) cmd->objtype = TYPE_INTEGER; return (STAT_OK); } - +*/ /* run_sx() - send XOFF, XON --- test only static stat_t run_sx(cmdObj_t *cmd) { @@ -718,12 +718,12 @@ stat_t set_baud_callback(void) #ifdef __TEXT_MODE //const char_t PROGMEM fmt_ic[] = "[ic] ignore CR or LF on RX%8d [0=off,1=CR,2=LF]\n"; -const char_t PROGMEM fmt_ec[] = "[ec] expand LF to CRLF on TX%6d [0=off,1=on]\n"; -const char_t PROGMEM fmt_ee[] = "[ee] enable echo%18d [0=off,1=on]\n"; -const char_t PROGMEM fmt_ex[] = "[ex] enable flow control%10d [0=off,1=XON/XOFF, 2=RTS/CTS]\n"; -const char_t PROGMEM fmt_baud[] = "[baud] USB baud rate%15d [1=9600,2=19200,3=38400,4=57600,5=115200,6=230400]\n"; -const char_t PROGMEM fmt_net[] = "[net] network mode%16d [0=master]\n"; -const char_t PROGMEM fmt_rx[] = "rx:%d\n"; +const char PROGMEM fmt_ec[] = "[ec] expand LF to CRLF on TX%6d [0=off,1=on]\n"; +const char PROGMEM fmt_ee[] = "[ee] enable echo%18d [0=off,1=on]\n"; +const char PROGMEM fmt_ex[] = "[ex] enable flow control%10d [0=off,1=XON/XOFF, 2=RTS/CTS]\n"; +const char PROGMEM fmt_baud[] = "[baud] USB baud rate%15d [1=9600,2=19200,3=38400,4=57600,5=115200,6=230400]\n"; +const char PROGMEM fmt_net[] = "[net] network mode%16d [0=master]\n"; +const char PROGMEM fmt_rx[] = "rx:%d\n"; void co_print_ec(cmdObj_t *cmd) { text_print_ui8(cmd, fmt_ec);} void co_print_ee(cmdObj_t *cmd) { text_print_ui8(cmd, fmt_ee);} diff --git a/TinyG2/controller.cpp b/TinyG2/controller.cpp index f1ab7816..ed8fd8da 100755 --- a/TinyG2/controller.cpp +++ b/TinyG2/controller.cpp @@ -132,8 +132,8 @@ static void _controller_HSM() // //----- lowest level functions -------------------------------------------------------// // Order is important: - DISPATCH(hardware_hard_reset_handler()); // 1. received hard reset request -// DISPATCH(hardware_bootloader_handler()); // 2. received request to start bootloader + DISPATCH(hw_hard_reset_handler()); // 1. received hard reset request +// DISPATCH(hw_bootloader_handler()); // 2. received request to start bootloader DISPATCH(_alarm_idler()); // 3. idle in alarm state (shutdown) DISPATCH( poll_switches()); // 4. run a switch polling cycle DISPATCH(_limit_switch_handler()); // 5. limit switch has been thrown @@ -148,8 +148,8 @@ static void _controller_HSM() DISPATCH(st_motor_power_callback()); // stepper motor disable timer // DISPATCH(switch_debounce_callback()); // debounce switches - DISPATCH(rpt_status_report_callback()); // conditionally send status report - DISPATCH(rpt_queue_report_callback()); // conditionally send queue report + DISPATCH(sr_status_report_callback()); // conditionally send status report + DISPATCH(qr_queue_report_callback()); // conditionally send queue report DISPATCH(ar_arc_callback()); // arc generation runs behind lines DISPATCH(cm_homing_callback()); // G28.2 continuation // DISPATCH(cm_probe_callback()); // G38.2 continuation @@ -213,7 +213,7 @@ static stat_t _command_dispatch() } case 'H': { // intercept help screens cfg.comm_mode = TEXT_MODE; - print_general_help(); + help_general(NULL); text_response(STAT_OK, cs.in_buf); break; } diff --git a/TinyG2/controller.h b/TinyG2/controller.h index 8382a650..f5e4ac05 100755 --- a/TinyG2/controller.h +++ b/TinyG2/controller.h @@ -36,8 +36,8 @@ extern "C"{ #define INPUT_BUFFER_LEN 255 // text buffer size (255 max) #define SAVED_BUFFER_LEN 100 // saved buffer size (for reporting only) #define OUTPUT_BUFFER_LEN 512 // text buffer size -#define STATUS_MESSAGE_LEN 32 // status message string storage allocation #define APPLICATION_MESSAGE_LEN 64 // application message string storage allocation +//#define STATUS_MESSAGE_LEN __ // see tinyg2.h for status message string storage allocation #define LED_NORMAL_TIMER 1000 // blink rate for normal operation (in ms) #define LED_ALARM_TIMER 100 // blink rate for alarm state (in ms) diff --git a/TinyG2/cycle_homing.cpp b/TinyG2/cycle_homing.cpp index 032ad62e..e147662f 100755 --- a/TinyG2/cycle_homing.cpp +++ b/TinyG2/cycle_homing.cpp @@ -28,6 +28,8 @@ #include "tinyg2.h" #include "util.h" #include "config.h" +#include "json_parser.h" +#include "text_parser.h" #include "gcode_parser.h" #include "canonical_machine.h" #include "planner.h" @@ -168,7 +170,6 @@ stat_t cm_homing_cycle_start_no_set(void) static stat_t _homing_finalize_exit(int8_t axis) // third part of return to home { -// cm_request_queue_flush(); mp_flush_planner(); // should be stopped, but in case of switch closure. // don't use cm_request_queue_flush() here @@ -176,7 +177,7 @@ static stat_t _homing_finalize_exit(int8_t axis) // third part of return to home cm_set_units_mode(hm.saved_units_mode); cm_set_distance_mode(hm.saved_distance_mode); cm_set_feed_rate(hm.saved_feed_rate); - cm_set_motion_mode(MOTION_MODE_CANCEL_MOTION_MODE); + cm_set_motion_mode(MODEL, MOTION_MODE_CANCEL_MOTION_MODE); cm.homing_state = HOMING_HOMED; cm.cycle_state = CYCLE_OFF; // required cm_cycle_end(); @@ -192,12 +193,13 @@ static stat_t _homing_error_exit(int8_t axis) // Generate the warning message. Since the error exit returns via the homing callback // - and not the main controller - it requires its own display processing cmd_reset_list(); + if (axis == -2) { - cmd_add_conditional_message_P((const char_t *)PSTR("*** WARNING *** Homing error: Specified axis(es) cannot be homed")); - } else { + cmd_add_conditional_message((const char_t *)"*** WARNING *** Homing error: Specified axis(es) cannot be homed");; + } else { char message[CMD_MESSAGE_LEN]; - sprintf_P(message, PSTR("*** WARNING *** Homing error: %c axis settings misconfigured"), get_axis_char(axis)); - cmd_add_conditional_message((const char_t *)message); + sprintf_P(message, PSTR("*** WARNING *** Homing error: %c axis settings misconfigured"), cm_get_axis_char(axis)); + cmd_add_conditional_message((char_t *)message); } cmd_print_list(STAT_HOMING_CYCLE_FAILED, TEXT_INLINE_VALUES, JSON_RESPONSE_FORMAT); @@ -208,7 +210,7 @@ static stat_t _homing_error_exit(int8_t axis) cm_set_units_mode(hm.saved_units_mode); cm_set_distance_mode(hm.saved_distance_mode); cm_set_feed_rate(hm.saved_feed_rate); - cm_set_motion_mode(MOTION_MODE_CANCEL_MOTION_MODE); + cm_set_motion_mode(MODEL, MOTION_MODE_CANCEL_MOTION_MODE); cm.cycle_state = CYCLE_OFF; cm_cycle_end(); return (STAT_HOMING_CYCLE_FAILED); // homing state remains HOMING_NOT_HOMED @@ -255,10 +257,10 @@ static stat_t _homing_axis_start(int8_t axis) } } // trap gross mis-configurations - if ((fp_ZERO(cfg.a[axis].search_velocity)) || (fp_ZERO(cfg.a[axis].latch_velocity))) { + if ((fp_ZERO(cm.a[axis].search_velocity)) || (fp_ZERO(cm.a[axis].latch_velocity))) { return (_homing_error_exit(axis)); } - if ((cfg.a[axis].travel_max <= 0) || (cfg.a[axis].latch_backoff <= 0)) { + if ((cm.a[axis].travel_max <= 0) || (cm.a[axis].latch_backoff <= 0)) { return (_homing_error_exit(axis)); } @@ -270,24 +272,24 @@ static stat_t _homing_axis_start(int8_t axis) return (_homing_error_exit(axis)); // axis cannot be homed } hm.axis = axis; // persist the axis - hm.search_velocity = fabs(cfg.a[axis].search_velocity); // search velocity is always positive - hm.latch_velocity = fabs(cfg.a[axis].latch_velocity); // latch velocity is always positive + hm.search_velocity = fabs(cm.a[axis].search_velocity); // search velocity is always positive + hm.latch_velocity = fabs(cm.a[axis].latch_velocity); // latch velocity is always positive // setup parameters homing to the minimum switch if (hm.min_mode & SW_HOMING_BIT) { hm.homing_switch = MIN_SWITCH(axis); // the min is the homing switch hm.limit_switch = MAX_SWITCH(axis); // the max would be the limit switch - hm.search_travel = -cfg.a[axis].travel_max; // search travels in negative direction - hm.latch_backoff = cfg.a[axis].latch_backoff; // latch travels in positive direction - hm.zero_backoff = cfg.a[axis].zero_backoff; + hm.search_travel = -cm.a[axis].travel_max; // search travels in negative direction + hm.latch_backoff = cm.a[axis].latch_backoff; // latch travels in positive direction + hm.zero_backoff = cm.a[axis].zero_backoff; // setup parameters for positive travel (homing to the maximum switch) } else { hm.homing_switch = MAX_SWITCH(axis); // the max is the homing switch hm.limit_switch = MIN_SWITCH(axis); // the min would be the limit switch - hm.search_travel = cfg.a[axis].travel_max; // search travels in positive direction - hm.latch_backoff = -cfg.a[axis].latch_backoff; // latch travels in negative direction - hm.zero_backoff = -cfg.a[axis].zero_backoff; + hm.search_travel = cm.a[axis].travel_max; // search travels in positive direction + hm.latch_backoff = -cm.a[axis].latch_backoff; // latch travels in negative direction + hm.zero_backoff = -cm.a[axis].zero_backoff; } // if homing is disabled for the axis then skip to the next axis uint8_t sw_mode = get_switch_mode(hm.homing_switch); @@ -298,7 +300,7 @@ static stat_t _homing_axis_start(int8_t axis) if (get_switch_mode(hm.limit_switch) == SW_MODE_DISABLED) { hm.limit_switch = -1; } - hm.saved_jerk = cfg.a[axis].jerk_max; // save the max jerk value + hm.saved_jerk = cm.a[axis].jerk_max; // save the max jerk value return (_set_homing_func(_homing_axis_clear)); // start the clear } @@ -336,7 +338,7 @@ static stat_t _homing_axis_backoff_limit(int8_t axis) // back off cleared limit static stat_t _homing_axis_search(int8_t axis) // start the search { - cfg.a[axis].jerk_max = cfg.a[axis].jerk_homing; // use the homing jerk for search onward + cm.a[axis].jerk_max = cm.a[axis].jerk_homing; // use the homing jerk for search onward _homing_axis_move(axis, hm.search_travel, hm.search_velocity); return (_set_homing_func(_homing_axis_latch)); } @@ -359,9 +361,10 @@ static stat_t _homing_axis_set_zero(int8_t axis) // set zero and finish up cm_set_axis_origin(axis, 0); mp_set_runtime_position(axis, 0); } else { - cm_set_axis_origin(axis, cm_get_runtime_work_position(axis)); +// cm_set_axis_origin(axis, cm_get_runtime_work_position(axis)); + cm_set_axis_origin(axis, cm_get_work_position(RUNTIME, axis)); } - cfg.a[axis].jerk_max = hm.saved_jerk; // restore the max jerk value + cm.a[axis].jerk_max = hm.saved_jerk; // restore the max jerk value cm.homed[axis] = true; return (_set_homing_func(_homing_axis_start)); } diff --git a/TinyG2/gcode_parser.cpp b/TinyG2/gcode_parser.cpp index b0841991..44aec9f6 100755 --- a/TinyG2/gcode_parser.cpp +++ b/TinyG2/gcode_parser.cpp @@ -243,135 +243,135 @@ static stat_t _parse_gcode_block(char_t *buf) memset(&gp, 0, sizeof(gp)); // clear all parser values memset(&gf, 0, sizeof(gf)); // clear all next-state flags memset(&gn, 0, sizeof(gn)); // clear all next-state values - gn.motion_mode = cm_get_model_motion_mode(); // get motion mode from previous block + gn.motion_mode = cm_get_motion_mode(MODEL);// get motion mode from previous block - // extract commands and parameters - while((status = _get_next_gcode_word(&pstr, &letter, &value)) == STAT_OK) { - switch(letter) { - case 'G': - switch((uint8_t)value) { - case 0: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE); - case 1: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED); - case 2: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CW_ARC); - case 3: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CCW_ARC); - case 4: SET_NON_MODAL (next_action, NEXT_ACTION_DWELL); - case 10: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_COORD_DATA); - case 17: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_XY); - case 18: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_XZ); - case 19: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_YZ); - case 20: SET_MODAL (MODAL_GROUP_G6, units_mode, INCHES); - case 21: SET_MODAL (MODAL_GROUP_G6, units_mode, MILLIMETERS); - case 28: { - switch (_point(value)) { - case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_GOTO_G28_POSITION); - case 1: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_G28_POSITION); - case 2: SET_NON_MODAL (next_action, NEXT_ACTION_SEARCH_HOME); - case 3: SET_NON_MODAL (next_action, NEXT_ACTION_SET_ABSOLUTE_ORIGIN); - case 4: SET_NON_MODAL (next_action, NEXT_ACTION_HOMING_NO_SET); - default: status = STAT_UNRECOGNIZED_COMMAND; - } - break; - } - case 30: { - switch (_point(value)) { - case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_GOTO_G30_POSITION); - case 1: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_G30_POSITION); - default: status = STAT_UNRECOGNIZED_COMMAND; - } - break; - } - case 38: - switch (_point(value)) { - case 2: SET_NON_MODAL (next_action, NEXT_ACTION_STRAIGHT_PROBE); - default: status = STAT_UNRECOGNIZED_COMMAND; - } - break; - } - case 40: break; // ignore cancel cutter radius compensation - case 49: break; // ignore cancel tool length offset comp. - case 53: SET_NON_MODAL (absolute_override, true); - case 54: SET_MODAL (MODAL_GROUP_G12, coord_system, G54); - case 55: SET_MODAL (MODAL_GROUP_G12, coord_system, G55); - case 56: SET_MODAL (MODAL_GROUP_G12, coord_system, G56); - case 57: SET_MODAL (MODAL_GROUP_G12, coord_system, G57); - case 58: SET_MODAL (MODAL_GROUP_G12, coord_system, G58); - case 59: SET_MODAL (MODAL_GROUP_G12, coord_system, G59); - case 61: { - switch (_point(value)) { - case 0: SET_MODAL (MODAL_GROUP_G13, path_control, PATH_EXACT_PATH); - case 1: SET_MODAL (MODAL_GROUP_G13, path_control, PATH_EXACT_STOP); - default: status = STAT_UNRECOGNIZED_COMMAND; - } - break; - } - case 64: SET_MODAL (MODAL_GROUP_G13,path_control, PATH_CONTINUOUS); - case 80: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CANCEL_MOTION_MODE); - case 90: SET_MODAL (MODAL_GROUP_G3, distance_mode, ABSOLUTE_MODE); - case 91: SET_MODAL (MODAL_GROUP_G3, distance_mode, INCREMENTAL_MODE); - case 92: { - switch (_point(value)) { - case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_ORIGIN_OFFSETS); - case 1: SET_NON_MODAL (next_action, NEXT_ACTION_RESET_ORIGIN_OFFSETS); - case 2: SET_NON_MODAL (next_action, NEXT_ACTION_SUSPEND_ORIGIN_OFFSETS); - case 3: SET_NON_MODAL (next_action, NEXT_ACTION_RESUME_ORIGIN_OFFSETS); - default: status = STAT_UNRECOGNIZED_COMMAND; - } - break; - } - case 93: SET_MODAL (MODAL_GROUP_G5, inverse_feed_rate_mode, true); - case 94: SET_MODAL (MODAL_GROUP_G5, inverse_feed_rate_mode, false); - default: status = STAT_UNRECOGNIZED_COMMAND; - } - break; + // extract commands and parameters + while((status = _get_next_gcode_word(&pstr, &letter, &value)) == STAT_OK) { + switch(letter) { + case 'G': + switch((uint8_t)value) { + case 0: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_TRAVERSE); + case 1: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_STRAIGHT_FEED); + case 2: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CW_ARC); + case 3: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CCW_ARC); + case 4: SET_NON_MODAL (next_action, NEXT_ACTION_DWELL); + case 10: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_COORD_DATA); + case 17: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_XY); + case 18: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_XZ); + case 19: SET_MODAL (MODAL_GROUP_G2, select_plane, CANON_PLANE_YZ); + case 20: SET_MODAL (MODAL_GROUP_G6, units_mode, INCHES); + case 21: SET_MODAL (MODAL_GROUP_G6, units_mode, MILLIMETERS); + case 28: { + switch (_point(value)) { + case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_GOTO_G28_POSITION); + case 1: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_G28_POSITION); + case 2: SET_NON_MODAL (next_action, NEXT_ACTION_SEARCH_HOME); + case 3: SET_NON_MODAL (next_action, NEXT_ACTION_SET_ABSOLUTE_ORIGIN); + case 4: SET_NON_MODAL (next_action, NEXT_ACTION_HOMING_NO_SET); + default: status = STAT_UNRECOGNIZED_COMMAND; + } + break; + } + case 30: { + switch (_point(value)) { + case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_GOTO_G30_POSITION); + case 1: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_G30_POSITION); + default: status = STAT_UNRECOGNIZED_COMMAND; + } + break; + } + case 38: { + switch (_point(value)) { + case 2: SET_NON_MODAL (next_action, NEXT_ACTION_STRAIGHT_PROBE); + default: status = STAT_UNRECOGNIZED_COMMAND; + } + break; + } + case 40: break; // ignore cancel cutter radius compensation + case 49: break; // ignore cancel tool length offset comp. + case 53: SET_NON_MODAL (absolute_override, true); + case 54: SET_MODAL (MODAL_GROUP_G12, coord_system, G54); + case 55: SET_MODAL (MODAL_GROUP_G12, coord_system, G55); + case 56: SET_MODAL (MODAL_GROUP_G12, coord_system, G56); + case 57: SET_MODAL (MODAL_GROUP_G12, coord_system, G57); + case 58: SET_MODAL (MODAL_GROUP_G12, coord_system, G58); + case 59: SET_MODAL (MODAL_GROUP_G12, coord_system, G59); + case 61: { + switch (_point(value)) { + case 0: SET_MODAL (MODAL_GROUP_G13, path_control, PATH_EXACT_PATH); + case 1: SET_MODAL (MODAL_GROUP_G13, path_control, PATH_EXACT_STOP); + default: status = STAT_UNRECOGNIZED_COMMAND; + } + break; + } + case 64: SET_MODAL (MODAL_GROUP_G13,path_control, PATH_CONTINUOUS); + case 80: SET_MODAL (MODAL_GROUP_G1, motion_mode, MOTION_MODE_CANCEL_MOTION_MODE); + case 90: SET_MODAL (MODAL_GROUP_G3, distance_mode, ABSOLUTE_MODE); + case 91: SET_MODAL (MODAL_GROUP_G3, distance_mode, INCREMENTAL_MODE); + case 92: { + switch (_point(value)) { + case 0: SET_MODAL (MODAL_GROUP_G0, next_action, NEXT_ACTION_SET_ORIGIN_OFFSETS); + case 1: SET_NON_MODAL (next_action, NEXT_ACTION_RESET_ORIGIN_OFFSETS); + case 2: SET_NON_MODAL (next_action, NEXT_ACTION_SUSPEND_ORIGIN_OFFSETS); + case 3: SET_NON_MODAL (next_action, NEXT_ACTION_RESUME_ORIGIN_OFFSETS); + default: status = STAT_UNRECOGNIZED_COMMAND; + } + break; + } + case 93: SET_MODAL (MODAL_GROUP_G5, inverse_feed_rate_mode, true); + case 94: SET_MODAL (MODAL_GROUP_G5, inverse_feed_rate_mode, false); + default: status = STAT_UNRECOGNIZED_COMMAND; + } + break; - case 'M': - switch((uint8_t)value) { - case 0: case 1: - SET_MODAL (MODAL_GROUP_M4, program_flow, PROGRAM_STOP); - case 2: case 30: case 60: - SET_MODAL (MODAL_GROUP_M4, program_flow, PROGRAM_END); - case 3: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_CW); - case 4: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_CCW); - case 5: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_OFF); - case 6: SET_NON_MODAL (change_tool, true); - case 7: SET_MODAL (MODAL_GROUP_M8, mist_coolant, true); - case 8: SET_MODAL (MODAL_GROUP_M8, flood_coolant, true); - case 9: SET_MODAL (MODAL_GROUP_M8, flood_coolant, false); - case 48: SET_MODAL (MODAL_GROUP_M9, override_enables, true); - case 49: SET_MODAL (MODAL_GROUP_M9, override_enables, false); - case 50: SET_MODAL (MODAL_GROUP_M9, feed_rate_override_enable, true); // conditionally true - case 51: SET_MODAL (MODAL_GROUP_M9, spindle_override_enable, true); // conditionally true - default: status = STAT_UNRECOGNIZED_COMMAND; - } - break; + case 'M': + switch((uint8_t)value) { + case 0: case 1: case 60: + SET_MODAL (MODAL_GROUP_M4, program_flow, PROGRAM_STOP); + case 2: case 30: + SET_MODAL (MODAL_GROUP_M4, program_flow, PROGRAM_END); + case 3: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_CW); + case 4: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_CCW); + case 5: SET_MODAL (MODAL_GROUP_M7, spindle_mode, SPINDLE_OFF); + case 6: SET_NON_MODAL (tool_change, true); + case 7: SET_MODAL (MODAL_GROUP_M8, mist_coolant, true); + case 8: SET_MODAL (MODAL_GROUP_M8, flood_coolant, true); + case 9: SET_MODAL (MODAL_GROUP_M8, flood_coolant, false); + case 48: SET_MODAL (MODAL_GROUP_M9, override_enables, true); + case 49: SET_MODAL (MODAL_GROUP_M9, override_enables, false); + case 50: SET_MODAL (MODAL_GROUP_M9, feed_rate_override_enable, true); // conditionally true + case 51: SET_MODAL (MODAL_GROUP_M9, spindle_override_enable, true); // conditionally true + default: status = STAT_UNRECOGNIZED_COMMAND; + } + break; - case 'T': SET_NON_MODAL (tool, (uint8_t)trunc(value)); - case 'F': SET_NON_MODAL (feed_rate, value); - case 'P': SET_NON_MODAL (parameter, value); // used for dwell time, G10 coord select - case 'S': SET_NON_MODAL (spindle_speed, value); - case 'X': SET_NON_MODAL (target[AXIS_X], value); - case 'Y': SET_NON_MODAL (target[AXIS_Y], value); - case 'Z': SET_NON_MODAL (target[AXIS_Z], value); - case 'A': SET_NON_MODAL (target[AXIS_A], value); - case 'B': SET_NON_MODAL (target[AXIS_B], value); - case 'C': SET_NON_MODAL (target[AXIS_C], value); - // case 'U': SET_NON_MODAL (target[AXIS_U], value); // reserved - // case 'V': SET_NON_MODAL (target[AXIS_V], value); // reserved - // case 'W': SET_NON_MODAL (target[AXIS_W], value); // reserved - case 'I': SET_NON_MODAL (arc_offset[0], value); - case 'J': SET_NON_MODAL (arc_offset[1], value); - case 'K': SET_NON_MODAL (arc_offset[2], value); - case 'R': SET_NON_MODAL (arc_radius, value); - case 'N': SET_NON_MODAL (linenum,(uint32_t)value); // line number - case 'L': break; // not used for anything - default: status = STAT_UNRECOGNIZED_COMMAND; - } - if(status != STAT_OK) break; - } - if ((status != STAT_OK) && (status != STAT_COMPLETE)) return (status); - ritorno(_validate_gcode_block()); - return (_execute_gcode_block()); // if successful execute the block -} + case 'T': SET_NON_MODAL (tool_select, (uint8_t)trunc(value)); + case 'F': SET_NON_MODAL (feed_rate, value); + case 'P': SET_NON_MODAL (parameter, value); // used for dwell time, G10 coord select + case 'S': SET_NON_MODAL (spindle_speed, value); + case 'X': SET_NON_MODAL (target[AXIS_X], value); + case 'Y': SET_NON_MODAL (target[AXIS_Y], value); + case 'Z': SET_NON_MODAL (target[AXIS_Z], value); + case 'A': SET_NON_MODAL (target[AXIS_A], value); + case 'B': SET_NON_MODAL (target[AXIS_B], value); + case 'C': SET_NON_MODAL (target[AXIS_C], value); + // case 'U': SET_NON_MODAL (target[AXIS_U], value); // reserved + // case 'V': SET_NON_MODAL (target[AXIS_V], value); // reserved + // case 'W': SET_NON_MODAL (target[AXIS_W], value); // reserved + case 'I': SET_NON_MODAL (arc_offset[0], value); + case 'J': SET_NON_MODAL (arc_offset[1], value); + case 'K': SET_NON_MODAL (arc_offset[2], value); + case 'R': SET_NON_MODAL (arc_radius, value); + case 'N': SET_NON_MODAL (linenum,(uint32_t)value); // line number + case 'L': break; // not used for anything + default: status = STAT_UNRECOGNIZED_COMMAND; + } + if(status != STAT_OK) break; + } + if ((status != STAT_OK) && (status != STAT_COMPLETE)) return (status); + ritorno(_validate_gcode_block()); + return (_execute_gcode_block()); // if successful execute the block + } /* * _execute_gcode_block() - execute parsed block diff --git a/TinyG2/hardware.cpp b/TinyG2/hardware.cpp index 81bf8725..b9dbb563 100755 --- a/TinyG2/hardware.cpp +++ b/TinyG2/hardware.cpp @@ -27,6 +27,8 @@ #include "tinyg2.h" // #1 #include "config.h" // #2 +//#include "switch.h" +#include "controller.h" #include "hardware.h" #include "text_parser.h" @@ -43,62 +45,17 @@ void hardware_init() return; } -/* UNUSED -uint8_t _read_calibration_byte(uint8_t index) -{ - NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc; // Load NVM Command register to read the calibration row - uint8_t result = pgm_read_byte(index); - NVM_CMD = NVM_CMD_NO_OPERATION_gc; // Clean up NVM Command register - return(result); -} -*/ - /* - * hw_get_id() - get a human readable signature + * _get_id() - get a human readable signature * - * Produces a unique deviceID based on the factory calibration data. Format is: + * Produce a unique deviceID based on the factory calibration data. Format is: * 123456-ABC - * - * The number part is a direct readout of the 6 digit lot number - * The alpha is the lo 5 bits of wafer number and XY coords in printable ASCII - * Refer to NVM_PROD_SIGNATURES_t in iox192a3.h for details. */ - /* -enum { - LOTNUM0=8, // Lot Number Byte 0, ASCII - LOTNUM1, // Lot Number Byte 1, ASCII - LOTNUM2, // Lot Number Byte 2, ASCII - LOTNUM3, // Lot Number Byte 3, ASCII - LOTNUM4, // Lot Number Byte 4, ASCII - LOTNUM5, // Lot Number Byte 5, ASCII - WAFNUM =16, // Wafer Number - COORDX0=18, // Wafer Coordinate X Byte 0 - COORDX1, // Wafer Coordinate X Byte 1 - COORDY0, // Wafer Coordinate Y Byte 0 - COORDY1, // Wafer Coordinate Y Byte 1 -}; void hw_get_id(char_t *id) { - char printable[33] = {"ABCDEFGHJKLMNPQRSTUVWXYZ23456789"}; - uint8_t i; - - NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc; // Load NVM Command register to read the calibration row - - for (i=0; i<6; i++) { - id[i] = pgm_read_byte(LOTNUM0 + i); - } - id[i++] = '-'; - id[i++] = printable[(pgm_read_byte(WAFNUM) & 0x1F)]; - id[i++] = printable[(pgm_read_byte(COORDX0) & 0x1F)]; -// id[i++] = printable[(pgm_read_byte(COORDX1) & 0x1F)]; - id[i++] = printable[(pgm_read_byte(COORDY0) & 0x1F)]; -// id[i++] = printable[(pgm_read_byte(COORDY1) & 0x1F)]; - id[i] = 0; - - NVM_CMD = NVM_CMD_NO_OPERATION_gc; // Clean up NVM Command register + return; } -*/ /* * Hardware Reset Handlers @@ -117,8 +74,8 @@ void hw_hard_reset(void) // software hard reset using the watchdog timer stat_t hw_hard_reset_handler(void) { -// if (cs.hard_reset_requested == false) { return (STAT_NOOP);} -// hw_hard_reset(); // hard reset - identical to hitting RESET button + if (cs.hard_reset_requested == false) { return (STAT_NOOP);} + hw_hard_reset(); // hard reset - identical to hitting RESET button return (STAT_EAGAIN); } @@ -147,6 +104,19 @@ stat_t hw_bootloader_handler(void) * Functions to get and set variables from the cfgArray table ***********************************************************************************/ +/* + * hw_get_id() - get device ID (signature) + */ + +stat_t hw_get_id(cmdObj_t *cmd) +{ +// char_t tmp[SYS_ID_LEN]; +// _get_id(tmp); +// cmd->objtype = TYPE_STRING; +// ritorno(cmd_copy_string(cmd, tmp)); + return (STAT_OK); +} + /* * hw_run_boot() - invoke boot form the cfgArray */ @@ -161,24 +131,6 @@ stat_t hw_run_boot(cmdObj_t *cmd) */ stat_t hw_set_hv(cmdObj_t *cmd) { - if (cmd->value > TINYG_HARDWARE_VERSION_MAX) { return (STAT_INPUT_VALUE_UNSUPPORTED);} - set_flt(cmd); // record the hardware version -// _port_bindings(cmd->value); // reset port bindings - switch_init(); // re-initialize the GPIO ports -//+++++ gpio_init(); // re-initialize the GPIO ports - return (STAT_OK); -} - -/* - * hw_get_id() - get device ID (signature) - */ - -stat_t hw_get_id(cmdObj_t *cmd) -{ - char_t tmp[SYS_ID_LEN]; - _get_id(tmp); - cmd->objtype = TYPE_STRING; - ritorno(cmd_copy_string(cmd, tmp)); return (STAT_OK); } @@ -190,11 +142,11 @@ stat_t hw_get_id(cmdObj_t *cmd) #ifdef __TEXT_MODE -const char_t PROGMEM fmt_fb[] = "[fb] firmware build%18.2f\n"; -const char_t PROGMEM fmt_fv[] = "[fv] firmware version%16.2f\n"; -const char_t PROGMEM fmt_hv[] = "[hp] hardware platform%15.2f\n"; -const char_t PROGMEM fmt_hv[] = "[hv] hardware version%16.2f\n"; -const char_t PROGMEM fmt_id[] = "[id] TinyG ID%30s\n"; +const char PROGMEM fmt_fb[] = "[fb] firmware build%18.2f\n"; +const char PROGMEM fmt_fv[] = "[fv] firmware version%16.2f\n"; +const char PROGMEM fmt_hp[] = "[hp] hardware platform%15.2f\n"; +const char PROGMEM fmt_hv[] = "[hv] hardware version%16.2f\n"; +const char PROGMEM fmt_id[] = "[id] TinyG ID%30s\n"; void hw_print_fb(cmdObj_t *cmd) { text_print_flt(cmd, fmt_fb);} void hw_print_fv(cmdObj_t *cmd) { text_print_flt(cmd, fmt_fv);} diff --git a/TinyG2/hardware.h b/TinyG2/hardware.h index 915d6d50..287c66fe 100755 --- a/TinyG2/hardware.h +++ b/TinyG2/hardware.h @@ -27,14 +27,11 @@ */ #ifndef HARDWARE_H_ONCE #define HARDWARE_H_ONCE - -#include "motatePins.h" -#include "motateTimers.h" // for Motate::timer_number - +/* #ifdef __cplusplus extern "C"{ #endif - +*/ /**** Global System Defines ****/ #undef F_CPU // CPU clock - set for delays @@ -42,6 +39,12 @@ extern "C"{ #define MILLISECONDS_PER_TICK 1 // MS for system tick (systick * N) #define SYS_ID_LEN 12 // length of system ID string from sys_get_id() +/************************************************************************************ + **** ARM SAM3X8E SPECIFIC HARDWARE ************************************************* + ************************************************************************************/ +#include "motatePins.h" +#include "motateTimers.h" // for Motate::timer_number + /**** Resource Assignment via Motate **** * * This section defines resource usage for pins, timers, PWM channels, communications @@ -281,9 +284,9 @@ stat_t hw_get_id(cmdObj_t *cmd); #define hw_print_id tx_print_stub #endif // __TEXT_MODE - +/* #ifdef __cplusplus } #endif - +*/ #endif // end of include guard: HARDWARE_H_ONCE diff --git a/TinyG2/main.cpp b/TinyG2/main.cpp index ceb30d13..e9cf3d15 100755 --- a/TinyG2/main.cpp +++ b/TinyG2/main.cpp @@ -57,9 +57,6 @@ void __libc_init_array(void); static void _application_init(void); -// collect all weird little globals here -stat_t status_code; // declared for ritorno, see tinyg2.h - /******************** Application Code ************************/ const Motate::USBSettings_t Motate::USBSettings = { diff --git a/TinyG2/switch.cpp b/TinyG2/switch.cpp index b4849b2c..a9ca1472 100755 --- a/TinyG2/switch.cpp +++ b/TinyG2/switch.cpp @@ -41,6 +41,7 @@ */ #include "tinyg2.h" +#include "config.h" #include "switch.h" #include "hardware.h" #include "canonical_machine.h" @@ -187,6 +188,53 @@ static void _trigger_cycle_start(switch_t *s) uint8_t get_switch_mode(uint8_t sw_num) { return (0);} // ++++ +/*********************************************************************************** + * CONFIGURATION AND INTERFACE FUNCTIONS + * Functions to get and set variables from the cfgArray table + * These functions are not part of the NIST defined functions + ***********************************************************************************/ + +stat_t sw_set_st(cmdObj_t *cmd) // switch type (global) +{ +// if (cmd->value > SW_MODE_MAX_VALUE) { return (STAT_INPUT_VALUE_UNSUPPORTED);} + set_01(cmd); + switch_init(); + return (STAT_OK); +} + +stat_t sw_set_sw(cmdObj_t *cmd) // switch setting +{ + if (cmd->value > SW_MODE_MAX_VALUE) { return (STAT_INPUT_VALUE_UNSUPPORTED);} + set_ui8(cmd); + switch_init(); + return (STAT_OK); +} + +/*********************************************************************************** + * TEXT MODE SUPPORT + * Functions to print variables from the cfgArray table + ***********************************************************************************/ + +#ifdef __TEXT_MODE + +const char PROGMEM fmt_st[] = "[st] switch type%18d [0=NO,1=NC]\n"; +void sw_print_st(cmdObj_t *cmd) { text_print_flt(cmd, fmt_st);} + +//const char PROGMEM fmt_ss[] = "Switch %s state: %d\n"; +//void sw_print_ss(cmdObj_t *cmd) { fprintf(stderr, fmt_ss, cmd->token, (uint8_t)cmd->value);} + +/* +static const char PROGMEM msg_sw0[] = "Disabled"; +static const char PROGMEM msg_sw1[] = "NO homing"; +static const char PROGMEM msg_sw2[] = "NO homing & limit"; +static const char PROGMEM msg_sw3[] = "NC homing"; +static const char PROGMEM msg_sw4[] = "NC homing & limit"; +static PGM_P const PROGMEM msg_sw[] = { msg_sw0, msg_sw1, msg_sw2, msg_sw3, msg_sw4 }; +*/ + + +#endif + //########################################################################### //##### UNIT TESTS ########################################################## //########################################################################### diff --git a/TinyG2/switch.h b/TinyG2/switch.h index 2d938db6..d47a859e 100755 --- a/TinyG2/switch.h +++ b/TinyG2/switch.h @@ -120,6 +120,15 @@ void switch_reset_switches(void); uint8_t switch_read_switch(uint8_t sw_num); */ +stat_t sw_set_st(cmdObj_t *cmd); +stat_t sw_set_sw(cmdObj_t *cmd); + +#ifdef __TEXT_MODE + void sw_print_st(cmdObj_t *cmd); +#else + #define sw_print_st tx_print_stub +#endif // __TEXT_MODE + /* unit test setup */ //#define __UNIT_TEST_GPIO // uncomment to enable GPIO unit tests diff --git a/TinyG2/tinyg2.h b/TinyG2/tinyg2.h index 2f062b71..18010323 100755 --- a/TinyG2/tinyg2.h +++ b/TinyG2/tinyg2.h @@ -193,7 +193,11 @@ typedef uint16_t magic_t; // magic number size * It returns only if an error occurred. (ritorno is Italian for return) */ typedef uint8_t stat_t; -extern stat_t status_code; // declared in main.cpp +#define STATUS_MESSAGE_LEN 48 // status message string storage allocation +char status_message[STATUS_MESSAGE_LEN];// allocate string for global use + +stat_t status_code; // allocate a variable for this macro +//extern stat_t status_code; // declared in main.cpp #define ritorno(a) if((status_code=a) != STAT_OK) { return(status_code); } // OS, communications and low-level status (must align with XIO_xxxx codes in xio.h)