Пример #1
0
void get_command() {
    while (1) {
        int foo = usb_peek();
        if (foo < 0 || buflen >= BUFSIZE) {
            break;
        }
        serial_char = foo;

        if (serial_char == '\n' ||
                serial_char == '\r' ||
                (serial_char == ':' && comment_mode == false) ||
                serial_count >= (MAX_CMD_SIZE - 1)) {
            if (!serial_count) { //if empty line
                comment_mode = false; //for new command
                return;
            }
            cmdbuffer[bufindw][serial_count] = 0; //terminate string
            if (!comment_mode) {
                comment_mode = false; //for new command





                if (strstr(cmdbuffer[bufindw], "N") != NULL) {
                    strchr_pointer = strchr(cmdbuffer[bufindw], 'N');
                    gcode_N = (strtol(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL, 10));
                    if (gcode_N != gcode_LastN + 1 && (strstr(cmdbuffer[bufindw], "M110") == NULL)) {
                        printf("Error: Line Number is not Last Line Number+1, Last Line:%lu\n", gcode_LastN);
                        //Serial.println(gcode_N);
                        FlushSerialRequestResend();
                        serial_count = 0;
                        return;
                    }

                    if (strstr(cmdbuffer[bufindw], "*") != NULL) {
                        unsigned char checksum = 0;
                        unsigned char count = 0;
                        while (cmdbuffer[bufindw][count] != '*') checksum = checksum^cmdbuffer[bufindw][count++];
                        strchr_pointer = strchr(cmdbuffer[bufindw], '*');

                        if ((int) (strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)) != checksum) {
                            printf("Error:checksum mismatch, Last Line:%lu\n", gcode_LastN);
                            FlushSerialRequestResend();
                            serial_count = 0;
                            return;
                            //if no errors, continue parsing
                        }
                    } else {
                        printf("Error:No Checksum with line number, Last Line:%lu\n", gcode_LastN);
                        FlushSerialRequestResend();
                        serial_count = 0;
                        return;
                    }

                    gcode_LastN = gcode_N;
                    //if no errors, continue parsing
                } else // if we don't receive 'N' but still see '*'
                {
                    if ((strstr(cmdbuffer[bufindw], "*") != NULL)) {
                        printf("Error:No Line Number with checksum, Last Line:%lu\n", gcode_LastN);
                        serial_count = 0;
                        return;
                    }
                }
                if ((strstr(cmdbuffer[bufindw], "G") != NULL)) {
                    strchr_pointer = strchr(cmdbuffer[bufindw], 'G');
                    switch ((int) ((strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)))) {
                        case 0:
                        case 1:
                        case 2:
                        case 3:
                            printf("ok\n");
                            break;
                        default:
                            break;
                    }

                }
                bufindw = (bufindw + 1) % BUFSIZE;
                buflen += 1;
            }
            serial_count = 0; //clear buffer
        } else {
            bool skipmode = false;
            if (serial_char == ';') {

                // IN;SP1;PU698,727;PD453,632;PD236,779;PD251,517;PD44,356;PD298,289;PD387,42;PD529,263;PD791,272;PD625,475;PD698,727;PU;

                if (serial_count == 2 &&
                        cmdbuffer[bufindw][0] == 'I' &&
                        cmdbuffer[bufindw][1] == 'N') {
					hgpl_ack();
                    skipmode = true;
                }
                else if (serial_count == 3 &&
                        cmdbuffer[bufindw][0] == 'S' &&
                        cmdbuffer[bufindw][1] == 'P' &&
                        cmdbuffer[bufindw][2] == '1') {
					hgpl_ack();
                    skipmode = true;
                }
                else if (serial_count >= 2 &&
                        cmdbuffer[bufindw][0] == 'P' &&
                        (cmdbuffer[bufindw][1] == 'U' ||
                        cmdbuffer[bufindw][1] == 'D')) {
                    if (serial_count > 2) {
                        cmdbuffer[bufindw][serial_count] = '\0';
                        strchr_pointer = strchr(cmdbuffer[bufindw], ',');
                        if (strchr_pointer != NULL) {
                            int y = atoi(strchr_pointer + 1);
                            *strchr_pointer = '\0';
                            int x = atoi(&cmdbuffer[bufindw][2]);
                            if (cmdbuffer[bufindw][1] == 'U') {
                                stepper_move(x, y);
                            } else {
                                stepper_draw(x, y);
                            }
							hgpl_ack();
                        }
                    } else {
                        if (cmdbuffer[bufindw][1] == 'U') {
                            stepper_move(0, 0);
                            beeper_on(1360);
                            msleep(30);
                            beeper_off();
							hgpl_ack();
                        }
                    }
                    skipmode = true;
                } else {
                    comment_mode = true;
                }
            }

            if (skipmode) {
                serial_count = 0;
                skipmode = false;
            } else {
                if (!comment_mode) {
                    cmdbuffer[bufindw][serial_count++] = serial_char;
                }
            }
        }
    }

}
Пример #2
0
void get_command()
{
  while( SERIAL_PORT.available() > 0  && buflen < BUFSIZE) {
    serial_read = SERIAL_PORT.read();
	if( serial_read == -1 )
		continue;
	serial_char = (char)serial_read;
    if(serial_char == '\n' || serial_char == '\r' ||
       (serial_char == ':' && comment_mode == false) || serial_count >= (MAX_CMD_SIZE - 1) ) {
      if(!serial_count) { //if empty line
        comment_mode = false; //for new command
        return;
      }
      cmdbuffer[bufindw][serial_count] = 0; //terminate string
      if(!comment_mode) {
        comment_mode = false; //for new command
 
        if(strchr(cmdbuffer[bufindw], 'N') != NULL) {
          strchr_pointer = strchr(cmdbuffer[bufindw], 'N');
          gcode_N = (strtol(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL, 10));
          if(gcode_N != gcode_LastN+1 && (strstr_P(cmdbuffer[bufindw], PSTR("M110")) == NULL) ) {
            SERIAL_PGM(MSG_ERR_LINE_NO);
            SERIAL_PORT.println(gcode_LastN);
            //Serial.println(gcode_N);
            FlushSerialRequestResend();
            serial_count = 0;
            return;
          }
          if(strchr(cmdbuffer[bufindw], '*') != NULL) {
            byte checksum = 0;
            byte count = 0;
            while(cmdbuffer[bufindw][count] != '*') checksum = checksum^cmdbuffer[bufindw][count++];
            strchr_pointer = strchr(cmdbuffer[bufindw], '*');
            if( (int)(strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)) != checksum) {
              SERIAL_PGM(MSG_ERR_CHECKSUM_MISMATCH);
              SERIAL_PORT.println(gcode_LastN);
              FlushSerialRequestResend();
              serial_count = 0;
              return;
            }
            //if no errors, continue parsing
          } else {
            SERIAL_PGM(MSG_ERR_NO_CHECKSUM);
            SERIAL_PORT.println(gcode_LastN);
            FlushSerialRequestResend();
            serial_count = 0;
            return;
          }
          gcode_LastN = gcode_N;
          //if no errors, continue parsing
        } else { // if we don't receive 'N' but still see '*'
          if((strchr(cmdbuffer[bufindw], '*') != NULL)) {
            SERIAL_PGM(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM);
            SERIAL_PORT.println(gcode_LastN);
            serial_count = 0;
            return;
          }
        }
		// Determine if an outstanding error caused safety shutdown. If so respond with header
        if((strchr(cmdbuffer[bufindw], 'G') != NULL)){
          strchr_pointer = strchr(cmdbuffer[bufindw], 'G');
          switch((int)((strtod(&cmdbuffer[bufindw][strchr_pointer - cmdbuffer[bufindw] + 1], NULL)))) {
			case 0:
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
				if(Stopped) { // If robot is stopped by an error the G[0-5] codes are ignored.
					SERIAL_PGMLN(MSG_ERR_STOPPED);
				}
				break;
			default:
				break;
          }

        }
        bufindw = (bufindw + 1)%BUFSIZE;
        buflen += 1;
      }
      serial_count = 0; //clear buffer
    } else {
      if(serial_char == ';') comment_mode = true;
      if(!comment_mode) cmdbuffer[bufindw][serial_count++] = serial_char;
    }
  }

}