265 BC1 bits Clear GPIO in bank 1\n\ 266 BC2 bits Clear GPIO in bank 2\n\ 267 BI2CC sda Close bit bang I2C\n\ 268 BI2CO sda scl baud | Open bit bang I2C\n\ 269 BI2CZ sda ... I2C bit bang multiple transactions\n\ 271 BSPIC cs Close bit bang SPI\n\ 272 BSPIO cs miso mosi sclk baud flag | Open bit bang SPI\n\ 273 BSPIX cs ... SPI bit bang transfer\n\ 275 BR1 Read bank 1 GPIO\n\ 276 BR2 Read bank 2 GPIO\n\ 278 BS1 bits Set GPIO in bank 1\n\ 279 BS2 bits Set GPIO in bank 2\n\ 281 BSCX bctl bvs BSC I2C/SPI transfer\n\ 283 CF1 ... Custom function 1\n\ 284 CF2 ... Custom function 2\n\ 286 CGI Configuration get internals\n\ 287 CSI v Configuration set internals\n\ 289 EVM h bits Set events to monitor\n\ 290 EVT n Trigger event\n\ 292 FC h Close file handle\n\ 293 FG g steady Set glitch filter on GPIO\n\ 294 FL pat n List files which match pattern\n\ 295 FN g steady active | Set noise filter on GPIO\n\ 296 FO file mode Open a file in mode\n\ 297 FR h n Read bytes from file handle\n\ 298 FS h n from Seek to file handle position\n\ 299 FW h ... Write bytes to file handle\n\ 301 GDC g Get PWM dutycycle for GPIO\n\ 302 GPW g Get servo pulsewidth for GPIO\n\ 304 H/HELP Display command help\n\ 305 HC g f Set hardware clock frequency\n\ 306 HP g f dc Set hardware PWM frequency and dutycycle\n\ 307 HWVER Get hardware version\n\ 309 I2CC h Close I2C handle\n\ 310 I2CO bus device flags | Open I2C bus and device with flags\n\ 311 I2CPC h r word SMBus Process Call: exchange register with word\n\ 312 I2CPK h r ... SMBus Block Process Call: exchange data bytes with register\n\ 313 I2CRB h r SMBus Read Byte Data: read byte from register\n\ 314 I2CRD h n I2C Read bytes\n\ 315 I2CRI h r n SMBus Read I2C Block Data: read bytes from register\n\ 316 I2CRK h r SMBus Read Block Data: read data from register\n\ 317 I2CRS h SMBus Read Byte: read byte\n\ 318 I2CRW h r SMBus Read Word Data: read word from register\n\ 319 I2CWB h r byte SMBus Write Byte Data: write byte to register\n\ 320 I2CWD h ... I2C Write data\n\ 321 I2CWI h r ... SMBus Write I2C Block Data\n\ 322 I2CWK h r ... SMBus Write Block Data: write data to register\n\ 323 I2CWQ h b SMBus Write Quick: write bit\n\ 324 I2CWS h b SMBus Write Byte: write byte\n\ 325 I2CWW h r word SMBus Write Word Data: write word to register\n\ 326 I2CZ h ... I2C multiple transactions\n\ 328 M/MODES g mode Set GPIO mode\n\ 329 MG/MODEG g Get GPIO mode\n\ 330 MICS n Delay for microseconds\n\ 331 MILS n Delay for milliseconds\n\ 333 NB h bits Start notification\n\ 334 NC h Close notification\n\ 335 NO Request a notification\n\ 336 NP h Pause notification\n\ 338 P/PWM g v Set GPIO PWM value\n\ 339 PADG pad Get pad drive strength\n\ 340 PADS pad v Set pad drive strength\n\ 341 PARSE text Validate script\n\ 342 PFG g Get GPIO PWM frequency\n\ 343 PFS g v Set GPIO PWM frequency\n\ 344 PIGPV Get pigpio library version\n\ 345 PRG g Get GPIO PWM range\n\ 346 PROC text Store script\n\ 347 PROCD sid Delete script\n\ 348 PROCP sid Get script status and parameters\n\ 349 PROCR sid ... Run script\n\ 350 PROCS sid Stop script\n\ 351 PROCU sid ... Set script parameters\n\ 352 PRRG g Get GPIO PWM real range\n\ 353 PRS g v Set GPIO PWM range\n\ 354 PUD g pud Set GPIO pull up/down\n\ 356 R/READ g Read GPIO level\n\ 358 S/SERVO g v Set GPIO servo pulsewidth\n\ 359 SERC h Close serial handle\n\ 360 SERDA h Check for serial data ready to read\n\ 361 SERO text baud flags | Open serial device at baud with flags\n\ 362 SERR h n Read bytes from serial handle\n\ 363 SERRB h Read byte from serial handle\n\ 364 SERW h ... Write bytes to serial handle\n\ 365 SERWB h byte Write byte to serial handle\n\ 366 SHELL name str Execute a shell command\n\ 367 SLR g v Read bit bang serial data from GPIO\n\ 368 SLRC g Close GPIO for bit bang serial data\n\ 369 SLRO g baud bitlen | Open GPIO for bit bang serial data\n\ 370 SLRI g invert Invert serial logic (1 invert, 0 normal)\n\ 371 SPIC h SPI close handle\n\ 372 SPIO channel baud flags | SPI open channel at baud with flags\n\ 373 SPIR h v SPI read bytes from handle\n\ 374 SPIW h ... SPI write bytes to handle\n\ 375 SPIX h ... SPI transfer bytes to handle\n\ 377 T/TICK Get current tick\n\ 378 TRIG g micros l Trigger level for micros on GPIO\n\ 380 W/WRITE g l Write level to GPIO\n\ 381 WDOG g millis Set millisecond watchdog on GPIO\n\ 382 WVAG triplets Wave add generic pulses\n\ 383 WVAS g baud bitlen stopbits offset ... | Wave add serial data\n\ 384 WVBSY Check if wave busy\n\ 385 WVCHA Transmit a chain of waves\n\ 387 WVCRE Create wave from added pulses\n\ 388 WVDEL wid Delete waves w and higher\n\ 389 WVGO Wave transmit (DEPRECATED)\n\ 390 WVGOR Wave transmit repeatedly (DEPRECATED)\n\ 392 WVNEW Start a new empty wave\n\ 393 WVSC 0,1,2 Wave get DMA control block stats\n\ 394 WVSM 0,1,2 Wave get micros stats\n\ 395 WVSP 0,1,2 Wave get pulses stats\n\ 396 WVTAT Returns the current transmitting wave\n\ 397 WVTX wid Transmit wave as one-shot\n\ 398 WVTXM wid wmde Transmit wave using mode\n\ 399 WVTXR wid Transmit wave repeatedly\n\ 401 Numbers may be entered as hex (prefix 0x), octal (prefix 0),\n\ 402 otherwise they are assumed to be decimal.\n\ 406 pigs w 4 1 # set GPIO 4 high\n\ 407 pigs r 5 # read GPIO 5\n\ 408 pigs t # get current tick\n\ 409 pigs i2co 1 0x20 0 # get handle to device 0x20 on I2C bus 1\n\ 411 man pigs for full details.\n\ 578 if (strcasecmp(str, cmdInfo[i].
name) == 0)
return i;
583 static int getNum(
char *str, uint32_t *val, int8_t *opt)
590 f = sscanf(str,
" %ji %n", &v, &n);
599 f = sscanf(str,
" v%ji %n", &v, &n);
609 f = sscanf(str,
" p%ji %n", &v, &n);
630 char *buf, uint32_t *p,
unsigned ext_len,
char *ext,
cmdCtlParse_t *ctl)
632 int f, valid, idx, val, pp, pars, n, n2;
636 uint32_t tp1=0, tp2=0, tp3=0, tp4=0, tp5=0;
637 int8_t to1, to2, to3, to4, to5;
643 bzero(&ctl->
opt,
sizeof(ctl->
opt));
653 if (idx < 0)
return idx;
657 p[0] = cmdInfo[idx].
cmd;
662 switch (cmdInfo[idx].vt)
683 if (ctl->
opt[1] > 0) valid = 1;
696 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0)) valid = 1;
723 p[3] = strlen(buf+ctl->
eaten);
724 memcpy(ext, buf+ctl->
eaten, p[3]);
734 f = sscanf(buf+ctl->
eaten,
" %*s%n %n", &n, &n2);
739 memcpy(ext, buf+ctl->
eaten, n);
755 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) &&
756 (ctl->
opt[2] > 0) && ((
int)p[2] >= 0)) valid = 1;
767 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) &&
768 (ctl->
opt[2] > 0)) valid = 1;
779 if ((ctl->
opt[1] > 0) &&
781 (ctl->
opt[2] > 0)) valid = 1;
803 f = sscanf(buf+ctl->
eaten,
" %c %n", &c, &n);
805 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) && (f >= 1))
827 f = sscanf(buf+ctl->
eaten,
" %c %n", &c, &n);
829 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) && (f >= 1))
848 f = sscanf(buf+ctl->
eaten,
" %*s%n %n", &n, &n2);
853 memcpy(ext, buf+ctl->
eaten, n);
858 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0))
869 f = sscanf(buf+ctl->
eaten,
" %*s%n %n", &n, &n2);
876 memcpy(ext, buf+ctl->
eaten, n);
880 n2 = strlen(buf+ctl->
eaten+1);
881 memcpy(ext+n+1, buf+ctl->
eaten+1, n2);
884 p[3] = p[1] + n2 + 1;
898 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) &&
899 (ctl->
opt[2] > 0) && ((
int)p[2] >= 0) &&
900 (ctl->
opt[3] > 0) && ((
int)tp1 >= 0))
903 memcpy(ext, &tp1, 4);
913 f = sscanf(buf+ctl->
eaten,
" %*s%n %n", &n, &n2);
918 memcpy(ext, buf+ctl->
eaten, n);
924 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) &&
925 (ctl->
opt[2] > 0) && ((
int)p[2] >= 0))
940 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) &&
945 memcpy(ext, &tp1, 4);
963 if ((ctl->
opt[1] > 0) && ((
int)p[1] >= 0) &&
971 memcpy(ext+ 0, &tp1, 4);
972 memcpy(ext+ 4, &tp2, 4);
973 memcpy(ext+ 8, &tp3, 4);
974 memcpy(ext+12, &tp4, 4);
975 memcpy(ext+16, &tp5, 4);
991 p32 = (int32_t *)ext;
1018 p32 = (int32_t *)ext;
1033 if (pars && ((pars % 3) == 0)) valid = 1;
1056 if (((
int)tp1>=0) && ((
int)tp1<=255))
1060 ctl->
eaten += eaten;
1084 ((
int)p[1]>=0) && ((
int)p[2]>=0) && ((
int)p[2]<=255))
1094 if (((
int)tp1>=0) && ((
int)tp1<=255))
1098 ctl->
eaten += eaten;
1107 if (pars > 0) valid = 1;
1138 if (((
int)tp1>=0) && ((
int)tp1<=255))
1142 ctl->
eaten += eaten;
1186 memcpy(ext, &tp1, 4);
1187 memcpy(ext+4, &tp2, 4);
1188 memcpy(ext+8, &tp3, 4);
1195 if (((
int)tp1>=0) && ((
int)tp1<=255))
1199 ctl->
eaten += eaten;
1208 if (pars > 0) valid = 1;
1225 if (((
int)tp1>=0) && ((
int)tp1<=255))
1229 ctl->
eaten += eaten;
1238 if (pars) valid = 1;
1254 if (errInfo[i].error == error)
return errInfo[i].
str;
1256 return "unknown error";
1261 int idx, len, b, i, j, tags, resolved;
1274 len = strlen(script);
1281 s->
par = calloc(1, b);
1283 if (s->
par == NULL)
return -1;
1300 while (ctl.
eaten<len)
1314 memcpy(&instr.
p, p,
sizeof(instr.
p));
1321 for (j=0; j<tags; j++)
1323 if (tag_step[j].tag == instr.
p[1])
1327 fprintf(stderr,
"Duplicate tag: %d\n", instr.
p[1]);
1335 tag_step[tags].
tag = instr.
p[1];
1343 fprintf(stderr,
"Too many tags: %d\n", instr.
p[1]);
1355 fprintf(stderr,
"Unknown command: %s\n",
cmdStr());
1357 fprintf(stderr,
"Bad parameter to %s\n",
cmdStr());
1366 memcpy(instr.
opt, &ctl.
opt,
sizeof(instr.
opt));
1372 for (i=0; i<s->
instrs; i++)
1374 instr = s->
instr[i];
1384 for (j=0; j<tags; j++)
1386 if (instr.
p[1] == tag_step[j].
tag)
1398 fprintf(stderr,
"Can't resolve tag %d\n", instr.
p[1]);
#define PI_FIL_OPEN_FAILED
#define PI_BAD_CHAIN_DELAY
#define PI_BAD_CFG_INTERNAL
#define PI_BAD_MALLOC_MODE
#define PI_BAD_SHELL_STATUS
#define PI_BAD_WVSP_COMMND
#define CMD_BAD_PARAMETER
#define PI_CHAIN_LOOP_CNT
#define PI_SER_READ_FAILED
#define PI_BAD_SERIAL_STRUC
#define PI_BAD_SOCKET_PORT
#define PI_BAD_CLK_MICROS
void error(const char *msg)
#define CMD_MAX_EXTENSION
#define PI_EMPTY_WAVEFORM
#define PI_BAD_FILE_WRITE
static errInfo_t errInfo[]
#define PI_CMD_INTERRUPTED
#define PI_I2C_READ_FAILED
#define PI_FILE_NOT_WOPEN
#define PI_BAD_SECO_CHANNEL
#define PI_BAD_BUF_MILLIS
#define PI_BAD_PULSEWIDTH
int cmdParseScript(char *script, cmdScript_t *s, int diags)
#define PI_SOME_PERMITTED
#define PI_BAD_FIFO_COMMAND
#define PI_NO_WAVEFORM_ID
#define PI_MAX_SCRIPT_VARS
#define PI_BAD_WDOG_TIMEOUT
#define PI_SCRIPT_NOT_READY
#define PI_BAD_CLK_SOURCE
#define PI_MAX_SCRIPT_PARAMS
#define PI_BAD_SCRIPT_NAME
#define PI_NOT_INITIALISED
#define PI_SER_WRITE_FAILED
static char intCmdStr[32]
#define PI_SPI_XFER_FAILED
#define PI_BAD_CLK_PERIPH
#define PI_NOT_SERIAL_GPIO
#define PI_BAD_WVSM_COMMND
#define PI_BAD_SER_DEVICE
#define PI_SER_OPEN_FAILED
#define PI_SER_READ_NO_DATA
#define PI_TOO_MANY_CHARS
#define PI_FILE_NOT_ROPEN
int cmdParse(char *buf, uint32_t *p, unsigned ext_len, char *ext, cmdCtlParse_t *ctl)
static int cmdMatch(char *str)
#define PI_NO_FILE_ACCESS
#define PI_BAD_MILS_DELAY
#define PI_TOO_MANY_PULSES
#define PI_BAD_SER_OFFSET
#define PI_MAX_SCRIPT_TAGS
#define PI_BAD_SERIAL_BUF
#define PI_BAD_SER_INVERT
#define PI_I2C_OPEN_FAILED
#define PI_BAD_CHAIN_LOOP
#define PI_SPI_OPEN_FAILED
#define PI_NO_SCRIPT_ROOM
#define PI_NOT_SERVO_GPIO
#define PI_TOO_MANY_PARAM
#define PI_UNKNOWN_COMMAND
#define PI_BAD_SERIAL_COUNT
char * cmdErrStr(int error)
#define PI_BAD_SCRIPT_CMD
#define PI_SOCK_WRIT_FAILED
#define PI_BAD_MICS_DELAY
#define PI_I2C_WRITE_FAILED
#define PI_BAD_WVSC_COMMND
#define PI_BAD_SPI_CHANNEL
#define CMD_EXT_TOO_SMALL
static int getNum(char *str, uint32_t *val, int8_t *opt)
#define PI_SOCK_READ_FAILED