コード例 #1
0
ファイル: linearMotion.cpp プロジェクト: jCandlish/cutsim
//need to return RAPID for rapids...
MOTION_TYPE linearMotion::getMotionType() {
  bool traverse = cmdMatch("STRAIGHT_TRAVERSE");
  if (traverse) {
    return TRAVERSE;
  } else {
    return STRAIGHT_FEED;
  }
}
コード例 #2
0
ファイル: command.c プロジェクト: ciclonite/pigpio
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;
}