#ifndef CMDQUEUE_H #define CMDQUEUE_H #include "Marlin.h" #include "language_all.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 // 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 int bufindr; extern int bufindw; extern int buflen; extern bool cmdbuffer_front_already_processed; // 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_DEBUG 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(); extern bool cmdqueue_could_enqueue_front(int len_asked); extern bool cmdqueue_could_enqueue_back(int len_asked); extern void cmdqueue_dump_to_serial_single_line(int nr, const char *p); extern void cmdqueue_dump_to_serial(); extern void enquecommand(const char *cmd, bool from_progmem); extern void enquecommand_front(const char *cmd, bool from_progmem); 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 found static inline bool code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; } static inline bool code_seen(const char *code) { return (strchr_pointer = strstr(CMDBUFFER_CURRENT_STRING, code)) != 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