Generalized enqueue_commands_P, and moved them to Marlin_main as they should
This commit is contained in:
		@@ -384,6 +384,8 @@ static int serial_count = 0;
 | 
			
		||||
static boolean comment_mode = false;
 | 
			
		||||
static char *strchr_pointer; // just a pointer to find chars in the command string like X, Y, Z, E, etc
 | 
			
		||||
 | 
			
		||||
const char* queued_commands_P= NULL; /* pointer to the current line in the active sequence of commands, or NULL when none */
 | 
			
		||||
 | 
			
		||||
const int sensitive_pins[] = SENSITIVE_PINS; // Sensitive pin list for M42
 | 
			
		||||
 | 
			
		||||
//static float tt = 0;
 | 
			
		||||
@@ -451,43 +453,64 @@ void serial_echopair_P(const char *s_P, unsigned long v)
 | 
			
		||||
  }
 | 
			
		||||
#endif //!SDSUPPORT
 | 
			
		||||
 | 
			
		||||
//adds an command to the main command buffer
 | 
			
		||||
//thats really done in a non-safe way.
 | 
			
		||||
//needs overworking someday
 | 
			
		||||
//(or return false if it failed to do so)
 | 
			
		||||
bool enquecommand(const char *cmd)
 | 
			
		||||
//Injects the next command from the pending sequence of commands, when possible
 | 
			
		||||
//Return false if and only if no command was pending
 | 
			
		||||
static bool drain_queued_commands_P()
 | 
			
		||||
{
 | 
			
		||||
  if(buflen >= BUFSIZE)
 | 
			
		||||
  char cmd[30];
 | 
			
		||||
  if(!queued_commands_P)
 | 
			
		||||
    return false;
 | 
			
		||||
  else
 | 
			
		||||
  // Get the next 30 chars from the sequence of gcodes to run
 | 
			
		||||
  strncpy_P(cmd, queued_commands_P, sizeof(cmd)-1);
 | 
			
		||||
  cmd[sizeof(cmd)-1]= 0;
 | 
			
		||||
  // Look for the end of line, or the end of sequence
 | 
			
		||||
  size_t i= 0;
 | 
			
		||||
  char c;
 | 
			
		||||
  while( (c= cmd[i]) && c!='\n' )
 | 
			
		||||
    ++i; // look for the end of this gcode command
 | 
			
		||||
  cmd[i]= 0;
 | 
			
		||||
  if(enquecommand(cmd)) // buffer was not full (else we will retry later)
 | 
			
		||||
  {
 | 
			
		||||
    //this is dangerous if a mixing of serial and this happens
 | 
			
		||||
    strcpy(&(cmdbuffer[bufindw][0]),cmd);
 | 
			
		||||
    SERIAL_ECHO_START;
 | 
			
		||||
    SERIAL_ECHOPGM(MSG_Enqueing);
 | 
			
		||||
    SERIAL_ECHO(cmdbuffer[bufindw]);
 | 
			
		||||
    SERIAL_ECHOLNPGM("\"");
 | 
			
		||||
    bufindw= (bufindw + 1)%BUFSIZE;
 | 
			
		||||
    buflen += 1;
 | 
			
		||||
    return true;
 | 
			
		||||
    if(c)
 | 
			
		||||
      queued_commands_P+= i+1; // move to next command
 | 
			
		||||
    else
 | 
			
		||||
      queued_commands_P= NULL; // will have no more commands in the sequence
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void enquecommand_P(const char *cmd)
 | 
			
		||||
//Record one or many commands to run from program memory.
 | 
			
		||||
//Aborts the current queue, if any.
 | 
			
		||||
//Note: drain_queued_commands_P() must be called repeatedly to drain the commands afterwards
 | 
			
		||||
void enquecommands_P(const char* pgcode)
 | 
			
		||||
{
 | 
			
		||||
  if(buflen < BUFSIZE)
 | 
			
		||||
  {
 | 
			
		||||
    //this is dangerous if a mixing of serial and this happens
 | 
			
		||||
    strcpy_P(&(cmdbuffer[bufindw][0]),cmd);
 | 
			
		||||
    SERIAL_ECHO_START;
 | 
			
		||||
    SERIAL_ECHOPGM(MSG_Enqueing);
 | 
			
		||||
    SERIAL_ECHO(cmdbuffer[bufindw]);
 | 
			
		||||
    SERIAL_ECHOLNPGM("\"");
 | 
			
		||||
    bufindw= (bufindw + 1)%BUFSIZE;
 | 
			
		||||
    buflen += 1;
 | 
			
		||||
  }
 | 
			
		||||
    queued_commands_P= pgcode;
 | 
			
		||||
    drain_queued_commands_P(); // first command exectuted asap (when possible)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//adds a single command to the main command buffer, from RAM
 | 
			
		||||
//that is really done in a non-safe way.
 | 
			
		||||
//needs overworking someday
 | 
			
		||||
//Returns false if it failed to do so
 | 
			
		||||
bool enquecommand(const char *cmd)
 | 
			
		||||
{
 | 
			
		||||
  if(*cmd==';')
 | 
			
		||||
    return false;
 | 
			
		||||
  if(buflen >= BUFSIZE)
 | 
			
		||||
    return false;
 | 
			
		||||
  //this is dangerous if a mixing of serial and this happens
 | 
			
		||||
  strcpy(&(cmdbuffer[bufindw][0]),cmd);
 | 
			
		||||
  SERIAL_ECHO_START;
 | 
			
		||||
  SERIAL_ECHOPGM(MSG_Enqueing);
 | 
			
		||||
  SERIAL_ECHO(cmdbuffer[bufindw]);
 | 
			
		||||
  SERIAL_ECHOLNPGM("\"");
 | 
			
		||||
  bufindw= (bufindw + 1)%BUFSIZE;
 | 
			
		||||
  buflen += 1;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void setup_killpin()
 | 
			
		||||
{
 | 
			
		||||
  #if defined(KILL_PIN) && KILL_PIN > -1
 | 
			
		||||
@@ -691,6 +714,9 @@ void loop()
 | 
			
		||||
 | 
			
		||||
void get_command()
 | 
			
		||||
{
 | 
			
		||||
  if(drain_queued_commands_P()) // priority is given to non-serial commands
 | 
			
		||||
    return;
 | 
			
		||||
  
 | 
			
		||||
  while( MYSERIAL.available() > 0  && buflen < BUFSIZE) {
 | 
			
		||||
    serial_char = MYSERIAL.read();
 | 
			
		||||
    if(serial_char == '\n' ||
 | 
			
		||||
@@ -4489,7 +4515,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s
 | 
			
		||||
    {
 | 
			
		||||
       if (homeDebounceCount == 0)
 | 
			
		||||
       {
 | 
			
		||||
          enquecommand_P((PSTR("G28")));
 | 
			
		||||
          enquecommands_P((PSTR("G28")));
 | 
			
		||||
          homeDebounceCount++;
 | 
			
		||||
          LCD_ALERTMESSAGEPGM(MSG_AUTO_HOME);
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user