diff --git a/src/Config.h b/src/Config.h index a66e520..5ddd67e 100644 --- a/src/Config.h +++ b/src/Config.h @@ -20,6 +20,7 @@ const char COMM_REPORT_CMD_ERROR[4] = {'R', '0', '3', '\0'}; const char COMM_REPORT_CMD_BUSY[4] = {'R', '0', '4', '\0'}; const char COMM_REPORT_CMD_STATUS[4] = {'R', '0', '5', '\0'}; const char COMM_REPORT_CALIB_STATUS[4] = {'R', '0', '6', '\0'}; +const char COMM_REPORT_CMD_RETRY[4] = { 'R', '0', '7', '\0' }; const char COMM_REPORT_ENCODER_SCALED[4] = { 'R', '8', '4', '\0' }; const char COMM_REPORT_ENCODER_RAW[4] = { 'R', '8', '5', '\0' }; @@ -54,6 +55,7 @@ const long PARAM_TEST_DEFAULT = 0; const long PARAM_CONFIG_OK_DEFAULT = 0; const long PARAM_USE_EEPROM_DEFAULT = 1; const long PARAM_E_STOP_ON_MOV_ERR_DEFAULT = 0; +const long PARAM_MOV_NR_RETRY_DEFAULT = 3; const long MOVEMENT_TIMEOUT_X_DEFAULT = 120; const long MOVEMENT_TIMEOUT_Y_DEFAULT = 120; diff --git a/src/CurrentState.cpp b/src/CurrentState.cpp index 1a91e9d..bf8aba3 100644 --- a/src/CurrentState.cpp +++ b/src/CurrentState.cpp @@ -14,6 +14,7 @@ long z = 0; unsigned int speed = 0; bool endStopState[3][2]; long Q = 0; +int lastError = 0; CurrentState *CurrentState::getInstance() { @@ -31,6 +32,7 @@ CurrentState::CurrentState() z = 0; speed = 0; Q = 0; + lastError = 0; } long CurrentState::getX() @@ -69,6 +71,16 @@ void CurrentState::setZ(long newZ) z = newZ; } +int CurrentState::getLastError() +{ + return lastError; +} + +void CurrentState::setLastError(int error) +{ + lastError = error; +} + void CurrentState::setEndStopState(unsigned int axis, unsigned int position, bool state) { endStopState[axis][position] = state; diff --git a/src/CurrentState.h b/src/CurrentState.h index 50ef9d6..9717ce3 100644 --- a/src/CurrentState.h +++ b/src/CurrentState.h @@ -23,6 +23,9 @@ public: void setY(long); void setZ(long); + int getLastError(); + void setLastError(int error); + void setEndStopState(unsigned int, unsigned int, bool); void printPosition(); String getPosition(); diff --git a/src/GCodeProcessor.cpp b/src/GCodeProcessor.cpp index cbfad42..b6535ce 100644 --- a/src/GCodeProcessor.cpp +++ b/src/GCodeProcessor.cpp @@ -27,11 +27,31 @@ int GCodeProcessor::execute(Command *command) { int execution = 0; + bool isMovement = false; + + int attempt = 0; + int maximumAttempts = ParameterList::getInstance()->getValue(PARAM_MOV_NR_RETRY); long Q = command->getQ(); CurrentState::getInstance()->setQ(Q); - + if + ( + command->getCodeEnum() == G00 || + command->getCodeEnum() == G01 || + command->getCodeEnum() == F11 || + command->getCodeEnum() == F12 || + command->getCodeEnum() == F13 || + command->getCodeEnum() == F14 || + command->getCodeEnum() == F15 || + command->getCodeEnum() == F16 + ) + { + isMovement = true; + } + + + //Only allow reset of emergency stop when emergency stop is engaged if (CurrentState::getInstance()->isEmergencyStop()) @@ -106,13 +126,37 @@ int GCodeProcessor::execute(Command *command) return -1; } - // Execute the command, report start and end + // Report start of command Serial.print(COMM_REPORT_CMD_START); CurrentState::getInstance()->printQAndNewLine(); - execution = handler->execute(command); + // Execute command with retry + CurrentState::getInstance()->setLastError(0); + while (attempt < 1 || (attempt < maximumAttempts && execution != 0)) + { + Serial.print("R99 attempt "); + Serial.print(attempt); + Serial.print(" from "); + Serial.print(maximumAttempts); + Serial.print("\r\n"); + + attempt++; + if (attempt > 1) + { + Serial.print(COMM_REPORT_CMD_RETRY); + CurrentState::getInstance()->printQAndNewLine(); + } + + handler->execute(command); + execution = CurrentState::getInstance()->getLastError(); + + Serial.print("R99 execution "); + Serial.print(execution); + Serial.print("\r\n"); + + } // Clean serial buffer while (Serial.available() > 0) { diff --git a/src/ParameterList.cpp b/src/ParameterList.cpp index 263e7c8..ed3ac36 100644 --- a/src/ParameterList.cpp +++ b/src/ParameterList.cpp @@ -245,7 +245,9 @@ void ParameterList::loadDefaultValue(int id) case PARAM_E_STOP_ON_MOV_ERR: paramValues[id] = PARAM_E_STOP_ON_MOV_ERR_DEFAULT; break; - + case PARAM_MOV_NR_RETRY: + paramValues[id] = PARAM_MOV_NR_RETRY_DEFAULT; + break; case MOVEMENT_TIMEOUT_X: paramValues[id] = MOVEMENT_TIMEOUT_X_DEFAULT; break; @@ -509,6 +511,7 @@ bool ParameterList::validParam(int id) case PARAM_CONFIG_OK: case PARAM_USE_EEPROM: case PARAM_E_STOP_ON_MOV_ERR: + case PARAM_MOV_NR_RETRY: case MOVEMENT_TIMEOUT_X: case MOVEMENT_TIMEOUT_Y: case MOVEMENT_TIMEOUT_Z: diff --git a/src/ParameterList.h b/src/ParameterList.h index cdf522c..e2400d2 100644 --- a/src/ParameterList.h +++ b/src/ParameterList.h @@ -17,6 +17,8 @@ enum ParamListEnum PARAM_USE_EEPROM = 3, PARAM_E_STOP_ON_MOV_ERR = 4, + PARAM_MOV_NR_RETRY = 5, + // stepper motor settings MOVEMENT_TIMEOUT_X = 11, diff --git a/src/StepperControl.cpp b/src/StepperControl.cpp index 3579981..e3e81e1 100644 --- a/src/StepperControl.cpp +++ b/src/StepperControl.cpp @@ -433,6 +433,10 @@ int StepperControl::moveToCoords(long xDest, long yDest, long zDest, encoderX.setPosition(0); axisX.setCurrentPosition(0); } + else + { + error = 1; + } } if (axisY.isAxisActive() && motorConsMissedSteps[1] > motorConsMissedStepsMax[1]) @@ -450,6 +454,10 @@ int StepperControl::moveToCoords(long xDest, long yDest, long zDest, encoderY.setPosition(0); axisY.setCurrentPosition(0); } + else + { + error = 1; + } } if (axisZ.isAxisActive() && motorConsMissedSteps[2] > motorConsMissedStepsMax[2]) @@ -468,6 +476,10 @@ int StepperControl::moveToCoords(long xDest, long yDest, long zDest, encoderZ.setPosition(0); axisZ.setCurrentPosition(0); } + else + { + error = 1; + } } if (axisX.endStopAxisReached(false)) @@ -652,7 +664,14 @@ int StepperControl::moveToCoords(long xDest, long yDest, long zDest, CurrentState::getInstance()->setEmergencyStop(); } + Serial.print("R99 error "); + Serial.print(error); + Serial.print("\r\n"); + + // Return error + CurrentState::getInstance()->setLastError(error); + return error; }