From b30e6ad4e1307f6d3d1131f7ca9d693602ea22bc Mon Sep 17 00:00:00 2001 From: David Crocker Date: Fri, 29 Aug 2014 21:38:14 +0100 Subject: [PATCH] Version 0.78p Fixed bug that caused the cooling fan PWM frequency to be 165kHz. It is now 25kHz. Fan RPM is now included in the web interface status response (thanks zpl). Many more error messages are now reported to the web interface as well as the USB interface. Interrupt-driven network timer task to better cope with slow SD card writes (thanks zpl) Module SamNonDuePin is now used for all digital and PWM pin I/O. --- Changes in dc42 fork.txt | 31 ++- Configuration.h | 4 +- GCodes.cpp | 131 +++++----- Heat.cpp | 19 +- Heat.h | 9 +- Libraries/SamNonDuePin/SamNonDuePin.cpp | 170 ++++++++----- Libraries/SamNonDuePin/SamNonDuePin.h | 28 ++- Move.cpp | 3 +- Move.h | 30 +-- Network.cpp | 52 +++- Network.h | 1 + Platform.cpp | 311 ++++++++++++------------ Platform.h | 42 ++-- Release/RepRapFirmware-078p-dc42.bin | Bin 0 -> 260728 bytes RepRapFirmware.cpp | 22 +- Webserver.cpp | 53 ++-- network/ethernet_sam.c | 42 ++-- network/ethernet_sam.h | 18 +- network/timer_mgt_sam.c | 147 ----------- network/timer_mgt_sam.h | 57 ----- 20 files changed, 544 insertions(+), 626 deletions(-) create mode 100644 Release/RepRapFirmware-078p-dc42.bin delete mode 100644 network/timer_mgt_sam.c delete mode 100644 network/timer_mgt_sam.h diff --git a/Changes in dc42 fork.txt b/Changes in dc42 fork.txt index 504b646..bb7738e 100644 --- a/Changes in dc42 fork.txt +++ b/Changes in dc42 fork.txt @@ -1,4 +1,4 @@ -Additional functionality in 0.78g-dc42 release compared to RRP 0.78: +Additional functionality in 0.78p-dc42 release compared to RRP 0.78a: * The Duet can serve all the files needed by the web interface @@ -52,17 +52,17 @@ Additional functionality in 0.78g-dc42 release compared to RRP 0.78: * When using a Z probe, Z homing and bed probing are done in two stages (a fast stage followed by a slow stage) for better accuracy. +* The default initial Z homing and bed probing speed has been increased. This is possible because Z homing and bed probing slow down when the probe reading is approaching the target value. + * M116 takes an optional P parameter to specify which tool to wait for. If no P parameter is given, it waits for all tools and the bed as before. The main purpose of this is that on a tool change, you can wait for the new tool to heat up to operating temperature but not wait for the old tool to cool down to standby temperature. * When fetching file info, if the gcode file contains more than one 'filament used' comment, the filament lengths in all of them are returned to the web interface * The active and standby temperatures of all heaters are included in the status poll response -* The default initial Z homing and bed probing speed has been increased. This is possible because Z homing and bed probing slow down when the probe reading is approaching the target value. - * The M220 and M221 commands now return the override factors if no S parameter is provided -* Temperature errors are reported to the web server as well as to USB +* Temperature errors are reported to the web server as well as to the USB interface * The Heat section of the M122 diagnostics report now shows the accumulated PID I-term @@ -72,13 +72,13 @@ Additional functionality in 0.78g-dc42 release compared to RRP 0.78: * M104 and M109 commands now accept an optional T parameter to specify the tool number, as generated by slic3r in multi-media gcode files. -* Movement code from RepRapPro's 0.89 dev version incorporated, including 5-point manual or automatic bed compensation mechanism. A bug fix to this was added in version 0.78g. +* Movement code from RepRapPro's 0.89 dev version incorporated, including 5-point manual or automatic bed compensation mechanism. Fixed a bug that caused the head to try to move beyond the axis limits when 5-point auto compensation was used and G32 was executed more than once. -* Heater status (off/standby/on) is included in the status poll response for the web interface. This will be used in a future version of the web interface. +* Heater status (off/standby/on/fault) is included in the status poll response for the web interface * Incorporated code from RepRapPro 0.89 dev version to allow many more M-commands to return the existing values as well as set them. -* Incorporated code from RepRapPro 0.89 dev branch to implement the M119 and M135 commands. There is currently a bug in the M135 (set heat sample interval) command, which means that if you change the interval from its default value of 0.5 seconds then you need to adjust the I parameter by the same ratio and the D parameter by the inverse ratio. +* Incorporated code from RepRapPro 0.89 dev branch to implement the M119 and M135 commands. Fixed a bug in the M135 (set heat sample interval) command, which meant that if you changed the interval from its default value of 0.5 seconds, you needed to adjust the I parameter by the same ratio and the D parameter by the inverse ratio. * Extrusion totals are reset to zero when starting a new print from SD card. @@ -86,6 +86,10 @@ Additional functionality in 0.78g-dc42 release compared to RRP 0.78: * Telnet server supported (thanks zombiepantslol) +* Fan RPM supported (thanks zombiepantslol) + +* Interrupt-driven network timing to better handle slow writes to SD card (thanks zombiepantslol) + * Bug fix: uploading file whose name includes an uppercase G now works. Similarly for setting a machine name containing an uppercase G (M550) or password containing an uppercase G (M551) * Bug fix: if the machine name in an M550 command is followed by a tab character, then the name is assumed to terminate just before the tab character. Similarly for passwords set using M551. @@ -108,8 +112,9 @@ Additional functionality in 0.78g-dc42 release compared to RRP 0.78: * Bug fix: if the last command in a macro file did not have a newline character at the end then the command might not be fully executed +* Bug fix: the cooling fan PWM frequency was set to a frequency that was much too high for the mosfet to handle. It has been changed to 25kHz so that it can be used to control 4-wire PWM fans meeting the Intel specification. -Additional functionality in web interface 0.95 compared to RRP 0.65: +Additional functionality in web interface 1.00 compared to RRP 0.65: * Faster (>6Mbytes/min), more reliable file uploading, with reporting and graceful recovery if an upload fails @@ -129,4 +134,12 @@ Additional functionality in web interface 0.95 compared to RRP 0.65: * Additional status Halted is shown (if emergency stop has been used) as well as Ready and Active -* The Print Status tab includes slider controls to allow the speed and extrusion factor to be adjusted during printing +* The Print Status tab includes slider controls to allow the speed and extrusion factors to be adjusted during printing + +* A second heated print head is supported + +* The active and standby temperature settings of each print head, and the active temperature setting of the bed, are displayed along with the current temperature. The active and standby temperatures can both be set. + +* The status of each heater (off/standby/active/fault) is displayed. + +* If a browser session is reconnected while a print is in progress, the print status is retrieved and displayed. diff --git a/Configuration.h b/Configuration.h index 7e57ad3..408c938 100644 --- a/Configuration.h +++ b/Configuration.h @@ -24,8 +24,8 @@ Licence: GPL #define CONFIGURATION_H #define NAME "RepRapFirmware" -#define VERSION "0.78o-dc42" -#define DATE "2014-08-26" +#define VERSION "0.78p-dc42" +#define DATE "2014-08-29" #define AUTHORS "reprappro, dc42, zpl" // Other firmware that we might switch to be compatible with. diff --git a/GCodes.cpp b/GCodes.cpp index 2a5c04c..c89ba36 100644 --- a/GCodes.cpp +++ b/GCodes.cpp @@ -350,8 +350,7 @@ bool GCodes::LoadMoveBufferFromGCode(GCodeBuffer *gb, bool doingG92, bool applyL gb->GetFloatArray(eMovement, eMoveCount); if(tool->DriveCount() != eMoveCount) { - scratchString.printf("Wrong number of extruder drives for the selected tool: %s\n", gb->Buffer()); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "Wrong number of extruder drives for the selected tool: %s\n", gb->Buffer()); return false; } @@ -490,12 +489,10 @@ bool GCodes::DoFileCannedCycles(const char* fileName) if (f == NULL) { // Don't use snprintf into scratchString here, because fileName may be aliased to scratchString - platform->Message(HOST_MESSAGE, "Macro file "); - platform->Message(HOST_MESSAGE, fileName); - platform->Message(HOST_MESSAGE, " not found.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Macro file %s not found.\n", fileName); if(!Pop()) { - platform->Message(HOST_MESSAGE, "Cannot pop the stack.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Cannot pop the stack.\n"); } return true; } @@ -1008,7 +1005,7 @@ bool GCodes::OpenFileToWrite(const char* directory, const char* fileName, GCodeB eofStringCounter = 0; if (fileBeingWritten == NULL) { - platform->Message(HOST_MESSAGE, "Can't open GCode file for writing.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Can't open GCode file \"%s\" for writing.\n", fileName); return false; } else @@ -1022,7 +1019,7 @@ void GCodes::WriteHTMLToFile(char b, GCodeBuffer *gb) { if (fileBeingWritten == NULL) { - platform->Message(HOST_MESSAGE, "Attempt to write to a null file.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Attempt to write to a null file.\n"); return; } @@ -1058,7 +1055,7 @@ void GCodes::WriteGCodeToFile(GCodeBuffer *gb) { if (fileBeingWritten == NULL) { - platform->Message(HOST_MESSAGE, "Attempt to write to a null file.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Attempt to write to a null file.\n"); return; } @@ -1085,7 +1082,7 @@ void GCodes::WriteGCodeToFile(GCodeBuffer *gb) { if (gb->Seen('P')) { - scratchString.printf("%s", gb->GetIValue()); + scratchString.printf("%d", gb->GetIValue()); HandleReply(false, gb == serialGCode, scratchString.Pointer(), 'G', 998, true); return; } @@ -1120,7 +1117,7 @@ void GCodes::QueueFileToPrint(const char* fileName) } else { - platform->Message(BOTH_ERROR_MESSAGE, "GCode file not found\n"); + platform->Message(BOTH_ERROR_MESSAGE, "GCode file \"%s\" not found\n", fileName); } } @@ -1128,8 +1125,7 @@ void GCodes::DeleteFile(const char* fileName) { if(!platform->GetMassStorage()->Delete(platform->GetGCodeDir(), fileName)) { - scratchString.printf("Unsuccessful attempt to delete: %s\n", fileName); - platform->Message(BOTH_ERROR_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "Unsuccessful attempt to delete file \"%s\"\n", fileName); } } @@ -1142,7 +1138,7 @@ bool GCodes::SendConfigToLine() configFile = platform->GetFileStore(platform->GetSysDir(), platform->GetConfigFile(), false); if (configFile == NULL) { - platform->Message(HOST_MESSAGE, "Configuration file not found\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Configuration file not found\n"); return true; } platform->GetLine()->Write('\n', true); @@ -1331,9 +1327,7 @@ void GCodes::SetEthernetAddress(GCodeBuffer *gb, int mCode) ipp++; if (ipp > 3) { - platform->Message(HOST_MESSAGE, "Dud IP address: "); - platform->Message(HOST_MESSAGE, gb->Buffer()); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Dud IP address: %s\n", gb->Buffer()); return; } sp++; @@ -1360,14 +1354,12 @@ void GCodes::SetEthernetAddress(GCodeBuffer *gb, int mCode) break; default: - platform->Message(HOST_MESSAGE, "Setting ether parameter - dud code."); + platform->Message(BOTH_ERROR_MESSAGE, "Setting ether parameter - dud code."); } } else { - platform->Message(HOST_MESSAGE, "Dud IP address: "); - platform->Message(HOST_MESSAGE, gb->Buffer()); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Dud IP address: %s\n", gb->Buffer()); } } @@ -1387,9 +1379,7 @@ void GCodes::SetMACAddress(GCodeBuffer *gb) ipp++; if(ipp > 5) { - platform->Message(HOST_MESSAGE, "Dud MAC address: "); - platform->Message(HOST_MESSAGE, gb->Buffer()); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Dud MAC address: %s\n", gb->Buffer()); return; } sp++; @@ -1407,9 +1397,7 @@ void GCodes::SetMACAddress(GCodeBuffer *gb) } else { - platform->Message(HOST_MESSAGE, "Dud MAC address: "); - platform->Message(HOST_MESSAGE, gb->Buffer()); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Dud MAC address: %s\n", gb->Buffer()); } // snprintf(scratchString, STRING_LENGTH, "MAC: %x:%x:%x:%x:%x:%x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); // platform->Message(HOST_MESSAGE, scratchString); @@ -1503,8 +1491,7 @@ void GCodes::HandleReply(bool error, bool fromLine, const char* reply, char gMOr if (s != 0) { - scratchString.printf("Emulation of %s is not yet supported.\n", s); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "Emulation of %s is not yet supported.\n", s); } } @@ -1638,7 +1625,7 @@ void GCodes::SetToolHeaters(Tool *tool, float temperature) { if(tool == NULL) { - platform->Message(HOST_MESSAGE, "Setting temperature: no tool selected.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Setting temperature: no tool selected.\n"); return; } @@ -1928,7 +1915,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb) break; case 29: // End of file being written; should be intercepted before getting here - platform->Message(HOST_MESSAGE, "GCode end-of-file being interpreted.\n"); + platform->Message(BOTH_MESSAGE, "GCode end-of-file being interpreted.\n"); break; case 30: // Delete file @@ -1989,8 +1976,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb) gb->GetFloatArray(eVals, eCount); if(eCount != DRIVES-AXES) { - scratchString.printf("Setting steps/mm - wrong number of E drives: %s\n", gb->Buffer()); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "Setting steps/mm - wrong number of E drives: %s\n", gb->Buffer()); } else { @@ -2052,32 +2038,43 @@ bool GCodes::HandleMcode(GCodeBuffer* gb) reply.copy("T:"); for(int8_t heater = 1; heater < HEATERS; heater++) { - if(reprap.GetHeat()->GetStatus(heater) != Heat::HS_off) + Heat::HeaterStatus hs = reprap.GetHeat()->GetStatus(heater); + if(hs != Heat::HS_off && hs != Heat::HS_fault) { reply.catf("%.1f ", reprap.GetHeat()->GetTemperature(heater)); } } - reply.catf("B: %.1f ", reprap.GetHeat()->GetTemperature(0)); + reply.catf("B: %.1f ", reprap.GetHeat()->GetTemperature(HOT_BED)); break; case 106: // Fan on or off - if (gb->Seen('I')) { - coolingInverted = (gb->GetIValue() > 0); - } - if (gb->Seen('S')) - { - float f = gb->GetFValue(); - f = min(f, 255.0); - f = max(f, 0.0); - if (coolingInverted) + bool seen = false; + if (gb->Seen('I')) { - // Check if 1.0 or 255.0 may be used as the maximum value - platform->CoolingFan((f <= 1.0 ? 1.0 : 255.0) - f); + coolingInverted = (gb->GetIValue() > 0); + seen = true; } - else + if (gb->Seen('S')) { - platform->CoolingFan(f); + float f = gb->GetFValue(); + f = min(f, 255.0); + f = max(f, 0.0); + if (coolingInverted) + { + // Check if 1.0 or 255.0 may be used as the maximum value + platform->CoolingFan((f <= 1.0 ? 1.0 : 255.0) - f); + } + else + { + platform->CoolingFan(f); + } + seen = true; + } + + if (!seen) + { + reply.printf("Cooling inverted: %s", coolingInverted ? "yes" : "no"); } } break; @@ -2236,11 +2233,11 @@ bool GCodes::HandleMcode(GCodeBuffer* gb) break; case 126: // Valve open - platform->Message(HOST_MESSAGE, "M126 - valves not yet implemented\n"); + platform->Message(BOTH_MESSAGE, "M126 - valves not yet implemented\n"); break; case 127: // Valve closed - platform->Message(HOST_MESSAGE, "M127 - valves not yet implemented\n"); + platform->Message(BOTH_MESSAGE, "M127 - valves not yet implemented\n"); break; case 135: // Set PID sample interval @@ -2273,7 +2270,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb) break; case 141: // Chamber temperature - platform->Message(HOST_MESSAGE, "M141 - heated chamber not yet implemented\n"); + platform->Message(BOTH_MESSAGE, "M141 - heated chamber not yet implemented\n"); break; // case 160: //number of mixing filament drives TODO: With tools defined, is this needed? @@ -2320,8 +2317,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb) gb->GetFloatArray(eVals, eCount); if(eCount != DRIVES-AXES) { - scratchString.printf("Setting accelerations - wrong number of E drives: %s\n", gb->Buffer()); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "Setting accelerations - wrong number of E drives: %s\n", gb->Buffer()); } else { @@ -2369,8 +2365,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb) gb->GetFloatArray(eVals, eCount); if(eCount != DRIVES-AXES) { - scratchString.printf("Setting feedrates - wrong number of E drives: %s\n", gb->Buffer()); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "Setting feedrates - wrong number of E drives: %s\n", gb->Buffer()); } else { @@ -3025,7 +3020,7 @@ bool GCodes::ChangeTool(int newToolNumber) return true; default: - platform->Message(HOST_MESSAGE, "Tool change - dud sequence number.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "Tool change - dud sequence number.\n"); } toolChangeSequence = 0; @@ -3108,9 +3103,7 @@ bool GCodeBuffer::Put(char c) Init(); if (reprap.Debug() && gcodeBuffer[0] && !writingFileDirectory) // Don't bother with blank/comment lines { - platform->Message(HOST_MESSAGE, identity); - platform->Message(HOST_MESSAGE, gcodeBuffer); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(HOST_MESSAGE, "%s%s\n", identity, gcodeBuffer); } // Deal with line numbers and checksums @@ -3171,7 +3164,7 @@ bool GCodeBuffer::Put(char c) if (gcodePointer >= GCODE_LENGTH) { - platform->Message(HOST_MESSAGE, "G Code buffer length overflow.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "G Code buffer length overflow.\n"); gcodePointer = 0; gcodeBuffer[0] = 0; } @@ -3202,7 +3195,7 @@ float GCodeBuffer::GetFValue() { if (readPointer < 0) { - platform->Message(HOST_MESSAGE, "GCodes: Attempt to read a GCode float before a search.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: Attempt to read a GCode float before a search.\n"); readPointer = -1; return 0.0; } @@ -3218,7 +3211,7 @@ const void GCodeBuffer::GetFloatArray(float a[], int& returnedLength) int length = 0; if(readPointer < 0) { - platform->Message(HOST_MESSAGE, "GCodes: Attempt to read a GCode float array before a search.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: Attempt to read a GCode float array before a search.\n"); readPointer = -1; returnedLength = 0; return; @@ -3229,8 +3222,7 @@ const void GCodeBuffer::GetFloatArray(float a[], int& returnedLength) { if(length >= returnedLength) // Array limit has been set in here { - scratchString.printf("GCodes: Attempt to read a GCode float array that is too long: %s\n", gcodeBuffer); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: Attempt to read a GCode float array that is too long: %s\n", gcodeBuffer); readPointer = -1; returnedLength = 0; return; @@ -3273,7 +3265,7 @@ const void GCodeBuffer::GetLongArray(long l[], int& returnedLength) int length = 0; if(readPointer < 0) { - platform->Message(HOST_MESSAGE, "GCodes: Attempt to read a GCode long array before a search.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: Attempt to read a GCode long array before a search.\n"); readPointer = -1; return; } @@ -3283,8 +3275,7 @@ const void GCodeBuffer::GetLongArray(long l[], int& returnedLength) { if(length >= returnedLength) // Array limit has been set in here { - scratchString.printf("GCodes: Attempt to read a GCode long array that is too long: %s\n", gcodeBuffer); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: Attempt to read a GCode long array that is too long: %s\n", gcodeBuffer); readPointer = -1; returnedLength = 0; return; @@ -3313,7 +3304,7 @@ const char* GCodeBuffer::GetString() { if (readPointer < 0) { - platform->Message(HOST_MESSAGE, "GCodes: Attempt to read a GCode string before a search.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: Attempt to read a GCode string before a search.\n"); readPointer = -1; return ""; } @@ -3343,7 +3334,7 @@ const char* GCodeBuffer::GetUnprecedentedString() if (!gcodeBuffer[readPointer]) { - platform->Message(HOST_MESSAGE, "GCodes: String expected but not seen.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: String expected but not seen.\n"); readPointer = -1; return gcodeBuffer; // Good idea? } @@ -3359,7 +3350,7 @@ long GCodeBuffer::GetLValue() { if (readPointer < 0) { - platform->Message(HOST_MESSAGE, "GCodes: Attempt to read a GCode int before a search.\n"); + platform->Message(BOTH_ERROR_MESSAGE, "GCodes: Attempt to read a GCode int before a search.\n"); readPointer = -1; return 0; } diff --git a/Heat.cpp b/Heat.cpp index d25021a..45c2ef8 100644 --- a/Heat.cpp +++ b/Heat.cpp @@ -73,8 +73,7 @@ void Heat::Diagnostics() { if (pids[heater]->active) { - scratchString.printf("Heater %d: I-accumulator = %.1f\n", heater, pids[heater]->temp_iState); - platform->AppendMessage(BOTH_MESSAGE, scratchString); + platform->AppendMessage(BOTH_MESSAGE, "Heater %d: I-accumulator = %.1f\n", heater, pids[heater]->temp_iState); } } } @@ -163,8 +162,7 @@ void PID::Spin() platform->SetHeater(heater, 0.0); temperatureFault = true; switchedOff = true; - scratchString.printf("Temperature fault on heater %d, T = %.1f\n", heater, temperature); - platform->Message(BOTH_MESSAGE, scratchString); + platform->Message(BOTH_MESSAGE, "Temperature fault on heater %d, T = %.1f\n", heater, temperature); reprap.FlagTemperatureFault(heater); } } @@ -191,8 +189,7 @@ void PID::Spin() platform->SetHeater(heater, 0.0); temperatureFault = true; switchedOff = true; - scratchString.printf("Heating fault on heater %d, T = %.1f C; still not at temperature after %f seconds.\n", heater, temperature, tim); - platform->Message(BOTH_MESSAGE, scratchString); + platform->Message(BOTH_MESSAGE, "Heating fault on heater %d, T = %.1f C; still not at temperature after %f seconds.\n", heater, temperature, tim); reprap.FlagTemperatureFault(heater); } } @@ -232,8 +229,14 @@ void PID::Spin() float sampleInterval = platform->HeatSampleTime(); temp_iState += error * pp.kI * sampleInterval; - if (temp_iState < pp.pidMin) temp_iState = pp.pidMin; - else if (temp_iState > pp.pidMax) temp_iState = pp.pidMax; + if (temp_iState < pp.pidMin) + { + temp_iState = pp.pidMin; + } + else if (temp_iState > pp.pidMax) + { + temp_iState = pp.pidMax; + } float temp_dState = pp.kD * (temperature - lastTemperature) / sampleInterval; float result = pp.kP * error + temp_iState - temp_dState; diff --git a/Heat.h b/Heat.h index 4dc862a..4a47462 100644 --- a/Heat.h +++ b/Heat.h @@ -72,7 +72,7 @@ class Heat { public: // Enumeration to describe the status of a heater. Note that the web interface returns the numerical values, so don't change them. - enum HeaterStatus { HS_off = 0, HS_standby = 1, HS_active = 2 }; + enum HeaterStatus { HS_off = 0, HS_standby = 1, HS_active = 2, HS_fault = 3 }; Heat(Platform* p, GCodes* g); void Spin(); // Called in a tight loop to keep everything going @@ -187,9 +187,10 @@ inline Heat::HeaterStatus Heat::GetStatus(int8_t heater) const { if (heater < 0 || heater >= HEATERS) return HS_off; - return (pids[heater]->SwitchedOff()) ? HS_off - : (pids[heater]->Active()) ? HS_active - : HS_standby; + return (pids[heater]->temperatureFault ? HS_fault + : pids[heater]->SwitchedOff()) ? HS_off + : (pids[heater]->Active()) ? HS_active + : HS_standby; } inline void Heat::SetActiveTemperature(int8_t heater, float t) diff --git a/Libraries/SamNonDuePin/SamNonDuePin.cpp b/Libraries/SamNonDuePin/SamNonDuePin.cpp index 22c8377..4ce3cc5 100644 --- a/Libraries/SamNonDuePin/SamNonDuePin.cpp +++ b/Libraries/SamNonDuePin/SamNonDuePin.cpp @@ -83,44 +83,51 @@ Allows a non "Arduino Due" PIO pin to be setup. */ extern void pinModeNonDue( uint32_t ulPin, uint32_t ulMode ) { - if ( nonDuePinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) + if (ulPin < X0) + { + pinMode(ulPin, ulMode); // pass on to Arduino core + return; + } + + const PinDescription& pinDesc = nonDuePinDescription[ulPin - X0]; + if ( pinDesc.ulPinType == PIO_NOT_A_PIN ) { - return ; + return; } switch ( ulMode ) { case INPUT: /* Enable peripheral for clocking input */ - pmc_enable_periph_clk( nonDuePinDescription[ulPin].ulPeripheralId ) ; + pmc_enable_periph_clk( pinDesc.ulPeripheralId ) ; PIO_Configure( - nonDuePinDescription[ulPin].pPort, + pinDesc.pPort, PIO_INPUT, - nonDuePinDescription[ulPin].ulPin, + pinDesc.ulPin, 0 ) ; break ; case INPUT_PULLUP: /* Enable peripheral for clocking input */ - pmc_enable_periph_clk( nonDuePinDescription[ulPin].ulPeripheralId ) ; + pmc_enable_periph_clk( pinDesc.ulPeripheralId ) ; PIO_Configure( - nonDuePinDescription[ulPin].pPort, + pinDesc.pPort, PIO_INPUT, - nonDuePinDescription[ulPin].ulPin, + pinDesc.ulPin, PIO_PULLUP ) ; break ; case OUTPUT: PIO_Configure( - nonDuePinDescription[ulPin].pPort, + pinDesc.pPort, PIO_OUTPUT_1, - nonDuePinDescription[ulPin].ulPin, - nonDuePinDescription[ulPin].ulPinConfiguration ) ; + pinDesc.ulPin, + pinDesc.ulPinConfiguration ) ; /* if all pins are output, disable PIO Controller clocking, reduce power consumption */ - if ( nonDuePinDescription[ulPin].pPort->PIO_OSR == 0xffffffff ) + if ( pinDesc.pPort->PIO_OSR == 0xffffffff ) { - pmc_disable_periph_clk( g_APinDescription[ulPin].ulPeripheralId ) ; + pmc_disable_periph_clk( pinDesc.ulPeripheralId ) ; } break ; @@ -137,19 +144,27 @@ Allows digital write to a non "Arduino Due" PIO pin that has been setup as outpu extern void digitalWriteNonDue( uint32_t ulPin, uint32_t ulVal ) { + if (ulPin < X0) + { + digitalWrite(ulPin, ulVal); // pass on to Arduino core + return; + } + + const PinDescription& pinDesc = nonDuePinDescription[ulPin - X0]; + /* Handle */ - if ( nonDuePinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) - { + if ( pinDesc.ulPinType == PIO_NOT_A_PIN ) + { return ; } - if ( PIO_GetOutputDataStatus( nonDuePinDescription[ulPin].pPort, nonDuePinDescription[ulPin].ulPin ) == 0 ) + if ( PIO_GetOutputDataStatus( pinDesc.pPort, pinDesc.ulPin ) == 0 ) { - PIO_PullUp( nonDuePinDescription[ulPin].pPort, nonDuePinDescription[ulPin].ulPin, ulVal ) ; + PIO_PullUp( pinDesc.pPort, pinDesc.ulPin, ulVal ) ; } else { - PIO_SetOutput( nonDuePinDescription[ulPin].pPort, nonDuePinDescription[ulPin].ulPin, ulVal, 0, PIO_PULLUP ) ; + PIO_SetOutput( pinDesc.pPort, pinDesc.ulPin, ulVal, 0, PIO_PULLUP ) ; } } @@ -160,12 +175,18 @@ Allows digital read of a non "Arduino Due" PIO pin that has been setup as input */ extern int digitalReadNonDue( uint32_t ulPin ) { - if ( nonDuePinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) + if (ulPin < X0) + { + return digitalRead(ulPin); // pass on to Arduino core + } + + const PinDescription& pinDesc = nonDuePinDescription[ulPin - X0]; + if ( pinDesc.ulPinType == PIO_NOT_A_PIN ) { return LOW ; } - if ( PIO_Get( nonDuePinDescription[ulPin].pPort, PIO_INPUT, nonDuePinDescription[ulPin].ulPin ) == 1 ) + if ( PIO_Get( pinDesc.pPort, PIO_INPUT, pinDesc.ulPin ) == 1 ) { return HIGH ; } @@ -173,59 +194,80 @@ extern int digitalReadNonDue( uint32_t ulPin ) return LOW ; } -static uint8_t PWMEnabled = 0; -static uint8_t pinEnabled[PINS_C]; +static bool nonDuePWMEnabled = 0; +static bool PWMChanEnabled[8] = {false,false,false,false, false,false,false,false}; // there are only 8 PWM channels -/* -analog write helper functions -*/ -void analogOutputNonDueInit(void) { - uint8_t i; - for (i=0; iPWM_SR & (1 << ul_channel)) != 0) { + pPwm->PWM_DIS = 1 << ul_channel; + while ((pPwm->PWM_SR & (1 << ul_channel)) != 0); + } + + /* Configure ul_channel */ + pPwm->PWM_CH_NUM[ul_channel].PWM_CMR = prescaler | alignment | polarity; } + /* analogWriteNonDue copied from the analogWrite function within wiring-analog.c file, part of the arduino core. Allows analog write to a non "Arduino Due" PWM pin. Note this does not support the other functions of the arduino analog write function such as timer counters and the DAC. Any hardware PWM pin that is defined as such within the unDefPinDescription[] struct should work, and non hardware PWM pin will default to digitalWriteUndefined +NOTE: +1. We must not pass on any PWM calls to the Arduino core analogWrite here, because it calls the buggy version of PWMC_ConfigureChannel + which messes up channel 0.. +2. The optional fastPwm parameter only takes effect on the first call to analogWriteNonDuet for each PWM pin. + If true on the first call then the PWM frequency will be set to 25kHz instead of 1kHz. */ -void analogWriteNonDue(uint32_t ulPin, uint32_t ulValue) { - uint32_t attr = nonDuePinDescription[ulPin].ulPinAttribute; - if ((attr & PIN_ATTR_PWM) == PIN_ATTR_PWM) { - if (!PWMEnabled) { - // PWM Startup code - pmc_enable_periph_clk(PWM_INTERFACE_ID); - PWMC_ConfigureClocks(PWM_FREQUENCY * PWM_MAX_DUTY_CYCLE, 0, VARIANT_MCK); - analogOutputNonDueInit(); - PWMEnabled = 1; - } - uint32_t chan = nonDuePinDescription[ulPin].ulPWMChannel; - if (!pinEnabled[ulPin]) { - // Setup PWM for this pin - PIO_Configure(nonDuePinDescription[ulPin].pPort, - nonDuePinDescription[ulPin].ulPinType, - nonDuePinDescription[ulPin].ulPin, - nonDuePinDescription[ulPin].ulPinConfiguration); - PWMC_ConfigureChannel(PWM_INTERFACE, chan, PWM_CMR_CPRE_CLKA, 0, 0); - PWMC_SetPeriod(PWM_INTERFACE, chan, PWM_MAX_DUTY_CYCLE); - PWMC_SetDutyCycle(PWM_INTERFACE, chan, ulValue); - PWMC_EnableChannel(PWM_INTERFACE, chan); - pinEnabled[ulPin] = 1; - } +void analogWriteNonDue(uint32_t ulPin, uint32_t ulValue, bool fastPwm) +{ + const PinDescription& pinDesc = (ulPin >= X0) ? nonDuePinDescription[ulPin - X0] : g_APinDescription[ulPin]; + uint32_t attr = pinDesc.ulPinAttribute; + if ((attr & PIN_ATTR_ANALOG) == PIN_ATTR_ANALOG) + { + // It's a DAC pin, so we can pass it on (and it can't be an extended pin because none of our extended pins support DAC) + analogWrite(ulPin, ulValue); + return; + } + + if ((attr & PIN_ATTR_PWM) == PIN_ATTR_PWM) + { + if (!nonDuePWMEnabled) + { + // PWM Startup code + pmc_enable_periph_clk(PWM_INTERFACE_ID); + // Set clock A to give 1kHz PWM (the standard value for Arduino Due) and clock B to give 25kHz PWM + PWMC_ConfigureClocks(PWM_FREQUENCY * PWM_MAX_DUTY_CYCLE, pwmFastFrequency * PWM_MAX_DUTY_CYCLE, VARIANT_MCK); + nonDuePWMEnabled = true; + } + + uint32_t chan = pinDesc.ulPWMChannel; + if (!PWMChanEnabled[chan]) + { + // Setup PWM for this PWM channel + PIO_Configure(pinDesc.pPort, + pinDesc.ulPinType, + pinDesc.ulPin, + pinDesc.ulPinConfiguration); + PWMC_ConfigureChannel_fixed(PWM_INTERFACE, chan, (fastPwm) ? PWM_CMR_CPRE_CLKB : PWM_CMR_CPRE_CLKA, 0, 0); + PWMC_SetPeriod(PWM_INTERFACE, chan, PWM_MAX_DUTY_CYCLE); + PWMC_SetDutyCycle(PWM_INTERFACE, chan, ulValue); + PWMC_EnableChannel(PWM_INTERFACE, chan); + PWMChanEnabled[chan] = true; + } + + PWMC_SetDutyCycle(PWM_INTERFACE, chan, ulValue); + return; + } - PWMC_SetDutyCycle(PWM_INTERFACE, chan, ulValue); - return; - } // Defaults to digital write pinModeNonDue(ulPin, OUTPUT); - if (ulValue < 128) - digitalWriteNonDue(ulPin, LOW); - else - digitalWriteNonDue(ulPin, HIGH); + digitalWriteNonDue(ulPin, (ulValue < 128) ? LOW : HIGH); } @@ -239,11 +281,11 @@ void hsmciPinsinit() PIO_Configure(nonDuePinDescription[PIN_HSMCI_MCDA2_GPIO].pPort,nonDuePinDescription[PIN_HSMCI_MCDA2_GPIO].ulPinType,nonDuePinDescription[PIN_HSMCI_MCDA2_GPIO].ulPin,nonDuePinDescription[PIN_HSMCI_MCDA2_GPIO].ulPinConfiguration); PIO_Configure(nonDuePinDescription[PIN_HSMCI_MCDA3_GPIO].pPort,nonDuePinDescription[PIN_HSMCI_MCDA3_GPIO].ulPinType,nonDuePinDescription[PIN_HSMCI_MCDA3_GPIO].ulPin,nonDuePinDescription[PIN_HSMCI_MCDA3_GPIO].ulPinConfiguration); //set pullups (not on clock!) - digitalWriteNonDue(PIN_HSMCI_MCCDA_GPIO, HIGH); - digitalWriteNonDue(PIN_HSMCI_MCDA0_GPIO, HIGH); - digitalWriteNonDue(PIN_HSMCI_MCDA1_GPIO, HIGH); - digitalWriteNonDue(PIN_HSMCI_MCDA2_GPIO, HIGH); - digitalWriteNonDue(PIN_HSMCI_MCDA3_GPIO, HIGH); + digitalWriteNonDue(PIN_HSMCI_MCCDA_GPIO+X0, HIGH); + digitalWriteNonDue(PIN_HSMCI_MCDA0_GPIO+X0, HIGH); + digitalWriteNonDue(PIN_HSMCI_MCDA1_GPIO+X0, HIGH); + digitalWriteNonDue(PIN_HSMCI_MCDA2_GPIO+X0, HIGH); + digitalWriteNonDue(PIN_HSMCI_MCDA3_GPIO+X0, HIGH); } //initialise ethernet pins diff --git a/Libraries/SamNonDuePin/SamNonDuePin.h b/Libraries/SamNonDuePin/SamNonDuePin.h index 0001397..48e7393 100644 --- a/Libraries/SamNonDuePin/SamNonDuePin.h +++ b/Libraries/SamNonDuePin/SamNonDuePin.h @@ -29,17 +29,21 @@ See undefined.cpp file for more info // Number of pins defined in PinDescription array #define PINS_C 25 -//undefined pins constants so the undef pins can -//be refered to a Xn rather than n -static const uint8_t X0 = 0; -static const uint8_t X1 = 1; -static const uint8_t X2 = 2; -static const uint8_t X3 = 3; -static const uint8_t X4 = 4; -static const uint8_t X5 = 5; -static const uint8_t X6 = 6; -static const uint8_t X7 = 7; -static const uint8_t X8 = 8; +static const unsigned int pwmFastFrequency = 25000; // fast PWM frequency for Intel spec PWM fans + +// Undefined pins constants so the undef pins can be referred to a Xn rather than n +// Any pin numbers below X0 we assume are ordinary Due pin numbers +// Note: these must all be <=127 because pin numbers are held in int8_t in some places. +// There are 92 pins defined in the Arduino Due core as at version 1.5.4, so these must all be >=92 +static const uint8_t X0 = 100; +static const uint8_t X1 = 101; +static const uint8_t X2 = 102; +static const uint8_t X3 = 103; +static const uint8_t X4 = 104; +static const uint8_t X5 = 105; +static const uint8_t X6 = 106; +static const uint8_t X7 = 107; +static const uint8_t X8 = 108; //HSMCI static const uint8_t PIN_HSMCI_MCCDA_GPIO = 9; static const uint8_t PIN_HSMCI_MCCK_GPIO = 10; @@ -66,7 +70,7 @@ extern const PinDescription nonDuePinDescription[] ; extern void pinModeNonDue( uint32_t ulPin, uint32_t ulMode ); extern void digitalWriteNonDue( uint32_t ulPin, uint32_t ulVal ); extern int digitalReadNonDue( uint32_t ulPin); -extern void analogWriteNonDue(uint32_t ulPin, uint32_t ulValue); +extern void analogWriteNonDue(uint32_t ulPin, uint32_t ulValue, bool fastPwm = false); extern void analogOutputNonDue(); extern void hsmciPinsinit(); extern void ethPinsInit(); diff --git a/Move.cpp b/Move.cpp index 73687eb..3727416 100644 --- a/Move.cpp +++ b/Move.cpp @@ -1310,10 +1310,9 @@ long LookAhead::EndPointToMachine(int8_t drive, float coord) void LookAhead::PrintMove() { - scratchString.printf("X,Y,Z: %.1f %.1f %.1f, min v: %.2f, max v: %.1f, acc: %.1f, feed: %.1f, u: %.3f, v: %.3f\n", + platform->Message(HOST_MESSAGE, "X,Y,Z: %.1f %.1f %.1f, min v: %.2f, max v: %.1f, acc: %.1f, feed: %.1f, u: %.3f, v: %.3f\n", MachineToEndPoint(X_AXIS), MachineToEndPoint(Y_AXIS), MachineToEndPoint(Z_AXIS), MinSpeed(), MaxSpeed(), Acceleration(), FeedRate(), Previous()->V(), V()); - platform->Message(HOST_MESSAGE, scratchString); } diff --git a/Move.h b/Move.h index 876156e..ee26b44 100644 --- a/Move.h +++ b/Move.h @@ -69,17 +69,17 @@ protected: LookAhead(Move* m, Platform* p, LookAhead* n); void Init(long ep[], float requsestedFeedRate, float minSpeed, // Set up this move float maxSpeed, float acceleration, EndstopChecks ce); - LookAhead* Next(); // Next one in the ring - LookAhead* Previous(); // Previous one in the ring + LookAhead* Next() const; // Next one in the ring + LookAhead* Previous() const; // Previous one in the ring const long* MachineCoordinates() const; // Endpoints of a move in machine coordinates float MachineToEndPoint(int8_t drive) const; // Convert a move endpoint to real mm coordinates static float MachineToEndPoint(int8_t drive, long coord); // Convert any number to a real coordinate static long EndPointToMachine(int8_t drive, float coord); // Convert real mm to a machine coordinate - float FeedRate(); // How fast is the set speed for this move - float MinSpeed(); // What is the slowest that this move can be - float MaxSpeed(); // What is the fastest this move can be - float Acceleration(); // What is the acceleration available for this move - float V(); // The speed at the end of the move + float FeedRate() const; // How fast is the set speed for this move + float MinSpeed() const; // What is the slowest that this move can be + float MaxSpeed() const; // What is the fastest this move can be + float Acceleration() const; // What is the acceleration available for this move + float V() const; // The speed at the end of the move void SetV(float vv); // Set the end speed void SetFeedRate(float f); // Set the desired feedrate int8_t Processed() const; // Where we are in the look-ahead prediction sequence @@ -258,7 +258,7 @@ class Move bool addNoMoreMoves; // If true, allow no more moves to be added to the look-ahead bool active; // Are we live and running? float currentFeedrate; // Err... the current feed rate... - float liveCoordinates[DRIVES + 1]; // The last endpoint that the machine moved to + volatile float liveCoordinates[DRIVES + 1]; // The last endpoint that the machine moved to float nextMove[DRIVES + 1]; // The endpoint of the next move to processExtra entry is for feedrate float normalisedDirectionVector[DRIVES]; // Used to hold a unit-length vector in the direction of motion long nextMachineEndPoints[DRIVES+1]; // The next endpoint in machine coordinates (i.e. steps) @@ -280,12 +280,12 @@ class Move //******************************************************************************************************** -inline LookAhead* LookAhead::Next() +inline LookAhead* LookAhead::Next() const { return next; } -inline LookAhead* LookAhead::Previous() +inline LookAhead* LookAhead::Previous() const { return previous; } @@ -301,22 +301,22 @@ inline float LookAhead::MachineToEndPoint(int8_t drive) const return ((float)(endPoint[drive]))/platform->DriveStepsPerUnit(drive); } -inline float LookAhead::FeedRate() +inline float LookAhead::FeedRate() const { return requestedFeedrate; } -inline float LookAhead::MinSpeed() +inline float LookAhead::MinSpeed() const { return minSpeed; } -inline float LookAhead::MaxSpeed() +inline float LookAhead::MaxSpeed() const { return maxSpeed; } -inline float LookAhead::Acceleration() +inline float LookAhead::Acceleration() const { return acceleration; } @@ -326,7 +326,7 @@ inline void LookAhead::SetV(float vv) v = vv; } -inline float LookAhead::V() +inline float LookAhead::V() const { return v; } diff --git a/Network.cpp b/Network.cpp index b05e217..a8f7f35 100644 --- a/Network.cpp +++ b/Network.cpp @@ -123,6 +123,28 @@ static void SendData(tcp_pcb *pcb, ConnectionState *cs) extern "C" { +// Callback functions for the EMAC driver + +static void emac_read_packet(uint32_t ul_status) +{ + // Because the LWIP stack can become corrupted if we work with it in parallel, + // we may have to wait for the next Spin() call to read the next packet. + // On this occasion, we can set the RX callback again. + if (inLwip) + { + reprap.GetNetwork()->ReadPacket(); + ethernet_set_rx_callback(NULL); + } + else + { + ++inLwip; + do { + // read all queued packets from the RX buffer + } while (ethernet_read()); + --inLwip; + } +} + // Callback functions called by LWIP static void conn_err(void *arg, err_t err) @@ -414,12 +436,19 @@ void Network::Spin() { if (state == NetworkActive) { - // Fetch incoming data - // ethernet_task() is called twice because the EMAC RX buffers have been increased by dc42's Arduino patch. - ++inLwip; - ethernet_task(); - ethernet_task(); - --inLwip; + // See if we can read any packets + if (readingData) + { + readingData = false; + + ++inLwip; + do { + // read all queued packets from the RX buffer + } while (ethernet_read()); + --inLwip; + + ethernet_set_rx_callback(&emac_read_packet); + } // See if we can send anything ++inLwip; @@ -463,11 +492,22 @@ void Network::Spin() httpd_init(); ftpd_init(); telnetd_init(); + ethernet_set_rx_callback(&emac_read_packet); state = NetworkActive; } } } +void Network::Interrupt() +{ + if (!inLwip) + { + ++inLwip; + ethernet_timers_update(); + --inLwip; + } +} + bool Network::InLwip() const { return (inLwip); diff --git a/Network.h b/Network.h index 11bd9a1..cba0628 100644 --- a/Network.h +++ b/Network.h @@ -160,6 +160,7 @@ public: Network(); void Init(); void Spin(); + void Interrupt(); bool InLwip() const; void ReadPacket(); diff --git a/Platform.cpp b/Platform.cpp index 4e2e632..9e69009 100644 --- a/Platform.cpp +++ b/Platform.cpp @@ -28,6 +28,8 @@ extern "C" char *sbrk(int i); const uint8_t memPattern = 0xA5; +static volatile uint32_t fanRpmCounter = 0; + // Arduino initialise and loop functions // Put nothing in these other than calls to the RepRap equivalents @@ -91,7 +93,8 @@ bool PidParameters::operator==(const PidParameters& other) const // Platform class Platform::Platform() : - tickState(0), fileStructureInitialised(false), active(false), errorCodeBits(0), debugCode(0) + tickState(0), fileStructureInitialised(false), active(false), errorCodeBits(0), debugCode(0), + messageString(messageStringBuffer, ARRAY_SIZE(messageStringBuffer)) { line = new Line(); @@ -109,8 +112,8 @@ Platform::Platform() : void Platform::Init() { - digitalWrite(atxPowerPin, LOW); // ensure ATX power is off by default - pinMode(atxPowerPin, OUTPUT); + digitalWriteNonDue(atxPowerPin, LOW); // ensure ATX power is off by default + pinModeNonDue(atxPowerPin, OUTPUT); DueFlashStorage::init(); // We really want to use static_assert here, but the ancient version of gcc used by Arduino doesn't support it @@ -220,6 +223,8 @@ void Platform::Init() standbyTemperatures = STANDBY_TEMPERATURES; activeTemperatures = ACTIVE_TEMPERATURES; coolingFanPin = COOLING_FAN_PIN; + coolingFanRpmPin = COOLING_FAN_RPM_PIN; + lastRpmResetTime = 0.0; webDir = WEB_DIR; gcodeDir = GCODE_DIR; @@ -234,24 +239,15 @@ void Platform::Init() { if (stepPins[i] >= 0) { - if(i == E0_DRIVE || i == E3_DRIVE) // STEP_PINS {14, 25, 5, X2, 41, 39, X4, 49} - pinModeNonDue(stepPins[i], OUTPUT); - else - pinMode(stepPins[i], OUTPUT); + pinModeNonDue(stepPins[i], OUTPUT); } if (directionPins[i] >= 0) { - if(i == E0_DRIVE) // DIRECTION_PINS {15, 26, 4, X3, 35, 53, 51, 48} - pinModeNonDue(directionPins[i], OUTPUT); - else - pinMode(directionPins[i], OUTPUT); + pinModeNonDue(directionPins[i], OUTPUT); } if (enablePins[i] >= 0) { - if(i == Z_AXIS || i == E0_DRIVE || i == E2_DRIVE) // ENABLE_PINS {29, 27, X1, X0, 37, X8, 50, 47} - pinModeNonDue(enablePins[i], OUTPUT); - else - pinMode(enablePins[i], OUTPUT); + pinModeNonDue(enablePins[i], OUTPUT); } Disable(i); driveEnabled[i] = false; @@ -260,13 +256,11 @@ void Platform::Init() { if (lowStopPins[i] >= 0) { - pinMode(lowStopPins[i], INPUT); - digitalWrite(lowStopPins[i], HIGH); // Turn on pullup + pinModeNonDue(lowStopPins[i], INPUT_PULLUP); } if (highStopPins[i] >= 0) { - pinMode(highStopPins[i], INPUT); - digitalWrite(highStopPins[i], HIGH); // Turn on pullup + pinModeNonDue(highStopPins[i], INPUT_PULLUP); } } @@ -274,16 +268,8 @@ void Platform::Init() { if (heatOnPins[i] >= 0) { - if(i == E0_HEATER || i == E1_HEATER) // HEAT_ON_PINS {6, X5, X7, 7, 8, 9} - { - digitalWriteNonDue(heatOnPins[i], HIGH); // turn the heater off - pinModeNonDue(heatOnPins[i], OUTPUT); - } - else - { - digitalWrite(heatOnPins[i], HIGH); // turn the heater off - pinMode(heatOnPins[i], OUTPUT); - } + digitalWriteNonDue(heatOnPins[i], HIGH); // turn the heater off + pinModeNonDue(heatOnPins[i], OUTPUT); } analogReadResolution(12); thermistorFilters[i].Init(analogRead(tempSensePins[i])); @@ -299,8 +285,12 @@ void Platform::Init() if (coolingFanPin >= 0) { - //pinModeNonDue(coolingFanPin, OUTPUT); //not required as analogwrite does this automatically - analogWriteNonDue(coolingFanPin, 255); //inverse logic for Duet v0.6 this turns it off + analogWriteNonDue(coolingFanPin, (HEAT_ON == 0) ? 255 : 0, true); + } + + if (coolingFanRpmPin >= 0) + { + pinModeNonDue(coolingFanRpmPin, INPUT_PULLUP); } InitialiseInterrupts(); @@ -328,14 +318,14 @@ void Platform::InitZProbe() if (nvData.zProbeType == 1 || nvData.zProbeType == 2) { - pinMode(zProbeModulationPin, OUTPUT); - digitalWrite(zProbeModulationPin, HIGH); // enable the IR LED + pinModeNonDue(zProbeModulationPin, OUTPUT); + digitalWriteNonDue(zProbeModulationPin, HIGH); // enable the IR LED SetZProbing(false); } else if (nvData.zProbeType == 3) { - pinMode(zProbeModulationPin, OUTPUT); - digitalWrite(zProbeModulationPin, LOW); // enable the alternate sensor + pinModeNonDue(zProbeModulationPin, OUTPUT); + digitalWriteNonDue(zProbeModulationPin, LOW); // enable the alternate sensor SetZProbing(false); } } @@ -629,6 +619,17 @@ void TC3_Handler() reprap.Interrupt(); } +void TC4_Handler() +{ + TC_GetStatus(TC1, 1); + reprap.GetNetwork()->Interrupt(); +} + +void FanInterrupt() +{ + fanRpmCounter++; +} + void Platform::InitialiseInterrupts() { // Timer interrupt for stepper motors @@ -639,6 +640,20 @@ void Platform::InitialiseInterrupts() TC1 ->TC_CHANNEL[0].TC_IDR = ~TC_IER_CPCS; SetInterrupt(STANDBY_INTERRUPT_RATE); + // Timer interrupt to keep the networking timers running (called at 8Hz) + pmc_enable_periph_clk((uint32_t) TC4_IRQn); + TC_Configure(TC1, 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK2); + uint32_t rc = VARIANT_MCK/8/16; // 8 because we selected TIMER_CLOCK2 above + TC_SetRA(TC1, 1, rc/2); // 50% high, 50% low + TC_SetRC(TC1, 1, rc); + TC_Start(TC1, 1); + TC1 ->TC_CHANNEL[1].TC_IER = TC_IER_CPCS; + TC1 ->TC_CHANNEL[1].TC_IDR = ~TC_IER_CPCS; + NVIC_EnableIRQ(TC4_IRQn); + + // Interrupt for 4-pin PWM fan sense line + attachInterrupt(coolingFanRpmPin, FanInterrupt, FALLING); + // Tick interrupt for ADC conversions tickState = 0; currentHeater = 0; @@ -649,6 +664,7 @@ void Platform::InitialiseInterrupts() //void Platform::DisableInterrupts() //{ // NVIC_DisableIRQ(TC3_IRQn); +// NVIC_DisableIRQ(TC4_IRQn); //} // Process a 1ms tick interrupt @@ -701,7 +717,7 @@ void Platform::Tick() StartAdcConversion(heaterAdcChannels[currentHeater]); // read a thermistor if (nvData.zProbeType == 2) // if using a modulated IR sensor { - digitalWrite(Z_PROBE_MOD_PIN, LOW); // turn off the IR emitter + digitalWriteNonDue(Z_PROBE_MOD_PIN, LOW); // turn off the IR emitter } ++tickState; break; @@ -714,7 +730,7 @@ void Platform::Tick() StartAdcConversion(heaterAdcChannels[currentHeater]); // read a thermistor if (nvData.zProbeType == 2) // if using a modulated IR sensor { - digitalWrite(Z_PROBE_MOD_PIN, HIGH); // turn on the IR emitter + digitalWriteNonDue(Z_PROBE_MOD_PIN, HIGH); // turn on the IR emitter } tickState = 1; break; @@ -763,36 +779,27 @@ void Platform::Diagnostics() const char *ramstart = (char *) 0x20070000; const struct mallinfo mi = mallinfo(); AppendMessage(BOTH_MESSAGE, "Memory usage:\n\n"); - scratchString.printf("Program static ram used: %d\n", &_end - ramstart); - AppendMessage(BOTH_MESSAGE, scratchString); - scratchString.printf("Dynamic ram used: %d\n", mi.uordblks); - AppendMessage(BOTH_MESSAGE, scratchString); - scratchString.printf("Recycled dynamic ram: %d\n", mi.fordblks); - AppendMessage(BOTH_MESSAGE, scratchString); + AppendMessage(BOTH_MESSAGE, "Program static ram used: %d\n", &_end - ramstart); + AppendMessage(BOTH_MESSAGE, "Dynamic ram used: %d\n", mi.uordblks); + AppendMessage(BOTH_MESSAGE, "Recycled dynamic ram: %d\n", mi.fordblks); size_t currentStack, maxStack, neverUsed; GetStackUsage(¤tStack, &maxStack, &neverUsed); - scratchString.printf("Current stack ram used: %d\n", currentStack); - AppendMessage(BOTH_MESSAGE, scratchString); - scratchString.printf("Maximum stack ram used: %d\n", maxStack); - AppendMessage(BOTH_MESSAGE, scratchString); - scratchString.printf("Never used ram: %d\n", neverUsed); - AppendMessage(BOTH_MESSAGE, scratchString); + AppendMessage(BOTH_MESSAGE, "Current stack ram used: %d\n", currentStack); + AppendMessage(BOTH_MESSAGE, "Maximum stack ram used: %d\n", maxStack); + AppendMessage(BOTH_MESSAGE, "Never used ram: %d\n", neverUsed); // Show the up time and reason for the last reset const uint32_t now = (uint32_t)Time(); // get up time in seconds const char* resetReasons[8] = { "power up", "backup", "watchdog", "software", "external", "?", "?", "?" }; - scratchString.printf("Last reset %02d:%02d:%02d ago, cause: %s\n", + AppendMessage(BOTH_MESSAGE, "Last reset %02d:%02d:%02d ago, cause: %s\n", (unsigned int)(now/3600), (unsigned int)((now % 3600)/60), (unsigned int)(now % 60), resetReasons[(REG_RSTC_SR & RSTC_SR_RSTTYP_Msk) >> RSTC_SR_RSTTYP_Pos]); - AppendMessage(BOTH_MESSAGE, scratchString); // Show the error code stored at the last software reset - scratchString.printf("Last software reset code & available RAM: 0x%04x, %u\n", nvData.resetReason, nvData.neverUsedRam); - AppendMessage(BOTH_MESSAGE, scratchString); + AppendMessage(BOTH_MESSAGE, "Last software reset code & available RAM: 0x%04x, %u\n", nvData.resetReason, nvData.neverUsedRam); // Show the current error codes - scratchString.printf("Error status: %u\n", errorCodeBits); - AppendMessage(BOTH_MESSAGE, scratchString); + AppendMessage(BOTH_MESSAGE, "Error status: %u\n", errorCodeBits); // Show the current probe position heights scratchString.copy("Bed probe heights:"); @@ -812,12 +819,10 @@ void Platform::Diagnostics() ++numFreeFiles; } } - scratchString.printf("Free file entries: %u\n", numFreeFiles); - AppendMessage(BOTH_MESSAGE, scratchString); + AppendMessage(BOTH_MESSAGE, "Free file entries: %u\n", numFreeFiles); // Show the longest write time - scratchString.printf("Longest block write time: %.1fms\n", FileStore::GetAndClearLongestWriteTime()); - AppendMessage(BOTH_MESSAGE, scratchString); + AppendMessage(BOTH_MESSAGE, "Longest block write time: %.1fms\n", FileStore::GetAndClearLongestWriteTime()); reprap.Timing(); @@ -862,15 +867,14 @@ void Platform::GetStackUsage(size_t* currentStack, size_t* maxStack, size_t* nev if (neverUsed) { *neverUsed = stack_lwm - heapend; } } -void Platform::ClassReport(char* className, float &lastTime) +void Platform::ClassReport(const char* className, float &lastTime) { if (!reprap.Debug()) return; if (Time() - lastTime < LONG_TIME) return; lastTime = Time(); - scratchString.printf("Class %s spinning.\n", className); - Message(HOST_MESSAGE, scratchString); + Message(HOST_MESSAGE, "Class %s spinning.\n", className); } //=========================================================================== @@ -938,24 +942,13 @@ const PidParameters& Platform::GetPidParameters(size_t heater) // power is a fraction in [0,1] -void Platform::SetHeater(size_t heater, const float& power) +void Platform::SetHeater(size_t heater, float power) { if (heatOnPins[heater] < 0) return; byte p = (byte) (255.0 * min(1.0, max(0.0, power))); - if (HEAT_ON == 0) - { - p = 255 - p; - if(heater == E0_HEATER || heater == E1_HEATER) //HEAT_ON_PINS {6, X5, X7, 7, 8, 9} - { - analogWriteNonDue(heatOnPins[heater], p); - } - else - { - analogWrite(heatOnPins[heater], p); - } - } + analogWriteNonDue(heatOnPins[heater], (HEAT_ON == 0) ? 255 - p : p); } EndStopHit Platform::Stopped(int8_t drive) @@ -976,12 +969,12 @@ EndStopHit Platform::Stopped(int8_t drive) if (lowStopPins[drive] >= 0) { - if (digitalRead(lowStopPins[drive]) == ENDSTOP_HIT) + if (digitalReadNonDue(lowStopPins[drive]) == ENDSTOP_HIT) return lowHit; } if (highStopPins[drive] >= 0) { - if (digitalRead(highStopPins[drive]) == ENDSTOP_HIT) + if (digitalReadNonDue(highStopPins[drive]) == ENDSTOP_HIT) return highHit; } return noStop; @@ -993,24 +986,14 @@ void Platform::SetDirection(byte drive, bool direction) return; bool d = (direction == FORWARDS) ? directions[drive] : !directions[drive]; - if(drive == E0_DRIVE) //DIRECTION_PINS {15, 26, 4, X3, 35, 53, 51, 48} - { - digitalWriteNonDue(directionPins[drive], d); - } - else - { - digitalWrite(directionPins[drive], d); - } + digitalWriteNonDue(directionPins[drive], d); } void Platform::Disable(byte drive) { if(enablePins[drive] < 0) return; - if(drive == Z_AXIS || drive==E0_DRIVE || drive==E2_DRIVE) //ENABLE_PINS {29, 27, X1, X0, 37, X8, 50, 47} - digitalWriteNonDue(enablePins[drive], DISABLE); - else - digitalWrite(enablePins[drive], DISABLE); + digitalWriteNonDue(enablePins[drive], DISABLE); driveEnabled[drive] = false; } @@ -1020,25 +1003,11 @@ void Platform::Step(byte drive) return; if(!driveEnabled[drive] && enablePins[drive] >= 0) { - if(drive == Z_AXIS || drive==E0_DRIVE || drive==E2_DRIVE) //ENABLE_PINS {29, 27, X1, X0, 37, X8, 50, 47} - { - digitalWriteNonDue(enablePins[drive], ENABLE); - } - else - { - digitalWrite(enablePins[drive], ENABLE); - } + digitalWriteNonDue(enablePins[drive], ENABLE); driveEnabled[drive] = true; } - if(drive == E0_DRIVE || drive == E3_DRIVE) //STEP_PINS {14, 25, 5, X2, 41, 39, X4, 49} - { - digitalWriteNonDue(stepPins[drive], 0); - digitalWriteNonDue(stepPins[drive], 1); - } else - { - digitalWrite(stepPins[drive], 0); - digitalWrite(stepPins[drive], 1); - } + digitalWriteNonDue(stepPins[drive], 0); + digitalWriteNonDue(stepPins[drive], 1); } // current is in mA @@ -1101,10 +1070,31 @@ void Platform::CoolingFan(float speed) } // The cooling fan output pin gets inverted if HEAT_ON == 0 - analogWriteNonDue(coolingFanPin, (HEAT_ON == 0) ? (255 - p) : p); + analogWriteNonDue(coolingFanPin, (HEAT_ON == 0) ? (255 - p) : p, true); } } +// Get current fan RPM + +float Platform::GetFanRPM() +{ + float now = Time(); + float diff = now - lastRpmResetTime; + + // Intel's 4-pin PWM fan specifications say we get two pulses per revolution. + // That means we get 2 ISR calls per pulse and 4 increments per revolution. + float result = (float)fanRpmCounter / (4.0 * diff) * 60.0; + + // Collect some values and reset the counters after a few seconds + if (diff > COOLING_FAN_RPM_SAMPLE_TIME) + { + fanRpmCounter = 0; + lastRpmResetTime = now; + } + + return result; +} + // Interrupts void Platform::SetInterrupt(float s) // Seconds @@ -1154,7 +1144,16 @@ MassStorage* Platform::GetMassStorage() return massStorage; } -void Platform::Message(char type, const char* message) +void Platform::Message(char type, const char* message, ...) +{ + va_list vargs; + va_start(vargs, message); + messageString.vprintf(message, vargs); + va_end(vargs); + Message(type, messageString); +} + +void Platform::Message(char type, const StringRef& message) { switch(type) { @@ -1178,17 +1177,17 @@ void Platform::Message(char type, const char* message) line->Write(' ', type == DEBUG_MESSAGE); } } - line->Write(message, type == DEBUG_MESSAGE); + line->Write(message.Pointer(), type == DEBUG_MESSAGE); break; case WEB_MESSAGE: // Message that is to be sent to the web - reprap.GetWebserver()->MessageStringToWebInterface(message, false); + reprap.GetWebserver()->MessageStringToWebInterface(message.Pointer(), false); break; case WEB_ERROR_MESSAGE: // Message that is to be sent to the web - flags an error - reprap.GetWebserver()->MessageStringToWebInterface(message, true); + reprap.GetWebserver()->MessageStringToWebInterface(message.Pointer(), true); break; case BOTH_MESSAGE: @@ -1200,8 +1199,8 @@ void Platform::Message(char type, const char* message) line->Write(' '); } } - line->Write(message); - reprap.GetWebserver()->MessageStringToWebInterface(message, false); + line->Write(message.Pointer()); + reprap.GetWebserver()->MessageStringToWebInterface(message.Pointer(), false); break; case BOTH_ERROR_MESSAGE: @@ -1216,13 +1215,22 @@ void Platform::Message(char type, const char* message) line->Write(' '); } } - line->Write(message); - reprap.GetWebserver()->MessageStringToWebInterface(message, true); + line->Write(message.Pointer()); + reprap.GetWebserver()->MessageStringToWebInterface(message.Pointer(), true); break; } } -void Platform::AppendMessage(char type, const char* message) +void Platform::AppendMessage(char type, const char* message, ...) +{ + va_list vargs; + va_start(vargs, message); + messageString.vprintf(message, vargs); + va_end(vargs); + AppendMessage(type, messageString); +} + +void Platform::AppendMessage(char type, const StringRef& message) { switch(type) { @@ -1247,17 +1255,17 @@ void Platform::AppendMessage(char type, const char* message) line->Write(' ', type == DEBUG_MESSAGE); } } - line->Write(message, type == DEBUG_MESSAGE); + line->Write(message.Pointer(), type == DEBUG_MESSAGE); break; case WEB_MESSAGE: // Message that is to be sent to the web - reprap.GetWebserver()->AppendReplyToWebInterface(message, false); + reprap.GetWebserver()->AppendReplyToWebInterface(message.Pointer(), false); break; case WEB_ERROR_MESSAGE: // Message that is to be sent to the web - flags an error - reprap.GetWebserver()->AppendReplyToWebInterface(message, true); + reprap.GetWebserver()->AppendReplyToWebInterface(message.Pointer(), true); break; case BOTH_MESSAGE: @@ -1269,8 +1277,8 @@ void Platform::AppendMessage(char type, const char* message) line->Write(' '); } } - line->Write(message); - reprap.GetWebserver()->AppendReplyToWebInterface(message, false); + line->Write(message.Pointer()); + reprap.GetWebserver()->AppendReplyToWebInterface(message.Pointer(), false); break; case BOTH_ERROR_MESSAGE: @@ -1285,8 +1293,8 @@ void Platform::AppendMessage(char type, const char* message) line->Write(' '); } } - line->Write(message); - reprap.GetWebserver()->AppendReplyToWebInterface(message, true); + line->Write(message.Pointer()); + reprap.GetWebserver()->AppendReplyToWebInterface(message.Pointer(), true); break; } } @@ -1294,7 +1302,7 @@ void Platform::AppendMessage(char type, const char* message) void Platform::SetAtxPower(bool on) { - digitalWrite(atxPowerPin, (on) ? HIGH : LOW); + digitalWriteNonDue(atxPowerPin, (on) ? HIGH : LOW); } @@ -1503,9 +1511,7 @@ bool MassStorage::Delete(const char* directory, const char* fileName) : fileName; if (f_unlink(location) != FR_OK) { - platform->Message(HOST_MESSAGE, "Can't delete file "); - platform->Message(HOST_MESSAGE, location); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_MESSAGE, "Can't delete file %s\n, location"); return false; } return true; @@ -1517,9 +1523,7 @@ bool MassStorage::MakeDirectory(const char *parentDir, const char *dirName) const char* location = platform->GetMassStorage()->CombineName(parentDir, dirName); if (f_mkdir(location) != FR_OK) { - platform->Message(HOST_MESSAGE, "Can't create directory "); - platform->Message(HOST_MESSAGE, location); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_MESSAGE, "Can't create directory %s\n", location); return false; } return true; @@ -1529,9 +1533,7 @@ bool MassStorage::MakeDirectory(const char *directory) { if (f_mkdir(directory) != FR_OK) { - platform->Message(HOST_MESSAGE, "Can't create directory "); - platform->Message(HOST_MESSAGE, directory); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_MESSAGE, "Can't create directory %s\n", directory); return false; } return true; @@ -1542,11 +1544,7 @@ bool MassStorage::Rename(const char *oldFilename, const char *newFilename) { if (f_rename(oldFilename, newFilename) != FR_OK) { - platform->Message(HOST_MESSAGE, "Can't rename file or directory "); - platform->Message(HOST_MESSAGE, oldFilename); - platform->Message(HOST_MESSAGE, " to "); - platform->Message(HOST_MESSAGE, newFilename); - platform->Message(HOST_MESSAGE, "\n"); + platform->Message(BOTH_MESSAGE, "Can't rename file or directory %s to %s\n", oldFilename, newFilename); return false; } return true; @@ -1587,12 +1585,7 @@ bool FileStore::Open(const char* directory, const char* fileName, bool write) FRESULT openReturn = f_open(&file, location, (writing) ? FA_CREATE_ALWAYS | FA_WRITE : FA_OPEN_EXISTING | FA_READ); if (openReturn != FR_OK) { - char errString[12]; // don't use scratch_string for this because that may be holding the original filename - platform->Message(BOTH_MESSAGE, "Can't open "); - platform->AppendMessage(BOTH_MESSAGE, location); - platform->AppendMessage(BOTH_MESSAGE, (writing) ? " to write to, error code " : " to read from, error code "); - snprintf(errString, ARRAY_SIZE(errString), "%d\n", openReturn); - platform->AppendMessage(BOTH_MESSAGE, errString); + platform->Message(BOTH_MESSAGE, "Can't open %s to %s, error code %d\n", location, (writing) ? "write" : "read", openReturn); return false; } @@ -1606,7 +1599,7 @@ void FileStore::Duplicate() { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to dup a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to dup a non-open file.\n"); return; } ++openCount; @@ -1616,7 +1609,7 @@ bool FileStore::Close() { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to close a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to close a non-open file.\n"); return false; } --openCount; @@ -1640,7 +1633,7 @@ bool FileStore::Seek(unsigned long pos) { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to seek on a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to seek on a non-open file.\n"); return false; } if (writing) @@ -1661,7 +1654,7 @@ unsigned long FileStore::Length() { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to size non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to size non-open file.\n"); return 0; } return file.fsize; @@ -1686,7 +1679,7 @@ bool FileStore::ReadBuffer() FRESULT readStatus = f_read(&file, buf, FILE_BUF_LEN, &lastBufferEntry); // Read a chunk of file if (readStatus) { - platform->Message(HOST_MESSAGE, "Error reading file.\n"); + platform->Message(BOTH_MESSAGE, "Error reading file.\n"); return false; } bufferPointer = 0; @@ -1698,7 +1691,7 @@ bool FileStore::Read(char& b) { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to read from a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to read from a non-open file.\n"); return false; } @@ -1728,7 +1721,7 @@ int FileStore::Read(char* extBuf, unsigned int nBytes) { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to read from a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to read from a non-open file.\n"); return -1; } bufferPointer = FILE_BUF_LEN; // invalidate the buffer @@ -1736,7 +1729,7 @@ int FileStore::Read(char* extBuf, unsigned int nBytes) FRESULT readStatus = f_read(&file, extBuf, nBytes, &bytesRead); if (readStatus) { - platform->Message(HOST_MESSAGE, "Error reading file.\n"); + platform->Message(BOTH_MESSAGE, "Error reading file.\n"); return -1; } return (int)bytesRead; @@ -1749,7 +1742,7 @@ bool FileStore::WriteBuffer() bool ok = InternalWriteBlock((const char*)buf, bufferPointer); if (!ok) { - platform->Message(HOST_MESSAGE, "Error writing file. Disc may be full.\n"); + platform->Message(BOTH_MESSAGE, "Error writing file. Disc may be full.\n"); return false; } bufferPointer = 0; @@ -1761,7 +1754,7 @@ bool FileStore::Write(char b) { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to write byte to a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to write byte to a non-open file.\n"); return false; } buf[bufferPointer] = b; @@ -1777,7 +1770,7 @@ bool FileStore::Write(const char* b) { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to write string to a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to write string to a non-open file.\n"); return false; } int i = 0; @@ -1796,14 +1789,14 @@ bool FileStore::Write(const char *s, unsigned int len) { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to write block to a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to write block to a non-open file.\n"); return false; } if (!WriteBuffer()) { return false; } - InternalWriteBlock(s, len); + return InternalWriteBlock(s, len); } bool FileStore::InternalWriteBlock(const char *s, unsigned int len) @@ -1818,7 +1811,7 @@ bool FileStore::InternalWriteBlock(const char *s, unsigned int len) } if ((writeStatus != FR_OK) || (bytesWritten != len)) { - platform->Message(HOST_MESSAGE, "Error writing file. Disc may be full.\n"); + platform->Message(BOTH_MESSAGE, "Error writing file. Disc may be full.\n"); return false; } return true; @@ -1828,7 +1821,7 @@ bool FileStore::Flush() { if (!inUse) { - platform->Message(HOST_MESSAGE, "Attempt to flush a non-open file.\n"); + platform->Message(BOTH_MESSAGE, "Attempt to flush a non-open file.\n"); return false; } if (!WriteBuffer()) diff --git a/Platform.h b/Platform.h index 1e31920..047a9c4 100644 --- a/Platform.h +++ b/Platform.h @@ -128,7 +128,7 @@ const unsigned int numZProbeReadingsAveraged = 8; // we average this number of r // HEATERS - The bed is assumed to be the at index 0 #define TEMP_SENSE_PINS {5, 4, 0, 7, 8, 9} // Analogue pin numbers -#define HEAT_ON_PINS {6, X5, X7, 7, 8, 9} //pin D38 is PWM capable but not an Arduino PWM pin - //FIXME TEST if E1 PWM works as D38 +#define HEAT_ON_PINS {6, X5, X7, 7, 8, 9} //pin D38 is PWM capable but not an Arduino PWM pin // Bed thermistor: http://uk.farnell.com/epcos/b57863s103f040/sensor-miniature-ntc-10k/dp/1299930?Ntt=129-9930 // Hot end thermistor: http://www.digikey.co.uk/product-search/en?x=20&y=11&KeyWords=480-3137-ND const float defaultThermistorBetas[HEATERS] = {3988.0, 4138.0, 4138.0, 4138.0, 4138.0, 4138.0}; // Bed thermistor: B57861S104F40; Extruder thermistor: RS 198-961 @@ -171,7 +171,9 @@ const float defaultPidMax[HEATERS] = {255, 180, 180, 180, 180, 180}; // maximu #define STANDBY_TEMPERATURES {ABS_ZERO, ABS_ZERO, ABS_ZERO, ABS_ZERO, ABS_ZERO, ABS_ZERO} // We specify one for the bed, though it's not needed #define ACTIVE_TEMPERATURES {ABS_ZERO, ABS_ZERO, ABS_ZERO, ABS_ZERO, ABS_ZERO, ABS_ZERO} -#define COOLING_FAN_PIN X6 //pin D34 is PWM capable but not an Arduino PWM pin - use X6 instead +#define COOLING_FAN_PIN X6 // pin D34 is PWM capable but not an Arduino PWM pin - use X6 instead +#define COOLING_FAN_RPM_PIN 36 // pin PC4 +#define COOLING_FAN_RPM_SAMPLE_TIME 2.0 // Time to wait before resetting the internal fan RPM stats #define HEAT_ON 0 // 0 for inverted heater (e.g. Duet v0.6) 1 for not (e.g. Duet v0.4) // For the theory behind ADC oversampling, see http://www.atmel.com/Images/doc8003.pdf @@ -218,6 +220,8 @@ const int atxPowerPin = 12; // Arduino Due pin number that controls the ATX const uint16_t lineInBufsize = 256; // use a power of 2 for good performance const uint16_t lineOutBufSize = 2048; // ideally this should be large enough to hold the results of an M503 command, // but could be reduced if we ever need the memory +const size_t messageStringLength = 1024; // max length of a message chunk sent via Message or AppendMessage + /****************************************************************************************************/ enum EndStopHit @@ -541,12 +545,12 @@ public: // it has just been restarted; it can do this by executing an actual restart if you like, but beware the // loop of death... void Spin(); // This gets called in the main loop and should do any housekeeping needed - void Exit(); // Shut down tidily. Calling Init after calling this should reset to the beginning + void Exit(); // Shut down tidily. Calling Init after calling this should reset to the beginning Compatibility Emulating() const; void SetEmulating(Compatibility c); void Diagnostics(); void DiagnosticTest(int d); - void ClassReport(char* className, float &lastTime); // Called on return to check everything's live. + void ClassReport(const char* className, float &lastTime); // Called on return to check everything's live. void RecordError(ErrorCode ec) { errorCodeBits |= ec; } void SoftwareReset(uint16_t reason); void SetAtxPower(bool on); @@ -574,18 +578,18 @@ public: MassStorage* GetMassStorage(); FileStore* GetFileStore(const char* directory, const char* fileName, bool write); - const char* GetWebDir() const; // Where the htm etc files are - const char* GetGCodeDir() const; // Where the gcodes are - const char* GetSysDir() const; // Where the system files are - const char* GetTempDir() const; // Where temporary files are + const char* GetWebDir() const; // Where the htm etc files are + const char* GetGCodeDir() const; // Where the gcodes are + const char* GetSysDir() const; // Where the system files are + const char* GetTempDir() const; // Where temporary files are const char* GetConfigFile() const; // Where the configuration is stored (in the system dir). - void Message(char type, const char* message); // Send a message. Messages may simply flash an LED, or, - // say, display the messages on an LCD. This may also transmit the messages to the host. - void Message(char type, const StringRef& message) { return Message(type, message.Pointer()); } - void AppendMessage(char type, const char* message); // Send a message. Messages may simply flash an LED, or, - // say, display the messages on an LCD. This may also transmit the messages to the host. - void AppendMessage(char type, const StringRef& message) { return AppendMessage(type, message.Pointer()); } + void Message(char type, const char* message, ...); // Send a message. Messages may simply flash an LED, or, + // say, display the messages on an LCD. This may also transmit the messages to the host. + void Message(char type, const StringRef& message); + void AppendMessage(char type, const char* message, ...); // Send a message. Messages may simply flash an LED, or, + // say, display the messages on an LCD. This may also transmit the messages to the host. + void AppendMessage(char type, const StringRef& message); void PushMessageIndent(); void PopMessageIndent(); @@ -643,10 +647,11 @@ public: // Heat and temperature float GetTemperature(size_t heater) const; // Result is in degrees Celsius - void SetHeater(size_t heater, const float& power); // power is a fraction in [0,1] + void SetHeater(size_t heater, float power); // power is a fraction in [0,1] float HeatSampleTime() const; void SetHeatSampleTime(float st); void CoolingFan(float speed); + float GetFanRPM(); void SetPidParameters(size_t heater, const PidParameters& params); const PidParameters& GetPidParameters(size_t heater); @@ -705,7 +710,7 @@ private: int8_t directionPins[DRIVES]; int8_t enablePins[DRIVES]; bool disableDrives[DRIVES]; - bool driveEnabled[DRIVES]; + volatile bool driveEnabled[DRIVES]; bool directions[DRIVES]; int8_t lowStopPins[DRIVES]; int8_t highStopPins[DRIVES]; @@ -750,6 +755,8 @@ private: float standbyTemperatures[HEATERS]; float activeTemperatures[HEATERS]; int8_t coolingFanPin; + int8_t coolingFanRpmPin; + float lastRpmResetTime; // Serial/USB @@ -779,6 +786,9 @@ private: static uint16_t GetAdcReading(adc_channel_num_t chan); static void StartAdcConversion(adc_channel_num_t chan); static adc_channel_num_t PinToAdcChannel(int pin); + + char messageStringBuffer[messageStringLength]; + StringRef messageString; }; // Small class to hold an open file and data relating to it. diff --git a/Release/RepRapFirmware-078p-dc42.bin b/Release/RepRapFirmware-078p-dc42.bin new file mode 100644 index 0000000000000000000000000000000000000000..796b13976c25172ac8f59d77a5952a91a77dd9b4 GIT binary patch literal 260728 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

