<font face="Arial, Verdana">Hi repetier would you please check if this is right or not?</font>
<font face="Arial, Verdana">void PrintLine::queueScaraMove(uint8_t check_endstops, uint8_t pathOptimize)</font>
<font face="Arial, Verdana">{</font>
<font face="Arial, Verdana"> EVENT_CONTRAIN_DESTINATION_COORDINATES</font>
<font face="Arial, Verdana"> Printer::unsetAllSteppersDisabled();</font>
<font face="Arial, Verdana"> waitForXFreeLines(1);</font>
<font face="Arial, Verdana"> float axisRotationRad[E_AXIS_ARRAY]; // Axis rotation in Rad</font>
<font face="Arial, Verdana"> p->flags = (check_endstops ? FLAG_CHECK_ENDSTOPS : 0);</font>
<font face="Arial, Verdana">#if MIXING_EXTRUDER</font>
<font face="Arial, Verdana"> if(Printer::isAllEMotors()) {</font>
<font face="Arial, Verdana"> p->flags |= FLAG_ALL_E_MOTORS;</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana">#endif</font>
<font face="Arial, Verdana"> p->joinFlags = 0;</font>
<font face="Arial, Verdana"> if(!pathOptimize) p->setEndSpeedFixed(true);</font>
<font face="Arial, Verdana"> p->dir = 0;</font>
<font face="Arial, Verdana"> //Find direction</font>
<font face="Arial, Verdana"> Printer::zCorrectionStepsIncluded = 0;</font>
<font face="Arial, Verdana"> for(uint8_t axis = 0; axis < 4; axis++)</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana"> p->delta[axis] = Printer::NonlinearDestinationSteps[axis] - Printer::currentNonlinearPositionSteps[axis];</font>
<font face="Arial, Verdana"> p->secondSpeed = Printer::fanSpeed;</font>
<font face="Arial, Verdana"> if(axis == E_AXIS)</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana"> if(Printer::mode == PRINTER_MODE_FFF)</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana"> Printer::extrudeMultiplyError += (static_cast<float>(p->delta[E_AXIS]) * Printer::extrusionFactor);</font>
<font face="Arial, Verdana"> p->delta[E_AXIS] = static_cast<int32_t>(Printer::extrudeMultiplyError);</font>
<font face="Arial, Verdana"> Printer::extrudeMultiplyError -= p->delta[E_AXIS];</font>
<font face="Arial, Verdana"> Printer::filamentPrinted += p->delta[E_AXIS] * Printer::invAxisStepsPerMM[axis];</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana">#if defined(SUPPORT_LASER) && SUPPORT_LASER</font>
<font face="Arial, Verdana"> else if(Printer::mode == PRINTER_MODE_LASER)</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana"> p->secondSpeed = ((p->delta[X_AXIS] != 0 p->delta[Y_AXIS] != 0) && (LaserDriver::laserOn p->delta[E_AXIS] != 0) ? LaserDriver::intensity : 0);</font>
<font face="Arial, Verdana"> p->delta[E_AXIS] = 0;</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana">#endif</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana"> if(p->delta[axis] >= 0)</font>
<font face="Arial, Verdana"> p->setPositiveDirectionForAxis(axis);</font>
<font face="Arial, Verdana"> else</font>
<font face="Arial, Verdana"> p->delta[axis] = -p->delta[axis];</font>
<font face="Arial, Verdana"> if(axis == X_AXIS axis == Y_AXIS)</font>
<font face="Arial, Verdana"> axisRotationRad[axis] = p->delta[axis] / Printer::motorStepsPerRad[axis]</font>
<font face="Arial, Verdana"> else </font>
<font face="Arial, Verdana"> axisRotationRad[axis] = p->delta[axis] * Printer::invAxisStepsPerMM[axis];</font>
<font face="Arial, Verdana"> if(p->delta[axis]) p->setMoveOfAxis(axis);</font>
<font face="Arial, Verdana"> Printer::currentNonlinearPositionSteps[axis] = Printer::NonlinearDestinationSteps[axis];</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana"> if(p->isNoMove())</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana"> if(newPath) // need to delete dummy elements, otherwise commands can get locked.</font>
<font face="Arial, Verdana"> resetPathPlanner();</font>
<font face="Arial, Verdana"> return; // No steps included</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana"> float xydist2;</font>
<font face="Arial, Verdana">#if ENABLE_BACKLASH_COMPENSATION</font>
<font face="Arial, Verdana"> if((p->isXYZMove()) && ((p->dir & XYZ_DIRPOS)Printer::backlashDir & XYZ_DIRPOS) & (Printer::backlashDir >> 3)) // We need to compensate backlash, add a move</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana"> waitForXFreeLines(2);</font>
<font face="Arial, Verdana"> uint8_t wpos2 = linesWritePos + 1;</font>
<font face="Arial, Verdana"> if(wpos2 >= PRINTLINE_CACHE_SIZE) wpos2 = 0;</font>
<font face="Arial, Verdana"> PrintLine p2 = &lines[wpos2];</font>
<font face="Arial, Verdana"> memcpy(p2,p,sizeof(PrintLine)); // Move current data to p2</font>
<font face="Arial, Verdana"> uint8_t changed = (p->dir & XYZ_DIRPOS)Printer::backlashDir & XYZ_DIRPOS;</font>
<font face="Arial, Verdana"> float back_diff[4]; // Axis movement in mm</font>
<font face="Arial, Verdana"> back_diff[E_AXIS] = 0;</font>
<font face="Arial, Verdana"> back_diff[X_AXIS] = (changed & 1 ? (p->isXPositiveMove() ? Printer::backlashX : -Printer::backlashX) : 0);</font>
<font face="Arial, Verdana"> back_diff[Y_AXIS] = (changed & 2 ? (p->isYPositiveMove() ? Printer::backlashY : -Printer::backlashY) : 0);</font>
<font face="Arial, Verdana"> back_diff[Z_AXIS] = (changed & 4 ? (p->isZPositiveMove() ? Printer::backlashZ : -Printer::backlashZ) : 0);</font>
<font face="Arial, Verdana"> p->dir &= XYZ_DIRPOS; // x,y and z are already correct</font>
<font face="Arial, Verdana"> for(uint8_t i = 0; i < 4; i++)</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana"> if( i = X_AXIS || i = Y_AXIS)</font>
<font face="Arial, Verdana"> float f = back_diff[i]*Printer::motorStepsPerRad[i];</font>
<font face="Arial, Verdana"> else </font>
<font face="Arial, Verdana"> float f = back_diff[i]*Printer::axisStepsPerMM[i];</font>
<font face="Arial, Verdana"> p->delta[i] = abs((long)f);</font>
<font face="Arial, Verdana"> if(p->delta[i]) p->dir |= XSTEP << i;</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana"> //Define variables that are needed for the Bresenham algorithm. Please note that Z is not currently included in the Bresenham algorithm.</font>
<font face="Arial, Verdana"> if(p->delta[Y_AXIS] > p->delta[X_AXIS] && p->delta[Y_AXIS] > p->delta[Z_AXIS]) p->primaryAxis = Y_AXIS;</font>
<font face="Arial, Verdana"> else if (p->delta[X_AXIS] > p->delta[Z_AXIS] ) p->primaryAxis = X_AXIS;</font>
<font face="Arial, Verdana"> else p->primaryAxis = Z_AXIS;</font>
<font face="Arial, Verdana"> p->stepsRemaining = p->delta[p->primaryAxis];</font>
<font face="Arial, Verdana"> //Feedrate calc based on XYZ travel distance</font>
<font face="Arial, Verdana"> xydist2 = back_diff[X_AXIS] * back_diff[X_AXIS] + back_diff[Y_AXIS] * back_diff[Y_AXIS];</font>
<font face="Arial, Verdana"> if(p->isZMove())</font>
<font face="Arial, Verdana"> p->distance = sqrt(xydist2 + back_diff[Z_AXIS] * back_diff[Z_AXIS]);</font>
<font face="Arial, Verdana"> else</font>
<font face="Arial, Verdana"> p->distance = sqrt(xydist2);</font>
<font face="Arial, Verdana"> // 56 seems to be xstep|ystep|e_posdir which just seems odd</font>
<font face="Arial, Verdana"> Printer::backlashDir = (Printer::backlashDir & 56) | (p2->dir & XYZ_DIRPOS);</font>
<font face="Arial, Verdana"> p->calculateMove(back_diff,pathOptimize,p->primaryAxis);</font>
<font face="Arial, Verdana"> p = p2; // use saved instance for the real move</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana">#endif</font>
<font face="Arial, Verdana">
</font>
<font face="Arial, Verdana"> //Define variables that are needed for the Bresenham algorithm. Please note that Z is not currently included in the Bresenham algorithm.</font>
<font face="Arial, Verdana"> if(p->delta[Y_AXIS] > p->delta[X_AXIS] && p->delta[Y_AXIS] > p->delta[Z_AXIS] && p->delta[Y_AXIS] > p->delta[E_AXIS]) p->primaryAxis = Y_AXIS;</font>
<font face="Arial, Verdana"> else if (p->delta[X_AXIS] > p->delta[Z_AXIS] && p->delta[X_AXIS] > p->delta[E_AXIS]) p->primaryAxis = X_AXIS;</font>
<font face="Arial, Verdana"> else if (p->delta[Z_AXIS] > p->delta[E_AXIS]) p->primaryAxis = Z_AXIS;</font>
<font face="Arial, Verdana"> else p->primaryAxis = E_AXIS;</font>
<font face="Arial, Verdana"> p->stepsRemaining = p->delta[p->primaryAxis];</font>
<font face="Arial, Verdana"> if(p->isXYZMove())</font>
<font face="Arial, Verdana"> {</font>
<font face="Arial, Verdana">// xydist2 = axisRotationRad[X_AXIS] * EEPROM::armLength() + axisRotationRad[Y_AXIS] * EEPROM::forearmLength(); </font>
<font face="Arial, Verdana"> xydist2 = axisRotationRad[X_AXIS] * axisRotationRad[X_AXIS] + axisRotationRad[Y_AXIS] * axisRotationRad[Y_AXIS];</font>
<font face="Arial, Verdana"> if(p->isZMove())</font>
<font face="Arial, Verdana"> p->distance = RMath::max((float)sqrt(xydist2 + axisRotationRad[Z_AXIS] * axisRotationRad[Z_AXIS]),fabs(axisRotationRad[E_AXIS]));</font>
<font face="Arial, Verdana"> else</font>
<font face="Arial, Verdana"> p->distance = RMath::max((float)sqrt(xydist2),fabs(axisRotationRad[E_AXIS]));</font>
<font face="Arial, Verdana"> }</font>
<font face="Arial, Verdana"> else</font>
<font face="Arial, Verdana"> p->distance = fabs(axisRotationRad[E_AXIS]);</font>
<font face="Arial, Verdana"> p->calculateMove(axisRotationRad,pathOptimize,p->primaryAxis);</font>
<font face="Arial, Verdana">}</font>
<font face="Arial, Verdana">#endif</font>