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; } } } } }
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; } } }