MCPcopy Create free account
hub / github.com/Duet3D/RepRapFirmware / AddMoveFromRemote

Method AddMoveFromRemote

src/Movement/Move2.cpp:1232–1286  ·  view source on GitHub ↗

Add a move to the movement queue when we are in expansion board mode

Source from the content-addressed store, hash-verified

1230
1231// Add a move to the movement queue when we are in expansion board mode
1232void Move::AddMoveFromRemote(const CanMessageMovementLinearShaped& msg) noexcept
1233{
1234 // Prepare for movement
1235 PrepParams params;
1236
1237 // Normalise the move to unit distance
1238 params.totalDistance = 1.0;
1239 params.acceleration = msg.acceleration;
1240 params.deceleration = -msg.deceleration;
1241 params.accelClocks = msg.accelerationClocks;
1242 params.steadyClocks = msg.steadyClocks;
1243 params.decelClocks = msg.decelClocks;
1244 uint32_t clocksNeeded = msg.accelerationClocks + msg.steadyClocks + msg.decelClocks;
1245
1246 // We occasionally receive a message for a very short move with zero clocks needed. This messes up the calculations, so add one steady clock in this case.
1247 if (clocksNeeded == 0)
1248 {
1249 clocksNeeded = params.steadyClocks = 1;
1250 }
1251
1252 const float accelDistanceExTopSpeed = -0.5 * params.acceleration * fsquare((float)params.accelClocks);
1253 const float decelDistanceExTopSpeed = 0.5 * params.deceleration * fsquare((float)params.decelClocks);
1254 const float topSpeed = (params.totalDistance - accelDistanceExTopSpeed - decelDistanceExTopSpeed)/clocksNeeded;
1255
1256 params.accelDistance = accelDistanceExTopSpeed + topSpeed * params.accelClocks;
1257 const float decelDistance = decelDistanceExTopSpeed + topSpeed * params.decelClocks;
1258 params.decelStartDistance = 1.0 - decelDistance;
1259
1260 MovementFlags segFlags;
1261 segFlags.nonPrintingMove = !msg.usePressureAdvance;
1262 segFlags.noShaping = !msg.useLateInputShaping;
1263
1264 for (size_t drive = 0; drive < min<size_t>(NumDirectDrivers, msg.numDrivers); drive++)
1265 {
1266 if ((msg.extruderDrives & (1u << drive)) != 0)
1267 {
1268 // It's an extruder
1269 const float extrusionRequested = msg.perDrive[drive].extrusion;
1270 if (extrusionRequested != 0.0)
1271 {
1272 EnableDrivers(drive, false);
1273 AddLinearSegments(drive, msg.whenToExecute, params, extrusionRequested, segFlags.AddIsExtruder());
1274 }
1275 }
1276 else
1277 {
1278 const float delta = (float)msg.perDrive[drive].steps;
1279 if (delta != 0.0)
1280 {
1281 EnableDrivers(drive, false);
1282 AddLinearSegments(drive, msg.whenToExecute, params, delta, segFlags);
1283 }
1284 }
1285 }
1286}
1287
1288GCodeResult Move::EutSetMotorCurrents(const CanMessageMultipleDrivesRequest<float>& msg, size_t dataLength, const StringRef& reply) noexcept
1289{

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected