
Prevent setting of absurdly high hot end temperatures Added R parameter to G1 to go back to previous location, with optional offsets Allow Pronterface and PanelDue M105 requests to execute during file macros etc. Added more status information for PanelDue to M105 S2 command Send replies when prints are paused, resumed or cancelled Added missing newlines at end of M105 responses Increased X and Y course homing speeds
115 lines
3.6 KiB
C++
115 lines
3.6 KiB
C++
/*
|
|
* GCodeBuffer.h
|
|
*
|
|
* Created on: 6 Feb 2015
|
|
* Author: David
|
|
*/
|
|
|
|
#ifndef GCODEBUFFER_H_
|
|
#define GCODEBUFFER_H_
|
|
|
|
// Small class to hold an individual GCode and provide functions to allow it to be parsed
|
|
class GCodeBuffer
|
|
{
|
|
public:
|
|
GCodeBuffer(Platform* p, const char* id);
|
|
void Init(); // Set it up
|
|
bool Put(char c); // Add a character to the end
|
|
bool Put(const char *str, size_t len); // Add an entire string
|
|
bool IsEmpty() const; // Does this buffer contain any code?
|
|
bool Seen(char c); // Is a character present?
|
|
float GetFValue(); // Get a float after a key letter
|
|
int GetIValue(); // Get an integer after a key letter
|
|
long GetLValue(); // Get a long integer after a key letter
|
|
const char* GetUnprecedentedString(bool optional = false); // Get a string with no preceding key letter
|
|
const char* GetString(); // Get a string after a key letter
|
|
const void GetFloatArray(float a[], int& length); // Get a :-separated list of floats after a key letter
|
|
const void GetLongArray(long l[], int& length); // Get a :-separated list of longs after a key letter
|
|
const char* Buffer() const;
|
|
bool Active() const;
|
|
void SetFinished(bool f); // Set the G Code executed (or not)
|
|
void Pause();
|
|
void CancelPause();
|
|
void Resume();
|
|
const char* WritingFileDirectory() const; // If we are writing the G Code to a file, where that file is
|
|
void SetWritingFileDirectory(const char* wfd); // Set the directory for the file to write the GCode in
|
|
int GetToolNumberAdjust() const { return toolNumberAdjust; }
|
|
void SetToolNumberAdjust(int arg) { toolNumberAdjust = arg; }
|
|
void SetCommsProperties(uint32_t arg) { checksumRequired = (arg & 1); }
|
|
bool StartingNewCode() const { return gcodePointer == 0; }
|
|
bool IsPollRequest();
|
|
|
|
private:
|
|
|
|
enum State { idle, executing, paused };
|
|
int CheckSum() const; // Compute the checksum (if any) at the end of the G Code
|
|
Platform* platform; // Pointer to the RepRap's controlling class
|
|
char gcodeBuffer[GcodeLength]; // The G Code
|
|
const char* identity; // Where we are from (web, file, serial line etc)
|
|
int gcodePointer; // Index in the buffer
|
|
int readPointer; // Where in the buffer to read next
|
|
bool inComment; // Are we after a ';' character?
|
|
bool checksumRequired; // True if we only accept commands with a valid checksum
|
|
State state; // Idle, executing or paused
|
|
const char* writingFileDirectory; // If the G Code is going into a file, where that is
|
|
int toolNumberAdjust; // The adjustment to tool numbers in commands we receive
|
|
};
|
|
|
|
// Get an Int after a G Code letter
|
|
|
|
inline int GCodeBuffer::GetIValue()
|
|
{
|
|
return (int)GetLValue();
|
|
}
|
|
|
|
inline const char* GCodeBuffer::Buffer() const
|
|
{
|
|
return gcodeBuffer;
|
|
}
|
|
|
|
inline bool GCodeBuffer::Active() const
|
|
{
|
|
return state == executing;
|
|
}
|
|
|
|
inline void GCodeBuffer::SetFinished(bool f)
|
|
{
|
|
state = (f) ? idle : executing;
|
|
}
|
|
|
|
inline void GCodeBuffer::Pause()
|
|
{
|
|
if (state == executing)
|
|
{
|
|
state = paused;
|
|
}
|
|
}
|
|
|
|
// If we paused a print, cancel printing that file and get ready to print a new one
|
|
inline void GCodeBuffer::CancelPause()
|
|
{
|
|
if (state == paused)
|
|
{
|
|
Init();
|
|
}
|
|
}
|
|
|
|
inline void GCodeBuffer::Resume()
|
|
{
|
|
if (state == paused)
|
|
{
|
|
state = executing;
|
|
}
|
|
}
|
|
|
|
inline const char* GCodeBuffer::WritingFileDirectory() const
|
|
{
|
|
return writingFileDirectory;
|
|
}
|
|
|
|
inline void GCodeBuffer::SetWritingFileDirectory(const char* wfd)
|
|
{
|
|
writingFileDirectory = wfd;
|
|
}
|
|
|
|
#endif /* GCODEBUFFER_H_ */
|