jUhR4%p~YWKMM?X_@ap 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⁣aX*6WW(u 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, scratchString); + platform->Message(HOST_MESSAGE, "%s Version %s dated %s\n", NAME, VERSION, DATE); platform->Message(HOST_MESSAGE, ".\n\nExecuting "); platform->Message(HOST_MESSAGE, platform->GetConfigFile()); @@ -222,14 +221,10 @@ void RepRap::Init() } } - //while(gCodes->RunConfigurationGCodes()); // Wait till the file is finished - platform->Message(HOST_MESSAGE, "\nStarting network...\n"); network->Init(); // Need to do this here, as the configuration GCodes may set IP address etc. - platform->Message(HOST_MESSAGE, "\n"); - scratchString.printf("%s is up and running.\n", NAME); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(HOST_MESSAGE, "\n%s is up and running.\n", NAME); fastLoop = FLT_MAX; slowLoop = 0.0; lastTime = platform->Time(); @@ -295,8 +290,7 @@ void RepRap::Spin() void RepRap::Timing() { - scratchString.printf("Slowest main loop (seconds): %f; fastest: %f\n", slowLoop, fastLoop); - platform->AppendMessage(BOTH_MESSAGE, scratchString); + platform->AppendMessage(BOTH_MESSAGE, "Slowest main loop (seconds): %f; fastest: %f\n", slowLoop, fastLoop); fastLoop = FLT_MAX; slowLoop = 0.0; } @@ -425,8 +419,7 @@ void RepRap::StandbyTool(int toolNumber) tool = tool->Next(); } - scratchString.printf("Attempt to standby a non-existent tool: %d.\n", toolNumber); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(HOST_MESSAGE, "Attempt to standby a non-existent tool: %d.\n", toolNumber); } Tool* RepRap::GetTool(int toolNumber) @@ -456,8 +449,7 @@ void RepRap::SetToolVariables(int toolNumber, float* standbyTemperatures, float* tool = tool->Next(); } - scratchString.printf("Attempt to set variables for a non-existent tool: %d.\n", toolNumber); - platform->Message(HOST_MESSAGE, scratchString); + platform->Message(HOST_MESSAGE, "Attempt to set variables for a non-existent tool: %d.\n", toolNumber); } @@ -550,7 +542,7 @@ size_t StringRef::cat(const char* src) // Utilities and storage not part of any class -static char scratchStringBuffer[STRING_LENGTH]; +static char scratchStringBuffer[200]; // this is now used only for short messages StringRef scratchString(scratchStringBuffer, ARRAY_SIZE(scratchStringBuffer)); // For debug use diff --git a/Webserver.cpp b/Webserver.cpp index e462bf8..97efeec 100644 --- a/Webserver.cpp +++ b/Webserver.cpp @@ -324,7 +324,7 @@ void Webserver::ProcessGcode(const char* gc) printStartTime = platform->Time(); strncpy(fileBeingPrinted, &gc[4], ARRAY_SIZE(fileBeingPrinted)); fileBeingPrinted[ARRAY_UPB(fileBeingPrinted)] = 0; - reprap.GetGCodes()->QueueFileToPrint(&gc[4]); + reprap.GetGCodes()->QueueFileToPrint(fileBeingPrinted); } else if (StringStartsWith(gc, "M112") && !isdigit(gc[4])) // emergency stop { @@ -523,7 +523,7 @@ void Webserver::MessageStringToWebInterface(const char *s, bool error) } else { - gcodeReply.printf("%s", s); + gcodeReply.copy(s); } } @@ -794,17 +794,13 @@ void Webserver::HttpInterpreter::SendJsonResponse(const char* command) jsonResponseBuffer[ARRAY_UPB(jsonResponseBuffer)] = 0; if (webDebug) { - platform->Message(HOST_MESSAGE, "JSON response: "); - platform->Message(HOST_MESSAGE, jsonResponseBuffer); - platform->Message(HOST_MESSAGE, " queued\n"); + platform->Message(HOST_MESSAGE, "JSON response: %s queued\n", jsonResponseBuffer); } } else { jsonResponseBuffer[0] = 0; - platform->Message(HOST_MESSAGE, "KnockOut request: "); - platform->Message(HOST_MESSAGE, command); - platform->Message(HOST_MESSAGE, " not recognised\n"); + platform->Message(HOST_MESSAGE, "KnockOut request: %s not recognised\n", command); } if (mayKeepOpen) @@ -875,7 +871,7 @@ bool Webserver::HttpInterpreter::GetJsonResponse(const char* request, StringRef& else if (StringEquals(request, "upload_cancel")) { CancelUpload(); - response.printf("{\"err\":%d}", 0); + response.copy("{\"err\":0}"); } else if (StringEquals(request, "delete") && StringEquals(key, "name")) { @@ -933,7 +929,7 @@ bool Webserver::HttpInterpreter::GetJsonResponse(const char* request, StringRef& } else { - response.printf("{\"err\":1}"); + response.copy("{\"err\":1}"); } } else if (reprap.GetGCodes()->PrintingAFile() && webserver->fileInfoDetected) @@ -964,7 +960,7 @@ bool Webserver::HttpInterpreter::GetJsonResponse(const char* request, StringRef& } else if (StringEquals(request, "name")) { - response.printf("{\"myName\":\""); + response.copy("{\"myName\":\""); size_t j = response.strlen(); const char *myName = webserver->GetName(); for (size_t i = 0; i < SHORT_STRING_LENGTH; ++i) @@ -1136,6 +1132,9 @@ void Webserver::HttpInterpreter::GetStatusResponse(StringRef& response, uint8_t break; } + // Send fan RPM value + response.catf(",\"fanRPM\":%u", (unsigned int)platform->GetFanRPM()); + // Send the amount of buffer space available for gcodes response.catf(",\"buff\":%u", webserver->GetGcodeBufferSpace()); @@ -1723,8 +1722,7 @@ bool Webserver::FtpInterpreter::CharFromClient(char c) if (DebugEnabled()) { - scratchString.printf("FtpInterpreter::ProcessLine called with state %d:\n%s\n", state, clientMessage); - platform->Message(DEBUG_MESSAGE, scratchString); + platform->Message(DEBUG_MESSAGE, "FtpInterpreter::ProcessLine called with state %d:\n%s\n", state, clientMessage); } if (clientPointer > 1) // only process a new line if we actually received data @@ -2482,6 +2480,8 @@ bool Webserver::GetFileInfo(const char *directory, const char *fileName, GcodeFi const size_t overlap = 100; char buf[readSize + overlap + 1]; // need the +1 so we can add a null terminator bool foundLayerHeight = false; + unsigned int filamentsFound = 0, nFilaments; + float filaments[DRIVES - AXES]; // Get slic3r settings by reading from the start of the file. We only read the first 1K or so, everything we are looking for should be there. { @@ -2491,6 +2491,17 @@ bool Webserver::GetFileInfo(const char *directory, const char *fileName, GcodeFi { buf[sizeToRead] = 0; + // Search for filament usage (Cura puts it at the beginning of a G-code file) + nFilaments = FindFilamentUsed(buf, sizeToRead, filaments, DRIVES - AXES); + if (nFilaments != 0 && nFilaments >= filamentsFound) + { + filamentsFound = min(nFilaments, info.numFilaments); + for (unsigned int i = 0; i < filamentsFound; ++i) + { + info.filamentNeeded[i] = filaments[i]; + } + } + // Look for layer height foundLayerHeight = FindLayerHeight(buf, sizeToRead, info.layerHeight); @@ -2524,6 +2535,7 @@ bool Webserver::GetFileInfo(const char *directory, const char *fileName, GcodeFi // Now get the object height and filament used by reading the end of the file { + bool searchForFilaments = (filamentsFound == 0); size_t sizeToRead; if (info.fileSize <= readSize + overlap) { @@ -2539,7 +2551,6 @@ bool Webserver::GetFileInfo(const char *directory, const char *fileName, GcodeFi } unsigned long seekPos = info.fileSize - sizeToRead; // read on a 512b boundary size_t sizeToScan = sizeToRead; - unsigned int filamentsFound = 0; for (;;) { if (!f->Seek(seekPos)) @@ -2554,14 +2565,16 @@ bool Webserver::GetFileInfo(const char *directory, const char *fileName, GcodeFi buf[sizeToScan] = 0; // add a null terminator // Search for filament used - float filaments[DRIVES - AXES]; - unsigned int nFilaments = FindFilamentUsed(buf, sizeToScan, filaments, DRIVES - AXES); - if (nFilaments != 0 && nFilaments >= filamentsFound) + if (searchForFilaments) { - filamentsFound = min(nFilaments, info.numFilaments); - for (unsigned int i = 0; i < filamentsFound; ++i) + nFilaments = FindFilamentUsed(buf, sizeToScan, filaments, DRIVES - AXES); + if (nFilaments != 0 && nFilaments >= filamentsFound) { - info.filamentNeeded[i] = filaments[i]; + filamentsFound = min(nFilaments, info.numFilaments); + for (unsigned int i = 0; i < filamentsFound; ++i) + { + info.filamentNeeded[i] = filaments[i]; + } } } diff --git a/network/ethernet_sam.c b/network/ethernet_sam.c index d4a3ebd..39dca0a 100644 --- a/network/ethernet_sam.c +++ b/network/ethernet_sam.c @@ -47,7 +47,6 @@ #include "ethernet_sam.h" //#include "emac.h" #include "ethernet_phy.h" -#include "timer_mgt_sam.h" //#include "sysclk.h" /* lwIP includes */ #include "lwip/src/include/lwip/sys.h" @@ -69,7 +68,7 @@ #include "lwip/src/include/netif/etharp.h" #include "lwip/src/sam/include/netif/ethernetif.h" -#include "lwip_test.h" +#include "emac.h" extern void RepRapNetworkMessage(const char*); @@ -86,7 +85,7 @@ bool status_link_up() //*****************************AB -struct netif* GetConfiguration() +struct netif* ethernet_get_configuration() { return &gs_net_if; } @@ -119,13 +118,13 @@ static timers_info_t gs_timers_table[] = { /** * \brief Process timing functions. */ -static void timers_update(void) +void ethernet_timers_update(void) { static uint32_t ul_last_time; uint32_t ul_cur_time, ul_time_diff, ul_idx_timer; timers_info_t *p_tmr_inf; - ul_cur_time = sys_get_ms(); + ul_cur_time = millis(); ul_time_diff = ul_cur_time - ul_last_time; // we're using unsigned arithmetic, so this handles wrap around if (ul_time_diff) { @@ -176,7 +175,7 @@ static void ethernet_configure_interface(unsigned char ipAddress[], unsigned cha netif_set_default(&gs_net_if); /* Setup callback function for netif status change */ - netif_set_status_callback(&gs_net_if, status_callback); + netif_set_status_callback(&gs_net_if, ethernet_status_callback); /* Bring it up */ if (x_ip_addr.addr == 0) @@ -215,9 +214,6 @@ void start_ethernet(const unsigned char ipAddress[], const unsigned char netMask { /* Set hw and IP parameters, initialize MAC too */ ethernet_configure_interface(ipAddress, netMask, gateWay); - - /* Init timer service */ - sys_init_timing(); } @@ -228,7 +224,7 @@ void start_ethernet(const unsigned char ipAddress[], const unsigned char netMask * * \param netif Instance to network interface. */ -void status_callback(struct netif *netif) +void ethernet_status_callback(struct netif *netif) { char c_mess[20]; // 15 for IP address, 1 for \n, 1 for null, so 3 spare if (netif_is_up(netif)) @@ -250,15 +246,29 @@ void status_callback(struct netif *netif) /**0 * \brief Manage the Ethernet packets, if any received process them. * After processing any packets, manage the lwIP timers. +* + * \return Returns true if data has been processed. */ -//int HttpSend(); - -void ethernet_task(void) +bool ethernet_read(void) { - //HttpSend(); /* Run polling tasks */ - ethernetif_input(&gs_net_if); + bool data_read = ethernetif_input(&gs_net_if); /* Run periodic tasks */ - timers_update(); + ethernet_timers_update(); + + return data_read; +} + +/* + * \brief Sets the EMAC RX callback. It will be called when a new packet + * can be processed and should be called with a NULL parameter inside + * the actual callback. + * + * \param callback The callback to be called when a new packet is ready + */ +void ethernet_set_rx_callback(emac_dev_tx_cb_t callback) +{ + + ethernetif_set_rx_callback(callback); } diff --git a/network/ethernet_sam.h b/network/ethernet_sam.h index c69cebe..6c0a053 100644 --- a/network/ethernet_sam.h +++ b/network/ethernet_sam.h @@ -66,9 +66,9 @@ void init_ethernet(void); bool establish_ethernet_link(void); void start_ethernet(const unsigned char ipAddress[], const unsigned char netMask[], const unsigned char gateWay[]); -struct netif* GetConfiguration(); +struct netif* ethernet_get_configuration(); -static void timers_update(void); +void ethernet_timers_update(void); /** * \brief Status callback used to print address given by DHCP. @@ -76,13 +76,23 @@ static void timers_update(void); * \param netif Instance to network interface. * */ -void status_callback(struct netif *netif); +void ethernet_status_callback(struct netif *netif); /** * \brief Manage the ethernet packets, if any received process them. * + * \return Returns true if data has been processed. */ -void ethernet_task(void); +bool ethernet_read(void); + +/* + * \brief Sets the EMAC RX callback. It will be called when a new packet + * can be processed and should be called with a NULL parameter inside + * the actual callback. + * + * \param callback The callback to be called when a new packet is ready + */ +void ethernet_set_rx_callback(emac_dev_tx_cb_t callback); /// @cond 0 /**INDENT-OFF**/ diff --git a/network/timer_mgt_sam.c b/network/timer_mgt_sam.c deleted file mode 100644 index 007b220..0000000 --- a/network/timer_mgt_sam.c +++ /dev/null @@ -1,147 +0,0 @@ -/** - * \file - * - * \brief Timer management for lwIP example. - * - * Copyright (c) 2012 Atmel Corporation. All rights reserved. - * - * \asf_license_start - * - * \page License - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The name of Atmel may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * 4. This software may only be redistributed and used in connection with an - * Atmel microcontroller product. - * - * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE - * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * \asf_license_stop - * - */ - -//#include "board.h" -#include "timer_mgt_sam.h" -#include "include/tc.h" -#include "include/pmc.h" -//#include "sysclk.h" -#include "lwip/src/include/lwip/sys.h" -#include "lwip_test.h" - -volatile int ledState; -/** Clock tick count */ -static volatile uint32_t gs_ul_clk_tick; - -/** - * Interrupt handler for TC0 interrupt. - */ -//void TC0_Handler(void) -//{ - /* Remove warnings */ -// volatile uint32_t ul_dummy; - - /* Clear status bit to acknowledge interrupt */ -// ul_dummy = TC0->TC_CHANNEL[0].TC_SR; - - /* Increase tick */ -// gs_ul_clk_tick++; -//} - -void TC4_Handler() -{ - // You must do TC_GetStatus to "accept" interrupt - // As parameters use the first two parameters used in startTimer (TC1, 0 in this case) - TC_GetStatus(TC1, 1); - - /* Increase tick */ - gs_ul_clk_tick++; - - ledState = !ledState; -} - -/** - * \brief Initialize for timing operation. - */ -void sys_init_timing(void) -{ - uint32_t ul_div; - uint32_t ul_tcclks; - - /* Clear tick value */ - gs_ul_clk_tick = 0; - - startTimer(TC1,1,TC4_IRQn,4); - -} -// Start timer. Parameters are: - - // TC1 : timer counter. Can be TC0, TC1 or TC2 - // 0 : channel. Can be 0, 1 or 2 - // TC3_IRQn: irq number. See table. - // 40 : frequency (in Hz) - // The interrupt service routine is TC3_Handler. See table. -void startTimer(Tc *tc, uint32_t channel, IRQn_Type irq, uint32_t frequency) { - pmc_set_writeprotect(false); - pmc_enable_periph_clk((uint32_t)irq); - TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK4); - uint32_t rc = VARIANT_MCK/128/frequency; //128 because we selected TIMER_CLOCK4 above - TC_SetRA(tc, channel, rc/2); //50% high, 50% low - TC_SetRC(tc, channel, rc); - TC_Start(tc, channel); - tc->TC_CHANNEL[channel].TC_IER=TC_IER_CPCS; - tc->TC_CHANNEL[channel].TC_IDR=~TC_IER_CPCS; - NVIC_EnableIRQ(irq); -} -// Paramters table: -// TC0, 0, TC0_IRQn => TC0_Handler() -// TC0, 1, TC1_IRQn => TC1_Handler() -// TC0, 2, TC2_IRQn => TC2_Handler() -// TC1, 0, TC3_IRQn => TC3_Handler() -// TC1, 1, TC4_IRQn => TC4_Handler() -// TC1, 2, TC5_IRQn => TC5_Handler() -// TC2, 0, TC6_IRQn => TC6_Handler() -// TC2, 1, TC7_IRQn => TC7_Handler() -// TC2, 2, TC8_IRQn => TC8_Handler() - - -/** - * \brief Read for clock time (ms). - */ -uint32_t sys_get_ms(void) -{ - return gs_ul_clk_tick; -} - -#if (THIRDPARTY_LWIP_VERSION != 132) - -/* See lwip/sys.h for more information - Returns number of milliseconds expired - since lwip is initialized -*/ -u32_t sys_now(void) -{ - return (sys_get_ms()); -} - -#endif diff --git a/network/timer_mgt_sam.h b/network/timer_mgt_sam.h deleted file mode 100644 index 7ffd3b9..0000000 --- a/network/timer_mgt_sam.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * \file - * - * \brief Timer management definitions for lwIP example. - * - * Copyright (c) 2012 Atmel Corporation. All rights reserved. - * - * \asf_license_start - * - * \page License - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The name of Atmel may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * 4. This software may only be redistributed and used in connection with an - * Atmel microcontroller product. - * - * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE - * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * \asf_license_stop - * - */ - -#ifndef TIMER_MGT_SAM_H_INCLUDED -#define TIMER_MGT_SAM_H_INCLUDED - -#include "Arduino.h" - -#define CLOCK_CONF_SECOND 1000 - -void sys_init_timing(void); -extern uint32_t sys_get_ms(void); -void startTimer(Tc *tc, uint32_t channel, IRQn_Type irq, uint32_t frequency); - -extern volatile int ledState; - -#endif /* TIMER_MGT_SAM_H_INCLUDED */