//need to return RAPID for rapids... MOTION_TYPE linearMotion::getMotionType() { bool traverse = cmdMatch("STRAIGHT_TRAVERSE"); if (traverse) { return TRAVERSE; } else { return STRAIGHT_FEED; } }
int cmdParse( char *buf, uint32_t *p, unsigned ext_len, char *ext, cmdCtlParse_t *ctl) { int f, valid, idx, val, pp, pars, n, n2, i; char *p8; int32_t *p32; char c; uint32_t tp1, tp2, tp3; int8_t to1, to2, to3; int eaten; /* Check that ext is big enough for the largest message. */ if (ext_len < (4 * CMD_MAX_PARAM)) return CMD_EXT_TOO_SMALL; bzero(&ctl->opt, sizeof(ctl->opt)); sscanf(buf+ctl->eaten, " %31s %n", intCmdStr, &pp); ctl->eaten += pp; p[0] = -1; idx = cmdMatch(intCmdStr); if (idx < 0) return idx; valid = 0; p[0] = cmdInfo[idx].cmd; p[1] = 0; p[2] = 0; p[3] = 0; switch (cmdInfo[idx].vt) { case 101: /* BR1 BR2 CGI H HELP HWVER DCRA HALT INRA NO PIGPV POPA PUSHA RET T TICK WVBSY WVCLR WVCRE WVGO WVGOR WVHLT WVNEW No parameters, always valid. */ valid = 1; break; case 111: /* ADD AND BC1 BC2 BS1 BS2 CMP CSI DIV LDA LDAB MLT MOD OR RLA RRA STAB SUB WAIT XOR One parameter, any value. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); if (ctl->opt[1] > 0) valid = 1; break; case 112: /* BI2CC GDC GPW I2CC I2CRB MG MICS MILS MODEG NC NP PFG PRG PROCD PROCP PROCS PRRG R READ SLRC SPIC WVDEL WVSC WVSM WVSP WVTX WVTXR One positive parameter. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); if ((ctl->opt[1] > 0) && ((int)p[1] >= 0)) valid = 1; break; case 113: /* DCR INR POP PUSH STA XA One register parameter. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); if ((ctl->opt[1] > 0) && (p[1] < PI_MAX_SCRIPT_VARS)) valid = 1; break; case 114: /* CALL JM JMP JNZ JP JZ TAG One numeric parameter, any value. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); if (ctl->opt[1] == CMD_NUMERIC) valid = 1; break; case 115: /* PARSE PROC One parameter, string (rest of input). */ p[3] = strlen(buf+ctl->eaten); memcpy(ext, buf+ctl->eaten, p[3]); ctl->eaten += p[3]; valid = 1; break; case 116: /* SYS One parameter, a string of letters, digits, '-' and '_'. */ f = sscanf(buf+ctl->eaten, " %*s%n %n", &n, &n2); if ((f >= 0) && n) { valid = 1; for (i=0; i<n; i++) { c = buf[ctl->eaten+i]; if ((!isalnum(c)) && (c != '_') && (c != '-')) { valid = 0; break; } } if (valid) { p[3] = n; ctl->opt[3] = CMD_NUMERIC; memcpy(ext, buf+ctl->eaten, n); ctl->eaten += n2; } } break; case 121: /* HC I2CRD I2CRR I2CRW I2CWB I2CWQ P PFS PRS PWM S SERVO SLR SLRI W WDOG WRITE Two positive parameters. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (ctl->opt[2] > 0) && ((int)p[2] >= 0)) valid = 1; break; case 122: /* NB Two parameters, first positive, second any value. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (ctl->opt[2] > 0)) valid = 1; break; case 123: /* LD RL RR Two parameters, first register, second any value. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); if ((ctl->opt[1] > 0) && (p[1] < PI_MAX_SCRIPT_VARS) && (ctl->opt[2] > 0)) valid = 1; break; case 124: /* X Two register parameters. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); if ((ctl->opt[1] > 0) && (p[1] < PI_MAX_SCRIPT_VARS) && (ctl->opt[2] > 0) && (p[2] < PI_MAX_SCRIPT_VARS)) valid = 1; break; case 125: /* M MODES Two parameters, first positive, second in 'RW540123'. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); f = sscanf(buf+ctl->eaten, " %c %n", &c, &n); if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (f >= 1)) { ctl->eaten += n; val = toupper(c); p8 = strchr(fmtMdeStr, val); if (p8 != NULL) { val = p8 - fmtMdeStr; p[2] = val; valid = 1; } } break; case 126: /* PUD Two parameters, first positive, second in 'ODU'. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); f = sscanf(buf+ctl->eaten, " %c %n", &c, &n); if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (f >= 1)) { ctl->eaten += n; val = toupper(c); p8 = strchr(fmtPudStr, val); if (p8 != NULL) { val = p8 - fmtPudStr; p[2] = val; valid = 1; } } break; case 131: /* BI2CO HP I2CO I2CPC I2CRI I2CWB I2CWW SLRO SPIO TRIG Three positive parameters. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1); if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (ctl->opt[2] > 0) && ((int)p[2] >= 0) && (to1 == CMD_NUMERIC) && ((int)tp1 >= 0)) { p[3] = 4; memcpy(ext, &tp1, 4); valid = 1; } break; case 132: /* SERO Three parameters, first a string, rest >=0 */ f = sscanf(buf+ctl->eaten, " %*s%n %n", &n, &n2); if ((f >= 0) && n) { p[3] = n; ctl->opt[2] = CMD_NUMERIC; memcpy(ext, buf+ctl->eaten, n); ctl->eaten += n2; ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (ctl->opt[2] > 0) && ((int)p[2] >= 0)) valid = 1; } break; case 191: /* PROCR One to 11 parameters, first positive, optional remainder, any value. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); if ((ctl->opt[1] == CMD_NUMERIC) && ((int)p[1] >= 0)) { pars = 0; p32 = (int32_t *)ext; while (pars < PI_MAX_SCRIPT_PARAMS) { ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1); if (to1 == CMD_NUMERIC) { pars++; *p32++ = tp1; } else break; } p[3] = pars * 4; valid = 1; } break; case 192: /* WVAG One or more triplets (gpios on, gpios off, delay), any value. */ pars = 0; p32 = (int32_t *)ext; while (pars < CMD_MAX_PARAM) { ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1); if (to1 == CMD_NUMERIC) { pars++; *p32++ = tp1; } else break; } p[3] = pars * 4; if (pars && ((pars % 3) == 0)) valid = 1; break; case 193: /* BI2CZ I2CWD I2CZ SERW SPIW SPIX Two or more parameters, first >=0, rest 0-255. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); if ((ctl->opt[1] == CMD_NUMERIC) && ((int)p[1] >= 0)) { pars = 0; p8 = ext; while (pars < CMD_MAX_PARAM) { eaten = getNum(buf+ctl->eaten, &tp1, &to1); if (to1 == CMD_NUMERIC) { if (((int)tp1>=0) && ((int)tp1<=255)) { pars++; *p8++ = tp1; ctl->eaten += eaten; } else break; /* invalid number, end of command */ } else break; } p[3] = pars; if (pars) valid = 1; } break; case 194: /* I2CPK I2CWI I2CWK Three to 34 parameters, all 0-255. */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); if ((ctl->opt[1] == CMD_NUMERIC) && (ctl->opt[2] == CMD_NUMERIC) && ((int)p[1]>=0) && ((int)p[2]>=0) && ((int)p[2]<=255)) { pars = 0; p8 = ext; while (pars < 32) { eaten = getNum(buf+ctl->eaten, &tp1, &to1); if (to1 == CMD_NUMERIC) { if (((int)tp1>=0) && ((int)tp1<=255)) { pars++; *p8++ = tp1; ctl->eaten += eaten; } else break; /* invalid number, end of command */ } else break; } p[3] = pars; if (pars > 0) valid = 1; } break; case 195: /* CF1 CF2 Zero or more parameters, first two >=0, rest 0-255. */ valid = 1; ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); if (ctl->opt[1] == CMD_NUMERIC) { if ((int)p[1] >= 0) { ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); if (ctl->opt[2] == CMD_NUMERIC) { if ((int)p[2] >= 0) { pars = 0; p8 = ext; while (pars < CMD_MAX_PARAM) { eaten = getNum(buf+ctl->eaten, &tp1, &to1); if (to1 == CMD_NUMERIC) { if (((int)tp1>=0) && ((int)tp1<=255)) { pars++; *p8++ = tp1; ctl->eaten += eaten; } else break; } else break; } p[3] = pars; } else valid = 0; } } else valid = 0; } break; case 196: /* WVAS gpio baud offset char... p1 gpio p2 baud p3 len + 4 --------- uint32_t databits uint32_t stophalfbits uint32_t offset uint8_t[len] */ ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]); ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]); ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1); ctl->eaten += getNum(buf+ctl->eaten, &tp2, &to2); ctl->eaten += getNum(buf+ctl->eaten, &tp3, &to3); if ((ctl->opt[1] == CMD_NUMERIC) && ((int)p[1] >= 0) && (ctl->opt[2] == CMD_NUMERIC) && ((int)p[2] > 0) && (to1 == CMD_NUMERIC) && (to2 == CMD_NUMERIC) && (to3 == CMD_NUMERIC)) { pars = 0; memcpy(ext, &tp1, 4); memcpy(ext+4, &tp2, 4); memcpy(ext+8, &tp3, 4); p8 = ext + 12; while (pars < CMD_MAX_PARAM) { eaten = getNum(buf+ctl->eaten, &tp1, &to1); if (to1 == CMD_NUMERIC) { if (((int)tp1>=0) && ((int)tp1<=255)) { *p8++ = tp1; pars++; ctl->eaten += eaten; } else break; /* invalid number, end of command */ } else break; } p[3] = pars + 12; if (pars > 0) valid = 1; } break; case 197: /* WVCHA One or more parameters, all 0-255. */ pars = 0; p8 = ext; while (pars < CMD_MAX_PARAM) { eaten = getNum(buf+ctl->eaten, &tp1, &to1); if (to1 == CMD_NUMERIC) { if (((int)tp1>=0) && ((int)tp1<=255)) { pars++; *p8++ = tp1; ctl->eaten += eaten; } else break; /* invalid number, end of command */ } else break; } p[3] = pars; if (pars) valid = 1; break; } if (valid) return idx; else return CMD_BAD_PARAMETER; }