From f0d55e0c8fb5fbaa8e9abd4388c3b31448dc31cc Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Sun, 1 Dec 2013 21:19:47 +0000 Subject: [PATCH 01/14] README updated. --- Configuration.h | 4 +- README | 101 ++++++++++++------------------------- Release/RepRapFirmware.bin | Bin 166132 -> 166132 bytes 3 files changed, 35 insertions(+), 70 deletions(-) diff --git a/Configuration.h b/Configuration.h index 2d4fe5e..b0c454d 100644 --- a/Configuration.h +++ b/Configuration.h @@ -24,8 +24,8 @@ Licence: GPL #define CONFIGURATION_H #define NAME "RepRapFirmware" -#define VERSION "0.28" -#define DATE "2013-11-30" +#define VERSION "0.29" +#define DATE "2013-12-01" #define LAST_AUTHOR "reprappro.com" // Other firmware that we might switch to be compatible with. diff --git a/README b/README index d681b95..f2dc09e 100644 --- a/README +++ b/README @@ -1,6 +1,4 @@ -RepRapFirmware - Main Program - -This firmware is intended to be a fully object-oriented highly modular control program for +This firmware is intended to be a fully object-oriented highly modular control program for RepRap self-replicating 3D printers. It owes a lot to Marlin and to the original RepRap FiveD_GCode. @@ -11,28 +9,29 @@ General design principles: * Control by RepRap G Codes. These are taken to be machine independent, though some may be unsupported. * Full use of C++ OO techniques, * Make classes hide their data, - * Make everything as stateless as possible, + * Make everything except the Platform class (see below) as stateless as possible, * No use of conditional compilation except for #include guards - if you need that, you should be forking the repository to make a new branch - let the repository take the strain, * Concentration of all machine-dependent defintions and code in Platform.h and Platform.cpp, * No specials for (X,Y) or (Z) - all movement is 3-dimensional, + * Except in Platform.h, use real units (mm, seconds etc) throughout the rest of the code wherever possible, * Try to be efficient in memory use, but this is not critical, * Labour hard to be efficient in time use, and this is critical, * Don't abhor floats - they work fast enough if you're clever, * Don't avoid arrays and structs/classes, * Don't avoid pointers, - * Use operator and function overloading where appropriate, particularly for vector algebra. - - + * Use operator and function overloading where appropriate. + + Naming conventions: - * #defines are all capitals with optional underscores between words + * #defines are all CAPITALS_WITH_OPTIONAL_UNDERSCORES_BETWEEN_WORDS * No underscores in other names - MakeReadableWithCapitalisation * Class names and functions start with a CapitalLetter * Variables start with a lowerCaseLetter * Use veryLongDescriptiveNames - - + + Structure: There are six main classes: @@ -42,7 +41,7 @@ There are six main classes: * Heat * Move * Platform, and - * Webserver + * Webserver RepRap: @@ -50,12 +49,12 @@ This is just a container class for the single instances of all the others, and o GCodes: -This class is fed GCodes, either from the web interface or from GCode files, interprests them, and requests -actions from the RepRap machine via the other classes. +This class is fed GCodes, either from the web interface, or from GCode files, or from a serial interface, +Interprets them, and requests actions from the RepRap machine via the other classes. Heat: -This class imlements all heating and temperature control in the RepRap machine. +This class implements all heating and temperature control in the RepRap machine. Move: @@ -76,36 +75,36 @@ interface to the RepRap machine. It uses the Knockout and Jquery Javascript lib When the software is running there is one single instance of each main class, and all the memory allocation is -done on initialisation. new/malloc should not be used in the general running code, and delete is never +done on initialization. new/malloc should not be used in the general running code, and delete is never used. Each class has an Init() function that resets it to its boot-up state; the constructors merely handle that memory allocation on startup. Calling RepRap.Init() calls all the other Init()s in the right sequence. -There are other ancilliary classes that are declared in the .h files for the master classes that use them. For +There are other ancillary classes that are declared in the .h files for the master classes that use them. For example, Move has a DDA class that implements a Bresenham/digital differential analyser. Timing: -There is a single interrupt chain entered via Platform.Interrupt(). This controls movement step timing, and -this chain of code should be the only place that volatile declarations and structure/variable-locking are +There is a single interrupt chain entered via Platform.Interrupt(). This controls movement step timing, and +this chain of code should be the only place that volatile declarations and structure/variable-locking are required. All the rest of the code is called sequentially and repeatedly as follows: -All the main classes have a Spin() function. These are called in a loop by the RepRap.Spin() function and implement -simple timesharing. No class does, or ever should, wait inside one of its functions for anything to happen or call +All the main classes have a Spin() function. These are called in a loop by the RepRap.Spin() function and implement +simple timesharing. No class does, or ever should, wait inside one of its functions for anything to happen or call any sort of delay() function. The general rule is: Can I do a thing? Yes - do it No - set a flag/timer to remind me to do it next-time-I'm-called/at-a-future-time and return. - -The restriction this strategy places on almost all the code in the firmware (that it must execute quickly and -never cause waits or delays) is balanced by the fact that none of that code needs to worry about synchronicity, -locking, or other areas of code accessing items upon which it is working. As mentioned, only the interrupt -chain needs to concern itself with such problems. Unlike movement, heating (including PID controllers) does -not need the fast precision of timing that interrupts alone can offer. Indeed, most heating code only needs + +The restriction this strategy places on almost all the code in the firmware (that it must execute quickly and +never cause waits or delays) is balanced by the fact that none of that code needs to worry about synchronization, +locking, or other areas of code accessing items upon which it is working. As mentioned, only the interrupt +chain needs to concern itself with such problems. Unlike movement, heating (including PID controllers) does +not need the fast precision of timing that interrupts alone can offer. Indeed, most heating code only needs to execute a couple of times a second. -Most data is transferred bytewise, with classes typically containg code like this: +Most data is transferred bytewise, with classes' Spin() functions typically containing code like this: Is a byte available for me? Yes @@ -115,52 +114,18 @@ Most data is transferred bytewise, with classes typically containg code like thi Act on the contents of my buffer No Return - No - Return - -Note that it is simple to raise the "priority" of any class's activities relative to the others by calling its + No + Return + +Note that it is simple to raise the "priority" of any class's activities relative to the others by calling its Spin() function more than once from RepRap.Spin(). --------------------------------------------------------------------------------- - -This version is for the Arduino Due with an Ethernet shield with an SD card and -the RepRapPro Ltd Arduino DUE to Sanguinololu Adaptor. - -(See https://github.com/reprappro/ARMadaptor) - -Test compiling was with Arduino 1.5.2. - -Upload it to your Due, put the ether shield on it, plug in a -network cable, and copy the files in the SD-image folder onto the SD. - -The IP address for your browser is 192.168.1.14. - -You can change that in Platform.h if you need to: - -#define IP0 192 -#define IP1 168 -#define IP2 1 -#define IP3 14 - -The password when the web browser asks for it is "reprap" with no quotes. - -The password is intended to stop fidgety friends or colleagues from playing -with your RepRap. It is not intended to stop international cyberterrorists -hiding in a hollowed-out volcano from controlling your RepRap from the next -continent. For example, it is transmitted unencrypted... - -If you open the Arduino serial monitor (115200 baud) you should see a -log of incoming HTTP requests and a record of any G Codes it thinks it -has to act upon. - -Actually acting upon them will be added shortly :-) - ------------- -Version 0.2 pre-alpha +Version 0.2n beta -Started: 18 November 2012 -This date: 12 June 2013 +Started: 2012-11-18 +This README dated: 2013-12-01 Adrian Bowyer RepRap Professional Ltd diff --git a/Release/RepRapFirmware.bin b/Release/RepRapFirmware.bin index 0d67651e5d54de99231a60599c4c18a747ecff8a..2d5ca35d286fe7386e972d6e4774167f5dcc9601 100755 GIT binary patch delta 41 xcmew|k?YGuu7(!IElgs;qLvIg3Mq*tsVNE!Mh1q)x`sx&28P?UgPBg60stBK3>W|a delta 41 xcmew|k?YGuu7(!IElgs;q81D~3Mq*tsVNE!Mh1q)x`u|j#s=H9gPBg60stB03>W|a From bfb02c8fb52057134854587881c3b04f91523342 Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Tue, 3 Dec 2013 09:55:00 +0000 Subject: [PATCH 02/14] README updated to include library details and links to documentation. --- Platform.h | 2 +- README | 15 ++++++++++++++- Release/RepRapFirmware.bin | Bin 166132 -> 166132 bytes 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Platform.h b/Platform.h index 5877066..4d7b236 100644 --- a/Platform.h +++ b/Platform.h @@ -125,7 +125,7 @@ Licence: GPL #define STANDBY_TEMPERATURES {ABS_ZERO, ABS_ZERO} // We specify one for the bed, though it's not needed #define ACTIVE_TEMPERATURES {ABS_ZERO, ABS_ZERO} #define COOLING_FAN_PIN 34 -#define HEAT_ON 0 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4) +#define HEAT_ON 1 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4) #define AD_RANGE 1023.0//16383 // The A->D converter that measures temperatures gives an int this big as its max value diff --git a/README b/README index f2dc09e..dfb2d48 100644 --- a/README +++ b/README @@ -3,6 +3,19 @@ RepRap self-replicating 3D printers. It owes a lot to Marlin and to the original RepRap FiveD_GCode. +This is the version for the RepRap Duet: + + http://blog.think3dprint3d.com/2013/12/Duet-Arduino-Due-compatible-3DPrinter-controller.html + +To edit and compile this you will also need the libraries in this repository: + + https://github.com/jmgiacalone/Arduino-libraries + +A complete uploadable executable version is in the directory Release/RepRapFirmware.bin in this +repository. For details of how to flash it to a Duet see here: + + http://www.reprappro.com/documentation/RepRapPro_Firmware#Flashing_the_Firmware + General design principles: @@ -125,7 +138,7 @@ Spin() function more than once from RepRap.Spin(). Version 0.2n beta Started: 2012-11-18 -This README dated: 2013-12-01 +This README dated: 2013-12-03 Adrian Bowyer RepRap Professional Ltd diff --git a/Release/RepRapFirmware.bin b/Release/RepRapFirmware.bin index 2d5ca35d286fe7386e972d6e4774167f5dcc9601..c8cf26b102b66916324939eaf5cbd16b5b9fa51b 100755 GIT binary patch delta 54 zcmew|k?YGut_??SF)B_zdP`4slj=?dx4kb49GE_A*#}{L{_eY@VDI|R3=Pc!x3>%2 IW_+?10RM0tRsaA1 delta 54 zcmew|k?YGut_??SF)B|!dP`5%neoGaM%A4PZhK!8I52(Kv=74i{M~y;!QN(p+uH?h IGd@`h0OwO1v;Y7A From 820b17857aebee65beadd9d44b22f06a217eccc2 Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Tue, 3 Dec 2013 09:56:27 +0000 Subject: [PATCH 03/14] This time with correct heater settings... --- Platform.h | 2 +- Release/RepRapFirmware.bin | Bin 166132 -> 166132 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Platform.h b/Platform.h index 4d7b236..5877066 100644 --- a/Platform.h +++ b/Platform.h @@ -125,7 +125,7 @@ Licence: GPL #define STANDBY_TEMPERATURES {ABS_ZERO, ABS_ZERO} // We specify one for the bed, though it's not needed #define ACTIVE_TEMPERATURES {ABS_ZERO, ABS_ZERO} #define COOLING_FAN_PIN 34 -#define HEAT_ON 1 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4) +#define HEAT_ON 0 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4) #define AD_RANGE 1023.0//16383 // The A->D converter that measures temperatures gives an int this big as its max value diff --git a/Release/RepRapFirmware.bin b/Release/RepRapFirmware.bin index c8cf26b102b66916324939eaf5cbd16b5b9fa51b..2d5ca35d286fe7386e972d6e4774167f5dcc9601 100755 GIT binary patch delta 54 zcmew|k?YGut_??SF)B|!dP`5%neoGaM%A4PZhK!8I52(Kv=74i{M~y;!QN(p+uH?h IGd@`h0OwO1v;Y7A delta 54 zcmew|k?YGut_??SF)B_zdP`4slj=?dx4kb49GE_A*#}{L{_eY@VDI|R3=Pc!x3>%2 IW_+?10RM0tRsaA1 From 1a8ffb2d0055eec02c7d05f7150724dd2b377d00 Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Tue, 3 Dec 2013 14:41:49 +0000 Subject: [PATCH 04/14] Second degree (ruled quadratic surface) bed plane compensation added. Probe three points to get plane compensation. Probe 4 [0 = min, 1 = max: (x0, y0), (x0, y1), (x1, y1), (x1, y0) in that order] to get second degree compensation. Also M115 print version added. --- Configuration.h | 6 ++-- GCodes.cpp | 19 ++++++---- Move.cpp | 71 ++++++++++++++++++++++++++----------- Move.h | 47 +++++++++++++++++++++--- Platform.h | 4 +++ Release/RepRapFirmware.bin | Bin 166132 -> 166604 bytes 6 files changed, 113 insertions(+), 34 deletions(-) diff --git a/Configuration.h b/Configuration.h index b0c454d..37ac790 100644 --- a/Configuration.h +++ b/Configuration.h @@ -24,8 +24,8 @@ Licence: GPL #define CONFIGURATION_H #define NAME "RepRapFirmware" -#define VERSION "0.29" -#define DATE "2013-12-01" +#define VERSION "0.30" +#define DATE "2013-12-03" #define LAST_AUTHOR "reprappro.com" // Other firmware that we might switch to be compatible with. @@ -60,7 +60,7 @@ enum Compatibility #define STANDBY_INTERRUPT_RATE 2.0e-4 // Seconds -#define NUMBER_OF_PROBE_POINTS 3 +#define NUMBER_OF_PROBE_POINTS 4 #define Z_DIVE 5.0 // Height from which to probe the bed (mm) #define SILLY_Z_VALUE -9999.0 diff --git a/GCodes.cpp b/GCodes.cpp index a9646f2..1f9c856 100644 --- a/GCodes.cpp +++ b/GCodes.cpp @@ -670,7 +670,7 @@ bool GCodes::SetSingleZProbeAtAPosition(GCodeBuffer *gb) if(gb->Seen('S')) { zProbesSet = true; - reprap.GetMove()->SetProbedBedPlane(); + reprap.GetMove()->SetProbedBedEquation(); } return true; } else @@ -682,7 +682,7 @@ bool GCodes::SetSingleZProbeAtAPosition(GCodeBuffer *gb) if(gb->Seen('S')) { zProbesSet = true; - reprap.GetMove()->SetProbedBedPlane(); + reprap.GetMove()->SetProbedBedEquation(); } return true; } @@ -691,20 +691,20 @@ bool GCodes::SetSingleZProbeAtAPosition(GCodeBuffer *gb) return false; } -// This probes multiple points on the bed (usually three in a -// triangle), then sets the bed transformation to compensate +// This probes multiple points on the bed (three in a +// triangle or four in the corners), then sets the bed transformation to compensate // for the bed not quite being the plane Z = 0. bool GCodes::DoMultipleZProbe() { if(DoSingleZProbe()) probeCount++; - if(probeCount >= NUMBER_OF_PROBE_POINTS) + if(probeCount >= reprap.GetMove()->NumberOfProbePoints()) { probeCount = 0; zProbesSet = true; reprap.GetMove()->SetZProbing(false); - reprap.GetMove()->SetProbedBedPlane(); + reprap.GetMove()->SetProbedBedEquation(); return true; } return false; @@ -1072,9 +1072,10 @@ void GCodes::HandleReply(bool error, bool fromLine, char* reply, char gMOrT, int return; } - if( (gMOrT == 'M' && code == 105) || (gMOrT == 'G' && code == 998) ) + if( (gMOrT == 'M' && code == 105) || (gMOrT == 'G' && code == 998)) { platform->GetLine()->Write(response); + platform->GetLine()->Write(" "); platform->GetLine()->Write(reply); platform->GetLine()->Write("\n"); return; @@ -1340,6 +1341,10 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) result = false; break; + case 115: // Print firmware version + snprintf(reply, STRING_LENGTH, "FIRMWARE_NAME:%s FIRMWARE_VERSION:%s ELECTRONICS:%s DATE:%s", NAME, VERSION, ELECTRONICS, DATE); + break; + case 109: // Depricated if(gb->Seen('S')) { diff --git a/Move.cpp b/Move.cpp index fd14e73..df1d108 100644 --- a/Move.cpp +++ b/Move.cpp @@ -147,25 +147,20 @@ void Move::Init() tanXY = 0.0; tanYZ = 0.0; tanXZ = 0.0; - zPlaneSet = false; + zEquationSet = false; lastZHit = 0.0; zProbing = false; - xBedProbePoints[0] = 0.2*platform->AxisLength(X_AXIS); - yBedProbePoints[0] = 0.2*platform->AxisLength(Y_AXIS); - zBedProbePoints[0] = 0.0; - probePointSet[0] = false; + for(uint8_t point = 0; point < NUMBER_OF_PROBE_POINTS; point++) + { + xBedProbePoints[point] = (0.2 + 0.6*(float)(point%2))*platform->AxisLength(X_AXIS); + yBedProbePoints[point] = (0.2 + 0.6*(float)(point/2))*platform->AxisLength(Y_AXIS); + zBedProbePoints[point] = 0.0; + probePointSet[point] = unset; + } - xBedProbePoints[1] = 0.8*platform->AxisLength(X_AXIS); - yBedProbePoints[1] = 0.2*platform->AxisLength(Y_AXIS); - zBedProbePoints[1] = 0.0; - probePointSet[1] = false; - - xBedProbePoints[2] = 0.5*platform->AxisLength(X_AXIS); - yBedProbePoints[2] = 0.8*platform->AxisLength(Y_AXIS); - zBedProbePoints[2] = 0.0; - probePointSet[2] = false; + secondDegreeCompensation = false; lastTime = platform->Time(); longWait = lastTime; @@ -609,28 +604,64 @@ void Move::SetIdentityTransform() aC = 0.0; } + void Move::Transform(float xyzPoint[]) { xyzPoint[X_AXIS] = xyzPoint[X_AXIS] + tanXY*xyzPoint[Y_AXIS] + tanXZ*xyzPoint[Z_AXIS]; xyzPoint[Y_AXIS] = xyzPoint[Y_AXIS] + tanYZ*xyzPoint[Z_AXIS]; - xyzPoint[Z_AXIS] = xyzPoint[Z_AXIS] + aX*xyzPoint[X_AXIS] + aY*xyzPoint[Y_AXIS] + aC; + if(secondDegreeCompensation) + xyzPoint[Z_AXIS] = xyzPoint[Z_AXIS] + SecondDegreeTransformZ(xyzPoint[X_AXIS], xyzPoint[Y_AXIS]); + else + xyzPoint[Z_AXIS] = xyzPoint[Z_AXIS] + aX*xyzPoint[X_AXIS] + aY*xyzPoint[Y_AXIS] + aC; +// platform->GetLine()->Write(xyzPoint[Y_AXIS]); +// platform->GetLine()->Write('\n'); } void Move::InverseTransform(float xyzPoint[]) { - xyzPoint[Z_AXIS] = xyzPoint[Z_AXIS] - (aX*xyzPoint[X_AXIS] + aY*xyzPoint[Y_AXIS] + aC); + if(secondDegreeCompensation) + xyzPoint[Z_AXIS] = xyzPoint[Z_AXIS] - SecondDegreeTransformZ(xyzPoint[X_AXIS], xyzPoint[Y_AXIS]); + else + xyzPoint[Z_AXIS] = xyzPoint[Z_AXIS] - (aX*xyzPoint[X_AXIS] + aY*xyzPoint[Y_AXIS] + aC); xyzPoint[Y_AXIS] = xyzPoint[Y_AXIS] - tanYZ*xyzPoint[Z_AXIS]; xyzPoint[X_AXIS] = xyzPoint[X_AXIS] - (tanXY*xyzPoint[Y_AXIS] + tanXZ*xyzPoint[Z_AXIS]); } -void Move::SetProbedBedPlane() +void Move::SetProbedBedEquation() { + if(AllProbeCoordinatesSet(0) && AllProbeCoordinatesSet(1) && AllProbeCoordinatesSet(2)) + { + secondDegreeCompensation = AllProbeCoordinatesSet(3); + if(secondDegreeCompensation) + { + /* + * Transform to a ruled-surface quadratic. The corner points for interpolation are indexed: + * + * ^ [1] [2] + * | + * Y + * | + * | [0] [3] + * -----X----> + * + * These are the scaling factors to apply to x and y coordinates to get them into the + * unit interval [0, 1]. + */ + aX = 1.0/(xBedProbePoints[3] - xBedProbePoints[0]); + aY = 1.0/(yBedProbePoints[1] - yBedProbePoints[0]); + zEquationSet = true; + return; + } + } else + { + platform->Message(HOST_MESSAGE, "Attempt to set bed compensation before all probe points have been recorded."); + return; + } + float xkj, ykj, zkj; float xlj, ylj, zlj; float a, b, c, d; // Implicit plane equation - what we need to do a proper job - if(!probePointSet[0] || !probePointSet[1] || !probePointSet[2]) - platform->Message(HOST_MESSAGE, "Attempt to set bed plane when probing is incomplete!\n"); xkj = xBedProbePoints[1] - xBedProbePoints[0]; ykj = yBedProbePoints[1] - yBedProbePoints[0]; zkj = zBedProbePoints[1] - zBedProbePoints[0]; @@ -644,7 +675,7 @@ void Move::SetProbedBedPlane() aX = -a/c; aY = -b/c; aC = -d/c; - zPlaneSet = true; + zEquationSet = true; } // FIXME diff --git a/Move.h b/Move.h index 97c246c..24e39dd 100644 --- a/Move.h +++ b/Move.h @@ -52,6 +52,14 @@ enum MovementType eMove = 4 }; +enum PointCoordinateSet +{ + unset = 0, + xSet = 1, + ySet = 2, + zSet = 4 +}; + class LookAhead { @@ -166,8 +174,11 @@ class Move float xBedProbePoint(int index); float yBedProbePoint(int index); float zBedProbePoint(int index); + int NumberOfProbePoints(); + bool AllProbeCoordinatesSet(int index); void SetZProbing(bool probing); - void SetProbedBedPlane(); + void SetProbedBedEquation(); + float SecondDegreeTransformZ(float x, float y); float GetLastProbedZ(); void SetAxisCompensation(int8_t axis, float tangent); void SetIdentityTransform(); @@ -225,12 +236,13 @@ class Move float xBedProbePoints[NUMBER_OF_PROBE_POINTS]; float yBedProbePoints[NUMBER_OF_PROBE_POINTS]; float zBedProbePoints[NUMBER_OF_PROBE_POINTS]; - bool probePointSet[NUMBER_OF_PROBE_POINTS]; + uint8_t probePointSet[NUMBER_OF_PROBE_POINTS]; float aX, aY, aC; // Bed plane explicit equation z' = z + aX*x + aY*y + aC - bool zPlaneSet; + bool zEquationSet; float tanXY, tanYZ, tanXZ; // 90 degrees + angle gives angle between axes float lastZHit; bool zProbing; + bool secondDegreeCompensation; float longWait; }; @@ -425,6 +437,7 @@ inline void Move::SetXBedProbePoint(int index, float x) return; } xBedProbePoints[index] = x; + probePointSet[index] |= xSet; } inline void Move::SetYBedProbePoint(int index, float y) @@ -435,6 +448,7 @@ inline void Move::SetYBedProbePoint(int index, float y) return; } yBedProbePoints[index] = y; + probePointSet[index] |= ySet; } inline void Move::SetZBedProbePoint(int index, float z) @@ -445,7 +459,7 @@ inline void Move::SetZBedProbePoint(int index, float z) return; } zBedProbePoints[index] = z; - probePointSet[index] = true; + probePointSet[index] |= zSet; } inline float Move::xBedProbePoint(int index) @@ -473,6 +487,31 @@ inline float Move::GetLastProbedZ() return lastZHit; } +inline bool Move::AllProbeCoordinatesSet(int index) +{ + return probePointSet[index] == xSet | ySet | zSet; +} + +/* + * Transform to a ruled-surface quadratic. The corner points for interpolation are indexed: + * + * ^ [1] [2] + * | + * Y + * | + * | [0] [3] + * -----X----> + * + * The values of x and y are transformed to put them in the interval [0, 1]. + */ +inline float Move::SecondDegreeTransformZ(float x, float y) +{ + x = (x - xBedProbePoints[0])*aX; + y = (y - yBedProbePoints[0])*aY; + return (1.0 - x)*(1.0 - y)*zBedProbePoints[0] + x*(1.0 - y)*zBedProbePoints[3] + (1.0 - x)*y*zBedProbePoints[1] + x*y*zBedProbePoints[2]; +} + + inline void Move::SetAxisCompensation(int8_t axis, float tangent) { switch(axis) diff --git a/Platform.h b/Platform.h index 5877066..029fc7f 100644 --- a/Platform.h +++ b/Platform.h @@ -34,6 +34,10 @@ Licence: GPL #ifndef PLATFORM_H #define PLATFORM_H +// What are we supposed to be running on + +#define ELECTRONICS "Duet" + // Language-specific includes #include diff --git a/Release/RepRapFirmware.bin b/Release/RepRapFirmware.bin index 2d5ca35d286fe7386e972d6e4774167f5dcc9601..808b9280e4642aabeb730ec9dbe09fa1c0e2c18b 100755 GIT binary patch delta 23737 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 QUS?CJ^8PFEf(hXN0T_3~UH||9 From ad4246e6af4931e50cb612ac0426cecc8561c055 Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Wed, 4 Dec 2013 11:53:50 +0000 Subject: [PATCH 05/14] Better version of the ORMAXIS.G file. --- Configuration.h | 2 +- Platform.h | 2 +- SD-image/gcodes/ormaxis.g | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Configuration.h b/Configuration.h index 37ac790..5dd4bfa 100644 --- a/Configuration.h +++ b/Configuration.h @@ -24,7 +24,7 @@ Licence: GPL #define CONFIGURATION_H #define NAME "RepRapFirmware" -#define VERSION "0.30" +#define VERSION "0.31" #define DATE "2013-12-03" #define LAST_AUTHOR "reprappro.com" diff --git a/Platform.h b/Platform.h index 029fc7f..2f31637 100644 --- a/Platform.h +++ b/Platform.h @@ -129,7 +129,7 @@ Licence: GPL #define STANDBY_TEMPERATURES {ABS_ZERO, ABS_ZERO} // We specify one for the bed, though it's not needed #define ACTIVE_TEMPERATURES {ABS_ZERO, ABS_ZERO} #define COOLING_FAN_PIN 34 -#define HEAT_ON 0 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4) +#define HEAT_ON 1 // 0 for inverted heater (eg Duet v0.6) 1 for not (e.g. Duet v0.4) #define AD_RANGE 1023.0//16383 // The A->D converter that measures temperatures gives an int this big as its max value diff --git a/SD-image/gcodes/ormaxis.g b/SD-image/gcodes/ormaxis.g index 303ec06..4a29962 100644 --- a/SD-image/gcodes/ormaxis.g +++ b/SD-image/gcodes/ormaxis.g @@ -29,11 +29,7 @@ T0; Select extruder M140 S65; Set bed temperature G1 Z5 F200 ; lift nozzle G28 X0 Y0; home X and Y axes -G1 X55 F2000; move to bed probe point -G28 Z0; zero Z -G32 ; Probe bed G1 X2 Y50 F2000; Go to wait for warm position -G1 Z0 F200 M116; Wait for all temperatures ;M109 S205 ; wait for temperature to be reached G90 ; use absolute coordinates From dd978290b5e3c3f781b638e427e511d8700ed35e Mon Sep 17 00:00:00 2001 From: Adrian Bowyer Date: Wed, 4 Dec 2013 15:36:26 +0000 Subject: [PATCH 06/14] Emergency stop added to the web interface (and Home All taken away, as you almost never want to home Z with the other two.) SD files tidied. --- Configuration.h | 4 +- GCodes.cpp | 3 +- Move.cpp | 15 +-- Move.h | 5 +- Release/RepRapFirmware.bin | Bin 166604 -> 166692 bytes RepRapFirmware.cpp | 2 + SD-image/gcodes/bigcirc.g | 202 ------------------------------ SD-image/gcodes/circle.g | 250 +++++++++++++++++++++++++++++-------- SD-image/gcodes/square.g | 12 +- SD-image/www/reprap.htm | 7 +- Webserver.cpp | 18 +-- 11 files changed, 237 insertions(+), 281 deletions(-) delete mode 100644 SD-image/gcodes/bigcirc.g diff --git a/Configuration.h b/Configuration.h index 5dd4bfa..191ebf9 100644 --- a/Configuration.h +++ b/Configuration.h @@ -24,8 +24,8 @@ Licence: GPL #define CONFIGURATION_H #define NAME "RepRapFirmware" -#define VERSION "0.31" -#define DATE "2013-12-03" +#define VERSION "0.32" +#define DATE "2013-12-04" #define LAST_AUTHOR "reprappro.com" // Other firmware that we might switch to be compatible with. diff --git a/GCodes.cpp b/GCodes.cpp index 1f9c856..6fcad09 100644 --- a/GCodes.cpp +++ b/GCodes.cpp @@ -1328,8 +1328,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb) reprap.SetDebug(gb->GetIValue()); break; - case 112: // Emergency stop - reprap.EmergencyStop(); + case 112: // Emergency stop - aced upon in Webserver break; case 114: // Deprecated diff --git a/Move.cpp b/Move.cpp index df1d108..54f2ba8 100644 --- a/Move.cpp +++ b/Move.cpp @@ -553,7 +553,7 @@ void Move::Interrupt() { // No - it's still live. Step it and return. - dda->Step(true); + dda->Step(); return; } @@ -1009,11 +1009,14 @@ void DDA::Start(bool noTest) active = true; } -void DDA::Step(bool noTest) +void DDA::Step() { - if(!active && noTest) + if(!active) return; + if(!move->active) + return; + uint8_t axesMoving = 0; uint8_t extrudersMoving = 0; @@ -1022,7 +1025,6 @@ void DDA::Step(bool noTest) counter[drive] += delta[drive]; if(counter[drive] > 0) { - if(noTest) platform->Step(drive); counter[drive] -= totalSteps; @@ -1076,11 +1078,10 @@ void DDA::Step(bool noTest) stepCount++; active = stepCount < totalSteps; - if(noTest) - platform->SetInterrupt(timeStep); + platform->SetInterrupt(timeStep); } - if(!active && noTest) + if(!active) { for(int8_t drive = 0; drive < DRIVES; drive++) move->liveCoordinates[drive] = myLookAheadEntry->MachineToEndPoint(drive); // Don't use SetLiveCoordinates because that applies the transform diff --git a/Move.h b/Move.h index 24e39dd..82f21da 100644 --- a/Move.h +++ b/Move.h @@ -117,7 +117,7 @@ protected: DDA(Move* m, Platform* p, DDA* n); MovementProfile Init(LookAhead* lookAhead, float& u, float& v); void Start(bool noTest); - void Step(bool noTest); + void Step(); bool Active(); DDA* Next(); float InstantDv(); @@ -189,9 +189,6 @@ class Move friend class DDA; - -// protected: - private: diff --git a/Release/RepRapFirmware.bin b/Release/RepRapFirmware.bin index 808b9280e4642aabeb730ec9dbe09fa1c0e2c18b..dc4960c57e1aae11c583eb076bd363bba20b8c59 100755 GIT binary patch delta 24009 zcmcJ%3s_Xu_dk60nE~bkG6)EW=nNwYDhVP9nhB^!F5WMxsR<%Fs3@qVb{kOqmX)b( zb+od)=Cu;Z(3H@!(z1fGved#`UaJFM=FI*5>@$N=zwiI|yzl$GFOQ40_F8MNz4qGs z>^q)br`f(UAWJkZ0);KCWj_R}FWxw}$(JS8-_vgM=XQ8;4Su zaF`h41%Gk9U8VOE-*6B?e>f<+jX0VHE0ResnyHwm2t1NSH!1onZhthEUQmo7el%Ix zKV<7ioG~fCs=T_aTa`{|BOah;Wek}|Hz_-j!L(LsNd48FBt^l2w3SK>UC&4=d-U;x!(?9&9XX++uIPN0Xs5{tpXoOxT7DMxqwr8Z?v1g== zUT35vc%cPv0(c|An+)Di@Q5oQZ^T`W=M0}p<$8c&nG_M)K3`YM)wS3xJ*X7wrAkgG zo~QEyqJl2F&mfg?-#AJqy6C!qWkE+;an{i|m61fy9Mur=HeI7i8ESEN9)=wGevK)! zLhqKFJ2jC0G4(7)?cH4b-TH{e!YF2uN+~*>IM+>5kt&TC?$_8))>k!mUYYEN6_))`>eot3XGB-U3<&Ivg|_ z-k=BF7W6vM8K8qfuL4~TIuP^<(429^-SYWrq?RIufX(NOen>sz;Pgb`1%*(1U6-K~ z7aZa0I9;2J4zXEurY6GtmLu(OykHP|3H<)r>!r}JengBM_3}tRG^vB%Uy5KKLO0bN z^p(`MBWw@ymCMDpN2-5Is%->P54ZTlha%OpMaJupig%0<%i$j}1S*jR&8f(TSr`Wx)7JE6Psv*HX(Dny`RuNJ3-LKau%KFaYTUj#OlP+jxbOM z4(P-}M_W)j@o@(+sw8Dn8=21{BWCKvv9w=c3^_z62Ii5mbVs1kZ)~E5TS&hStR}sy zD}s6kk!P!`+IR8;YUnhRSI_CG;a&keS)CdCi~`)+I1A4QCRINcpRWjL@93&;BSuu$ zb~h3-hFX5!#LcX9e{c4G+`dq&T64A*{j2&|PV}qLf zxs|BeO380zgt(A?+P{FDua0~4U84Qd883v33q0ZC3VLC{5b_y~%jg+?8_t9!Yq)iQ z(SUt`I$E4Dao|%LSc3>ZJf!-U~ zbJAz_Y(y#-w)33KBcG+FqGT%qbA$=bd)rd#I-7k{9GhZxBgT0CUDTAiZdQUSN=sUfGxtCVKdv2C7 z#TG8+R8JW?p2&Xnhh`3dMeh~**|4743oho-G$~A6Og+QW)h!ygt22i`$s3<_>V+_o zc*4X8x4+&X4_BOc@nf!Tb3YAt45n_=pGUqM9)`{mCT?_xiSN5IO#U0gV&Qc48>9S) zT9w+OxO;R=*M$yd(B=vggIyWLswyHrC+TIg9&6*r@eg$W7#*h_F6({|-5WG!OoY1s z18M&;3EIx+Nnzq{Nb6|Xm}F8(w~Z-F_}Z=)c3%4~x_x;Xtcn#ZUXLN)G+*9@z-u!C z^lPg7kG)4oK23QnjwDo1d~7@+9$Ga%RLyeiW7_oV@jbOaBmQCH6OJ%^lmQcNk@NJ< zgpKmo_odGwd04}>0VGv#nYfN8ed7F;ziH4CKVsHWYFQn>|Qw| z?(UkOlouvGOb1TcoyhXdMV`&5-J5__EI*2Q2Y3V0tj#|H-2k{nqn?-<6q%;sc0zJ& zbb$UeUHL?G@-p;>Fj0k)I(pQ({4K8SpRNS}rt z7AjtIhl(zjYDH9j+sO76x>}a45vt+o8g3jwhqXk;;kfKLRN6W}4wV+Du^>*Hf_@h& z9zyPK=$L|uawlg!ljU0q*g|UyQnkOLtAvV$&{{%W1^v|TL&7v})68knWH+5MElT^Q zBOZPjpwov|OiS%*ch?>0WPi!N{Qzft*c4dBJ#?;tbt!2%^DU*X*TQIeVOme^D0Ea* z-W4j|rV)h+Si8~tNA9Tehk#C1D?*ZUbfGf12Fx+?r9aqz+ct+7( z`*Un|XAGD#Vq;Oyvlw1N#VN48fU2kWAvH8}dOx`Xw$w8i_3aGkOV>>Asa+)NJDs6o zTl&@XLXtsy7DYudpI?K{9$#!e1O5^4CoL#iqy5#!{4Ycv#HZ+G4D~B!EFcr9Yes}T z;AkGvaB%<@v&Vp60=xzIiYCw8sXqUxcR;byi!+Dt+yL6mv_E>5#N7VN9xD3T2QKII zX|?(Ra1n5u-ZOR54wL2IL4KWfDo#}|X^~b>DOQs)+wm2t8$Xygxhg1Ihgj?#9h4U; zZuGD=>WECeZFlAktn$y+K=$rvf5=|OidekH8B-RP)&?#N(6btE@)f-rtE9Jo~A659WI%H8#!aC35H~d&VzoZuzN3^{O(Te~(Ks`{y zMGdUhELqCSV^9yI3juFcZ+s?&mowE?H$3M@0_UJ+A!3s!L=5oIOV0~(DNOyv>SXiJ zgp8)zii2{;xx|>v_8@#RfX4yL0q<8|sIYi#p08d~xrC5ktM4pN@J>=rC`cGC+74zG z6JHodwCmAZLd0lCh?q=QzW9|~U>8|ju!0cdJ7~`kvAaD)%(P{#XdB(FTv;)wB2q}J z&4AKaz-_wxrF89LSyk zf%?5#*8NSFURZyP(`OuT`$o0Te3{v()?UzXV*s-O>*$tO7m+*~wW>rL=8DIBDv-|6Kw>10TC%xgh}Wu^vs^t%HEmRXst;U1w=XtGv^aR}QKmrmSE zH_~~nY8|rHLbM7D7&`Gqr%rsUx_Vs{ksJSU8f;QqLJ_gAQ8Q;E%*+y@KX!PKd_Zr7#FO9&4FTKHE_+cPZpk=*rDq zL&rFR#9DX2w(oCn#vn1!(+1PQ7n{e2&vG%xV`ESynM#I7Sa@tnCv~)BOEGCff7%kG zDISLbHdn)S%%$!v)6@6c6NH3pe{r9^Yj(FBe{q*RE;|_~58Lg=?5;U%>*FuJ^-+g- zO+&KK33?msG1&&_t)*{l?G#>V56zCuxp}SoVy^oS_1HW?<7xWs)`%gzQ*R1Ee3=D> zXg=y)`e&iwM*)KY!vVJ+573VTo&uN)V9wPI({Rs&egUwGCT{CP9JC0(f1{hWtukMB zuu67AC4U7Kz*>-P&_*c4ACJh?Dz5GeGGc*jV#(Rbg8A%o~w?-Y}BG<9d3_6j=lc20vY?lW4n)2JQ@e~JLZ=$f5z0UhnV z8WrM3TDvn2o9xRwGyP;aP1qGZ^;@@kLy&ma{`C!xXh8i1iYHo7H$f>$AgHT$|J<){ z_>+ugzf5Izh?s6uWC!o(YCDe)&@VzM9mWLcOAoG=^dpr*8)4;Pb)K@RGudF`MLpfN zYZS54d%MPyWIAm3OwAh-(M$MXqjTxUyVJ;YYTX?}{-WV~^2p1yU{3_8rAzkoBirf0 zJyXak8oGB1xktcb_4j({JBR?X=fP z42?7O_`t{Fgvoq&-ur)C`(E0B4Pr)SkoYDwzV|lSKtFvikyOy8_d1b_H01pVQbZHp zA7da+zLCUnja(dC?Mcg7{Vt(?Dl8nhM>>37OE?H^ z&bI~5tx%jN@m%u1+*!s0W;J+$mVc=X$q`io=0+fmNl>0U7!{PmUZ zG|mObPPZHgH@{Gsba6IPuT>mtURY5A`SX>hE-nD)NQLTrDe$kA$C_7G%!j0`a@)nl z;QUm<-TAprriIPz#p z%2%0*)Kwj0PN`%~KF`jf3Vq;e_oI5#z-LMKw)HPp@uJgiG+iqG9;3{LI7mle>9+ixyNhpO=iLPaQ z_YBs4A4H{PUOFSanZyPg9B_whA;!T+VP7N zm=tucvf!MF#GW&y37L|rzd~HrDo>{C)J3oD6500LWnE3ov2UFgTjw&a=dtFZWr1QZ zXO29s2Z|NWKrz#E{6L!E-)J;Zvkj~D_+!mumT?9@G1)%c=jagGSoShz>NRJ^2rezM zj_A{#V(#}}mWFx`Ks~S7(=Y;MJ5w&R+BzkIk(CpT%jB;w3kSBYE|(w9%Mdt<-)I;@ zQ}a@DdHgQ%Ic*Mg=2s<*U@MBia<}zK=UGXYL}Dl8J515V?H4h#F*at@wzN~;SraEd z?DUrhf=f1D#`|mma-lbu(n}H93URw5>mqB0j=AS$9Fu$2R}{9lu=Cr}pa-Qr>O5;k zfLUQI!0i{+UwZ!zSI*{Ku5n(*FpNnVfRO+*fQ?lX-JGmP#a$PS+#S2uLqH|l{bf^w*&E~N@a$7x)fTrm>-e@9ylsyMZvD~eO)t3$l z%3CT$i~4fMt}3Q_)4^6+fjE^66o)%j`Py=mBT#$}mjm2pRa0O8FRoXXamIJwYA*RlAUoH3O!j zH94-lj`e_5pmzg~1I_}x^%*ReEXXCVwy#B7qh|0T-Ckd{)mNt5`i5Q6)BoqQQW%$Q z*o5!r0?qu$XpWTgMpdkSpttye-byT*c=01ieNlDm1;vm-pGx~Ui*!0^pvWs;0Cu4# zv3TB>KN4%XH%=LLg%DZA8DEeplm2LA`v*|^>-gaHsQvV^@3D63D|Cl{%Uw#dJXJ2t z?I(PB#j7wjWPUCaF2Z=kKHHMqxp~3jT~CK=ro0XK248c2(%8CFA41`M>sfU>*aNYS zo9ydS-`lv@{JcQ%TO0al`BLGmw3vGt0bgKai_wud6A#1@U^EjvD+^|}68r{JPg3)d z@SNveBZUpp0$r|PweEAVkL7T~)4qByK+y~3qU&tTRfUj=p+8t$@4-cop}3Lpy2mJY z_0J6!U!fO{7?YKbL5*V#%vr(4#;YE3?lrcx(t#v@;qe2jvy$th569+yXKGsaiZh-DQ+Oy1splt8?yd z`fk{?`T?!iH?uJ|@WWY8(#vB@5NJJZIGP$h-Iiaq*@TS`JX$FQaQXPkey7p3(dI8D zF22i!?%7IFftv2BV^X%B)eD!P6X%L-REme76LujMI!&Pd)@g*sAzOL%)#APL-jKgC zxAjG5d?V&DF1|XbDS+_eET^ezb1}2%wr;i6SM885J3Q9Kw&l{3T-&jYn~OE*Uh8a0 z4@9$N5i`PzpE|vhq28p-Q8u06dGT}UQMU8P#wZ2VV=Md&xREAp#_v>#xzvlQKTal( z(0(5m7hSZUkWO%o`RtA^413bP$dh)EGb#l|8OdLo|17SLFL(^t_yp# z=BU7_^X!m0U&$Ola6a^0EzsjggR9Gftx1p2IwHPKtLx&1g<#uV0PDJg z*sTbPTh24 z1s^8SxMOiM+oObR!_`HVxkUWV1^pz}c`I_4W(SLcydyS4@|jFM59*l9AdHd%XLl2p zWb?Si!a#xD8WBH`HJ*aT`!23=$0DOyTa|C(8aJCRngYcUwCY#{uXfQdk98(z>0igf z3vM~HF;)~7`0p7ZK0hW)3hN(_ZQ|>V1;t5lGt$mn$uD>`Wt?Oj$%2PPOjS_<|l0>iptB@dzzCZZL0k7>bt)jd0;N^zxCgbJeaD zN4S?_>GQIn6?5HeP~h~vaqK%h1^ZOQ(_JVOft29$H+E1&Y&c0Zn}s zn+xEBt{edf6c5`U?!&zC_jyufFDMRtM10TAcC&%vR$C^1Z?bW#FPpeHV*#tuqo@+M zE^HXLfu+XDsmo?=L*e0Iw9jCg`AMib+~v=<>MJ=;JkD|J2fm0_j>e9cZOy7cv&}zb z1MpyDpyKJo8>Iu$_T97U{Y*;H?6_s}mpAXbOj_|9S4Vk-)QYoF0hhEZ|Id8J|HQ>A zumT>~Y+CV%E5fIxacc#>qmY9rXvNXUaz!dA#wUUEU8CuHIqpBvrcXMllRw5?@-kd^ z)2L4qM|A#2p$lALK65%)*os1Tnf}bziZdS+`W6b!cLn;i-glu;Uzt{{4OY-~pY{x$ z>N1$PSU)T*esx{V*W+V+jQ;fL3q6kPLFLell8^BwT=oRum!U$QkJ3q>@?G`bA9WU|UAjjG|j}S)Of0H%bEWCaUYnqTmRR zGB2!mv}ugg89qePH%>;YAMk>T0AeV@-6NmYhm8H@Y*03VA#@=k{Oi zzcCy2Jnhno8FnsqS)LZBg}jhoLSEz6V8pbO*SR;?ccT-cSO+$0#XS!8tp^DCv$f(3 zc*=U$hi*d&#sidNVQVj`k7=2(d3w4m+vUy?0#<9q*HK0rJC_tY3xzy^R%OO2VXUvK zLN=BGW6YV=vaw7UD}%8SbkvvO=9@Ow<@`4WY|x5xVdxUphht%~_Jib<6Rn=lA`|OQ$`5Q* zHE|hQ@kK~`K>Cq0T}Z2gl*mit|v-_NdPIIt*(0 zCBb0Nkex`vG^-VVwfhTtnLFtLS0h?ITx<|B?ZBYC90ypu#v9)iIHh3m{n^DD>m@gu zgdX{-YtKN*7{jJvHlWWoh4p3~Nh=n+(`sww)rd4=`79;6s(BQ1YX}WF-PQcEbCghy zDcNKF937omU5Y9%1%45wuutb%XQtpUcQZ3MEaw7n{4jlM#iv|bX0aKJ^zj@}^eh)P zPdn9+Bya|;7~;|6T^6GPJ-Vt9;$Lkfh7>D0;2Q{G0<_5njrbSR6lsIwGR6ribsiZm5|yStTvP@t>RCu1qULXm zB#dtRW+G{zu5Tjnlqme$PH}ZER+Z<+6i(-i`Z?PQ3+8CW<4*l_c8=-Bc)(Wr*XYD= z2jCQT$Q4)V&4%sN+@O*Hk^13Ytv$+y(>p$ZbmUD;(ZCuzXszB z9hW(DSbc<9QL7Mleq1^POA4%rG1&_$Iik_7c$^4i8^Urq@vtjwD6YfBAKbz6q^%J< zd$i(F+t|*724>fpdtV6&%H|ByR7!klv4RG)QvBVflJPYgo+gUrS?%+&R>n_xUqNG4>X#(;2XSZBDIen+g}nbmo2ZyBYvpBA&5mVt*oR-@EdV5%ax zs?ue6tmo^fG+7^86^U-i(y!5m@5kWLYuuSkJb;~fW>UXTF<&RmUV(n|@q^h`E$(q@ z#M>B2*}dIbM3fDCSy-5bl?PyZZrVHw>9f>zW>SBSTa8YDZXvI4Iq|b{kF~eQIO`45 z>!!k4uV)3-v*V+&7*R5?>GW9RUHZfM#o30((PR5k`a@!Hp67B&oUm46)l6W(zB z5JO&}fBX<(HaLrl%Z2#4%)97T-raC$#2im!kw(8)Zgs<_#nU)%`C%6&t`XZON>E-pbJsU$YP_>Th~>zlOG zPvgl9y6C5rgtb_@Xs|nGUxh|&z&6Qy`lkrK(!e;6IMiYzT6He{{->_#b7bv~VVhth~U?U6n!gD@fg=<;r7FxbOW zwujP)-=UUk?cQrrwsdOQ&S=E$$WcpEe;!s;X*XcXnO2;Fn#OwKrd=%{art_sxY$lo z4d7o!)cqj~^Y|tHUeMHFob`zQt$eP_?*&RsU4Q3&*mHGSTp@{j1bH9#ZzI7uq0@*R zT^jL4Y)D38s@I6i7CjEJPN4-Kc+JlF-!6e82IzWLZ(F$=QUZgSnIK6fuCMeyZ#POzg*gQ!?ehrOE#qn09G%}eW`iZz9jwc!S zJA>{@`~Mm>zP)4+0?jXw$^UWb>+IL4%GTqo_j&s6uMyEN9Q7WeC1H?%c|Uu4B02p86E5TT z)8BrLN%i2NO;nD@`jsatH%h)+X_t*VW^lv6J?6PBoNnUA;5Pi8%E*q9+CX}hCjS;S z^Q_B1M=xlxi%G)tumxVQgNxH6HQadsJIrVX?))Uj1&`8jMu0A_^kDS!N_g2$_^Qfj zEwd-17hSSzb2Q=$u5$Ddr*)>Cm6DVnfP>=zl(mCa{T4y`(Nn+0gb%VCpnuS=785)j zd>`#i>i8{{ETPGb;n89CSivtROHyjReavHB?@{)aAW zOi*{n1K|Xr+4?Cx*w`r{)OAJ@1K4H9ueb~m1N`vrqZD=f>EqJc3GlxRzz%BgRiCa8NWx74+H$0V+KHrS=jzu_%lMEx3O~cQ z-F>kinO%MLVlpweV;9el;K^C1pT4=vM%10jmLT0=5J80XhIW19|}1{L>rw1He(h3BXo3um^Auz^eEg zC0Dwd|H8#$7diboC^o(XoZ}$9ET@>>M@}|2;if6^Qo~x?N6_HUG5&W>_F=2V+jyhG z&SioH4m&C}PGow>y+SQcajV2--j^yE5Y%FK3>;c~cc;0vwj*9UX2fqOZo}$f=%j4u z*aJhyob7#v(qU+7D?8%7&QBFFDuB*Pj8hd&|5j@ZZBDQ?_2?jN9@# zhp$2ENKGuGl^NEsY|mX^@(WRY;XR zvV~0Hj`d4S%aKRe#`TVMJ+)jdAycW}?>&QR5z{j)u6W6HlV<)N5%sJ?Uv)<6K@|9Y zqvd0DWis0i{6))t9}%S-?R{EP(1E*GS$alN8kF~5UvS4-LVy0Q&)^Yd)b&Jif)2Uf6EENvU5_Ih>89&F`3M{R=6aWQ7h(Dj zK+9Ps8xGWCsOHA-s4ipJaeTcb_EBOePa+;`d%T{xV=bd)H@f=`hP0S&xzUMCpvQ0Y zB%5f{jq$v8EX}<+8Ar=IZyNAd9H(xkkTmML`9*k+T&b|${C=JMtYtp>_CEUatr6;< zu`iBC5PzV_xBIC3xY-OIET+)1+XnS^pKLRI<91JTJFHN%G2pPN>$+QC)k8=$DkZ!k zXzYQzdo~0`;2tYbRC@5~2wR2rOxE4j@KB1e6xTI4>%+d*q!weHZSs`D7%3jT=sUKd zge(?)0QEFk^INVcLKYc^AO^yT?pi7ne25 zHds=YbQAO@4%a0wdl*FwWIb-!JezTIIoZa=busOqrxqvSaD&ZSd!=$goVNl6kCs}N zCTj6ZOmq1T|E5ya3kTkdT8~?=4E!zIUF$4ohOk~TFVL~X24@%3f+#AFDnaLN9U$G= zxYA@5+-zJS;&sncQJnEVQfw02ZG76m?iKi4x7F>&R(07G#GUOOIP6Jkoy<9ZTcgQk z{aMl%JFH8k{9-l*a$@*l#S*5stcq!V4nAkb6Iy+-)0!>U$?Ry9XG@ng>?8D4EYx%d z6;F8$53w=5PdvyZK4W8rWI0(ONE}&2r^x{Bm zl__Ixl-s&VCfUO;x78xkouKd<{r1lYa+hBFvy=HLaNX7cvMd;~xiX~$RSZh&dxhq< zPWzZ$)(>L69oM+Sf!QVgc;F(yYykTbDgZ4vQX}pjEybvTPrz**;fc%7Y~G;f#ijDy z6DQ_KMFl7Ie6sj77}Ib*@3gM+#1%+TDFY`K9JlpX=Z^di;F#o0vBfT{%SJ!^YcW3C zo?^t{`4U@jB(ie=`FW??`Zb1tqwv9yr;{gP)*9IcR_9|b<-POsS%^q4xAm}m>(d_m z59rHcf!`m@f7&F*jGYg?$d33IBAE8IRG=n;s%T^j=dZ-sPn2ntK_`>efp8lezAr zakH9;(d=`)B^i3oFUs%U`6o$gJU-9;bar!$ag-+(`=oXpo2>)IZng13CukpnHoKFJ z0lkUtZI02d!?T}kLpU5-O}}qWOdpDJM*`Sg>Nw!305f1IzyjC`_yV9i$lZHwEO)O% zz9Ok0#$(+~)9>_)T4YPBGMdLv}nn`!Nw7* zN}XM%1QnF3ytn$XJB2AZY-@ee(JRNh$^O)loWsRO*702#|0wo^BO17#+4bfFEEnnN z*A(Ixg-_RQt-~XxZWwvU%Q5wXvS-}U_clk3c$KJJGr76_c~w`GUeVlJpQk~ml*A|iXN`( zA~+o=&U296kLC0p>mcg5*B#FSyWWo(_JiF|*j1&x*8z8~>g2wt$ZEGU z$aUDAT%;FNI0f;zsK)v*8Ba5lTGuasLXAs*618>|Jr233k~EK@lc8Nyx~6n8q5fN z@QNW1vPzh<26~_ zJrK$X7;^z(fG9v$Ksum5U>x9az-+)%0D0k#PWl4qw*lMfJ)044TBGa(GY4Qrw~wf* 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 delta 23864 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 P{1>05RFP+)3i!VOKJ`&F diff --git a/RepRapFirmware.cpp b/RepRapFirmware.cpp index f996db3..17b4c43 100644 --- a/RepRapFirmware.cpp +++ b/RepRapFirmware.cpp @@ -246,6 +246,7 @@ void RepRap::EmergencyStop() for(i = 0; i < HEATERS; i++) platform->SetHeater(i, 0.0); + // We do this twice, to avoid an interrupt switching // a drive back on. move->Exit() should prevent // interrupts doing this. @@ -259,6 +260,7 @@ void RepRap::EmergencyStop() platform->Disable(i); } } + platform->Message(HOST_MESSAGE, "Emergency Stop! Reset the controller to continue."); } diff --git a/SD-image/gcodes/bigcirc.g b/SD-image/gcodes/bigcirc.g deleted file mode 100644 index 8073416..0000000 --- a/SD-image/gcodes/bigcirc.g +++ /dev/null @@ -1,202 +0,0 @@ -G1 F2000 -G1 X180 Y100 -G1 X179.96 Y102.525 -G1 X179.841 Y105.048 -G1 X179.641 Y107.566 -G1 X179.363 Y110.077 -G1 X179.005 Y112.577 -G1 X178.569 Y115.065 -G1 X178.054 Y117.538 -G1 X177.461 Y119.993 -G1 X176.792 Y122.428 -G1 X176.045 Y124.841 -G1 X175.223 Y127.23 -G1 X174.326 Y129.591 -G1 X173.355 Y131.922 -G1 X172.311 Y134.222 -G1 X171.194 Y136.488 -G1 X170.007 Y138.717 -G1 X168.75 Y140.908 -G1 X167.424 Y143.058 -G1 X166.031 Y145.165 -G1 X164.573 Y147.227 -G1 X163.049 Y149.242 -G1 X161.464 Y151.208 -G1 X159.816 Y153.122 -G1 X158.11 Y154.984 -G1 X156.345 Y156.791 -G1 X154.524 Y158.542 -G1 X152.649 Y160.234 -G1 X150.721 Y161.866 -G1 X148.743 Y163.436 -G1 X146.716 Y164.943 -G1 X144.642 Y166.386 -G1 X142.524 Y167.762 -G1 X140.364 Y169.071 -G1 X138.163 Y170.31 -G1 X135.925 Y171.48 -G1 X133.65 Y172.579 -G1 X131.342 Y173.605 -G1 X129.003 Y174.557 -G1 X126.635 Y175.436 -G1 X124.24 Y176.239 -G1 X121.822 Y176.966 -G1 X119.381 Y177.617 -G1 X116.921 Y178.19 -G1 X114.444 Y178.685 -G1 X111.953 Y179.102 -G1 X109.45 Y179.44 -G1 X106.938 Y179.699 -G1 X104.418 Y179.878 -G1 X101.894 Y179.978 -G1 X99.3685 Y179.998 -G1 X96.8434 Y179.938 -G1 X94.3215 Y179.798 -G1 X91.8052 Y179.579 -G1 X89.2971 Y179.281 -G1 X86.7997 Y178.903 -G1 X84.3154 Y178.447 -G1 X81.8467 Y177.913 -G1 X79.3962 Y177.301 -G1 X76.9661 Y176.612 -G1 X74.5591 Y175.847 -G1 X72.1774 Y175.006 -G1 X69.8234 Y174.09 -G1 X67.4995 Y173.101 -G1 X65.208 Y172.038 -G1 X62.9512 Y170.904 -G1 X60.7314 Y169.699 -G1 X58.5506 Y168.425 -G1 X56.4112 Y167.082 -G1 X54.3153 Y165.673 -G1 X52.2648 Y164.198 -G1 X50.262 Y162.659 -G1 X48.3087 Y161.057 -G1 X46.407 Y159.395 -G1 X44.5587 Y157.674 -G1 X42.7657 Y155.895 -G1 X41.0297 Y154.06 -G1 X39.3525 Y152.172 -G1 X37.7357 Y150.231 -G1 X36.181 Y148.24 -G1 X34.6899 Y146.202 -G1 X33.264 Y144.117 -G1 X31.9045 Y141.988 -G1 X30.613 Y139.818 -G1 X29.3906 Y137.607 -G1 X28.2385 Y135.359 -G1 X27.1581 Y133.076 -G1 X26.1502 Y130.76 -G1 X25.2159 Y128.414 -G1 X24.3562 Y126.039 -G1 X23.5719 Y123.638 -G1 X22.8638 Y121.213 -G1 X22.2326 Y118.768 -G1 X21.6789 Y116.303 -G1 X21.2032 Y113.823 -G1 X20.8061 Y111.328 -G1 X20.488 Y108.823 -G1 X20.2491 Y106.308 -G1 X20.0897 Y103.787 -G1 X20.01 Y101.263 -G1 X20.01 Y98.7371 -G1 X20.0897 Y96.2126 -G1 X20.2491 Y93.6918 -G1 X20.488 Y91.1773 -G1 X20.8061 Y88.6716 -G1 X21.2032 Y86.1773 -G1 X21.6789 Y83.6966 -G1 X22.2326 Y81.2323 -G1 X22.8638 Y78.7866 -G1 X23.5719 Y76.3621 -G1 X24.3562 Y73.9612 -G1 X25.2159 Y71.5862 -G1 X26.1502 Y69.2395 -G1 X27.1581 Y66.9235 -G1 X28.2385 Y64.6405 -G1 X29.3906 Y62.3927 -G1 X30.613 Y60.1824 -G1 X31.9045 Y58.0118 -G1 X33.264 Y55.8831 -G1 X34.6899 Y53.7983 -G1 X36.181 Y51.7596 -G1 X37.7357 Y49.769 -G1 X39.3525 Y47.8284 -G1 X41.0297 Y45.9399 -G1 X42.7657 Y44.1052 -G1 X44.5587 Y42.3262 -G1 X46.407 Y40.6048 -G1 X48.3087 Y38.9425 -G1 X50.262 Y37.3412 -G1 X52.2648 Y35.8022 -G1 X54.3153 Y34.3273 -G1 X56.4112 Y32.9178 -G1 X58.5506 Y31.5752 -G1 X60.7314 Y30.3008 -G1 X62.9512 Y29.0959 -G1 X65.208 Y27.9617 -G1 X67.4995 Y26.8993 -G1 X69.8234 Y25.9097 -G1 X72.1774 Y24.994 -G1 X74.5591 Y24.1531 -G1 X76.9661 Y23.3877 -G1 X79.3961 Y22.6988 -G1 X81.8467 Y22.0869 -G1 X84.3154 Y21.5526 -G1 X86.7996 Y21.0966 -G1 X89.2971 Y20.7192 -G1 X91.8052 Y20.4208 -G1 X94.3215 Y20.2018 -G1 X96.8434 Y20.0623 -G1 X99.3685 Y20.0025 -G1 X101.894 Y20.0224 -G1 X104.418 Y20.1221 -G1 X106.938 Y20.3014 -G1 X109.45 Y20.5601 -G1 X111.953 Y20.898 -G1 X114.444 Y21.3148 -G1 X116.921 Y21.81 -G1 X119.381 Y22.3831 -G1 X121.822 Y23.0336 -G1 X124.24 Y23.7609 -G1 X126.635 Y24.5641 -G1 X129.003 Y25.4425 -G1 X131.342 Y26.3953 -G1 X133.65 Y27.4214 -G1 X135.925 Y28.5199 -G1 X138.163 Y29.6896 -G1 X140.364 Y30.9294 -G1 X142.524 Y32.2381 -G1 X144.642 Y33.6143 -G1 X146.716 Y35.0567 -G1 X148.743 Y36.5638 -G1 X150.721 Y38.1341 -G1 X152.649 Y39.7662 -G1 X154.524 Y41.4582 -G1 X156.345 Y43.2086 -G1 X158.11 Y45.0157 -G1 X159.816 Y46.8775 -G1 X161.464 Y48.7923 -G1 X163.049 Y50.7581 -G1 X164.573 Y52.7731 -G1 X166.031 Y54.8351 -G1 X167.424 Y56.9421 -G1 X168.75 Y59.092 -G1 X170.007 Y61.2827 -G1 X171.194 Y63.5121 -G1 X172.311 Y65.7777 -G1 X173.355 Y68.0775 -G1 X174.326 Y70.4092 -G1 X175.223 Y72.7703 -G1 X176.045 Y75.1585 -G1 X176.792 Y77.5716 -G1 X177.461 Y80.007 -G1 X178.054 Y82.4623 -G1 X178.569 Y84.9351 -G1 X179.005 Y87.4229 -G1 X179.363 Y89.9232 -G1 X179.641 Y92.4336 -G1 X179.841 Y94.9515 -G1 X179.96 Y97.4745 -G1 X180 Y100 - diff --git a/SD-image/gcodes/circle.g b/SD-image/gcodes/circle.g index 29d267b..8073416 100644 --- a/SD-image/gcodes/circle.g +++ b/SD-image/gcodes/circle.g @@ -1,52 +1,202 @@ G1 F2000 -G1 X70 Y50 -G1 X69.8358 Y52.5575 -G1 X69.3459 Y55.0731 -G1 X68.5383 Y57.5053 -G1 X67.4264 Y59.8144 -G1 X66.0283 Y61.9622 -G1 X64.367 Y63.9137 -G1 X62.4698 Y65.6366 -G1 X60.3679 Y67.1029 -G1 X58.0957 Y68.2883 -G1 X55.6906 Y69.1734 -G1 X53.192 Y69.7436 -G1 X50.641 Y69.9897 -G1 X48.0795 Y69.9076 -G1 X45.5496 Y69.4986 -G1 X43.0927 Y68.7694 -G1 X40.7492 Y67.732 -G1 X38.5577 Y66.4034 -G1 X36.554 Y64.8056 -G1 X34.7711 Y62.9646 -G1 X33.2382 Y60.9107 -G1 X31.9806 Y58.6777 -G1 X31.0189 Y56.3022 -G1 X30.3688 Y53.8232 -G1 X30.0411 Y51.2814 -G1 X30.0411 Y48.7186 -G1 X30.3688 Y46.1768 -G1 X31.0189 Y43.6978 -G1 X31.9806 Y41.3223 -G1 X33.2382 Y39.0893 -G1 X34.7711 Y37.0354 -G1 X36.554 Y35.1944 -G1 X38.5577 Y33.5966 -G1 X40.7492 Y32.268 -G1 X43.0927 Y31.2306 -G1 X45.5496 Y30.5014 -G1 X48.0795 Y30.0924 -G1 X50.641 Y30.0103 -G1 X53.192 Y30.2564 -G1 X55.6906 Y30.8266 -G1 X58.0957 Y31.7117 -G1 X60.3678 Y32.8971 -G1 X62.4698 Y34.3634 -G1 X64.367 Y36.0863 -G1 X66.0283 Y38.0378 -G1 X67.4264 Y40.1856 -G1 X68.5383 Y42.4947 -G1 X69.3459 Y44.9269 -G1 X69.8358 Y47.4425 -G1 X70 Y50 +G1 X180 Y100 +G1 X179.96 Y102.525 +G1 X179.841 Y105.048 +G1 X179.641 Y107.566 +G1 X179.363 Y110.077 +G1 X179.005 Y112.577 +G1 X178.569 Y115.065 +G1 X178.054 Y117.538 +G1 X177.461 Y119.993 +G1 X176.792 Y122.428 +G1 X176.045 Y124.841 +G1 X175.223 Y127.23 +G1 X174.326 Y129.591 +G1 X173.355 Y131.922 +G1 X172.311 Y134.222 +G1 X171.194 Y136.488 +G1 X170.007 Y138.717 +G1 X168.75 Y140.908 +G1 X167.424 Y143.058 +G1 X166.031 Y145.165 +G1 X164.573 Y147.227 +G1 X163.049 Y149.242 +G1 X161.464 Y151.208 +G1 X159.816 Y153.122 +G1 X158.11 Y154.984 +G1 X156.345 Y156.791 +G1 X154.524 Y158.542 +G1 X152.649 Y160.234 +G1 X150.721 Y161.866 +G1 X148.743 Y163.436 +G1 X146.716 Y164.943 +G1 X144.642 Y166.386 +G1 X142.524 Y167.762 +G1 X140.364 Y169.071 +G1 X138.163 Y170.31 +G1 X135.925 Y171.48 +G1 X133.65 Y172.579 +G1 X131.342 Y173.605 +G1 X129.003 Y174.557 +G1 X126.635 Y175.436 +G1 X124.24 Y176.239 +G1 X121.822 Y176.966 +G1 X119.381 Y177.617 +G1 X116.921 Y178.19 +G1 X114.444 Y178.685 +G1 X111.953 Y179.102 +G1 X109.45 Y179.44 +G1 X106.938 Y179.699 +G1 X104.418 Y179.878 +G1 X101.894 Y179.978 +G1 X99.3685 Y179.998 +G1 X96.8434 Y179.938 +G1 X94.3215 Y179.798 +G1 X91.8052 Y179.579 +G1 X89.2971 Y179.281 +G1 X86.7997 Y178.903 +G1 X84.3154 Y178.447 +G1 X81.8467 Y177.913 +G1 X79.3962 Y177.301 +G1 X76.9661 Y176.612 +G1 X74.5591 Y175.847 +G1 X72.1774 Y175.006 +G1 X69.8234 Y174.09 +G1 X67.4995 Y173.101 +G1 X65.208 Y172.038 +G1 X62.9512 Y170.904 +G1 X60.7314 Y169.699 +G1 X58.5506 Y168.425 +G1 X56.4112 Y167.082 +G1 X54.3153 Y165.673 +G1 X52.2648 Y164.198 +G1 X50.262 Y162.659 +G1 X48.3087 Y161.057 +G1 X46.407 Y159.395 +G1 X44.5587 Y157.674 +G1 X42.7657 Y155.895 +G1 X41.0297 Y154.06 +G1 X39.3525 Y152.172 +G1 X37.7357 Y150.231 +G1 X36.181 Y148.24 +G1 X34.6899 Y146.202 +G1 X33.264 Y144.117 +G1 X31.9045 Y141.988 +G1 X30.613 Y139.818 +G1 X29.3906 Y137.607 +G1 X28.2385 Y135.359 +G1 X27.1581 Y133.076 +G1 X26.1502 Y130.76 +G1 X25.2159 Y128.414 +G1 X24.3562 Y126.039 +G1 X23.5719 Y123.638 +G1 X22.8638 Y121.213 +G1 X22.2326 Y118.768 +G1 X21.6789 Y116.303 +G1 X21.2032 Y113.823 +G1 X20.8061 Y111.328 +G1 X20.488 Y108.823 +G1 X20.2491 Y106.308 +G1 X20.0897 Y103.787 +G1 X20.01 Y101.263 +G1 X20.01 Y98.7371 +G1 X20.0897 Y96.2126 +G1 X20.2491 Y93.6918 +G1 X20.488 Y91.1773 +G1 X20.8061 Y88.6716 +G1 X21.2032 Y86.1773 +G1 X21.6789 Y83.6966 +G1 X22.2326 Y81.2323 +G1 X22.8638 Y78.7866 +G1 X23.5719 Y76.3621 +G1 X24.3562 Y73.9612 +G1 X25.2159 Y71.5862 +G1 X26.1502 Y69.2395 +G1 X27.1581 Y66.9235 +G1 X28.2385 Y64.6405 +G1 X29.3906 Y62.3927 +G1 X30.613 Y60.1824 +G1 X31.9045 Y58.0118 +G1 X33.264 Y55.8831 +G1 X34.6899 Y53.7983 +G1 X36.181 Y51.7596 +G1 X37.7357 Y49.769 +G1 X39.3525 Y47.8284 +G1 X41.0297 Y45.9399 +G1 X42.7657 Y44.1052 +G1 X44.5587 Y42.3262 +G1 X46.407 Y40.6048 +G1 X48.3087 Y38.9425 +G1 X50.262 Y37.3412 +G1 X52.2648 Y35.8022 +G1 X54.3153 Y34.3273 +G1 X56.4112 Y32.9178 +G1 X58.5506 Y31.5752 +G1 X60.7314 Y30.3008 +G1 X62.9512 Y29.0959 +G1 X65.208 Y27.9617 +G1 X67.4995 Y26.8993 +G1 X69.8234 Y25.9097 +G1 X72.1774 Y24.994 +G1 X74.5591 Y24.1531 +G1 X76.9661 Y23.3877 +G1 X79.3961 Y22.6988 +G1 X81.8467 Y22.0869 +G1 X84.3154 Y21.5526 +G1 X86.7996 Y21.0966 +G1 X89.2971 Y20.7192 +G1 X91.8052 Y20.4208 +G1 X94.3215 Y20.2018 +G1 X96.8434 Y20.0623 +G1 X99.3685 Y20.0025 +G1 X101.894 Y20.0224 +G1 X104.418 Y20.1221 +G1 X106.938 Y20.3014 +G1 X109.45 Y20.5601 +G1 X111.953 Y20.898 +G1 X114.444 Y21.3148 +G1 X116.921 Y21.81 +G1 X119.381 Y22.3831 +G1 X121.822 Y23.0336 +G1 X124.24 Y23.7609 +G1 X126.635 Y24.5641 +G1 X129.003 Y25.4425 +G1 X131.342 Y26.3953 +G1 X133.65 Y27.4214 +G1 X135.925 Y28.5199 +G1 X138.163 Y29.6896 +G1 X140.364 Y30.9294 +G1 X142.524 Y32.2381 +G1 X144.642 Y33.6143 +G1 X146.716 Y35.0567 +G1 X148.743 Y36.5638 +G1 X150.721 Y38.1341 +G1 X152.649 Y39.7662 +G1 X154.524 Y41.4582 +G1 X156.345 Y43.2086 +G1 X158.11 Y45.0157 +G1 X159.816 Y46.8775 +G1 X161.464 Y48.7923 +G1 X163.049 Y50.7581 +G1 X164.573 Y52.7731 +G1 X166.031 Y54.8351 +G1 X167.424 Y56.9421 +G1 X168.75 Y59.092 +G1 X170.007 Y61.2827 +G1 X171.194 Y63.5121 +G1 X172.311 Y65.7777 +G1 X173.355 Y68.0775 +G1 X174.326 Y70.4092 +G1 X175.223 Y72.7703 +G1 X176.045 Y75.1585 +G1 X176.792 Y77.5716 +G1 X177.461 Y80.007 +G1 X178.054 Y82.4623 +G1 X178.569 Y84.9351 +G1 X179.005 Y87.4229 +G1 X179.363 Y89.9232 +G1 X179.641 Y92.4336 +G1 X179.841 Y94.9515 +G1 X179.96 Y97.4745 +G1 X180 Y100 diff --git a/SD-image/gcodes/square.g b/SD-image/gcodes/square.g index e989736..2fb1ecd 100644 --- a/SD-image/gcodes/square.g +++ b/SD-image/gcodes/square.g @@ -1,11 +1,11 @@ G1 X55 Y5 F2000 -G1 Y55 -G1 X5 +G1 Y180 +G1 X180 G1 Y5 -G1 X30 G1 X55 -G1 Y55 ; Confusing: F20 -G1 Y55 -G1 X5 +G1 Y180 +G1 X180 G1 Y5 +G1 X55 +M0 diff --git a/SD-image/www/reprap.htm b/SD-image/www/reprap.htm index cf42515..72b0825 100644 --- a/SD-image/www/reprap.htm +++ b/SD-image/www/reprap.htm @@ -185,7 +185,7 @@ function heatRowHTML(heater, hNumber) - + - mm + mm