| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | #ifndef CMDQUEUE_H#define CMDQUEUE_H#include "Marlin.h"#include "language.h"// String circular buffer. Commands may be pushed to the buffer from both sides:// Chained commands will be pushed to the front, interactive (from LCD menu) // and printing commands (from serial line or from SD card) are pushed to the tail.// First character of each entry indicates the type of the entry: #define CMDBUFFER_CURRENT_TYPE_UNKNOWN  0// Command in cmdbuffer was sent over USB.#define CMDBUFFER_CURRENT_TYPE_USB      1// Command in cmdbuffer was read from SDCARD.#define CMDBUFFER_CURRENT_TYPE_SDCARD   2// Command in cmdbuffer was generated by the UI.#define CMDBUFFER_CURRENT_TYPE_UI       3// Command in cmdbuffer was generated by another G-code.#define CMDBUFFER_CURRENT_TYPE_CHAINED  4// Command has been processed and its SD card length has been possibly pushed // to the planner queue, but not yet removed from the cmdqueue. // This is a temporary state to reduce stepper interrupt locking time.#define CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED 5//Command in cmdbuffer was sent over USB and contains line number#define CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR 6// How much space to reserve for the chained commands// of type CMDBUFFER_CURRENT_TYPE_CHAINED,// which are pushed to the front of the queue?// Maximum 5 commands of max length 20 + null terminator.#define CMDBUFFER_RESERVE_FRONT       (5*21)extern char cmdbuffer[BUFSIZE * (MAX_CMD_SIZE + 1) + CMDBUFFER_RESERVE_FRONT];extern size_t bufindr;extern int buflen;extern bool cmdbuffer_front_already_processed;extern bool cmdqueue_serial_disabled;// Type of a command, which is to be executed right now.#define CMDBUFFER_CURRENT_TYPE   (cmdbuffer[bufindr])// String of a command, which is to be executed right now.#define CMDBUFFER_CURRENT_STRING (cmdbuffer+bufindr+CMDHDRSIZE)// Enable debugging of the command buffer.// Debugging information will be sent to serial line.//#define CMDBUFFER_DEBUGextern uint32_t sdpos_atomic;extern int serial_count;extern boolean comment_mode;extern char *strchr_pointer;extern unsigned long TimeSent;extern unsigned long TimeNow;extern long gcode_N;extern long gcode_LastN;extern long Stopped_gcode_LastN;extern bool cmdqueue_pop_front();extern void cmdqueue_reset();#ifdef CMDBUFFER_DEBUGextern void cmdqueue_dump_to_serial_single_line(int nr, const char *p);extern void cmdqueue_dump_to_serial();#endif /* CMDBUFFER_DEBUG */extern bool cmd_buffer_empty();extern void enquecommand(const char *cmd, bool from_progmem = false);extern void enquecommand_front(const char *cmd, bool from_progmem = false);extern void repeatcommand_front();extern bool is_buffer_empty();extern void get_command();extern uint16_t cmdqueue_calc_sd_length();// Return True if a character was foundstatic inline bool    code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; }static inline bool    code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; }static inline float   code_value()      { return strtod(strchr_pointer+1, NULL);}static inline long    code_value_long()    { return strtol(strchr_pointer+1, NULL, 10); }static inline int16_t code_value_short()   { return int16_t(strtol(strchr_pointer+1, NULL, 10)); };static inline uint8_t code_value_uint8()   { return uint8_t(strtol(strchr_pointer+1, NULL, 10)); };static inline float code_value_float(){    char* e = strchr(strchr_pointer, 'E');    if (!e) return strtod(strchr_pointer + 1, NULL);    *e = 0;    float ret = strtod(strchr_pointer + 1, NULL);    *e = 'E';    return ret;}#endif //CMDQUEUE_H
 |