Marlin emulation implemented. Pretty much working, but not extensively tested.
This commit is contained in:
parent
bd51a7c3f0
commit
68e0f833df
7 changed files with 131 additions and 37 deletions
|
@ -28,6 +28,20 @@ Licence: GPL
|
||||||
#define DATE "2012-11-18"
|
#define DATE "2012-11-18"
|
||||||
#define LAST_AUTHOR "reprappro.com"
|
#define LAST_AUTHOR "reprappro.com"
|
||||||
|
|
||||||
|
// Other firmware that we might switch to be compatible with.
|
||||||
|
|
||||||
|
enum Compatibility
|
||||||
|
{
|
||||||
|
me = 0,
|
||||||
|
reprapFirmware = 1,
|
||||||
|
marlin = 2,
|
||||||
|
teacup = 3,
|
||||||
|
sprinter = 4,
|
||||||
|
repetier = 5
|
||||||
|
};
|
||||||
|
|
||||||
|
// Some numbers...
|
||||||
|
|
||||||
#define ABS_ZERO -273.15 // Celsius
|
#define ABS_ZERO -273.15 // Celsius
|
||||||
|
|
||||||
#define INCH_TO_MM 25.4
|
#define INCH_TO_MM 25.4
|
||||||
|
@ -59,7 +73,7 @@ Licence: GPL
|
||||||
*/
|
*/
|
||||||
#define CALIB_Z 0
|
#define CALIB_Z 0
|
||||||
|
|
||||||
#define LONG_TIME 60.0 // Seconds
|
#define LONG_TIME 300.0 // Seconds
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
108
GCodes.cpp
108
GCodes.cpp
|
@ -657,14 +657,70 @@ bool GCodes::StandbyHeaters()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GCodes::HandleReply(bool error, bool fromLine, char* reply)
|
void GCodes::HandleReply(bool error, bool fromLine, char* reply, char gMOrT, int code)
|
||||||
{
|
{
|
||||||
if(!reply[0])
|
Compatibility c = platform->Emulating();
|
||||||
return;
|
if(!fromLine)
|
||||||
if(error)
|
c = me;
|
||||||
platform->GetLine()->Write("Error: ");
|
char* s = 0;
|
||||||
platform->GetLine()->Write(reply);
|
|
||||||
platform->GetLine()->Write("\n");
|
switch(c)
|
||||||
|
{
|
||||||
|
case me:
|
||||||
|
case reprapFirmware:
|
||||||
|
if(!reply[0])
|
||||||
|
return;
|
||||||
|
if(error)
|
||||||
|
platform->GetLine()->Write("Error: ");
|
||||||
|
platform->GetLine()->Write(reply);
|
||||||
|
platform->GetLine()->Write("\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case marlin:
|
||||||
|
|
||||||
|
if(gMOrT == 'M' && code == 20)
|
||||||
|
{
|
||||||
|
platform->GetLine()->Write("Begin file list\n");
|
||||||
|
platform->GetLine()->Write(reply);
|
||||||
|
platform->GetLine()->Write("\nEnd file list\nok\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(gMOrT == 'M' && code == 105)
|
||||||
|
{
|
||||||
|
platform->GetLine()->Write("ok ");
|
||||||
|
platform->GetLine()->Write(reply);
|
||||||
|
platform->GetLine()->Write("\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(reply[0])
|
||||||
|
{
|
||||||
|
platform->GetLine()->Write(reply);
|
||||||
|
platform->GetLine()->Write("\n");
|
||||||
|
}
|
||||||
|
platform->GetLine()->Write("ok\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case teacup:
|
||||||
|
s = "teacup";
|
||||||
|
break;
|
||||||
|
case sprinter:
|
||||||
|
s = "sprinter";
|
||||||
|
break;
|
||||||
|
case repetier:
|
||||||
|
s = "repetier";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
s = "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(s != 0)
|
||||||
|
{
|
||||||
|
snprintf(scratchString, STRING_LENGTH, "Emulation of %s is not yet supported.\n", s);
|
||||||
|
platform->Message(HOST_MESSAGE, scratchString);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the GCode to act on is completed, this returns true,
|
// If the GCode to act on is completed, this returns true,
|
||||||
|
@ -759,7 +815,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb)
|
||||||
snprintf(reply, STRING_LENGTH, "invalid G Code: %s", gb->Buffer());
|
snprintf(reply, STRING_LENGTH, "invalid G Code: %s", gb->Buffer());
|
||||||
}
|
}
|
||||||
if(result == true)
|
if(result == true)
|
||||||
HandleReply(error, gb == serialGCode, reply);
|
HandleReply(error, gb == serialGCode, reply, 'G', code);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -786,9 +842,15 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20: // Deprecated...
|
case 20: // Deprecated...
|
||||||
snprintf(reply, STRING_LENGTH, "GCode files:\n%s", platform->GetMassStorage()->FileList(platform->GetGCodeDir()));
|
if(platform->Emulating() == me || platform->Emulating() == reprapFirmware)
|
||||||
|
snprintf(reply, STRING_LENGTH, "GCode files:\n%s", platform->GetMassStorage()->FileList(platform->GetGCodeDir(), gb == serialGCode));
|
||||||
|
else
|
||||||
|
snprintf(reply, STRING_LENGTH, "%s", platform->GetMassStorage()->FileList(platform->GetGCodeDir(), gb == serialGCode));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 21: // Initialise SD - ignore
|
||||||
|
break;
|
||||||
|
|
||||||
case 23: // Set file to print
|
case 23: // Set file to print
|
||||||
QueueFileToPrint(gb->GetUnprecedentedString());
|
QueueFileToPrint(gb->GetUnprecedentedString());
|
||||||
break;
|
break;
|
||||||
|
@ -834,6 +896,14 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 104: // Depricated
|
||||||
|
if(gb->Seen('S'))
|
||||||
|
{
|
||||||
|
reprap.GetHeat()->SetActiveTemperature(1, gb->GetFValue()); // 0 is the bed
|
||||||
|
reprap.GetHeat()->Activate(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 105: // Deprecated...
|
case 105: // Deprecated...
|
||||||
strncpy(reply, "T:", STRING_LENGTH);
|
strncpy(reply, "T:", STRING_LENGTH);
|
||||||
for(int8_t heater = HEATERS - 1; heater > 0; heater--)
|
for(int8_t heater = HEATERS - 1; heater > 0; heater--)
|
||||||
|
@ -872,11 +942,17 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb)
|
||||||
result = false;
|
result = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 109: // Depricated
|
||||||
|
if(gb->Seen('S'))
|
||||||
|
{
|
||||||
|
reprap.GetHeat()->SetActiveTemperature(1, gb->GetFValue()); // 0 is the bed
|
||||||
|
reprap.GetHeat()->Activate(1);
|
||||||
|
}
|
||||||
case 116: // Wait for everything, especially set temperatures
|
case 116: // Wait for everything, especially set temperatures
|
||||||
if(!AllMovesAreFinishedAndMoveBufferIsLoaded())
|
if(!AllMovesAreFinishedAndMoveBufferIsLoaded())
|
||||||
return false;
|
return false;
|
||||||
result = reprap.GetHeat()->AllHeatersAtSetTemperatures();
|
result = reprap.GetHeat()->AllHeatersAtSetTemperatures();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 120:
|
case 120:
|
||||||
result = Push();
|
result = Push();
|
||||||
|
@ -1015,7 +1091,7 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb)
|
||||||
snprintf(reply, STRING_LENGTH, "invalid M Code: %s", gb->Buffer());
|
snprintf(reply, STRING_LENGTH, "invalid M Code: %s", gb->Buffer());
|
||||||
}
|
}
|
||||||
if(result == true)
|
if(result == true)
|
||||||
HandleReply(error, gb == serialGCode, reply);
|
HandleReply(error, gb == serialGCode, reply, 'M', code);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1045,14 +1121,14 @@ bool GCodes::ActOnGcode(GCodeBuffer *gb)
|
||||||
snprintf(reply, STRING_LENGTH, "invalid T Code: %s", gb->Buffer());
|
snprintf(reply, STRING_LENGTH, "invalid T Code: %s", gb->Buffer());
|
||||||
|
|
||||||
if(result == true)
|
if(result == true)
|
||||||
HandleReply(error, gb == serialGCode, reply);
|
HandleReply(error, gb == serialGCode, reply, 'T', code);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// An empty buffer jumps to here and gets discarded
|
// An empty buffer jumps to here and gets discarded
|
||||||
|
|
||||||
if(result == true)
|
if(result == true)
|
||||||
HandleReply(error, gb == serialGCode, reply);
|
HandleReply(error, gb == serialGCode, reply, 'X', code);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
2
GCodes.h
2
GCodes.h
|
@ -92,7 +92,7 @@ class GCodes
|
||||||
bool Pop();
|
bool Pop();
|
||||||
bool DisableDrives();
|
bool DisableDrives();
|
||||||
bool StandbyHeaters();
|
bool StandbyHeaters();
|
||||||
void HandleReply(bool error, bool fromLine, char* reply);
|
void HandleReply(bool error, bool fromLine, char* reply, char gMOrT, int code);
|
||||||
|
|
||||||
int8_t Heater(int8_t head);
|
int8_t Heater(int8_t head);
|
||||||
Platform* platform;
|
Platform* platform;
|
||||||
|
|
3
Heat.cpp
3
Heat.cpp
|
@ -113,6 +113,9 @@ void PID::Init()
|
||||||
|
|
||||||
void PID::Spin()
|
void PID::Spin()
|
||||||
{
|
{
|
||||||
|
if(temperatureFault)
|
||||||
|
return;
|
||||||
|
|
||||||
temperature = platform->GetTemperature(heater);
|
temperature = platform->GetTemperature(heater);
|
||||||
|
|
||||||
if(temperature < BAD_LOW_TEMPERATURE || temperature > BAD_HIGH_TEMPERATURE)
|
if(temperature < BAD_LOW_TEMPERATURE || temperature > BAD_HIGH_TEMPERATURE)
|
||||||
|
|
21
Platform.cpp
21
Platform.cpp
|
@ -479,7 +479,7 @@ char* MassStorage::CombineName(char* directory, char* fileName)
|
||||||
|
|
||||||
// List the flat files in a directory. No sub-directories or recursion.
|
// List the flat files in a directory. No sub-directories or recursion.
|
||||||
|
|
||||||
char* MassStorage::FileList(char* directory)
|
char* MassStorage::FileList(char* directory, bool fromLine)
|
||||||
{
|
{
|
||||||
// File dir, entry;
|
// File dir, entry;
|
||||||
DIR dir;
|
DIR dir;
|
||||||
|
@ -487,6 +487,17 @@ char* MassStorage::FileList(char* directory)
|
||||||
FRESULT res;
|
FRESULT res;
|
||||||
char loc[64];
|
char loc[64];
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
char fileListBracket = FILE_LIST_BRACKET;
|
||||||
|
char fileListSeparator = FILE_LIST_SEPARATOR;
|
||||||
|
|
||||||
|
if(fromLine)
|
||||||
|
{
|
||||||
|
if(platform->Emulating() == marlin)
|
||||||
|
{
|
||||||
|
fileListBracket = 0;
|
||||||
|
fileListSeparator = '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
len = strlen(directory);
|
len = strlen(directory);
|
||||||
strncpy(loc,directory,len-1);
|
strncpy(loc,directory,len-1);
|
||||||
|
@ -519,7 +530,8 @@ char* MassStorage::FileList(char* directory)
|
||||||
if(strlen(entry.fname) > 0)
|
if(strlen(entry.fname) > 0)
|
||||||
{
|
{
|
||||||
int q = 0;
|
int q = 0;
|
||||||
fileList[p++] = FILE_LIST_BRACKET;
|
if(fileListBracket)
|
||||||
|
fileList[p++] = fileListBracket;
|
||||||
while(entry.fname[q])
|
while(entry.fname[q])
|
||||||
{
|
{
|
||||||
fileList[p++] = entry.fname[q];
|
fileList[p++] = entry.fname[q];
|
||||||
|
@ -533,8 +545,9 @@ char* MassStorage::FileList(char* directory)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fileList[p++] = FILE_LIST_BRACKET;
|
if(fileListBracket)
|
||||||
fileList[p++] = FILE_LIST_SEPARATOR;
|
fileList[p++] = fileListBracket;
|
||||||
|
fileList[p++] = fileListSeparator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
Platform.h
14
Platform.h
|
@ -171,18 +171,6 @@ Licence: GPL
|
||||||
|
|
||||||
#define BAUD_RATE 115200 // Communication speed of the USB if needed.
|
#define BAUD_RATE 115200 // Communication speed of the USB if needed.
|
||||||
|
|
||||||
// Other firmware that we might switch to be compatible with.
|
|
||||||
|
|
||||||
enum Compatibility
|
|
||||||
{
|
|
||||||
me = 0,
|
|
||||||
reprapFirmware = 1,
|
|
||||||
marlin = 2,
|
|
||||||
teacup = 3,
|
|
||||||
sprinter = 4,
|
|
||||||
repetier = 5
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************************************/
|
/****************************************************************************************************/
|
||||||
|
|
||||||
enum EndStopHit
|
enum EndStopHit
|
||||||
|
@ -327,7 +315,7 @@ class MassStorage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
char* FileList(char* directory); // Returns a ,-separated list of all the files in the named directory
|
char* FileList(char* directory, bool fromLine); // Returns a list of all the files in the named directory
|
||||||
char* CombineName(char* directory, char* fileName);
|
char* CombineName(char* directory, char* fileName);
|
||||||
bool Delete(char* directory, char* fileName);
|
bool Delete(char* directory, char* fileName);
|
||||||
|
|
||||||
|
|
|
@ -349,7 +349,7 @@ void Webserver::GetJsonResponse(char* request)
|
||||||
|
|
||||||
if(StringStartsWith(request, "files"))
|
if(StringStartsWith(request, "files"))
|
||||||
{
|
{
|
||||||
char* fileList = platform->GetMassStorage()->FileList(platform->GetGCodeDir());
|
char* fileList = platform->GetMassStorage()->FileList(platform->GetGCodeDir(), false);
|
||||||
strncpy(jsonResponse, "{\"files\":[", STRING_LENGTH);
|
strncpy(jsonResponse, "{\"files\":[", STRING_LENGTH);
|
||||||
strncat(jsonResponse, fileList, STRING_LENGTH);
|
strncat(jsonResponse, fileList, STRING_LENGTH);
|
||||||
strncat(jsonResponse, "]}", STRING_LENGTH);
|
strncat(jsonResponse, "]}", STRING_LENGTH);
|
||||||
|
|
Reference in a new issue