Add a move to the movement queue when we are in expansion board mode
| 1230 | |
| 1231 | // Add a move to the movement queue when we are in expansion board mode |
| 1232 | void 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 | |
| 1288 | GCodeResult Move::EutSetMotorCurrents(const CanMessageMultipleDrivesRequest<float>& msg, size_t dataLength, const StringRef& reply) noexcept |
| 1289 | { |
no outgoing calls
no test coverage detected