122 lines
2.7 KiB
C++
122 lines
2.7 KiB
C++
/****************************************************************************************************
|
|
|
|
RepRapFirmware - G Codes
|
|
|
|
This class interprets G Codes from one or more sources, and calls the functions in Move, Heat etc
|
|
that drive the machine to do what the G Codes command.
|
|
|
|
-----------------------------------------------------------------------------------------------------
|
|
|
|
Version 0.1
|
|
|
|
13 February 2013
|
|
|
|
Adrian Bowyer
|
|
RepRap Professional Ltd
|
|
http://reprappro.com
|
|
|
|
Licence: GPL
|
|
|
|
****************************************************************************************************/
|
|
|
|
#ifndef GCODES_H
|
|
#define GCODES_H
|
|
|
|
|
|
// Small class to hold an individual GCode
|
|
|
|
class GCodeBuffer
|
|
{
|
|
public:
|
|
GCodeBuffer(Platform* p, char* id);
|
|
void Init();
|
|
boolean Put(char c);
|
|
boolean Seen(char c);
|
|
float GetFValue();
|
|
int GetIValue();
|
|
long GetLValue();
|
|
char* Buffer();
|
|
|
|
private:
|
|
Platform* platform;
|
|
char gcodeBuffer[GCODE_LENGTH];
|
|
char* identity;
|
|
int gcodePointer;
|
|
int readPointer;
|
|
boolean inComment;
|
|
};
|
|
|
|
//****************************************************************************************************
|
|
|
|
// The GCode interpreter
|
|
|
|
class GCodes
|
|
{
|
|
public:
|
|
|
|
GCodes(Platform* p, Webserver* w);
|
|
void Spin();
|
|
void Init();
|
|
void Exit();
|
|
boolean ReadMove(float* m, boolean& ce);
|
|
boolean ReadHeat(float* h);
|
|
void QueueFileToPrint(char* fileName);
|
|
boolean PrintingAFile();
|
|
|
|
private:
|
|
|
|
boolean ActOnGcode(GCodeBuffer* gb);
|
|
boolean SetUpMove(GCodeBuffer* gb);
|
|
boolean DoDwell(GCodeBuffer *gb);
|
|
boolean DoHome();
|
|
boolean NoHome();
|
|
Platform* platform;
|
|
boolean active;
|
|
Webserver* webserver;
|
|
unsigned long dwellTime;
|
|
boolean dwellWaiting;
|
|
GCodeBuffer* webGCode;
|
|
GCodeBuffer* fileGCode;
|
|
boolean webGCodeFinished;
|
|
boolean fileGCodeFinished;
|
|
boolean moveAvailable;
|
|
boolean heatAvailable;
|
|
float moveBuffer[DRIVES+1]; // Last is feedrate
|
|
boolean checkEndStops;
|
|
boolean drivesRelative; // All except X, Y and Z
|
|
boolean axesRelative; // X, Y and Z
|
|
char gCodeLetters[DRIVES + 1]; // Extra is for F
|
|
float lastPos[DRIVES - AXES]; // Just needed for relative moves.
|
|
float distanceScale;
|
|
int fileBeingPrinted;
|
|
int fileToPrint;
|
|
boolean homeX;
|
|
boolean homeY;
|
|
boolean homeZ;
|
|
};
|
|
|
|
//*****************************************************************************************************
|
|
|
|
// Get an Int after a G Code letter
|
|
|
|
inline int GCodeBuffer::GetIValue()
|
|
{
|
|
return (int)GetLValue();
|
|
}
|
|
|
|
inline char* GCodeBuffer::Buffer()
|
|
{
|
|
return gcodeBuffer;
|
|
}
|
|
|
|
inline boolean GCodes::PrintingAFile()
|
|
{
|
|
return fileBeingPrinted >= 0;
|
|
}
|
|
|
|
inline boolean GCodes::NoHome()
|
|
{
|
|
return !(homeX || homeY || homeZ);
|
|
}
|
|
|
|
#endif
|