diff --git a/CHANGELOG.md b/CHANGELOG.md index 71218c2c3..de0d9a800 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,20 @@ # Changelog +## [1.0.0-rc] - 2020-07-11 + +### Added + - added possibility of changing values og G28 and G30 commands via G10 L2 P28 and G10 L2 P30. + - added configuration for using software pulling input limit/control pins + +### Changed + - configuration now simplified (choose board only and the mcu is selected to match the board) + +### Fixed + - fixed code without probe + - fixed code without spindle + - compliance to strict-prototype functions + ## [1.0.0-beta.2] - 2020-02-09 ### Added @@ -110,5 +124,6 @@ ### Initial release +[1.0.0-rc]: https://github.com/Paciente8159/uCNC/releases/tag/v1.0.0-rc [1.0.0-beta.2]: https://github.com/Paciente8159/uCNC/releases/tag/v1.0.0-beta.2 [1.0.0-beta]: https://github.com/Paciente8159/uCNC/releases/tag/v1.0.0-beta diff --git a/uCNC/boarddefs.h b/uCNC/boarddefs.h index e4e7354a9..dc417f1cb 100644 --- a/uCNC/boarddefs.h +++ b/uCNC/boarddefs.h @@ -2,16 +2,16 @@ Name: boarddefs.h Description: Defines the available board types. - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 07/02/2020 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -19,29 +19,33 @@ #ifndef BOARDDEFS_H #define BOARDDEFS_H +#include "mcus.h" #include "boards.h" /* MCU port map */ -#if(BOARD != 0) +#if (BOARD != 0) #else #error Invalid board configuration #endif -#if(BOARD == BOARD_GRBL) +#if (BOARD == BOARD_GRBL) +#define MCU MCU_AVR #include "mcus\avr\boardmap_grbl.h" #endif -#if(BOARD == BOARD_RAMBO14) +#if (BOARD == BOARD_RAMBO14) +#define MCU MCU_AVR #include "mcus\avr\boardmap_rambo14.h" #endif -#if(BOARD == BOARD_RAMPS14) +#if (BOARD == BOARD_RAMPS14) +#define MCU MCU_AVR #include "mcus\avr\boardmap_ramps14.h" #endif -#if(BOARD == BOARD_VIRTUAL) +#if (BOARD == BOARD_VIRTUAL) #endif @@ -49,4 +53,6 @@ #error Undefined board #endif +#include "mcudefs.h" //configures the mcu based on the board pin configuration + #endif diff --git a/uCNC/build.h b/uCNC/build.h index 01a119574..7673f97d0 100644 --- a/uCNC/build.h +++ b/uCNC/build.h @@ -20,7 +20,7 @@ #define BUILD_H #define MAJOR_MINOR_VERSION "1.0." -#define PATCH_VERSION "0-beta.2" +#define PATCH_VERSION "0-rc" #define VERSION MAJOR_MINOR_VERSION PATCH_VERSION diff --git a/uCNC/cnc.c b/uCNC/cnc.c index e1ead1edb..d2f2d6511 100644 --- a/uCNC/cnc.c +++ b/uCNC/cnc.c @@ -1,17 +1,17 @@ /* Name: cnc.c - Description: µCNC main unit. + Description: µCNC main unit. - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 17/09/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -54,69 +54,69 @@ static void cnc_exec_rt_commands(); static void cnc_exec_rt_messages(); static void cnc_reset(); -void cnc_init() +void cnc_init(void) { //initializes cnc state #ifdef FORCE_GLOBALS_TO_0 memset(&cnc_state, 0, sizeof(cnc_state_t)); #endif //initializes all systems - mcu_init(); //mcu - serial_init(); //serial - settings_init();//settings - parser_init(); //parser - mc_init(); //motion control - planner_init(); //motion planner - itp_init(); //interpolator + mcu_init(); //mcu + serial_init(); //serial + settings_init(); //settings + parser_init(); //parser + mc_init(); //motion control + planner_init(); //motion planner + itp_init(); //interpolator serial_flush(); } -void cnc_run() +void cnc_run(void) { cnc_reset(); do { //process gcode commands - if(!serial_rx_is_empty()) + if (!serial_rx_is_empty()) { uint8_t error = 0; //protocol_echo(); uint8_t c = serial_peek(); - switch(c) + switch (c) { - case EOL: - serial_getc(); - break; - case '$': + case EOL: + serial_getc(); + break; + case '$': #ifdef ECHO_CMD - protocol_send_string(MSG_ECHO); + protocol_send_string(MSG_ECHO); #endif - error = parser_grbl_command(); + error = parser_grbl_command(); #ifdef ECHO_CMD - protocol_send_string(MSG_END); + protocol_send_string(MSG_END); #endif - error = parse_grbl_error_code(error); //processes the error code to perform additional actions - break; - default: + error = parse_grbl_error_code(error); //processes the error code to perform additional actions + break; + default: #ifdef ECHO_CMD - protocol_send_string(MSG_ECHO); + protocol_send_string(MSG_ECHO); #endif - if(!cnc_get_exec_state(EXEC_GCODE_LOCKED)) - { - error = parser_gcode_command(); - } - else - { - error = STATUS_SYSTEM_GC_LOCK; - } + if (!cnc_get_exec_state(EXEC_GCODE_LOCKED)) + { + error = parser_gcode_command(); + } + else + { + error = STATUS_SYSTEM_GC_LOCK; + } #ifdef ECHO_CMD - protocol_send_string(MSG_END); + protocol_send_string(MSG_END); #endif - break; + break; } - if(!error) + if (!error) { protocol_send_ok(); } @@ -125,19 +125,17 @@ void cnc_run() protocol_send_error(error); } } - } - while(cnc_doevents()); + } while (cnc_doevents()); cnc_clear_exec_state(EXEC_ABORT); //clears the abort flag serial_flush(); - if(cnc_get_exec_state(EXEC_ALARM_ABORT))//checks if any alarm is active (except NOHOME - ignore it) + if (cnc_get_exec_state(EXEC_ALARM_ABORT)) //checks if any alarm is active (except NOHOME - ignore it) { cnc_check_fault_systems(); protocol_send_string(MSG_FEEDBACK_1); do { - } - while(!CHECKFLAG(cnc_state.rt_cmd,RT_CMD_ABORT)); + } while (!CHECKFLAG(cnc_state.rt_cmd, RT_CMD_ABORT)); } } @@ -145,89 +143,107 @@ void cnc_call_rt_command(uint8_t command) { //executes the realtime commands //control commands affect the exec_state directly (Abort, hold, safety door, cycle_start) - switch(command) + switch (command) { - case CMD_CODE_RESET: - cnc_stop(); - serial_rx_clear(); //dumps all commands - cnc_alarm(EXEC_ALARM_RESET); //abort state is activated through cnc_alarm - SETFLAG(cnc_state.rt_cmd, RT_CMD_ABORT); - break; - case CMD_CODE_FEED_HOLD: + case CMD_CODE_RESET: + cnc_stop(); + serial_rx_clear(); //dumps all commands + cnc_alarm(EXEC_ALARM_RESET); //abort state is activated through cnc_alarm + SETFLAG(cnc_state.rt_cmd, RT_CMD_ABORT); + break; + case CMD_CODE_FEED_HOLD: + cnc_set_exec_state(EXEC_HOLD); + break; + case CMD_CODE_REPORT: + SETFLAG(cnc_state.rt_cmd, RT_CMD_REPORT); + break; + case CMD_CODE_CYCLE_START: + cnc_clear_exec_state(EXEC_HOLD); //tries to clear hold if possible + break; + case CMD_CODE_SAFETY_DOOR: + cnc_clear_exec_state(EXEC_HOLD | EXEC_DOOR); + break; + case CMD_CODE_JOG_CANCEL: + if (cnc_get_exec_state(EXEC_JOG)) + { cnc_set_exec_state(EXEC_HOLD); - break; - case CMD_CODE_REPORT: - SETFLAG(cnc_state.rt_cmd, RT_CMD_REPORT); - break; - case CMD_CODE_CYCLE_START: - cnc_clear_exec_state(EXEC_HOLD); //tries to clear hold if possible - break; - case CMD_CODE_SAFETY_DOOR: - cnc_clear_exec_state(EXEC_HOLD | EXEC_DOOR); - break; - case CMD_CODE_JOG_CANCEL: - if(cnc_get_exec_state(EXEC_JOG)) - { - cnc_set_exec_state(EXEC_HOLD); - } - break; - case CMD_CODE_FEED_100: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_100); - break; - case CMD_CODE_FEED_INC_COARSE: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_INC_COARSE); - break; - case CMD_CODE_FEED_DEC_COARSE: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_DEC_COARSE); - break; - case CMD_CODE_FEED_INC_FINE: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_INC_FINE); - break; - case CMD_CODE_FEED_DEC_FINE: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_DEC_FINE); - break; - case CMD_CODE_RAPIDFEED_100: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_RAPIDFEED_100); - break; - case CMD_CODE_RAPIDFEED_OVR1: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_RAPIDFEED_OVR1); - break; - case CMD_CODE_RAPIDFEED_OVR2: - SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_RAPIDFEED_OVR2); - break; - case CMD_CODE_SPINDLE_100: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_100); - break; - case CMD_CODE_SPINDLE_INC_COARSE: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_INC_COARSE); - break; - case CMD_CODE_SPINDLE_DEC_COARSE: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_DEC_COARSE); - break; - case CMD_CODE_SPINDLE_INC_FINE: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_INC_FINE); - break; - case CMD_CODE_SPINDLE_DEC_FINE: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_DEC_FINE); - break; - case CMD_CODE_SPINDLE_TOGGLE: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_TOGGLE); - break; - case CMD_CODE_COOL_FLD_TOGGLE: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_COOL_FLD_TOGGLE); - break; - case CMD_CODE_COOL_MST_TOGGLE: - SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_COOL_MST_TOGGLE); - break; + } + break; + case CMD_CODE_FEED_100: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_100); + break; + case CMD_CODE_FEED_INC_COARSE: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_INC_COARSE); + break; + case CMD_CODE_FEED_DEC_COARSE: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_DEC_COARSE); + break; + case CMD_CODE_FEED_INC_FINE: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_INC_FINE); + break; + case CMD_CODE_FEED_DEC_FINE: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_FEED_DEC_FINE); + break; + case CMD_CODE_RAPIDFEED_100: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_RAPIDFEED_100); + break; + case CMD_CODE_RAPIDFEED_OVR1: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_RAPIDFEED_OVR1); + break; + case CMD_CODE_RAPIDFEED_OVR2: + SETFLAG(cnc_state.feed_ovr_cmd, RT_CMD_RAPIDFEED_OVR2); + break; + case CMD_CODE_SPINDLE_100: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_100); + break; + case CMD_CODE_SPINDLE_INC_COARSE: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_INC_COARSE); + break; + case CMD_CODE_SPINDLE_DEC_COARSE: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_DEC_COARSE); + break; + case CMD_CODE_SPINDLE_INC_FINE: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_INC_FINE); + break; + case CMD_CODE_SPINDLE_DEC_FINE: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_DEC_FINE); + break; + case CMD_CODE_SPINDLE_TOGGLE: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_SPINDLE_TOGGLE); + break; + case CMD_CODE_COOL_FLD_TOGGLE: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_COOL_FLD_TOGGLE); + break; + case CMD_CODE_COOL_MST_TOGGLE: + SETFLAG(cnc_state.tool_ovr_cmd, RT_CMD_COOL_MST_TOGGLE); + break; } } -bool cnc_doevents() +bool cnc_doevents(void) { +#ifdef USE_INPUTS_POOLING_ONLY + static uint8_t limits = 0; + static uint8_t controls = 0; + uint8_t val = io_get_limits(); + if (limits != val) + { + io_limits_isr(); + limits = val; + } + + val = io_get_controls(); + if (controls != val) + { + io_controls_isr(); + controls = val; + } +#endif + cnc_exec_rt_commands(); //executes all pending realtime commands //check security interlocking for any problem - if(!cnc_check_interlocking()) + if (!cnc_check_interlocking()) { return !cnc_get_exec_state(EXEC_ABORT); } @@ -237,11 +253,11 @@ bool cnc_doevents() return !cnc_get_exec_state(EXEC_ABORT); } -void cnc_home() +void cnc_home(void) { cnc_set_exec_state(EXEC_HOMING); uint8_t error = kinematics_home(); - if(error) + if (error) { //disables homing and reenables alarm messages cnc_clear_exec_state(EXEC_HOMING); @@ -256,22 +272,21 @@ void cnc_home() planner_block_data_t block_data; planner_get_position(target); - for(uint8_t i = AXIS_COUNT; i != 0;) + for (uint8_t i = AXIS_COUNT; i != 0;) { i--; - target[i] += ((g_settings.homing_dir_invert_mask & (1<>=1; + cmd_mask >>= 1; } //executes feeds override rt commands cmd_mask = 0x80; - command = cnc_state.feed_ovr_cmd; //copies realtime flags states + command = cnc_state.feed_ovr_cmd; //copies realtime flags states cnc_state.feed_ovr_cmd = RT_CMD_CLEAR; //clears command flags - while(command) + while (command) { switch (command & cmd_mask) { - case RT_CMD_FEED_100: - planner_feed_ovr_reset(); - break; - case RT_CMD_FEED_INC_COARSE: - planner_feed_ovr_inc(FEED_OVR_COARSE); - break; - case RT_CMD_FEED_DEC_COARSE: - planner_feed_ovr_inc(-FEED_OVR_COARSE); - break; - case RT_CMD_FEED_INC_FINE: - planner_feed_ovr_inc(FEED_OVR_FINE); - break; - case RT_CMD_FEED_DEC_FINE: - planner_feed_ovr_inc(-FEED_OVR_FINE); - break; - case RT_CMD_RAPIDFEED_100: - planner_rapid_feed_ovr_reset(); - break; - case RT_CMD_RAPIDFEED_OVR1: - planner_rapid_feed_ovr(RAPID_FEED_OVR1); - break; - case RT_CMD_RAPIDFEED_OVR2: - planner_rapid_feed_ovr(RAPID_FEED_OVR2); - break; + case RT_CMD_FEED_100: + planner_feed_ovr_reset(); + break; + case RT_CMD_FEED_INC_COARSE: + planner_feed_ovr_inc(FEED_OVR_COARSE); + break; + case RT_CMD_FEED_DEC_COARSE: + planner_feed_ovr_inc(-FEED_OVR_COARSE); + break; + case RT_CMD_FEED_INC_FINE: + planner_feed_ovr_inc(FEED_OVR_FINE); + break; + case RT_CMD_FEED_DEC_FINE: + planner_feed_ovr_inc(-FEED_OVR_FINE); + break; + case RT_CMD_RAPIDFEED_100: + planner_rapid_feed_ovr_reset(); + break; + case RT_CMD_RAPIDFEED_OVR1: + planner_rapid_feed_ovr(RAPID_FEED_OVR1); + break; + case RT_CMD_RAPIDFEED_OVR2: + planner_rapid_feed_ovr(RAPID_FEED_OVR2); + break; } CLEARFLAG(command, cmd_mask); - cmd_mask>>=1; + cmd_mask >>= 1; } //executes tools override rt commands cmd_mask = 0x80; - command = cnc_state.tool_ovr_cmd; //copies realtime flags states + command = cnc_state.tool_ovr_cmd; //copies realtime flags states cnc_state.tool_ovr_cmd = RT_CMD_CLEAR; //clears command flags - while(command) + while (command) { update_spindle = true; switch (command & cmd_mask) { #ifdef USE_SPINDLE - case RT_CMD_SPINDLE_100: - planner_spindle_ovr_reset(); - break; - case RT_CMD_SPINDLE_INC_COARSE: - planner_spindle_ovr_inc(SPINDLE_OVR_COARSE); - break; - case RT_CMD_SPINDLE_DEC_COARSE: - planner_spindle_ovr_inc(-SPINDLE_OVR_COARSE); - break; - case RT_CMD_SPINDLE_INC_FINE: - planner_spindle_ovr_inc(SPINDLE_OVR_FINE); - break; - case RT_CMD_SPINDLE_DEC_FINE: - planner_spindle_ovr_inc(-SPINDLE_OVR_FINE); - break; - case RT_CMD_SPINDLE_TOGGLE: - if(cnc_get_exec_state(EXEC_HOLD | EXEC_DOOR | EXEC_RUN) == EXEC_HOLD) //only available if a TRUE hold is active + case RT_CMD_SPINDLE_100: + planner_spindle_ovr_reset(); + break; + case RT_CMD_SPINDLE_INC_COARSE: + planner_spindle_ovr_inc(SPINDLE_OVR_COARSE); + break; + case RT_CMD_SPINDLE_DEC_COARSE: + planner_spindle_ovr_inc(-SPINDLE_OVR_COARSE); + break; + case RT_CMD_SPINDLE_INC_FINE: + planner_spindle_ovr_inc(SPINDLE_OVR_FINE); + break; + case RT_CMD_SPINDLE_DEC_FINE: + planner_spindle_ovr_inc(-SPINDLE_OVR_FINE); + break; + case RT_CMD_SPINDLE_TOGGLE: + if (cnc_get_exec_state(EXEC_HOLD | EXEC_DOOR | EXEC_RUN) == EXEC_HOLD) //only available if a TRUE hold is active + { + //toogle state + if (mcu_get_pwm(SPINDLE_PWM)) { - //toogle state - if(mcu_get_pwm(SPINDLE_PWM)) - { - update_spindle = false; - mcu_set_pwm(SPINDLE_PWM, 0); - } + update_spindle = false; + mcu_set_pwm(SPINDLE_PWM, 0); } - break; + } + break; #endif #ifdef USE_COOLANT - case RT_CMD_COOL_FLD_TOGGLE: - case RT_CMD_COOL_MST_TOGGLE: - update_spindle = false; - if(!cnc_get_exec_state(EXEC_ALARM)) //if no alarm is active - { - parser_toogle_coolant(command - (RT_CMD_COOL_FLD_TOGGLE - 1)); - } - break; + case RT_CMD_COOL_FLD_TOGGLE: + case RT_CMD_COOL_MST_TOGGLE: + update_spindle = false; + if (!cnc_get_exec_state(EXEC_ALARM)) //if no alarm is active + { + parser_toogle_coolant(command - (RT_CMD_COOL_FLD_TOGGLE - 1)); + } + break; #endif } CLEARFLAG(command, cmd_mask); - cmd_mask>>=1; + cmd_mask >>= 1; } #ifdef USE_SPINDLE - if(update_spindle) + if (update_spindle) { - itp_update(); - if(planner_buffer_is_empty()) - { - planner_block_data_t block = {}; - block.spindle = planner_get_previous_spindle_speed(); - mc_spindle_coolant(block); - } + itp_update(); + if (planner_buffer_is_empty()) + { + planner_block_data_t block = {}; + block.spindle = planner_get_previous_spindle_speed(); + mc_spindle_coolant(block); + } } #endif } -void cnc_check_fault_systems() +void cnc_check_fault_systems(void) { uint8_t inputs = io_get_controls(); #ifdef ESTOP - if(CHECKFLAG(inputs, ESTOP_MASK)) //fault on emergency stop + if (CHECKFLAG(inputs, ESTOP_MASK)) //fault on emergency stop { protocol_send_string(MSG_FEEDBACK_12); } #endif #ifdef SAFETY_DOOR - if(CHECKFLAG(inputs, SAFETY_DOOR_MASK)) //fault on safety door + if (CHECKFLAG(inputs, SAFETY_DOOR_MASK)) //fault on safety door { protocol_send_string(MSG_FEEDBACK_6); } #endif -#if(LIMITS_MASK != 0) - if(g_settings.hard_limits_enabled) //fault on limits +#if (LIMITS_MASK != 0) + if (g_settings.hard_limits_enabled) //fault on limits { inputs = io_get_limits(); - if(CHECKFLAG(inputs, LIMITS_MASK)) + if (CHECKFLAG(inputs, LIMITS_MASK)) { protocol_send_string(MSG_FEEDBACK_7); } @@ -570,12 +585,12 @@ void cnc_check_fault_systems() #endif } -bool cnc_check_interlocking() +bool cnc_check_interlocking(void) { //if abort is flagged - if(CHECKFLAG(cnc_state.exec_state, EXEC_ABORT)) + if (CHECKFLAG(cnc_state.exec_state, EXEC_ABORT)) { - if(cnc_state.active_alarm) //active alarm message + if (cnc_state.active_alarm) //active alarm message { protocol_send_alarm(cnc_state.active_alarm); cnc_state.active_alarm = 0; @@ -584,25 +599,25 @@ bool cnc_check_interlocking() return false; } - if(CHECKFLAG(cnc_state.exec_state, EXEC_DOOR | EXEC_HOLD)) + if (CHECKFLAG(cnc_state.exec_state, EXEC_DOOR | EXEC_HOLD)) { - if(CHECKFLAG(cnc_state.exec_state, EXEC_RUN)) + if (CHECKFLAG(cnc_state.exec_state, EXEC_RUN)) { return true; } itp_stop(); - if(CHECKFLAG(cnc_state.exec_state, EXEC_DOOR)) + if (CHECKFLAG(cnc_state.exec_state, EXEC_DOOR)) { cnc_stop(); //stop all tools not only motion } - if(CHECKFLAG(cnc_state.exec_state, EXEC_HOMING) && CHECKFLAG(cnc_state.exec_state, EXEC_DOOR)) //door opened during a homing cycle + if (CHECKFLAG(cnc_state.exec_state, EXEC_HOMING) && CHECKFLAG(cnc_state.exec_state, EXEC_DOOR)) //door opened during a homing cycle { cnc_alarm(EXEC_ALARM_HOMING_FAIL_DOOR); } - if(CHECKFLAG(cnc_state.exec_state, EXEC_HOMING | EXEC_JOG)) //flushes the buffers if motions was homing or jog + if (CHECKFLAG(cnc_state.exec_state, EXEC_HOMING | EXEC_JOG)) //flushes the buffers if motions was homing or jog { itp_clear(); planner_clear(); @@ -612,9 +627,9 @@ bool cnc_check_interlocking() return false; } - if(CHECKFLAG(cnc_state.exec_state, EXEC_LIMITS)) + if (CHECKFLAG(cnc_state.exec_state, EXEC_LIMITS)) { - if(CHECKFLAG(cnc_state.exec_state, EXEC_RUN)) //if a motion is being performed allow trigger the limit switch alarm + if (CHECKFLAG(cnc_state.exec_state, EXEC_RUN)) //if a motion is being performed allow trigger the limit switch alarm { cnc_alarm(EXEC_ALARM_HARD_LIMIT); } diff --git a/uCNC/cnc.h b/uCNC/cnc.h index ef4f43473..b1febeeb8 100644 --- a/uCNC/cnc.h +++ b/uCNC/cnc.h @@ -67,14 +67,14 @@ #define EXEC_ALLACTIVE 255 //All states -void cnc_init(); -void cnc_run(); +void cnc_init(void); +void cnc_run(void); //do events returns true if all OK and false if an ABORT alarm is reached -bool cnc_doevents(); -void cnc_home(); +bool cnc_doevents(void); +void cnc_home(void); void cnc_alarm(uint8_t code); -void cnc_stop(); -void cnc_unlock(); +void cnc_stop(void); +void cnc_unlock(void); uint8_t cnc_get_exec_state(uint8_t statemask); void cnc_set_exec_state(uint8_t statemask); diff --git a/uCNC/config.h b/uCNC/config.h index 6fc90a659..d88928292 100644 --- a/uCNC/config.h +++ b/uCNC/config.h @@ -20,15 +20,9 @@ #define CONFIG_H //include lists of available option -#include "mcus.h" +#include "boards.h" #include "machines.h" -/* - Choose the mcu - Check mcus.h for list of available/supported mcu -*/ -#define MCU MCU_AVR - /* Serial COM Defines the serial COM baud rate @@ -54,14 +48,13 @@ */ #include "boarddefs.h" //sets the mcu pin configuration based on the board -#include "mcudefs.h" //configures the mcu based on the board pin configuration #include "machinedefs.h" //configures the kinematics for the cnc machine #include "config_helper.h" //runs the config helper to create and define all variables + /* Defines the number of supported coordinate systems supported by µCNC Can be any value between 1 and 9 */ - #define COORD_SYS_COUNT 6 /* @@ -70,7 +63,7 @@ #define N_ARC_CORRECTION 12 /* - Echo recieved commands + Echo recieved commands. Uncomment to enable. Only necessary to debug communication problems */ //#define ECHO_CMD @@ -97,11 +90,6 @@ //not implemented //#define USE_TOOL_CHANGER -/* - Define a stepper enable pin -*/ -//#define STEPPER_ENABLE DOUT1_MASK - /* Define a coolant flood and mist pin */ @@ -162,4 +150,9 @@ //#define CRC_WITHOUT_LOOKUP_TABLE //saves a little program memory bytes but much more slow CRC check //#define NO_FAST_SQRT //disable the using of Quake III style fast sqrt. Feed rate display will be more precise. +/* + Uses pin pooling for all limits and control pins (no interrupts) +*/ +//#define USE_INPUTS_POOLING_ONLY + #endif diff --git a/uCNC/interpolator.c b/uCNC/interpolator.c index 54389aa25..907e6b32e 100644 --- a/uCNC/interpolator.c +++ b/uCNC/interpolator.c @@ -106,7 +106,7 @@ volatile static bool itp_busy; /* Interpolator segment buffer functions */ -static inline void itp_sgm_buffer_read() +static inline void itp_sgm_buffer_read(void) { itp_sgm_data_slots++; if (++itp_sgm_data_read == INTERPOLATOR_BUFFER_SIZE) @@ -115,7 +115,7 @@ static inline void itp_sgm_buffer_read() } } -static inline void itp_sgm_buffer_write() +static inline void itp_sgm_buffer_write(void) { itp_sgm_data_slots--; if (++itp_sgm_data_write == INTERPOLATOR_BUFFER_SIZE) @@ -124,17 +124,17 @@ static inline void itp_sgm_buffer_write() } } -static inline bool itp_sgm_is_empty() +static inline bool itp_sgm_is_empty(void) { return (itp_sgm_data_slots == INTERPOLATOR_BUFFER_SIZE); } -static inline bool itp_sgm_is_full() +static inline bool itp_sgm_is_full(void) { return (itp_sgm_data_slots == 0); } -static inline void itp_sgm_clear() +static inline void itp_sgm_clear(void) { itp_sgm_data_write = 0; itp_sgm_data_read = 0; @@ -147,7 +147,7 @@ static inline void itp_sgm_clear() */ //NOT NEEDED /* -static inline void itp_blk_buffer_read() +static inline void itp_blk_buffer_read(void) { itp_blk_data_read++; itp_blk_data_slots++; @@ -157,7 +157,7 @@ static inline void itp_blk_buffer_read() } }*/ -static inline void itp_blk_buffer_write() +static inline void itp_blk_buffer_write(void) { //itp_blk_data_slots--; //AUTOMATIC LOOP if (++itp_blk_data_write == INTERPOLATOR_BUFFER_SIZE) @@ -166,17 +166,17 @@ static inline void itp_blk_buffer_write() } } /* NOT NECESSARY -static inline bool itp_blk_is_empty() +static inline bool itp_blk_is_empty(void) { return (itp_blk_data_slots == INTERPOLATOR_BUFFER_SIZE); }*/ -/*static inline bool itp_blk_is_full() +/*static inline bool itp_blk_is_full(void) { return (itp_blk_data_slots == 0); }*/ -static inline void itp_blk_clear() +static inline void itp_blk_clear(void) { itp_blk_data_write = 0; itp_blk_data_read = 0; @@ -188,7 +188,7 @@ static inline void itp_blk_clear() Interpolator functions */ //declares functions called by the stepper ISR -void itp_init() +void itp_init(void) { #ifdef FORCE_GLOBALS_TO_0 //resets buffers @@ -205,7 +205,7 @@ void itp_init() itp_sgm_clear(); } -void itp_run() +void itp_run(void) { //static INTERPOLATOR_BLOCK *new_block = NULL; //static bool read_new_block = true; @@ -351,7 +351,7 @@ void itp_run() { itp_needs_update = false; float exit_speed_sqr = planner_get_block_exit_speed_sqr(); - junction_speed_sqr = planner_get_block_top_speed(exit_speed_sqr); + junction_speed_sqr = planner_get_block_top_speed(); accel_until = unprocessed_steps; deaccel_from = 0; @@ -470,12 +470,14 @@ void itp_run() itp_cur_plan_block->distance -= partial_distance; sgm->feed = current_speed; + #ifdef USE_SPINDLE float top_speed_inv = fast_inv_sqrt(junction_speed_sqr); #ifdef LASER_MODE planner_get_spindle_speed(MIN(1, current_speed * top_speed_inv), &(sgm->spindle), &(sgm->spindle_inv)); #else planner_get_spindle_speed(1, &(sgm->spindle), &(sgm->spindle_inv)); #endif + #endif unprocessed_steps -= sgm->remaining_steps; if (unprocessed_steps == accel_until) //resets float additions error @@ -511,19 +513,19 @@ void itp_run() } } -void itp_update() +void itp_update(void) { //flags executing block for update itp_needs_update = true; } -void itp_stop() +void itp_stop(void) { mcu_step_stop_ISR(); cnc_clear_exec_state(EXEC_RUN); } -void itp_clear() +void itp_clear(void) { itp_cur_plan_block = NULL; itp_running_sgm = NULL; @@ -542,7 +544,7 @@ void itp_get_rt_position(float *axis) kinematics_apply_forward((uint32_t *)&step_pos, axis); } -void itp_reset_rt_position() +void itp_reset_rt_position(void) { if (g_settings.homing_enabled) { @@ -568,7 +570,7 @@ void itp_reset_rt_position() } } -float itp_get_rt_feed() +float itp_get_rt_feed(void) { float feed = 0; if (!cnc_get_exec_state(EXEC_RUN)) @@ -585,7 +587,7 @@ float itp_get_rt_feed() } #ifdef USE_SPINDLE -uint16_t itp_get_rt_spindle() +uint16_t itp_get_rt_spindle(void) { float spindle = (float)itp_rt_spindle; spindle *= g_settings.spindle_max_rpm * UINT8_MAX_INV; @@ -602,14 +604,14 @@ void itp_lock_stepper(uint8_t lockmask) #endif #ifdef GCODE_PROCESS_LINE_NUMBERS -uint32_t itp_get_rt_line_number() +uint32_t itp_get_rt_line_number(void) { return ((itp_sgm_data[itp_sgm_data_read].block!=NULL) ? itp_sgm_data[itp_sgm_data_read].block->line : 0); } #endif //always fires after pulse -void itp_step_reset_isr() +void itp_step_reset_isr(void) { //always resets all stepper pins io_set_steps(g_settings.step_invert_mask); @@ -659,7 +661,7 @@ void itp_step_reset_isr() } } -void itp_step_isr() +void itp_step_isr(void) { static uint8_t stepbits = 0; if(itp_busy) //prevents reentrancy @@ -813,11 +815,13 @@ void itp_delay(uint16_t delay) itp_sgm_data[itp_sgm_data_write].remaining_steps = delay; itp_sgm_data[itp_sgm_data_write].update_speed = true; itp_sgm_data[itp_sgm_data_write].feed = 0; + #ifdef USE_SPINDLE #ifdef LASER_MODE itp_sgm_data[itp_sgm_data_write].spindle = 0; itp_sgm_data[itp_sgm_data_write].spindle_inv = false; #else planner_get_spindle_speed(1, &(itp_sgm_data[itp_sgm_data_write].spindle), &(itp_sgm_data[itp_sgm_data_write].spindle_inv)); #endif + #endif itp_sgm_buffer_write(); } diff --git a/uCNC/interpolator.h b/uCNC/interpolator.h index 7bb57dc1b..5bf308016 100644 --- a/uCNC/interpolator.h +++ b/uCNC/interpolator.h @@ -4,16 +4,16 @@ TODO: Create an S-curve interpolator - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 13/10/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -23,24 +23,24 @@ #include #include -void itp_init(); -void itp_run(); -void itp_update(); -void itp_step_isr(); -void itp_step_reset_isr(); -void itp_stop(); -void itp_clear(); -void itp_get_rt_position(float* axis); -void itp_reset_rt_position(); -float itp_get_rt_feed(); +void itp_init(void); +void itp_run(void); +void itp_update(void); +void itp_step_isr(void); +void itp_step_reset_isr(void); +void itp_stop(void); +void itp_clear(void); +void itp_get_rt_position(float *axis); +void itp_reset_rt_position(void); +float itp_get_rt_feed(void); #ifdef USE_SPINDLE -uint16_t itp_get_rt_spindle(); +uint16_t itp_get_rt_spindle(void); #endif #ifdef ENABLE_DUAL_DRIVE_AXIS void itp_lock_stepper(uint8_t lockmask); #endif #ifdef GCODE_PROCESS_LINE_NUMBERS -uint32_t itp_get_rt_line_number(); +uint32_t itp_get_rt_line_number(void); #endif void itp_delay(uint16_t delay); diff --git a/uCNC/io_control.c b/uCNC/io_control.c index 91410607e..ec8634e7e 100644 --- a/uCNC/io_control.c +++ b/uCNC/io_control.c @@ -29,7 +29,7 @@ static volatile uint8_t io_limits_homing_filter; -void io_limits_isr() +void io_limits_isr(void) { uint8_t limits = io_get_limits(); @@ -84,7 +84,7 @@ void io_limits_isr() } } -void io_controls_isr() +void io_controls_isr(void) { uint8_t controls = io_get_controls(); @@ -116,7 +116,7 @@ void io_controls_isr() #endif } -void io_probe_isr() +void io_probe_isr(void) { //on hit enables hold (directly) cnc_set_exec_state(EXEC_HOLD); @@ -144,7 +144,7 @@ bool io_check_boundaries(float* axis) return true; } -uint8_t io_get_limits() +uint8_t io_get_limits(void) { uint8_t value = 0; #ifdef LIMIT_X @@ -190,7 +190,7 @@ uint8_t io_get_limits() return (value ^ g_settings.limits_invert_mask); } -uint8_t io_get_controls() +uint8_t io_get_controls(void) { uint8_t value = 0; #ifdef ESTOP @@ -209,20 +209,32 @@ uint8_t io_get_controls() return (value ^ g_settings.control_invert_mask); } -void io_enable_probe() +void io_enable_probe(void) { + #ifndef USE_INPUTS_POOLING_ONLY + #ifdef PROBE mcu_enable_probe_isr(); + #endif + #endif } -void io_disable_probe() +void io_disable_probe(void) { + #ifndef USE_INPUTS_POOLING_ONLY + #ifdef PROBE mcu_disable_probe_isr(); + #endif + #endif } -bool io_get_probe() +bool io_get_probe(void) { + #ifdef PROBE bool probe = (mcu_get_input(PROBE)!=0); return (!g_settings.probe_invert_mask) ? probe : !probe; + #else + return false; + #endif } void io_set_homing_limits_filter(uint8_t filter_mask) @@ -433,7 +445,7 @@ void io_set_dirs(uint8_t mask) } -void io_enable_steps() +void io_enable_steps(void) { #ifdef STEP0_EN mcu_set_output(STEP0_EN); diff --git a/uCNC/io_control.h b/uCNC/io_control.h index 78d074c0f..da89251b4 100644 --- a/uCNC/io_control.h +++ b/uCNC/io_control.h @@ -29,17 +29,17 @@ #include "config.h" //ISR -void io_limits_isr(); -void io_controls_isr(); -void io_probe_isr(); +void io_limits_isr(void); +void io_controls_isr(void); +void io_probe_isr(void); //inputs bool io_check_boundaries(float* axis); -uint8_t io_get_limits(); -uint8_t io_get_controls(); -void io_enable_probe(); -void io_disable_probe(); -bool io_get_probe(); +uint8_t io_get_limits(void); +uint8_t io_get_controls(void); +void io_enable_probe(void); +void io_disable_probe(void); +bool io_get_probe(void); void io_set_homing_limits_filter(uint8_t filter_mask); //outputs @@ -47,7 +47,7 @@ void io_set_steps(uint8_t mask); void io_toggle_steps(uint8_t mask); void io_set_dirs(uint8_t mask); -void io_enable_steps(); +void io_enable_steps(void); #endif diff --git a/uCNC/kinematics.h b/uCNC/kinematics.h index ad3bcc0ee..48d904e95 100644 --- a/uCNC/kinematics.h +++ b/uCNC/kinematics.h @@ -1,19 +1,19 @@ /* Name: kinematics.h Description: Declares the functions needed to implement the machine kinematics and homing motion. - This defines an opac interface that allows to adapt µCNC to different architectures/mechanics of + This defines an opac interface that allows to adapt µCNC to different architectures/mechanics of different machines. - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 26/09/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -26,21 +26,20 @@ Converts from machine absolute coordinates to step position. This is done after computing position relative to the active coordinate system */ -void kinematics_apply_inverse(float* axis, uint32_t* steps); - +void kinematics_apply_inverse(float *axis, uint32_t *steps); /* Converts from step position to machine absolute coordinates This is done after computing position relative to the active coordinate system */ -void kinematics_apply_forward(uint32_t* steps, float* axis); +void kinematics_apply_forward(uint32_t *steps, float *axis); /* Executes the homing motion for the machine The homing motion for each axis is defined in the motion control In the kinematics home function the axis order of the homing motion and other custom motions can be defined */ -uint8_t kinematics_home(); +uint8_t kinematics_home(void); /* In dual drive machines this translates which drive is locked when a particular limit switch is triggered during homing motion @@ -51,12 +50,12 @@ void kinematics_lock_step(uint8_t limits_mask); Aplies a transformation to the position sent to planner. This is aplied only on normal and jog moves. Homing motions go directly to planner. */ -void kinematics_apply_transform(float* axis); +void kinematics_apply_transform(float *axis); /* Aplies a reverse transformation to the position returned from the planner. This is aplied only on normal and jog moves. Homing motions go directly to planner. */ -void kinematics_apply_reverse_transform(float* axis); +void kinematics_apply_reverse_transform(float *axis); #endif diff --git a/uCNC/kinematics_cartesian.c b/uCNC/kinematics_cartesian.c index b42e3912f..a3db6830a 100644 --- a/uCNC/kinematics_cartesian.c +++ b/uCNC/kinematics_cartesian.c @@ -73,7 +73,7 @@ void kinematics_apply_forward(uint32_t* steps, float* axis) #endif } -uint8_t kinematics_home() +uint8_t kinematics_home(void) { uint8_t result = 0; diff --git a/uCNC/kinematics_corexy.c b/uCNC/kinematics_corexy.c index cadc77ef6..92ce6e7b3 100644 --- a/uCNC/kinematics_corexy.c +++ b/uCNC/kinematics_corexy.c @@ -39,7 +39,7 @@ void kinematics_apply_forward(uint32_t* steps, float* axis) axis[AXIS_Z] = (float)(step_mm_inv[2] * steps[2]); } -void kinematics_home() +void kinematics_home(void) { uint8_t result = 0; result = mc_home_axis(AXIS_Z, LIMIT_Z_MASK); diff --git a/uCNC/mcu.h b/uCNC/mcu.h index a6ba22ac7..17e016ee1 100644 --- a/uCNC/mcu.h +++ b/uCNC/mcu.h @@ -47,12 +47,12 @@ void mcu_clear_output(uint8_t pin); void mcu_toggle_output(uint8_t pin); #endif -void mcu_init(); +void mcu_init(void); #ifndef mcu_enable_probe_isr -void mcu_enable_probe_isr(); +void mcu_enable_probe_isr(void); #endif #ifndef mcu_disable_probe_isr -void mcu_disable_probe_isr(); +void mcu_disable_probe_isr(void); #endif //Analog input @@ -70,19 +70,19 @@ uint8_t mcu_get_pwm(uint8_t pwm); #endif //Communication functions -void mcu_start_send(); //Start async send -void mcu_stop_send(); //Stop async send +void mcu_start_send(void); //Start async send +void mcu_stop_send(void); //Stop async send void mcu_putc(char c); -char mcu_getc(); +char mcu_getc(void); //ISR //enables all interrupts on the mcu. Must be called to enable all IRS functions #ifndef mcu_enable_interrupts -void mcu_enable_interrupts(); +void mcu_enable_interrupts(void); #endif //disables all ISR functions -#ifndef mcu_enable_interrupts -void mcu_disable_interrupts(); +#ifndef mcu_disable_interrupts +void mcu_disable_interrupts(void); #endif //Timers @@ -93,7 +93,7 @@ void mcu_start_step_ISR(uint16_t ticks, uint8_t prescaller); //modifies the pulse frequency void mcu_change_step_ISR(uint16_t ticks, uint8_t prescaller); //stops the pulse -void mcu_step_stop_ISR(); +void mcu_step_stop_ISR(void); //Custom delay function //void mcu_delay_ms(uint16_t miliseconds); @@ -103,8 +103,8 @@ uint8_t mcu_eeprom_getc(uint16_t address); void mcu_eeprom_putc(uint16_t address, uint8_t value); #ifdef __PERFSTATS__ -uint16_t mcu_get_step_clocks(); -uint16_t mcu_get_step_reset_clocks(); +uint16_t mcu_get_step_clocks(void); +uint16_t mcu_get_step_reset_clocks(void); #endif #endif diff --git a/uCNC/mcus/avr/mcu_avr.c b/uCNC/mcus/avr/mcu_avr.c index 173439dee..f5dd41050 100644 --- a/uCNC/mcus/avr/mcu_avr.c +++ b/uCNC/mcus/avr/mcu_avr.c @@ -64,12 +64,12 @@ volatile uint16_t mcu_perf_step; volatile uint16_t mcu_perf_step_reset; -uint16_t mcu_get_step_clocks() +uint16_t mcu_get_step_clocks(void) { uint16_t res = mcu_perf_step; return res; } -uint16_t mcu_get_step_reset_clocks() +uint16_t mcu_get_step_reset_clocks(void) { uint16_t res = mcu_perf_step_reset; return res; @@ -103,6 +103,8 @@ ISR(TIMER_COMPB_vect, ISR_BLOCK) #endif } +#ifndef USE_INPUTS_POOLING_ONLY + #if(PCINTA_MASK==1) ISR(INT0_vect, ISR_BLOCK) // input pin on change service routine { @@ -306,6 +308,8 @@ ISR(PCINT2_vect, ISR_BLOCK) // input pin on change service routine } #endif +#endif + ISR(COM_RX_vect, ISR_BLOCK) { serial_rx_isr(COM_INREG); @@ -319,7 +323,7 @@ ISR(COM_TX_vect, ISR_BLOCK) }*/ } -void mcu_init() +void mcu_init(void) { //disable WDT wdt_reset(); @@ -828,6 +832,7 @@ SETBIT(DIN15_OUTREG, DIN15_BIT); UCSRB |= (1< - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include "../../config.h" -#if(MCU == MCU_VIRTUAL) +#if (MCU == MCU_VIRTUAL) #include "../../mcudefs.h" #include "../../mcu.h" #include @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include "../../settings.h" @@ -70,7 +70,7 @@ uint8_t g_mcu_combuffer[COM_BUFFER_SIZE]; uint8_t g_mcu_bufferhead; uint8_t g_mcu_buffertail; uint8_t g_mcu_buffercount; -char* mcu_tx_buffer; +char *mcu_tx_buffer; volatile bool mcu_tx_ready; /* #ifdef __DEBUG__ @@ -88,7 +88,7 @@ volatile unsigned long isr_flags = 0; #define ISR_PULSERESET 2 #define ISR_COMRX 4 #define ISR_COMTX 8 -#define ISR_INPUT 16 +#define ISR_INPUT 16 unsigned long g_cpu_freq = 0; volatile unsigned long pulse_interval = 0; @@ -104,19 +104,18 @@ pthread_t thread_id; pthread_t thread_idout; pthread_t thread_timer_id; - //emulates uart RX -void* comsimul() +void *comsimul(void) { - for(;;) + for (;;) { - //while(isr_flags & ISR_COMRX); - #ifdef USECONSOLE +//while(isr_flags & ISR_COMRX); +#ifdef USECONSOLE unsigned char c = getch(); - #else +#else unsigned char c = virtualserial_getc(); - #endif - if(c != 0) +#endif + if (c != 0) { uart_char = c; serial_rx_isr(c); @@ -125,28 +124,28 @@ void* comsimul() } //emulates uart TX -void* comoutsimul() +void *comoutsimul(void) { unsigned char combuffer[128]; static uint8_t i = 0; - for(;;) + for (;;) { - if(!serial_tx_is_empty()) + if (!serial_tx_is_empty()) { serial_tx_isr(); unsigned char c = virtualports->uart; - if(c != 0) + if (c != 0) { combuffer[i] = c; i++; - if(c == '\n') + if (c == '\n') { combuffer[i] = 0; - #ifdef USECONSOLE +#ifdef USECONSOLE puts(combuffer); - #else +#else virtualserial_puts(combuffer); - #endif +#endif i = 0; } } @@ -159,80 +158,80 @@ void* comoutsimul() } //simulates internal clock (1Kz limited by windows timer) -void ticksimul() +void ticksimul(void) { static uint16_t tick_counter = 0; static uint16_t timer_counter = 0; static VIRTUAL_MAP initials = {}; - + FILE *infile = fopen("inputs.txt", "r"); char inputs[255]; - - if(infile!=NULL) //checks input file + + if (infile != NULL) //checks input file { fscanf(infile, "%lX", &(virtualports->inputs)); fclose(infile); - + uint32_t diff = virtualports->inputs ^ initials.inputs; initials.inputs = virtualports->inputs; - - if(diff) + + if (diff) { isr_flags |= ISR_INPUT; //flags input isr } } - + tick_counter++; - - if(tick_counter==pulse_interval) + + if (tick_counter == pulse_interval) { isr_flags |= ISR_PULSE; //flags step isr } - - if(tick_counter>=resetpulse_interval) + + if (tick_counter >= resetpulse_interval) { isr_flags |= ISR_PULSERESET; //flags step isr tick_counter = 0; } - if(global_isr_enabled) + if (global_isr_enabled) { bool isr = global_isr_enabled; global_isr_enabled = false; - - if(isr_flags & ISR_INPUT) + + if (isr_flags & ISR_INPUT) { //serial_rx_isr(uart_char); io_limits_isr(); io_controls_isr(); isr_flags &= ~ISR_INPUT; } - - if(pulse_enabled) + + if (pulse_enabled) { - if(isr_flags & ISR_PULSE) + if (isr_flags & ISR_PULSE) { itp_step_isr(); isr_flags &= ~ISR_PULSE; } - - if(isr_flags & ISR_PULSERESET) + + if (isr_flags & ISR_PULSERESET) { itp_step_reset_isr(); isr_flags &= ~ISR_PULSERESET; } } - + global_isr_enabled = isr; } } -void mcu_init() +void mcu_init(void) { send_char = false; virtualports = &virtualmap; FILE *infile = fopen("inputs.txt", "r"); - if(infile!=NULL) + if (infile != NULL) { fscanf(infile, "%lX", &(virtualports->inputs)); fclose(infile); @@ -240,7 +239,7 @@ void mcu_init() else { infile = fopen("inputs.txt", "w+"); - if(infile!=NULL) + if (infile != NULL) { fprintf(infile, "%lX", virtualports->inputs); fflush(infile); @@ -252,9 +251,9 @@ void mcu_init() } } g_cpu_freq = getCPUFreq(); - #ifndef USECONSOLE +#ifndef USECONSOLE virtualserial_open(); - #endif +#endif start_timer(1, &ticksimul); pthread_create(&thread_id, NULL, &comsimul, NULL); pthread_create(&thread_idout, NULL, &comoutsimul, NULL); @@ -262,15 +261,14 @@ void mcu_init() g_mcu_buffercount = 0; pulse_counter_ptr = &pulse_counter; mcu_enable_interrupts(); - } -//IO functions +//IO functions #ifdef PROBE -void mcu_enable_probe_isr() +void mcu_enable_probe_isr(void) { } -void mcu_disable_probe_isr() +void mcu_disable_probe_isr(void) { } #endif @@ -292,78 +290,78 @@ uint8_t mcu_get_pwm(uint8_t pwm) //Communication functions //sends a packet -void mcu_start_send() +void mcu_start_send(void) { mcu_tx_ready = true; } -void mcu_stop_send() +void mcu_stop_send(void) { mcu_tx_ready = false; } void mcu_putc(char c) { - #ifdef USECONSOLE +#ifdef USECONSOLE putchar(c); - #else +#else virtualserial_putc(c); - #endif +#endif } -char mcu_getc() +char mcu_getc(void) { char c = 0; - if(g_mcu_buffertail!=g_mcu_bufferhead) + if (g_mcu_buffertail != g_mcu_bufferhead) { c = g_mcu_combuffer[g_mcu_buffertail]; - if(++g_mcu_buffertail==COM_BUFFER_SIZE) + if (++g_mcu_buffertail == COM_BUFFER_SIZE) { g_mcu_buffertail = 0; } - - if(c=='\n') + + if (c == '\n') { g_mcu_buffercount--; } } - + return c; } -char mcu_peek() +char mcu_peek(void) { - if(g_mcu_buffercount==0) + if (g_mcu_buffercount == 0) return 0; return g_mcu_combuffer[g_mcu_buffertail]; } -void mcu_bufferClear() +void mcu_bufferClear(void) { - memset(&g_mcu_combuffer, 0, sizeof(char)*COM_BUFFER_SIZE); + memset(&g_mcu_combuffer, 0, sizeof(char) * COM_BUFFER_SIZE); g_mcu_buffertail = 0; g_mcu_bufferhead = 0; } //RealTime -void mcu_freq_to_clocks(float frequency, uint16_t* ticks, uint8_t* tick_reps) +void mcu_freq_to_clocks(float frequency, uint16_t *ticks, uint8_t *tick_reps) { - if(frequency < F_STEP_MIN) + if (frequency < F_STEP_MIN) frequency = F_STEP_MIN; - if(frequency > F_STEP_MAX) + if (frequency > F_STEP_MAX) frequency = F_STEP_MAX; - *ticks = (uint16_t)floorf((F_CPU/frequency)); + *ticks = (uint16_t)floorf((F_CPU / frequency)); *tick_reps = 1; } //enables all interrupts on the mcu. Must be called to enable all IRS functions -void mcu_enable_interrupts() +void mcu_enable_interrupts(void) { global_isr_enabled = true; } //disables all ISR functions -void mcu_disable_interrupts() +void mcu_disable_interrupts(void) { global_isr_enabled = false; } @@ -371,7 +369,7 @@ void mcu_disable_interrupts() //starts a constant rate pulse at a given frequency. This triggers to ISR handles with an offset of MIN_PULSE_WIDTH useconds void mcu_start_step_ISR(uint16_t clocks_speed, uint8_t prescaller) { - pulse_interval = clocks_speed>>1; + pulse_interval = clocks_speed >> 1; resetpulse_interval = clocks_speed; (*pulse_counter_ptr) = 0; pulse_enabled = true; @@ -380,13 +378,13 @@ void mcu_start_step_ISR(uint16_t clocks_speed, uint8_t prescaller) void mcu_change_step_ISR(uint16_t clocks_speed, uint8_t prescaller) { pulse_enabled = false; - pulse_interval = clocks_speed>>1; + pulse_interval = clocks_speed >> 1; resetpulse_interval = clocks_speed; (*pulse_counter_ptr) = 0; pulse_enabled = true; } -//stops the pulse -void mcu_step_stop_ISR() +//stops the pulse +void mcu_step_stop_ISR(void) { pulse_enabled = false; } @@ -395,57 +393,56 @@ void mcu_delay_ms(uint16_t miliseconds) { } -void mcu_printfp(const char* __fmt, ...) +void mcu_printfp(const char *__fmt, ...) { char buffer[50]; - char* newfmt = strcpy((char*)&buffer, __fmt); + char *newfmt = strcpy((char *)&buffer, __fmt); va_list __ap; - va_start(__ap,__fmt); - vprintf(newfmt,__ap); - va_end(__ap); + va_start(__ap, __fmt); + vprintf(newfmt, __ap); + va_end(__ap); } -void mcu_loadDummyPayload(const char* __fmt, ...) +void mcu_loadDummyPayload(const char *__fmt, ...) { char buffer[30]; char payload[50]; - char* newfmt = strcpy((char*)&buffer, __fmt); + char *newfmt = strcpy((char *)&buffer, __fmt); va_list __ap; - va_start(__ap,__fmt); - vsprintf((char*)&payload, newfmt,__ap); - va_end(__ap); + va_start(__ap, __fmt); + vsprintf((char *)&payload, newfmt, __ap); + va_end(__ap); g_mcu_bufferhead = strlen(payload); memset(&g_mcu_combuffer, 0, g_mcu_bufferhead); - strcpy((char*)&g_mcu_combuffer, payload); + strcpy((char *)&g_mcu_combuffer, payload); g_mcu_buffertail = 0; g_mcu_buffercount++; } uint8_t mcu_eeprom_getc(uint16_t address) { - FILE* fp = fopen("virtualeeprom", "rb"); + FILE *fp = fopen("virtualeeprom", "rb"); uint8_t c = 0; - - if(fp != NULL) + + if (fp != NULL) { - if(!fseek(fp, address, SEEK_SET)) + if (!fseek(fp, address, SEEK_SET)) { c = getc(fp); fclose(fp); } - } - + return c; } void mcu_eeprom_putc(uint16_t address, uint8_t value) { - FILE* src = fopen("virtualeeprom", "rb+"); - - if(!src) + FILE *src = fopen("virtualeeprom", "rb+"); + + if (!src) { - FILE* dest = fopen("virtualeeprom", "wb"); + FILE *dest = fopen("virtualeeprom", "wb"); fclose(dest); src = fopen("virtualeeprom", "rb+"); } @@ -454,10 +451,10 @@ void mcu_eeprom_putc(uint16_t address, uint8_t value) { getc(src); }*/ - + fseek(src, address, SEEK_SET); putc((int)value, src); - + fflush(src); fclose(src); } @@ -480,7 +477,6 @@ void mcu_eeprom_erase(uint16_t address) fclose(src); }*/ - /*uint8_t mcu_eeprom_putc(uint16_t address, uint8_t value) { FILE* src = fopen("virtualeeprom", "r"); @@ -516,14 +512,14 @@ void mcu_eeprom_erase(uint16_t address) return value; }*/ -void mcu_startPerfCounter() +void mcu_startPerfCounter(void) { startCycleCounter(); } -uint16_t mcu_stopPerfCounter() +uint16_t mcu_stopPerfCounter(void) { - return (uint16_t)stopCycleCounter(); + return (uint16_t)stopCycleCounter(); } #endif diff --git a/uCNC/mcus/virtual/virtualserial.c b/uCNC/mcus/virtual/virtualserial.c index 8d3fd51f0..ce3993ba1 100644 --- a/uCNC/mcus/virtual/virtualserial.c +++ b/uCNC/mcus/virtual/virtualserial.c @@ -40,7 +40,7 @@ HANDLE win_serial = NULL; unsigned char ComPortName[] = COMPORT; unsigned char ComParams[] = "baud=115200 parity=N data=8 stop=1"; -int virtualserial_open() +int virtualserial_open(void) { DCB dcbSerialParams = {}; COMMTIMEOUTS timeouts = {}; @@ -104,7 +104,7 @@ char serial_buffer[127]; int serial_charcount = 0; int serial_charindex = 0; -unsigned char virtualserial_getc() +unsigned char virtualserial_getc(void) { DWORD dwEventMask; unsigned char TempChar; @@ -159,7 +159,7 @@ void virtualserial_puts(const unsigned char* __str) PurgeComm(win_serial, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); } -int virtualserial_close() +int virtualserial_close(void) { // Close serial port fprintf(stderr, "Closing serial port COM3..."); diff --git a/uCNC/motion_control.c b/uCNC/motion_control.c index d05f5aca7..bd4485e19 100644 --- a/uCNC/motion_control.c +++ b/uCNC/motion_control.c @@ -32,19 +32,19 @@ static bool mc_checkmode; -void mc_init() +void mc_init(void) { #ifdef FORCE_GLOBALS_TO_0 mc_checkmode = false; #endif } -bool mc_get_checkmode() +bool mc_get_checkmode(void) { return mc_checkmode; } -bool mc_toogle_checkmode() +bool mc_toogle_checkmode(void) { mc_checkmode = !mc_checkmode; return mc_checkmode; @@ -411,20 +411,28 @@ uint8_t mc_spindle_coolant(planner_block_data_t block_data) uint8_t mc_probe(float *target, bool invert_probe, planner_block_data_t block_data) { + #ifdef PROBE uint8_t prev_state = cnc_get_exec_state(EXEC_HOLD); - mcu_enable_probe_isr(); + io_enable_probe(); mc_line(target, block_data); + do { if(!cnc_doevents()) { return STATUS_CRITICAL_FAIL; } - } - while (cnc_get_exec_state(EXEC_RUN)); + #ifdef USE_INPUTS_POOLING_ONLY + if(io_get_probe()) + { + io_probe_isr(); + break; + } + #endif + } while (cnc_get_exec_state(EXEC_RUN)); - mcu_disable_probe_isr(); + io_disable_probe(); itp_stop(); itp_clear(); planner_clear(); @@ -435,6 +443,8 @@ uint8_t mc_probe(float *target, bool invert_probe, planner_block_data_t block_da return EXEC_ALARM_PROBE_FAIL_CONTACT; } + #endif + return STATUS_OK; } diff --git a/uCNC/motion_control.h b/uCNC/motion_control.h index cd05bb573..da518130b 100644 --- a/uCNC/motion_control.h +++ b/uCNC/motion_control.h @@ -1,17 +1,17 @@ /* Name: motion_control.h - Description: Contains the building blocks for performing motions/actions in µCNC. + Description: Contains the building blocks for performing motions/actions in µCNC. - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 19/11/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -23,9 +23,9 @@ #include #include "planner.h" -void mc_init(); -bool mc_get_checkmode(); -bool mc_toogle_checkmode(); +void mc_init(void); +bool mc_get_checkmode(void); +bool mc_toogle_checkmode(void); uint8_t mc_line(float *target, planner_block_data_t block_data); uint8_t mc_arc(float *target, float center_offset_a, float center_offset_b, float radius, uint8_t axis_0, uint8_t axis_1, bool isclockwise, planner_block_data_t block_data); uint8_t mc_dwell(planner_block_data_t block_data); diff --git a/uCNC/parser.c b/uCNC/parser.c index 32639cde5..c0ac7bc3b 100644 --- a/uCNC/parser.c +++ b/uCNC/parser.c @@ -190,7 +190,7 @@ static void parser_discard_command(); /* Initializes the gcode parser */ -void parser_init() +void parser_init(void) { #ifdef FORCE_GLOBALS_TO_0 memset(&parser_state, 0, sizeof(parser_state_t)); @@ -203,7 +203,7 @@ void parser_init() /* Parse the next gcode line available in the buffer and send it to the motion controller */ -uint8_t parser_gcode_command() +uint8_t parser_gcode_command(void) { uint8_t result = 0; //initializes new state @@ -305,7 +305,7 @@ uint8_t parse_grbl_error_code(uint8_t code) return STATUS_OK; } -uint8_t parser_grbl_command() +uint8_t parser_grbl_command(void) { //if not IDLE if (cnc_get_exec_state(EXEC_RUN)) @@ -556,12 +556,12 @@ void parser_get_coordsys(uint8_t system_num, float* axis) } } -uint8_t parser_get_probe_result() +uint8_t parser_get_probe_result(void) { return parser_parameters.last_probe_ok; } -void parser_parameters_reset() +void parser_parameters_reset(void) { //erase all parameters for G54..G59.x coordinate systems memset(&parser_parameters.coord_system_offset, 0, sizeof(parser_parameters.coord_system_offset)); @@ -595,7 +595,7 @@ bool parser_get_wco(float *axis) return false; } -void parser_sync_probe() +void parser_sync_probe(void) { itp_get_rt_position(parser_parameters.last_probe_position); } @@ -719,7 +719,7 @@ bool parser_get_float(float *value, bool *isinteger) To be compatible with Grbl it accepts bad format comments On error returns false otherwise returns true */ -bool parser_get_comment() +bool parser_get_comment(void) { uint8_t msg_parser = 0; for(;;) @@ -1739,13 +1739,24 @@ uint8_t parser_exec_command(parser_state_t *new_state, parser_words_t *words) break; case 1: //G10 index = (uint8_t)words->p; - index--; - for (uint8_t i = AXIS_COUNT; i != 0;) + switch(index) { - i--; - parser_parameters.coord_system_offset[i] = words->xyzabc[i]; + case 28: + settings_save(G28ADDRESS, (uint8_t *)&words->xyzabc, PARSER_PARAM_SIZE); + break; + case 30: + settings_save(G28ADDRESS, (uint8_t *)&words->xyzabc, PARSER_PARAM_SIZE); + break; + default: + index--; + for (uint8_t i = AXIS_COUNT; i != 0;) + { + i--; + parser_parameters.coord_system_offset[i] = words->xyzabc[i]; + } + settings_save(SETTINGS_PARSER_PARAMETERS_ADDRESS_OFFSET + (index * PARSER_PARAM_ADDR_OFFSET), (uint8_t*)&parser_parameters.coord_system_offset, PARSER_PARAM_SIZE); + break; } - settings_save(SETTINGS_PARSER_PARAMETERS_ADDRESS_OFFSET + (index * PARSER_PARAM_ADDR_OFFSET), (uint8_t*)&parser_parameters.coord_system_offset, PARSER_PARAM_SIZE); CLEARFLAG(parser_word0, GCODE_ALL_AXIS); break; case 2: //G28 @@ -1989,7 +2000,7 @@ uint8_t parser_exec_command(parser_state_t *new_state, parser_words_t *words) return STATUS_OK; } -void parser_reset() +void parser_reset(void) { parser_state.groups.coord_system = 0; //G54 parser_state.groups.plane = 0; //G17 @@ -2013,7 +2024,7 @@ void parser_reset() //loads G92 offset //loads G54 coordinate system //also checks all other coordinate systems and homing positions -void parser_load_parameters() +void parser_load_parameters(void) { const uint8_t size = PARSER_PARAM_SIZE; @@ -2040,7 +2051,7 @@ void parser_load_parameters() } } -void parser_discard_command() +void parser_discard_command(void) { unsigned char c = '@'; #ifdef ECHO_CMD diff --git a/uCNC/parser.h b/uCNC/parser.h index 7d2347fa6..901df3818 100644 --- a/uCNC/parser.h +++ b/uCNC/parser.h @@ -29,10 +29,10 @@ #include #include "config.h" -void parser_init(); +void parser_init(void); uint8_t parse_grbl_error_code(uint8_t code); -uint8_t parser_gcode_command(); -uint8_t parser_grbl_command(); +uint8_t parser_gcode_command(void); +uint8_t parser_grbl_command(void); void parser_get_modes(uint8_t* modalgroups, uint16_t* feed, uint16_t* spindle); void parser_get_coordsys(uint8_t system_num, float* axis); bool parser_get_wco(float* axis); @@ -40,10 +40,10 @@ bool parser_get_wco(float* axis); void parser_update_coolant(uint8_t state); void parser_toogle_coolant(uint8_t state); #endif -void parser_sync_probe(); -uint8_t parser_get_probe_result(); -void parser_parameters_load(); -void parser_parameters_reset(); -void parser_parameters_save(); +void parser_sync_probe(void); +uint8_t parser_get_probe_result(void); +void parser_parameters_load(void); +void parser_parameters_reset(void); +void parser_parameters_save(void); #endif diff --git a/uCNC/planner.c b/uCNC/planner.c index 1beef4408..f09d7e144 100644 --- a/uCNC/planner.c +++ b/uCNC/planner.c @@ -3,16 +3,16 @@ Description: Chain planner for linear motions and acceleration/deacceleration profiles. It uses a similar algorithm to Grbl. - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 24/09/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -56,7 +56,7 @@ static uint8_t planner_ovr_counter; /* Planner buffer functions */ -static inline void planner_buffer_read() +static inline void planner_buffer_read(void) { planner_data_slots++; if (++planner_data_read == PLANNER_BUFFER_SIZE) @@ -65,7 +65,7 @@ static inline void planner_buffer_read() } } -static inline void planner_buffer_write() +static inline void planner_buffer_write(void) { planner_data_slots--; if (++planner_data_write == PLANNER_BUFFER_SIZE) @@ -94,17 +94,17 @@ static inline uint8_t planner_buffer_prev(uint8_t index) return --index; } -bool planner_buffer_is_empty() +bool planner_buffer_is_empty(void) { return (planner_data_slots == PLANNER_BUFFER_SIZE); } -bool planner_buffer_is_full() +bool planner_buffer_is_full(void) { return (planner_data_slots == 0); } -static inline void planner_buffer_clear() +static inline void planner_buffer_clear(void) { planner_data_write = 0; planner_data_read = 0; @@ -114,7 +114,7 @@ static inline void planner_buffer_clear() #endif } -void planner_init() +void planner_init(void) { #ifdef FORCE_GLOBALS_TO_0 memset(&planner_coord, 0, AXIS_COUNT * sizeof(float)); @@ -131,7 +131,7 @@ void planner_init() #endif } -void planner_clear() +void planner_clear(void) { //clears all motions stored in the buffer planner_buffer_clear(); @@ -142,12 +142,12 @@ void planner_clear() planner_resync_position(); } -planner_block_t *planner_get_block() +planner_block_t *planner_get_block(void) { return &planner_data[planner_data_read]; } -float planner_get_block_exit_speed_sqr() +float planner_get_block_exit_speed_sqr(void) { //only one block in the buffer (exit speed is 0) if (planner_data_slots >= (PLANNER_BUFFER_SIZE - 1)) @@ -179,7 +179,7 @@ float planner_get_block_exit_speed_sqr() return exit_speed_sqr; } -float planner_get_block_top_speed() +float planner_get_block_top_speed(void) { /* Computed the junction speed @@ -228,18 +228,18 @@ float planner_get_block_top_speed() } #ifdef USE_SPINDLE -void planner_get_spindle_speed(float scale, uint8_t* pwm,bool* invert) +void planner_get_spindle_speed(float scale, uint8_t *pwm, bool *invert) { - float spindle = (planner_data_slots == PLANNER_BUFFER_SIZE) ? planner_spindle : planner_data[planner_data_read].spindle; - *pwm = 0; + float spindle = (planner_data_slots == PLANNER_BUFFER_SIZE) ? planner_spindle : planner_data[planner_data_read].spindle; + *pwm = 0; *invert = (spindle < 0); if (spindle != 0) { spindle = ABS(spindle); - #ifdef LASER_MODE +#ifdef LASER_MODE spindle *= scale; //scale calculated in laser mode (otherwise scale is always 1) - #endif +#endif if (planner_overrides.overrides_enabled && planner_overrides.spindle_override != 100) { spindle = 0.01f * planner_overrides.spindle_override * spindle; @@ -250,18 +250,18 @@ void planner_get_spindle_speed(float scale, uint8_t* pwm,bool* invert) } } -float planner_get_previous_spindle_speed() +float planner_get_previous_spindle_speed(void) { - return planner_spindle; + return planner_spindle; } #endif -void planner_discard_block() +void planner_discard_block(void) { planner_buffer_read(); } -void planner_recalculate() +void planner_recalculate(void) { uint8_t last = planner_data_write; uint8_t first = planner_data_read; @@ -276,7 +276,7 @@ void planner_recalculate() while (!planner_data[block].optimal && block != first) { - if(planner_data[block].dwell != 0) + if (planner_data[block].dwell != 0) { planner_data[block].entry_feed_sqr = 0; } @@ -347,12 +347,12 @@ void planner_add_line(float *target, planner_block_data_t block_data) planner_spindle = planner_data[planner_data_write].spindle = block_data.spindle; #endif #ifdef GCODE_PROCESS_LINE_NUMBERS - planner_data[planner_data_write].line = block_data.line; + planner_data[planner_data_write].line = block_data.line; #endif planner_data[planner_data_write].dwell = block_data.dwell; planner_data[planner_data_write].distance = block_data.distance; - if(CHECKFLAG(block_data.motion_mode,PLANNER_MOTION_MODE_NOMOTION)) + if (CHECKFLAG(block_data.motion_mode, PLANNER_MOTION_MODE_NOMOTION)) { planner_buffer_write(); return; @@ -378,14 +378,14 @@ void planner_add_line(float *target, planner_block_data_t block_data) //calculates (given the motion direction), the maximum acceleration an feed allowed by the machine settings. float rapid_feed = FLT_MAX; planner_data[planner_data_write].acceleration = FLT_MAX; - for (uint8_t i = AXIS_COUNT; i != 0; ) + for (uint8_t i = AXIS_COUNT; i != 0;) { i--; //if target doesn't move skip computations if (block_data.dir_vect[i] != 0) { block_data.dir_vect[i] *= inv_magn; - float dir_axis_abs = 1.0f/block_data.dir_vect[i]; + float dir_axis_abs = 1.0f / block_data.dir_vect[i]; if (block_data.dir_vect[i] < 0) //sets direction bits { SETBIT(planner_data[planner_data_write].dirbits, i); @@ -404,7 +404,6 @@ void planner_add_line(float *target, planner_block_data_t block_data) float axis_accel = g_settings.acceleration[i] * dir_axis_abs; planner_data[planner_data_write].acceleration = MIN(planner_data[planner_data_write].acceleration, axis_accel); } - } planner_data[planner_data_write].accel_inv = 1.0f / planner_data[planner_data_write].acceleration; @@ -441,7 +440,7 @@ void planner_add_line(float *target, planner_block_data_t block_data) //sets the maximum allowed speed at junction (if angle doesn't force a full stop) float factor = ((!CHECKFLAG(block_data.motion_mode, PLANNER_MOTION_CONTINUOUS)) ? 0 : G64_MAX_ANGLE_FACTOR); angle_factor = MAX(angle_factor - factor, 0); - + if (angle_factor < 1.0f) { float junc_feed_sqr = (1 - angle_factor); @@ -468,36 +467,36 @@ void planner_get_position(float *axis) memcpy(axis, planner_coord, sizeof(planner_coord)); } -void planner_resync_position() +void planner_resync_position(void) { //resyncs the position with the interpolator itp_get_rt_position((float *)&planner_coord); } //overrides -void planner_toggle_overrides() +void planner_toggle_overrides(void) { planner_overrides.overrides_enabled = !planner_overrides.overrides_enabled; itp_update(); planner_ovr_counter = 0; } -bool planner_get_overrides() +bool planner_get_overrides(void) { return planner_overrides.overrides_enabled; } void planner_feed_ovr_inc(uint8_t value) { - uint8_t ovr_val = planner_overrides.feed_override; + uint8_t ovr_val = planner_overrides.feed_override; ovr_val += value; ovr_val = MAX(ovr_val, FEED_OVR_MIN); ovr_val = MIN(ovr_val, FEED_OVR_MAX); if (planner_overrides.overrides_enabled && ovr_val != planner_overrides.feed_override) { - planner_overrides.feed_override = ovr_val; - planner_ovr_counter = 0; + planner_overrides.feed_override = ovr_val; + planner_ovr_counter = 0; itp_update(); } } @@ -506,13 +505,13 @@ void planner_rapid_feed_ovr(uint8_t value) { if (planner_overrides.overrides_enabled && planner_overrides.rapid_feed_override != value) { - planner_overrides.rapid_feed_override = value; + planner_overrides.rapid_feed_override = value; planner_ovr_counter = 0; itp_update(); } } -void planner_feed_ovr_reset() +void planner_feed_ovr_reset(void) { if (planner_overrides.overrides_enabled && planner_overrides.feed_override != 100) { @@ -522,7 +521,7 @@ void planner_feed_ovr_reset() } } -void planner_rapid_feed_ovr_reset() +void planner_rapid_feed_ovr_reset(void) { if (planner_overrides.overrides_enabled && planner_overrides.rapid_feed_override != 100) { @@ -534,19 +533,19 @@ void planner_rapid_feed_ovr_reset() #ifdef USE_SPINDLE void planner_spindle_ovr_inc(uint8_t value) { - uint8_t ovr_val = planner_overrides.spindle_override; + uint8_t ovr_val = planner_overrides.spindle_override; ovr_val += value; ovr_val = MAX(ovr_val, FEED_OVR_MIN); ovr_val = MIN(ovr_val, FEED_OVR_MAX); if (planner_overrides.overrides_enabled && ovr_val != planner_overrides.spindle_override) { - planner_overrides.spindle_override = ovr_val; - planner_ovr_counter = 0; + planner_overrides.spindle_override = ovr_val; + planner_ovr_counter = 0; } } -void planner_spindle_ovr_reset() +void planner_spindle_ovr_reset(void) { planner_overrides.spindle_override = 100; planner_ovr_counter = 0; @@ -555,7 +554,7 @@ void planner_spindle_ovr_reset() bool planner_get_overflows(uint8_t *overflows) { - if(!planner_ovr_counter) + if (!planner_ovr_counter) { overflows[0] = planner_overrides.feed_override; overflows[1] = planner_overrides.rapid_feed_override; @@ -571,4 +570,3 @@ bool planner_get_overflows(uint8_t *overflows) planner_ovr_counter--; return false; } - diff --git a/uCNC/planner.h b/uCNC/planner.h index 793cf7ea9..373919038 100644 --- a/uCNC/planner.h +++ b/uCNC/planner.h @@ -77,35 +77,35 @@ typedef struct bool optimal; } planner_block_t; -void planner_init(); -void planner_clear(); -bool planner_buffer_is_full(); -bool planner_buffer_is_empty(); -planner_block_t *planner_get_block(); -float planner_get_block_exit_speed_sqr(); -float planner_get_block_top_speed(); +void planner_init(void); +void planner_clear(void); +bool planner_buffer_is_full(void); +bool planner_buffer_is_empty(void); +planner_block_t *planner_get_block(void); +float planner_get_block_exit_speed_sqr(void); +float planner_get_block_top_speed(void); #ifdef USE_SPINDLE void planner_get_spindle_speed(float scale, uint8_t* pwm,bool* invert); -float planner_get_previous_spindle_speed(); +float planner_get_previous_spindle_speed(void); #endif -void planner_discard_block(); +void planner_discard_block(void); void planner_add_line(float *target, planner_block_data_t block_data); void planner_add_analog_output(uint8_t output, uint8_t value); void planner_add_digital_output(uint8_t output, uint8_t value); void planner_get_position(float *axis); -void planner_resync_position(); +void planner_resync_position(void); //overrides -void planner_toggle_overrides(); -bool planner_get_overrides(); +void planner_toggle_overrides(void); +bool planner_get_overrides(void); -void planner_feed_ovr_reset(); +void planner_feed_ovr_reset(void); void planner_feed_ovr_inc(uint8_t value); void planner_rapid_feed_ovr_reset(); void planner_rapid_feed_ovr(uint8_t value); #ifdef USE_SPINDLE -void planner_spindle_ovr_reset(); +void planner_spindle_ovr_reset(void); void planner_spindle_ovr_inc(uint8_t value); #endif diff --git a/uCNC/protocol.c b/uCNC/protocol.c index 17a5f5bf8..bb6b938b6 100644 --- a/uCNC/protocol.c +++ b/uCNC/protocol.c @@ -29,13 +29,13 @@ #include "mcu.h" #include "protocol.h" -static void procotol_send_newline() +static void procotol_send_newline(void) { serial_putc('\r'); serial_putc('\n'); } -void protocol_send_ok() +void protocol_send_ok(void) { serial_print_str(__romstr__("ok")); procotol_send_newline(); @@ -60,7 +60,7 @@ void protocol_send_string(const unsigned char* __s) serial_print_str(__s); } -static uint8_t protocol_get_tools() +static uint8_t protocol_get_tools(void) { uint8_t modalgroups[9]; uint16_t feed; @@ -81,7 +81,7 @@ static uint8_t protocol_get_tools() return result; } -static void protocol_send_status_tail() +static void protocol_send_status_tail(void) { float axis[MAX(AXIS_COUNT,3)]; if(parser_get_wco(axis)) @@ -126,7 +126,7 @@ static void protocol_send_status_tail() } } -void protocol_send_status() +void protocol_send_status(void) { float axis[MAX(AXIS_COUNT,3)]; @@ -140,7 +140,9 @@ void protocol_send_status() itp_get_rt_position((float*)&axis); kinematics_apply_reverse_transform((float*)&axis); float feed = itp_get_rt_feed() * 60.0f; //convert from mm/s to mm/m + #ifdef USE_SPINDLE uint16_t spindle = itp_get_rt_spindle(); + #endif uint8_t controls = io_get_controls(); uint8_t limits = io_get_limits(); uint8_t state = cnc_get_exec_state(0xFF); @@ -306,7 +308,7 @@ void protocol_send_status() procotol_send_newline(); } -void protocol_send_gcode_coordsys() +void protocol_send_gcode_coordsys(void) { float axis[MAX(AXIS_COUNT,3)]; uint8_t coordlimit = MIN(6, COORD_SYS_COUNT); @@ -366,7 +368,7 @@ void protocol_send_gcode_coordsys() procotol_send_newline(); } -void protocol_send_gcode_modes() +void protocol_send_gcode_modes(void) { uint8_t modalgroups[9]; uint16_t feed; @@ -423,7 +425,7 @@ static void protocol_send_gcode_setting_line_flt(uint8_t setting, float value) procotol_send_newline(); } -void protocol_send_start_blocks() +void protocol_send_start_blocks(void) { unsigned char c = 0; uint16_t address = STARTUP_BLOCK0_ADDRESS_OFFSET; @@ -459,7 +461,7 @@ void protocol_send_start_blocks() } } -void protocol_send_ucnc_settings() +void protocol_send_ucnc_settings(void) { protocol_send_gcode_setting_line_int(0, g_settings.max_step_rate); protocol_send_gcode_setting_line_int(2, g_settings.step_invert_mask); diff --git a/uCNC/protocol.h b/uCNC/protocol.h index 076fc0846..eebdad4e0 100644 --- a/uCNC/protocol.h +++ b/uCNC/protocol.h @@ -1,16 +1,16 @@ /* Name: protocol.h - Description: µCNC implementation of a Grbl compatible send-response protocol - Copyright: Copyright (c) João Martins - Author: João Martins + Description: µCNC implementation of a Grbl compatible send-response protocol + Copyright: Copyright (c) João Martins + Author: João Martins Date: 19/09/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -22,15 +22,15 @@ #include #include -bool protocol_is_busy(); -void protocol_send_ok(); +bool protocol_is_busy(void); +void protocol_send_ok(void); void protocol_send_error(uint8_t error); void protocol_send_alarm(uint8_t alarm); -void protocol_send_status(); -void protocol_send_string(const unsigned char* __s); -void protocol_send_gcode_coordsys(); -void protocol_send_gcode_modes(); -void protocol_send_ucnc_settings(); -void protocol_send_start_blocks(); +void protocol_send_status(void); +void protocol_send_string(const unsigned char *__s); +void protocol_send_gcode_coordsys(void); +void protocol_send_gcode_modes(void); +void protocol_send_ucnc_settings(void); +void protocol_send_start_blocks(void); #endif diff --git a/uCNC/serial.c b/uCNC/serial.c index 7b35e0115..a792d1c7e 100644 --- a/uCNC/serial.c +++ b/uCNC/serial.c @@ -1,17 +1,17 @@ /* Name: serial.c - Description: Serial communication basic read/write functions µCNC. + Description: Serial communication basic read/write functions µCNC. - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 30/12/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -42,7 +42,7 @@ static uint16_t serial_read_index; //static void serial_rx_clear(); -void serial_init() +void serial_init(void) { #ifdef FORCE_GLOBALS_TO_0 serial_rx_write = 0; @@ -59,162 +59,161 @@ void serial_init() #endif } -bool serial_rx_is_empty() +bool serial_rx_is_empty(void) { - switch(serial_read_select) + switch (serial_read_select) { - case SERIAL_UART: - return (!serial_rx_count); - case SERIAL_N0: - case SERIAL_N1: - return false; + case SERIAL_UART: + return (!serial_rx_count); + case SERIAL_N0: + case SERIAL_N1: + return false; } return true; } -bool serial_tx_is_empty() +bool serial_tx_is_empty(void) { return (!serial_tx_count); } -unsigned char serial_getc() +unsigned char serial_getc(void) { unsigned char c; - switch(serial_read_select) + switch (serial_read_select) { - case SERIAL_UART: - if(!serial_rx_count) + case SERIAL_UART: + if (!serial_rx_count) + { + return EOL; + } + + do + { + c = serial_rx_buffer[serial_rx_read]; + if (++serial_rx_read == RX_BUFFER_SIZE) { - return EOL; + serial_rx_read = 0; } - - do + switch (c) { - c = serial_rx_buffer[serial_rx_read]; - if(++serial_rx_read == RX_BUFFER_SIZE) - { - serial_rx_read = 0; - } - switch(c) + case EOL: //EOL + serial_rx_count--; + return EOL; + case ' ': + case '\t': //eats white chars + break; + default: + if (c >= 'a' && c <= 'z') //serial only returns upper case letters { - case EOL: //EOL - serial_rx_count--; - return EOL; - case ' ': - case '\t'://eats white chars - break; - default: - if(c >= 'a' && c <= 'z') //serial only returns upper case letters - { - c -= 32; - } - #ifdef ECHO_CMD - serial_putc(c); - #endif - return c; + c -= 32; } - } while (serial_rx_count); - break; - case SERIAL_N0: - case SERIAL_N1: - c = mcu_eeprom_getc(serial_read_index++); - if(c) - { +#ifdef ECHO_CMD serial_putc(c); +#endif + return c; } - else - { - serial_putc(':'); - serial_read_select = SERIAL_UART; // resets the serial select - } - return c; + } while (serial_rx_count); + break; + case SERIAL_N0: + case SERIAL_N1: + c = mcu_eeprom_getc(serial_read_index++); + if (c) + { + serial_putc(c); + } + else + { + serial_putc(':'); + serial_read_select = SERIAL_UART; // resets the serial select + } + return c; } return EOL; } -void serial_ungetc() +void serial_ungetc(void) { - if(--serial_rx_read==0xFF) + if (--serial_rx_read == 0xFF) { serial_rx_read = RX_BUFFER_SIZE - 1; } - - if(serial_rx_buffer[serial_rx_read] == EOL) + + if (serial_rx_buffer[serial_rx_read] == EOL) { - serial_rx_count++; //recoverd command - } + serial_rx_count++; //recoverd command + } } void serial_select(uint8_t source) { serial_read_select = source; - switch(serial_read_select) + switch (serial_read_select) { - case SERIAL_N0: - serial_putc('>'); - serial_read_index = STARTUP_BLOCK0_ADDRESS_OFFSET; - break; - case SERIAL_N1: - serial_putc('>'); - serial_read_index = STARTUP_BLOCK1_ADDRESS_OFFSET; - break; + case SERIAL_N0: + serial_putc('>'); + serial_read_index = STARTUP_BLOCK0_ADDRESS_OFFSET; + break; + case SERIAL_N1: + serial_putc('>'); + serial_read_index = STARTUP_BLOCK1_ADDRESS_OFFSET; + break; } } -unsigned char serial_peek() +unsigned char serial_peek(void) { unsigned char c; - switch(serial_read_select) + switch (serial_read_select) { - case SERIAL_UART: - while (serial_rx_count) + case SERIAL_UART: + while (serial_rx_count) + { + c = serial_rx_buffer[serial_rx_read]; + switch (c) { - c = serial_rx_buffer[serial_rx_read]; - switch(c) + case ' ': + case '\t': //eats white chars + if (++serial_rx_read == RX_BUFFER_SIZE) + { + serial_rx_read = 0; + } + break; + default: + if (c >= 'a' && c <= 'z') //serial only returns upper case letters { - case ' ': - case '\t'://eats white chars - if(++serial_rx_read == RX_BUFFER_SIZE) - { - serial_rx_read = 0; - } - break; - default: - if(c >= 'a' && c <= 'z') //serial only returns upper case letters - { - c -= 32; - } - return c; + c -= 32; } + return c; } - break; - case SERIAL_N0: - case SERIAL_N1: - return mcu_eeprom_getc(serial_read_index); + } + break; + case SERIAL_N0: + case SERIAL_N1: + return mcu_eeprom_getc(serial_read_index); } return EOL; } -void serial_inject_cmd(const unsigned char* __s) +void serial_inject_cmd(const unsigned char *__s) { unsigned char c = rom_strptr(__s++); do { serial_rx_isr(c); c = rom_strptr(__s++); - } - while(c != 0); + } while (c != 0); } void serial_putc(unsigned char c) { - while((serial_tx_write == serial_tx_read) && (serial_tx_count != 0)) + while ((serial_tx_write == serial_tx_read) && (serial_tx_count != 0)) { - mcu_start_send(); //starts async send and loops while buffer full - if(!cnc_doevents()) //on any alarm abort + mcu_start_send(); //starts async send and loops while buffer full + if (!cnc_doevents()) //on any alarm abort { return; } @@ -222,27 +221,26 @@ void serial_putc(unsigned char c) serial_tx_buffer[serial_tx_write] = c; serial_tx_write++; - if(c == '\n' || c == '\r') + if (c == '\n' || c == '\r') { serial_tx_count++; mcu_start_send(); } - if(serial_tx_write == TX_BUFFER_SIZE) + if (serial_tx_write == TX_BUFFER_SIZE) { serial_tx_write = 0; } } -void serial_print_str(const unsigned char* __s) +void serial_print_str(const unsigned char *__s) { unsigned char c = rom_strptr(__s++); do { serial_putc(c); c = rom_strptr(__s++); - } - while(c != 0); + } while (c != 0); } void serial_print_int(uint16_t num) @@ -259,7 +257,7 @@ void serial_print_int(uint16_t num) while (num > 0) { uint8_t digit = num % 10; - num = ((((uint32_t)num * (UINT16_MAX/10))>>16) + ((digit!=0) ? 0 : 1)); //same has divide by 10 but faster + num = ((((uint32_t)num * (UINT16_MAX / 10)) >> 16) + ((digit != 0) ? 0 : 1)); //same has divide by 10 but faster buffer[i++] = digit; /*buffer[i++] = num % 10; num /= 10;*/ @@ -269,8 +267,7 @@ void serial_print_int(uint16_t num) { i--; serial_putc('0' + buffer[i]); - } - while(i); + } while (i); } #ifdef GCODE_PROCESS_LINE_NUMBERS void serial_print_long(uint32_t num) @@ -297,8 +294,7 @@ void serial_print_long(uint32_t num) { i--; serial_putc('0' + buffer[i]); - } - while(i); + } while (i); } #endif /* @@ -318,12 +314,12 @@ void serial_print_int(uint16_t num) void serial_print_flt(float num) { - if(g_settings.report_inches) + if (g_settings.report_inches) { num *= MM_INCH_MULT; } - if(num < 0) + if (num < 0) { serial_putc('-'); num = -num; @@ -337,25 +333,25 @@ void serial_print_flt(float num) num *= 1000; digits = (uint16_t)roundf(num); - if(g_settings.report_inches) + if (g_settings.report_inches) { - if(digits<10000) + if (digits < 10000) { serial_putc('0'); } - if(digits<1000) + if (digits < 1000) { serial_putc('0'); } } - if(digits<100) + if (digits < 100) { serial_putc('0'); } - if(digits<10) + if (digits < 10) { serial_putc('0'); } @@ -363,43 +359,40 @@ void serial_print_flt(float num) serial_print_int(digits); } -void serial_print_intarr(uint16_t* arr, uint8_t count) +void serial_print_intarr(uint16_t *arr, uint8_t count) { do { serial_print_int(*arr++); count--; - if(count) + if (count) { serial_putc(','); } - } - while(count); + } while (count); } -void serial_print_fltarr(float* arr, uint8_t count) +void serial_print_fltarr(float *arr, uint8_t count) { do { serial_print_flt(*arr++); count--; - if(count) + if (count) { serial_putc(','); } - } - while(count); - + } while (count); } -void serial_flush() +void serial_flush(void) { - while(serial_tx_count) + while (serial_tx_count) { mcu_start_send(); - if(!cnc_doevents()) + if (!cnc_doevents()) { return; } @@ -412,32 +405,32 @@ void serial_flush() void serial_rx_isr(unsigned char c) { uint8_t write; - if(c < ((unsigned char)'~')) //ascii (except CMD_CODE_CYCLE_START and DEL) + if (c < ((unsigned char)'~')) //ascii (except CMD_CODE_CYCLE_START and DEL) { - switch(c) + switch (c) { - case CMD_CODE_RESET: - serial_rx_clear(); //dumps all unexecuted commands - case CMD_CODE_FEED_HOLD: - case CMD_CODE_REPORT: - cnc_call_rt_command((uint8_t)c); - return; - case '\r': - case '\n': - c = EOL;//replaces CR and LF with EOL and continues - case EOL: - serial_rx_count++; //continues - default: - write = serial_rx_write; - serial_rx_buffer[write] = c; - if(++write == RX_BUFFER_SIZE) - { - write = 0; - } - //writes the overflow char ahead - serial_rx_buffer[write] = OVF; - serial_rx_write = write; - break; + case CMD_CODE_RESET: + serial_rx_clear(); //dumps all unexecuted commands + case CMD_CODE_FEED_HOLD: + case CMD_CODE_REPORT: + cnc_call_rt_command((uint8_t)c); + return; + case '\r': + case '\n': + c = EOL; //replaces CR and LF with EOL and continues + case EOL: + serial_rx_count++; //continues + default: + write = serial_rx_write; + serial_rx_buffer[write] = c; + if (++write == RX_BUFFER_SIZE) + { + write = 0; + } + //writes the overflow char ahead + serial_rx_buffer[write] = OVF; + serial_rx_write = write; + break; } } else //extended ascii (plus CMD_CODE_CYCLE_START and DEL) @@ -446,30 +439,30 @@ void serial_rx_isr(unsigned char c) } } -void serial_tx_isr() +void serial_tx_isr(void) { - if(!serial_tx_count) + if (!serial_tx_count) { return; } uint8_t read = serial_tx_read; unsigned char c = serial_tx_buffer[read]; COM_OUTREG = c; - if(c == '\n' || c == '\r') + if (c == '\n' || c == '\r') { - if(!--serial_tx_count) + if (!--serial_tx_count) { mcu_stop_send(); } } - if(++read == TX_BUFFER_SIZE) + if (++read == TX_BUFFER_SIZE) { read = 0; } serial_tx_read = read; } -void serial_rx_clear() +void serial_rx_clear(void) { serial_rx_write = 0; serial_rx_read = 0; diff --git a/uCNC/serial.h b/uCNC/serial.h index b414c66f1..22d29accd 100644 --- a/uCNC/serial.h +++ b/uCNC/serial.h @@ -1,17 +1,17 @@ /* Name: serial.h - Description: Serial communication basic read/write functions µCNC. + Description: Serial communication basic read/write functions µCNC. - Copyright: Copyright (c) João Martins - Author: João Martins + Copyright: Copyright (c) João Martins + Author: João Martins Date: 30/12/2019 - µCNC is free software: you can redistribute it and/or modify + µCNC is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Please see - µCNC is distributed WITHOUT ANY WARRANTY; + µCNC is distributed WITHOUT ANY WARRANTY; Also without the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ @@ -19,8 +19,8 @@ #ifndef SERIAL_H #define SERIAL_H -#define EOL 0x00 //end of line char -#define OVF 0x7F //overflow char +#define EOL 0x00 //end of line char +#define OVF 0x7F //overflow char #define RX_BUFFER_SIZE 129 //buffer sizes #define TX_BUFFER_SIZE 112 //buffer sizes @@ -34,29 +34,29 @@ void serial_init(); -bool serial_rx_is_empty(); -unsigned char serial_getc(); -void serial_ungetc(); -unsigned char serial_peek(); -void serial_inject_cmd(const unsigned char* __s); -void serial_restore_line(); -void serial_rx_clear(); +bool serial_rx_is_empty(void); +unsigned char serial_getc(void); +void serial_ungetc(void); +unsigned char serial_peek(void); +void serial_inject_cmd(const unsigned char *__s); +void serial_restore_line(void); +void serial_rx_clear(void); void serial_select(uint8_t source); -bool serial_tx_is_empty(); +bool serial_tx_is_empty(void); void serial_putc(unsigned char c); -void serial_print_str(const unsigned char* __s); +void serial_print_str(const unsigned char *__s); void serial_print_int(uint16_t num); #ifdef GCODE_PROCESS_LINE_NUMBERS void serial_print_long(uint32_t num); #endif void serial_print_flt(float num); -void serial_print_intarr(uint16_t* arr, uint8_t count); -void serial_print_fltarr(float* arr, uint8_t count); -void serial_flush(); +void serial_print_intarr(uint16_t *arr, uint8_t count); +void serial_print_fltarr(float *arr, uint8_t count); +void serial_flush(void); //ISR void serial_rx_isr(unsigned char c); -void serial_tx_isr(); +void serial_tx_isr(void); #endif diff --git a/uCNC/settings.c b/uCNC/settings.c index e13706c4b..e2165b9ce 100644 --- a/uCNC/settings.c +++ b/uCNC/settings.c @@ -152,7 +152,7 @@ const settings_t __rom__ default_settings = //static uint8_t settings_crc; -void settings_init() +void settings_init(void) { const char version[3] = SETTINGS_VERSION; uint8_t error = settings_load(SETTINGS_ADDRESS_OFFSET, (uint8_t*) &g_settings, (uint8_t)sizeof(settings_t)); @@ -206,7 +206,7 @@ uint8_t settings_load(uint16_t address, uint8_t* __ptr, uint8_t size) return (crc ^ mcu_eeprom_getc(address)); } -void settings_reset() +void settings_reset(void) { const uint8_t size = sizeof(settings_t); uint8_t* __ptr = (uint8_t*)&g_settings; diff --git a/uCNC/settings.h b/uCNC/settings.h index 788706492..27dd55fa5 100644 --- a/uCNC/settings.h +++ b/uCNC/settings.h @@ -65,11 +65,11 @@ typedef struct extern settings_t g_settings; -void settings_init(); +void settings_init(void); //Assumes that no structure being saved is bigger than 255 bytes uint8_t settings_load(uint16_t address, uint8_t* __ptr, uint8_t size); void settings_save(uint16_t address, const uint8_t* __ptr, uint8_t size); -void settings_reset(); +void settings_reset(void); uint8_t settings_change(uint8_t setting, float value); void settings_erase(uint16_t address, uint8_t size); bool settings_check_startup_gcode(uint16_t address);