diff --git a/.cproject b/.cproject
index 782f54e..c0c0e84 100644
--- a/.cproject
+++ b/.cproject
@@ -86,6 +86,7 @@
+
@@ -201,6 +202,7 @@
+
diff --git a/Libraries/SD_HSMCI/utility/integer.h b/Libraries/Fatfs/integer.h
similarity index 100%
rename from Libraries/SD_HSMCI/utility/integer.h
rename to Libraries/Fatfs/integer.h
diff --git a/Libraries/SD_HSMCI/SD_HSMCI.h b/Libraries/SD_HSMCI/SD_HSMCI.h
index ed50a29..5cafbcc 100644
--- a/Libraries/SD_HSMCI/SD_HSMCI.h
+++ b/Libraries/SD_HSMCI/SD_HSMCI.h
@@ -30,7 +30,6 @@
#include "utility/conf_access.h"
#include "utility/ctrl_access.h"
-
// From module: SD/MMC stack on Multimedia Card interface
#include "utility/sd_mmc_mem.h"
#include "utility/sd_mmc.h"
@@ -39,25 +38,6 @@
// From module: High Speed Multimedia Card Interface
#include "utility/hsmci.h"
-// From module: DMAC - DMAC Controller
-#include "utility/dmac.h"
-
-// From module: FatFS file system
-#include "../Fatfs/diskio.h"
-#include "../Fatfs/ff.h"
-
-
-// From module: Part identification macros
-#include "sam.h"
-
-#ifdef __SAM3X8E__
-#define SAM3XE (1)
-#endif
-
-// From module: RTC - Real Time Clock
-// Does not work right now
-#include "utility/rtc.h"
-
/** Enable SD MMC interface pins through HSMCI */
#define CONF_BOARD_SD_MMC_HSMCI
diff --git a/Libraries/SD_HSMCI/utility/hsmci.c b/Libraries/SD_HSMCI/utility/hsmci.c
index ae40306..0185f6e 100644
--- a/Libraries/SD_HSMCI/utility/hsmci.c
+++ b/Libraries/SD_HSMCI/utility/hsmci.c
@@ -48,6 +48,7 @@
#include "sd_mmc_protocol.h"
#include "pmc.h"
#include "hsmci.h"
+#include "part.h"
/**
* \ingroup sam_drivers_hsmci
diff --git a/Libraries/SD_HSMCI/utility/part.h b/Libraries/SD_HSMCI/utility/part.h
new file mode 100644
index 0000000..dac9ebe
--- /dev/null
+++ b/Libraries/SD_HSMCI/utility/part.h
@@ -0,0 +1,18 @@
+/*
+ * part.h
+ *
+ * Created on: 25 Mar 2016
+ * Author: David
+ */
+
+#ifndef PART_H_
+#define PART_H_
+
+// Part identification macros
+#include "sam.h"
+
+#ifdef __SAM3X8E__
+#define SAM3XE (1)
+#endif
+
+#endif /* PART_H_ */
diff --git a/src/Configuration.h b/src/Configuration.h
index 28973a3..57c10c2 100644
--- a/src/Configuration.h
+++ b/src/Configuration.h
@@ -26,11 +26,11 @@ Licence: GPL
#define NAME "RepRapFirmware"
#ifndef VERSION
-#define VERSION "1.10"
+#define VERSION "1.10+1"
#endif
#ifndef DATE
-#define DATE "2016-03-24"
+#define DATE "2016-03-25"
#endif
#define AUTHORS "reprappro, dc42, zpl, t3p3, dnewman"
diff --git a/src/DDA.cpp b/src/DDA.cpp
index 0b7496e..547432c 100644
--- a/src/DDA.cpp
+++ b/src/DDA.cpp
@@ -80,14 +80,14 @@ void DDA::Init()
}
// Set up a real move. Return true if it represents real movement, else false.
-bool DDA::Init(const float nextMove[], float reqSpeed, EndstopChecks ce, bool doMotorMapping, FilePosition fPos)
+bool DDA::Init(const GCodes::RawMove *nextMove, bool doMotorMapping)
{
// 1. Compute the new endpoints and the movement vector
const int32_t *positionNow = prev->DriveCoordinates();
const Move *move = reprap.GetMove();
if (doMotorMapping)
{
- move->MotorTransform(nextMove, endPoint); // transform the axis coordinates if on a delta or CoreXY printer
+ move->MotorTransform(nextMove->coords, endPoint); // transform the axis coordinates if on a delta or CoreXY printer
isDeltaMovement = move->IsDeltaMode()
&& (endPoint[X_AXIS] != positionNow[X_AXIS] || endPoint[Y_AXIS] != positionNow[Y_AXIS] || endPoint[Z_AXIS] != positionNow[Z_AXIS]);
}
@@ -106,13 +106,13 @@ bool DDA::Init(const float nextMove[], float reqSpeed, EndstopChecks ce, bool do
accelerations[drive] = normalAccelerations[drive];
if (drive >= AXES || !doMotorMapping)
{
- endPoint[drive] = Move::MotorEndPointToMachine(drive, nextMove[drive]);
+ endPoint[drive] = Move::MotorEndPointToMachine(drive, nextMove->coords[drive]);
}
int32_t delta;
if (drive < AXES)
{
- endCoordinates[drive] = nextMove[drive];
+ endCoordinates[drive] = nextMove->coords[drive];
delta = endPoint[drive] - positionNow[drive];
}
else
@@ -123,7 +123,7 @@ bool DDA::Init(const float nextMove[], float reqSpeed, EndstopChecks ce, bool do
DriveMovement& dm = ddm[drive];
if (drive < AXES && !isSpecialDeltaMove)
{
- directionVector[drive] = nextMove[drive] - prev->GetEndCoordinate(drive, false);
+ directionVector[drive] = nextMove->coords[drive] - prev->GetEndCoordinate(drive, false);
dm.state = (isDeltaMovement || delta != 0)
? DMState::moving // on a delta printer, if one tower moves then we assume they all do
: DMState::idle;
@@ -168,10 +168,12 @@ bool DDA::Init(const float nextMove[], float reqSpeed, EndstopChecks ce, bool do
}
// 3. Store some values
- endStopsToCheck = ce;
- filePos = fPos;
+ endStopsToCheck = nextMove->endStopsToCheck;
+ filePos = nextMove->filePos;
+ usePressureAdvance = nextMove->usePressureAdvance;
+
// The end coordinates will be valid at the end of this move if it does not involve endstop checks and is not a special move on a delta printer
- endCoordinatesValid = (ce == 0) && (doMotorMapping || !move->IsDeltaMode());
+ endCoordinatesValid = (endStopsToCheck == 0) && (doMotorMapping || !move->IsDeltaMode());
// 4. Normalise the direction vector and compute the amount of motion.
// If there is any XYZ movement, then we normalise it so that the total XYZ movement has unit length.
@@ -269,6 +271,7 @@ bool DDA::Init(const float nextMove[], float reqSpeed, EndstopChecks ce, bool do
// Set the speed to the smaller of the requested and maximum speed.
// Also enforce a minimum speed of 0.5mm/sec. We need a minimum speed to avoid overflow in the movement calculations.
+ float reqSpeed = nextMove->feedRate;
if (isSpecialDeltaMove)
{
// Special case of a raw or homing move on a delta printer
@@ -604,7 +607,6 @@ void DDA::Prepare()
goingSlow = false;
firstDM = nullptr;
- bool xyMoving = false;
for (size_t drive = 0; drive < DRIVES; ++drive)
{
@@ -615,7 +617,7 @@ void DDA::Prepare()
reprap.GetPlatform()->EnableDrive(drive);
if (drive >= AXES)
{
- dm.PrepareExtruder(*this, params, drive, xyMoving);
+ dm.PrepareExtruder(*this, params, drive, usePressureAdvance);
// Check for sensible values, print them if they look dubious
if (reprap.Debug(moduleDda)
@@ -631,10 +633,6 @@ void DDA::Prepare()
}
else if (isDeltaMovement)
{
- if (drive <= Z_AXIS)
- {
- xyMoving = true;
- }
dm.PrepareDeltaAxis(*this, params, drive);
// Check for sensible values, print them if they look dubious
@@ -645,10 +643,6 @@ void DDA::Prepare()
}
else
{
- if (drive < Z_AXIS)
- {
- xyMoving = true;
- }
dm.PrepareCartesianAxis(*this, params, drive);
// Check for sensible values, print them if they look dubious
diff --git a/src/DDA.h b/src/DDA.h
index 8e030e9..92053f5 100644
--- a/src/DDA.h
+++ b/src/DDA.h
@@ -30,8 +30,7 @@ public:
DDA(DDA* n);
- bool Init(const float nextMove[], float reqSpeed, EndstopChecks ce,
- bool doMotorMapping, FilePosition fPos); // Set up a new move, returning true if it represents real movement
+ bool Init(const GCodes::RawMove *nextMove, bool doMotorMapping); // Set up a new move, returning true if it represents real movement
void Init(); // Set up initial positions for machine startup
bool Start(uint32_t tim); // Start executing the DDA, i.e. move the move.
bool Step(); // Take one step of the DDA, called by timed interrupt.
@@ -99,9 +98,9 @@ private:
uint8_t canPause : 1; // True if we can pause at the end of this move
uint8_t goingSlow : 1; // True if we have reduced speed during homing
uint8_t isPrintingMove : 1; // True if this move includes XY movement and extrusion
+ uint8_t usePressureAdvance : 1; // True if pressure advance should be applied to any forward extrusion
EndstopChecks endStopsToCheck; // Which endstops we are checking on this move
- // We are on a half-word boundary here, so expect 2 bytes of padding to be inserted at this point
FilePosition filePos; // The position in the SD card file after this move was read, or zero if not read fro SD card
diff --git a/src/GCodes.cpp b/src/GCodes.cpp
index 9ff398d..c3d6087 100644
--- a/src/GCodes.cpp
+++ b/src/GCodes.cpp
@@ -356,6 +356,7 @@ void GCodes::Spin()
moveBuffer.feedRate = DEFAULT_FEEDRATE/minutesToSeconds; // ask for a good feed rate, we may have paused during a slow move
moveBuffer.moveType = 0;
moveBuffer.endStopsToCheck = 0;
+ moveBuffer.usePressureAdvance = false;
moveBuffer.filePos = noFilePosition;
if (state == GCodeState::resuming1 && currentZ > pausedMoveBuffer[Z_AXIS])
{
@@ -826,9 +827,15 @@ int GCodes::SetUpMove(GCodeBuffer *gb, StringRef& reply)
}
// Load the move buffer with either the absolute movement required or the relative movement required
+ const float currentX = moveBuffer.coords[X_AXIS];
+ const float currentY = moveBuffer.coords[Y_AXIS];
moveAvailable = LoadMoveBufferFromGCode(gb, false, limitAxes && moveBuffer.moveType == 0);
if (moveAvailable)
{
+ // Flag whether we should use pressure advance, if there is any extrusion in this move.
+ // We assume it is a normal printing move needing pressure advance if there is forward extrusion and XY movement.
+ // The movement code will only apply pressure advance if there is forward extrusion, so we only need to check for XY movement here.
+ moveBuffer.usePressureAdvance = (moveBuffer.coords[X_AXIS] != currentX || moveBuffer.coords[Y_AXIS] != currentY);
moveBuffer.filePos = (gb == fileGCode) ? filePos : noFilePosition;
//debugPrintf("Queue move pos %u\n", moveFilePos);
}
@@ -918,8 +925,9 @@ bool GCodes::DoCannedCycleMove(EndstopChecks ce)
moveBuffer.feedRate = moveToDo[DRIVES];
moveBuffer.endStopsToCheck = ce;
moveBuffer.filePos = noFilePosition;
- cannedCycleMoveQueued = true;
+ moveBuffer.usePressureAdvance = false;
moveAvailable = true;
+ cannedCycleMoveQueued = true;
}
return false;
}
@@ -2334,7 +2342,10 @@ bool GCodes::RetractFilament(bool retract)
{
moveBuffer.coords[i] = 0.0;
}
- moveBuffer.feedRate = retractSpeed * secondsToMinutes; // set the feed rate
+ // Set the feed rate. If there is any Z hop then we need to pass the Z speed, else we pass the extrusion speed.
+ moveBuffer.feedRate = (retractHop == 0.0)
+ ? retractSpeed * secondsToMinutes
+ : retractSpeed * secondsToMinutes * retractHop/retractLength;
moveBuffer.coords[Z_AXIS] += ((retract) ? retractHop : -retractHop);
for (size_t i = 0; i < nDrives; ++i)
{
@@ -2342,6 +2353,7 @@ bool GCodes::RetractFilament(bool retract)
}
moveBuffer.isFirmwareRetraction = true;
+ moveBuffer.usePressureAdvance = false;
moveBuffer.filePos = filePos;
moveAvailable = true;
}
@@ -2422,6 +2434,7 @@ bool GCodes::HandleGcode(GCodeBuffer* gb, StringRef& reply)
moveBuffer.feedRate = (gb->Seen(feedrateLetter)) ? gb->GetFValue() : feedRate;
}
moveBuffer.filePos = noFilePosition;
+ moveBuffer.usePressureAdvance = false;
moveAvailable = true;
}
else
@@ -4598,7 +4611,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply)
}
else
{
- reply.printf("Elastic compensation for extruder %u is %.3f seconds", extruder, platform->GetElasticComp(extruder));
+ reply.printf("Pressure advance for extruder %u is %.3f seconds", extruder, platform->GetElasticComp(extruder));
}
}
break;
diff --git a/src/GCodes.h b/src/GCodes.h
index 8cd920c..a3de3c9 100644
--- a/src/GCodes.h
+++ b/src/GCodes.h
@@ -83,6 +83,7 @@ public:
EndstopChecks endStopsToCheck; // endstops to check
uint8_t moveType; // the S parameter from the G0 or G1 command, 0 for a normal move
bool isFirmwareRetraction; // true if this is a firmware retraction/un-retraction move
+ bool usePressureAdvance; // true if we want to us extruder pressure advance, if there is any extrusion
};
GCodes(Platform* p, Webserver* w);
diff --git a/src/Move.cpp b/src/Move.cpp
index b869610..ee3ce5c 100644
--- a/src/Move.cpp
+++ b/src/Move.cpp
@@ -190,7 +190,7 @@ void Move::Spin()
{
Transform(nextMove.coords);
}
- if (ddaRingAddPointer->Init(nextMove.coords, nextMove.feedRate, nextMove.endStopsToCheck, doMotorMapping, nextMove.filePos))
+ if (ddaRingAddPointer->Init(&nextMove, doMotorMapping))
{
ddaRingAddPointer = ddaRingAddPointer->GetNext();
idleCount = 0;
diff --git a/src/Platform.h b/src/Platform.h
index 1ab8a28..159db6f 100644
--- a/src/Platform.h
+++ b/src/Platform.h
@@ -46,6 +46,7 @@ Licence: GPL
#include "Arduino.h"
#include "OutputMemory.h"
+#include "ff.h"
#include "SD_HSMCI.h"
#include "MAX31855.h"
#include "MCP4461.h"