command.c
Go to the documentation of this file.
1 /*
2 This is free and unencumbered software released into the public domain.
3 
4 Anyone is free to copy, modify, publish, use, compile, sell, or
5 distribute this software, either in source code form or as a compiled
6 binary, for any purpose, commercial or non-commercial, and by any
7 means.
8 
9 In jurisdictions that recognize copyright laws, the author or authors
10 of this software dedicate any and all copyright interest in the
11 software to the public domain. We make this dedication for the benefit
12 of the public at large and to the detriment of our heirs and
13 successors. We intend this dedication to be an overt act of
14 relinquishment in perpetuity of all present and future rights to this
15 software under copyright law.
16 
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 OTHER DEALINGS IN THE SOFTWARE.
24 
25 For more information, please refer to <http://unlicense.org/>
26 */
27 
28 /*
29 This version is for pigpio version 67+
30 */
31 
32 #include <stdio.h>
33 #include <string.h>
34 #include <stdarg.h>
35 #include <stdlib.h>
36 #include <ctype.h>
37 
38 #include "pigpio.h"
39 #include "command.h"
40 
42 {
43  /* num str vfyt retv */
44 
45  {PI_CMD_BC1, "BC1", 111, 1}, // gpioWrite_Bits_0_31_Clear
46  {PI_CMD_BC2, "BC2", 111, 1}, // gpioWrite_Bits_32_53_Clear
47 
48  {PI_CMD_BI2CC, "BI2CC", 112, 0}, // bbI2CClose
49  {PI_CMD_BI2CO, "BI2CO", 131, 0}, // bbI2COpen
50  {PI_CMD_BI2CZ, "BI2CZ", 193, 6}, // bbI2CZip
51 
52  {PI_CMD_BR1, "BR1", 101, 3}, // gpioRead_Bits_0_31
53  {PI_CMD_BR2, "BR2", 101, 3}, // gpioRead_Bits_32_53
54 
55  {PI_CMD_BS1, "BS1", 111, 1}, // gpioWrite_Bits_0_31_Set
56  {PI_CMD_BS2, "BS2", 111, 1}, // gpioWrite_Bits_32_53_Set
57 
58  {PI_CMD_BSCX, "BSCX", 193, 8}, // bscXfer
59 
60  {PI_CMD_BSPIC, "BSPIC", 112, 0}, // bbSPIClose
61  {PI_CMD_BSPIO, "BSPIO", 134, 0}, // bbSPIOpen
62  {PI_CMD_BSPIX, "BSPIX", 193, 6}, // bbSPIXfer
63 
64  {PI_CMD_CF1, "CF1", 195, 2}, // gpioCustom1
65  {PI_CMD_CF2, "CF2", 195, 6}, // gpioCustom2
66 
67  {PI_CMD_CGI, "CGI", 101, 4}, // gpioCfgGetInternals
68  {PI_CMD_CSI, "CSI", 111, 1}, // gpioCfgSetInternals
69 
70  {PI_CMD_EVM, "EVM", 122, 1}, // eventMonitor
71  {PI_CMD_EVT, "EVT", 112, 0}, // eventTrigger
72 
73  {PI_CMD_FC, "FC", 112, 0}, // fileClose
74 
75  {PI_CMD_FG, "FG", 121, 0}, // gpioGlitchFilter
76 
77  {PI_CMD_FL, "FL", 127, 6}, // fileList
78 
79  {PI_CMD_FN, "FN", 131, 0}, // gpioNoiseFilter
80 
81  {PI_CMD_FO, "FO", 127, 2}, // fileOpen
82  {PI_CMD_FR, "FR", 121, 6}, // fileRead
83  {PI_CMD_FS, "FS", 133, 2}, // fileSeek
84  {PI_CMD_FW, "FW", 193, 0}, // fileWrite
85 
86  {PI_CMD_GDC, "GDC", 112, 2}, // gpioGetPWMdutycycle
87  {PI_CMD_GPW, "GPW", 112, 2}, // gpioGetServoPulsewidth
88 
89  {PI_CMD_HELP, "H", 101, 5}, // cmdUsage
90  {PI_CMD_HELP, "HELP", 101, 5}, // cmdUsage
91 
92  {PI_CMD_HC, "HC", 121, 0}, // gpioHardwareClock
93  {PI_CMD_HP, "HP", 131, 0}, // gpioHardwarePWM
94 
95  {PI_CMD_HWVER, "HWVER", 101, 4}, // gpioHardwareRevision
96 
97  {PI_CMD_I2CC, "I2CC", 112, 0}, // i2cClose
98  {PI_CMD_I2CO, "I2CO", 131, 2}, // i2cOpen
99 
100  {PI_CMD_I2CPC, "I2CPC", 131, 2}, // i2cProcessCall
101  {PI_CMD_I2CPK, "I2CPK", 194, 6}, // i2cBlockProcessCall
102 
103  {PI_CMD_I2CRB, "I2CRB", 121, 2}, // i2cReadByteData
104  {PI_CMD_I2CRD, "I2CRD", 121, 6}, // i2cReadDevice
105  {PI_CMD_I2CRI, "I2CRI", 131, 6}, // i2cReadI2CBlockData
106  {PI_CMD_I2CRK, "I2CRK", 121, 6}, // i2cReadBlockData
107  {PI_CMD_I2CRS, "I2CRS", 112, 2}, // i2cReadByte
108  {PI_CMD_I2CRW, "I2CRW", 121, 2}, // i2cReadWordData
109 
110  {PI_CMD_I2CWB, "I2CWB", 131, 0}, // i2cWriteByteData
111  {PI_CMD_I2CWD, "I2CWD", 193, 0}, // i2cWriteDevice
112  {PI_CMD_I2CWI, "I2CWI", 194, 0}, // i2cWriteI2CBlockData
113  {PI_CMD_I2CWK, "I2CWK", 194, 0}, // i2cWriteBlockData
114  {PI_CMD_I2CWQ, "I2CWQ", 121, 0}, // i2cWriteQuick
115  {PI_CMD_I2CWS, "I2CWS", 121, 0}, // i2cWriteByte
116  {PI_CMD_I2CWW, "I2CWW", 131, 0}, // i2cWriteWordData
117 
118  {PI_CMD_I2CZ, "I2CZ", 193, 6}, // i2cZip
119 
120  {PI_CMD_MICS, "MICS", 112, 0}, // gpioDelay
121  {PI_CMD_MILS, "MILS", 112, 0}, // gpioDelay
122 
123  {PI_CMD_MODEG, "MG" , 112, 2}, // gpioGetMode
124  {PI_CMD_MODEG, "MODEG", 112, 2}, // gpioGetMode
125 
126  {PI_CMD_MODES, "M", 125, 0}, // gpioSetMode
127  {PI_CMD_MODES, "MODES", 125, 0}, // gpioSetMode
128 
129  {PI_CMD_NB, "NB", 122, 0}, // gpioNotifyBegin
130  {PI_CMD_NC, "NC", 112, 0}, // gpioNotifyClose
131  {PI_CMD_NO, "NO", 101, 2}, // gpioNotifyOpen
132  {PI_CMD_NP, "NP", 112, 0}, // gpioNotifyPause
133 
134  {PI_CMD_PADG, "PADG", 112, 2}, // gpioGetPad
135  {PI_CMD_PADS, "PADS", 121, 0}, // gpioSetPad
136 
137  {PI_CMD_PARSE, "PARSE", 115, 0}, // cmdParseScript
138 
139  {PI_CMD_PFG, "PFG", 112, 2}, // gpioGetPWMfrequency
140  {PI_CMD_PFS, "PFS", 121, 2}, // gpioSetPWMfrequency
141 
142  {PI_CMD_PIGPV, "PIGPV", 101, 4}, // gpioVersion
143 
144  {PI_CMD_PRG, "PRG", 112, 2}, // gpioGetPWMrange
145 
146  {PI_CMD_PROC, "PROC", 115, 2}, // gpioStoreScript
147  {PI_CMD_PROCD, "PROCD", 112, 0}, // gpioDeleteScript
148  {PI_CMD_PROCP, "PROCP", 112, 7}, // gpioScriptStatus
149  {PI_CMD_PROCR, "PROCR", 191, 0}, // gpioRunScript
150  {PI_CMD_PROCS, "PROCS", 112, 0}, // gpioStopScript
151  {PI_CMD_PROCU, "PROCU", 191, 0}, // gpioUpdateScript
152 
153  {PI_CMD_PRRG, "PRRG", 112, 2}, // gpioGetPWMrealRange
154  {PI_CMD_PRS, "PRS", 121, 2}, // gpioSetPWMrange
155 
156  {PI_CMD_PUD, "PUD", 126, 0}, // gpioSetPullUpDown
157 
158  {PI_CMD_PWM, "P", 121, 0}, // gpioPWM
159  {PI_CMD_PWM, "PWM", 121, 0}, // gpioPWM
160 
161  {PI_CMD_READ, "R", 112, 2}, // gpioRead
162  {PI_CMD_READ, "READ", 112, 2}, // gpioRead
163 
164  {PI_CMD_SERRB, "SERRB", 112, 2}, // serReadByte
165  {PI_CMD_SERWB, "SERWB", 121, 0}, // serWriteByte
166  {PI_CMD_SERC, "SERC", 112, 0}, // serClose
167  {PI_CMD_SERDA, "SERDA", 112, 2}, // serDataAvailable
168  {PI_CMD_SERO, "SERO", 132, 2}, // serOpen
169  {PI_CMD_SERR, "SERR", 121, 6}, // serRead
170  {PI_CMD_SERW, "SERW", 193, 0}, // serWrite
171 
172  {PI_CMD_SERVO, "S", 121, 0}, // gpioServo
173  {PI_CMD_SERVO, "SERVO", 121, 0}, // gpioServo
174 
175  {PI_CMD_SHELL, "SHELL", 128, 2}, // shell
176 
177  {PI_CMD_SLR, "SLR", 121, 6}, // gpioSerialRead
178  {PI_CMD_SLRC, "SLRC", 112, 0}, // gpioSerialReadClose
179  {PI_CMD_SLRO, "SLRO", 131, 0}, // gpioSerialReadOpen
180  {PI_CMD_SLRI, "SLRI", 121, 0}, // gpioSerialReadInvert
181 
182  {PI_CMD_SPIC, "SPIC", 112, 0}, // spiClose
183  {PI_CMD_SPIO, "SPIO", 131, 2}, // spiOpen
184  {PI_CMD_SPIR, "SPIR", 121, 6}, // spiRead
185  {PI_CMD_SPIW, "SPIW", 193, 0}, // spiWrite
186  {PI_CMD_SPIX, "SPIX", 193, 6}, // spiXfer
187 
188  {PI_CMD_TICK, "T", 101, 4}, // gpioTick
189  {PI_CMD_TICK, "TICK", 101, 4}, // gpioTick
190 
191  {PI_CMD_TRIG, "TRIG", 131, 0}, // gpioTrigger
192 
193  {PI_CMD_WDOG, "WDOG", 121, 0}, // gpioSetWatchdog
194 
195  {PI_CMD_WRITE, "W", 121, 0}, // gpioWrite
196  {PI_CMD_WRITE, "WRITE", 121, 0}, // gpioWrite
197 
198  {PI_CMD_WVAG, "WVAG", 192, 2}, // gpioWaveAddGeneric
199  {PI_CMD_WVAS, "WVAS", 196, 2}, // gpioWaveAddSerial
200  {PI_CMD_WVTAT, "WVTAT", 101, 2}, // gpioWaveTxAt
201  {PI_CMD_WVBSY, "WVBSY", 101, 2}, // gpioWaveTxBusy
202  {PI_CMD_WVCHA, "WVCHA", 197, 0}, // gpioWaveChain
203  {PI_CMD_WVCLR, "WVCLR", 101, 0}, // gpioWaveClear
204  {PI_CMD_WVCRE, "WVCRE", 101, 2}, // gpioWaveCreate
205  {PI_CMD_WVDEL, "WVDEL", 112, 0}, // gpioWaveDelete
206  {PI_CMD_WVGO, "WVGO" , 101, 2}, // gpioWaveTxStart
207  {PI_CMD_WVGOR, "WVGOR", 101, 2}, // gpioWaveTxStart
208  {PI_CMD_WVHLT, "WVHLT", 101, 0}, // gpioWaveTxStop
209  {PI_CMD_WVNEW, "WVNEW", 101, 0}, // gpioWaveAddNew
210  {PI_CMD_WVSC, "WVSC", 112, 2}, // gpioWaveGet*Cbs
211  {PI_CMD_WVSM, "WVSM", 112, 2}, // gpioWaveGet*Micros
212  {PI_CMD_WVSP, "WVSP", 112, 2}, // gpioWaveGet*Pulses
213  {PI_CMD_WVTX, "WVTX", 112, 2}, // gpioWaveTxSend
214  {PI_CMD_WVTXM, "WVTXM", 121, 2}, // gpioWaveTxSend
215  {PI_CMD_WVTXR, "WVTXR", 112, 2}, // gpioWaveTxSend
216 
217  {PI_CMD_ADD , "ADD" , 111, 0},
218  {PI_CMD_AND , "AND" , 111, 0},
219  {PI_CMD_CALL , "CALL" , 114, 0},
220  {PI_CMD_CMDR ,"CMDR" , 111, 0},
221  {PI_CMD_CMDW , "CMDW" , 111, 0},
222  {PI_CMD_CMP , "CMP" , 111, 0},
223  {PI_CMD_DCR , "DCR" , 113, 0},
224  {PI_CMD_DCRA , "DCRA" , 101, 0},
225  {PI_CMD_DIV , "DIV" , 111, 0},
226  {PI_CMD_EVTWT, "EVTWT", 111, 0},
227  {PI_CMD_HALT , "HALT" , 101, 0},
228  {PI_CMD_INR , "INR" , 113, 0},
229  {PI_CMD_INRA , "INRA" , 101, 0},
230  {PI_CMD_JM , "JM" , 114, 0},
231  {PI_CMD_JMP , "JMP" , 114, 0},
232  {PI_CMD_JNZ , "JNZ" , 114, 0},
233  {PI_CMD_JP , "JP" , 114, 0},
234  {PI_CMD_JZ , "JZ" , 114, 0},
235  {PI_CMD_LD , "LD" , 123, 0},
236  {PI_CMD_LDA , "LDA" , 111, 0},
237  {PI_CMD_LDAB , "LDAB" , 111, 0},
238  {PI_CMD_MLT , "MLT" , 111, 0},
239  {PI_CMD_MOD , "MOD" , 111, 0},
240  {PI_CMD_NOP , "NOP" , 101, 0},
241  {PI_CMD_OR , "OR" , 111, 0},
242  {PI_CMD_POP , "POP" , 113, 0},
243  {PI_CMD_POPA , "POPA" , 101, 0},
244  {PI_CMD_PUSH , "PUSH" , 113, 0},
245  {PI_CMD_PUSHA, "PUSHA", 101, 0},
246  {PI_CMD_RET , "RET" , 101, 0},
247  {PI_CMD_RL , "RL" , 123, 0},
248  {PI_CMD_RLA , "RLA" , 111, 0},
249  {PI_CMD_RR , "RR" , 123, 0},
250  {PI_CMD_RRA , "RRA" , 111, 0},
251  {PI_CMD_STA , "STA" , 113, 0},
252  {PI_CMD_STAB , "STAB" , 111, 0},
253  {PI_CMD_SUB , "SUB" , 111, 0},
254  {PI_CMD_SYS , "SYS" , 116, 0},
255  {PI_CMD_TAG , "TAG" , 114, 0},
256  {PI_CMD_WAIT , "WAIT" , 111, 0},
257  {PI_CMD_X , "X" , 124, 0},
258  {PI_CMD_XA , "XA" , 113, 0},
259  {PI_CMD_XOR , "XOR" , 111, 0},
260 
261 };
262 
263 
264 char * cmdUsage = "\n\
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\
270 \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\
274 \n\
275 BR1 Read bank 1 GPIO\n\
276 BR2 Read bank 2 GPIO\n\
277 \n\
278 BS1 bits Set GPIO in bank 1\n\
279 BS2 bits Set GPIO in bank 2\n\
280 \n\
281 BSCX bctl bvs BSC I2C/SPI transfer\n\
282 \n\
283 CF1 ... Custom function 1\n\
284 CF2 ... Custom function 2\n\
285 \n\
286 CGI Configuration get internals\n\
287 CSI v Configuration set internals\n\
288 \n\
289 EVM h bits Set events to monitor\n\
290 EVT n Trigger event\n\
291 \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\
300 \n\
301 GDC g Get PWM dutycycle for GPIO\n\
302 GPW g Get servo pulsewidth for GPIO\n\
303 \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\
308 \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\
327 \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\
332 \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\
337 \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\
355 \n\
356 R/READ g Read GPIO level\n\
357 \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\
376 \n\
377 T/TICK Get current tick\n\
378 TRIG g micros l Trigger level for micros on GPIO\n\
379 \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\
386 WVCLR Wave clear\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\
391 WVHLT Wave stop\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\
400 \n\
401 Numbers may be entered as hex (prefix 0x), octal (prefix 0),\n\
402 otherwise they are assumed to be decimal.\n\
403 \n\
404 Examples\n\
405 \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\
410 \n\
411 man pigs for full details.\n\
412 \n";
413 
414 typedef struct
415 {
416  int error;
417  char * str;
418 } errInfo_t;
419 
421 {
422  {PI_INIT_FAILED , "pigpio initialisation failed"},
423  {PI_BAD_USER_GPIO , "GPIO not 0-31"},
424  {PI_BAD_GPIO , "GPIO not 0-53"},
425  {PI_BAD_MODE , "mode not 0-7"},
426  {PI_BAD_LEVEL , "level not 0-1"},
427  {PI_BAD_PUD , "pud not 0-2"},
428  {PI_BAD_PULSEWIDTH , "pulsewidth not 0 or 500-2500"},
429  {PI_BAD_DUTYCYCLE , "dutycycle not 0-range (default 255)"},
430  {PI_BAD_TIMER , "timer not 0-9"},
431  {PI_BAD_MS , "ms not 10-60000"},
432  {PI_BAD_TIMETYPE , "timetype not 0-1"},
433  {PI_BAD_SECONDS , "seconds < 0"},
434  {PI_BAD_MICROS , "micros not 0-999999"},
435  {PI_TIMER_FAILED , "gpioSetTimerFunc failed"},
436  {PI_BAD_WDOG_TIMEOUT , "timeout not 0-60000"},
437  {PI_NO_ALERT_FUNC , "DEPRECATED"},
438  {PI_BAD_CLK_PERIPH , "clock peripheral not 0-1"},
439  {PI_BAD_CLK_SOURCE , "DEPRECATED"},
440  {PI_BAD_CLK_MICROS , "clock micros not 1, 2, 4, 5, 8, or 10"},
441  {PI_BAD_BUF_MILLIS , "buf millis not 100-10000"},
442  {PI_BAD_DUTYRANGE , "dutycycle range not 25-40000"},
443  {PI_BAD_SIGNUM , "signum not 0-63"},
444  {PI_BAD_PATHNAME , "can't open pathname"},
445  {PI_NO_HANDLE , "no handle available"},
446  {PI_BAD_HANDLE , "unknown handle"},
447  {PI_BAD_IF_FLAGS , "ifFlags > 4"},
448  {PI_BAD_CHANNEL , "DMA channel not 0-14"},
449  {PI_BAD_SOCKET_PORT , "socket port not 1024-30000"},
450  {PI_BAD_FIFO_COMMAND , "unknown fifo command"},
451  {PI_BAD_SECO_CHANNEL , "DMA secondary channel not 0-14"},
452  {PI_NOT_INITIALISED , "function called before gpioInitialise"},
453  {PI_INITIALISED , "function called after gpioInitialise"},
454  {PI_BAD_WAVE_MODE , "waveform mode not 0-1"},
455  {PI_BAD_CFG_INTERNAL , "bad parameter in gpioCfgInternals call"},
456  {PI_BAD_WAVE_BAUD , "baud rate not 50-250K(RX)/50-1M(TX)"},
457  {PI_TOO_MANY_PULSES , "waveform has too many pulses"},
458  {PI_TOO_MANY_CHARS , "waveform has too many chars"},
459  {PI_NOT_SERIAL_GPIO , "no bit bang serial read in progress on GPIO"},
460  {PI_BAD_SERIAL_STRUC , "bad (null) serial structure parameter"},
461  {PI_BAD_SERIAL_BUF , "bad (null) serial buf parameter"},
462  {PI_NOT_PERMITTED , "no permission to update GPIO"},
463  {PI_SOME_PERMITTED , "no permission to update one or more GPIO"},
464  {PI_BAD_WVSC_COMMND , "bad WVSC subcommand"},
465  {PI_BAD_WVSM_COMMND , "bad WVSM subcommand"},
466  {PI_BAD_WVSP_COMMND , "bad WVSP subcommand"},
467  {PI_BAD_PULSELEN , "trigger pulse length not 1-100"},
468  {PI_BAD_SCRIPT , "invalid script"},
469  {PI_BAD_SCRIPT_ID , "unknown script id"},
470  {PI_BAD_SER_OFFSET , "add serial data offset > 30 minute"},
471  {PI_GPIO_IN_USE , "GPIO already in use"},
472  {PI_BAD_SERIAL_COUNT , "must read at least a byte at a time"},
473  {PI_BAD_PARAM_NUM , "script parameter id not 0-9"},
474  {PI_DUP_TAG , "script has duplicate tag"},
475  {PI_TOO_MANY_TAGS , "script has too many tags"},
476  {PI_BAD_SCRIPT_CMD , "illegal script command"},
477  {PI_BAD_VAR_NUM , "script variable id not 0-149"},
478  {PI_NO_SCRIPT_ROOM , "no more room for scripts"},
479  {PI_NO_MEMORY , "can't allocate temporary memory"},
480  {PI_SOCK_READ_FAILED , "socket read failed"},
481  {PI_SOCK_WRIT_FAILED , "socket write failed"},
482  {PI_TOO_MANY_PARAM , "too many script parameters (> 10)"},
483  {PI_SCRIPT_NOT_READY , "script initialising"},
484  {PI_BAD_TAG , "script has unresolved tag"},
485  {PI_BAD_MICS_DELAY , "bad MICS delay (too large)"},
486  {PI_BAD_MILS_DELAY , "bad MILS delay (too large)"},
487  {PI_BAD_WAVE_ID , "non existent wave id"},
488  {PI_TOO_MANY_CBS , "No more CBs for waveform"},
489  {PI_TOO_MANY_OOL , "No more OOL for waveform"},
490  {PI_EMPTY_WAVEFORM , "attempt to create an empty waveform"},
491  {PI_NO_WAVEFORM_ID , "no more waveform ids"},
492  {PI_I2C_OPEN_FAILED , "can't open I2C device"},
493  {PI_SER_OPEN_FAILED , "can't open serial device"},
494  {PI_SPI_OPEN_FAILED , "can't open SPI device"},
495  {PI_BAD_I2C_BUS , "bad I2C bus"},
496  {PI_BAD_I2C_ADDR , "bad I2C address"},
497  {PI_BAD_SPI_CHANNEL , "bad SPI channel"},
498  {PI_BAD_FLAGS , "bad i2c/spi/ser open flags"},
499  {PI_BAD_SPI_SPEED , "bad SPI speed"},
500  {PI_BAD_SER_DEVICE , "bad serial device name"},
501  {PI_BAD_SER_SPEED , "bad serial baud rate"},
502  {PI_BAD_PARAM , "bad i2c/spi/ser parameter"},
503  {PI_I2C_WRITE_FAILED , "I2C write failed"},
504  {PI_I2C_READ_FAILED , "I2C read failed"},
505  {PI_BAD_SPI_COUNT , "bad SPI count"},
506  {PI_SER_WRITE_FAILED , "ser write failed"},
507  {PI_SER_READ_FAILED , "ser read failed"},
508  {PI_SER_READ_NO_DATA , "ser read no data available"},
509  {PI_UNKNOWN_COMMAND , "unknown command"},
510  {PI_SPI_XFER_FAILED , "spi xfer/read/write failed"},
511  {PI_BAD_POINTER , "bad (NULL) pointer"},
512  {PI_NO_AUX_SPI , "no auxiliary SPI on Pi A or B"},
513  {PI_NOT_PWM_GPIO , "GPIO is not in use for PWM"},
514  {PI_NOT_SERVO_GPIO , "GPIO is not in use for servo pulses"},
515  {PI_NOT_HCLK_GPIO , "GPIO has no hardware clock"},
516  {PI_NOT_HPWM_GPIO , "GPIO has no hardware PWM"},
517  {PI_BAD_HPWM_FREQ , "hardware PWM frequency not 1-125M"},
518  {PI_BAD_HPWM_DUTY , "hardware PWM dutycycle not 0-1M"},
519  {PI_BAD_HCLK_FREQ , "hardware clock frequency not 4689-250M"},
520  {PI_BAD_HCLK_PASS , "need password to use hardware clock 1"},
521  {PI_HPWM_ILLEGAL , "illegal, PWM in use for main clock"},
522  {PI_BAD_DATABITS , "serial data bits not 1-32"},
523  {PI_BAD_STOPBITS , "serial (half) stop bits not 2-8"},
524  {PI_MSG_TOOBIG , "socket/pipe message too big"},
525  {PI_BAD_MALLOC_MODE , "bad memory allocation mode"},
526  {PI_TOO_MANY_SEGS , "too many I2C transaction segments"},
527  {PI_BAD_I2C_SEG , "an I2C transaction segment failed"},
528  {PI_BAD_SMBUS_CMD , "SMBus command not supported by driver"},
529  {PI_NOT_I2C_GPIO , "no bit bang I2C in progress on GPIO"},
530  {PI_BAD_I2C_WLEN , "bad I2C write length"},
531  {PI_BAD_I2C_RLEN , "bad I2C read length"},
532  {PI_BAD_I2C_CMD , "bad I2C command"},
533  {PI_BAD_I2C_BAUD , "bad I2C baud rate, not 50-500k"},
534  {PI_CHAIN_LOOP_CNT , "bad chain loop count"},
535  {PI_BAD_CHAIN_LOOP , "empty chain loop"},
536  {PI_CHAIN_COUNTER , "too many chain counters"},
537  {PI_BAD_CHAIN_CMD , "bad chain command"},
538  {PI_BAD_CHAIN_DELAY , "bad chain delay micros"},
539  {PI_CHAIN_NESTING , "chain counters nested too deeply"},
540  {PI_CHAIN_TOO_BIG , "chain is too long"},
541  {PI_DEPRECATED , "deprecated function removed"},
542  {PI_BAD_SER_INVERT , "bit bang serial invert not 0 or 1"},
543  {PI_BAD_EDGE , "bad ISR edge, not 1, 1, or 2"},
544  {PI_BAD_ISR_INIT , "bad ISR initialisation"},
545  {PI_BAD_FOREVER , "loop forever must be last chain command"},
546  {PI_BAD_FILTER , "bad filter parameter"},
547  {PI_BAD_PAD , "bad pad number"},
548  {PI_BAD_STRENGTH , "bad pad drive strength"},
549  {PI_FIL_OPEN_FAILED , "file open failed"},
550  {PI_BAD_FILE_MODE , "bad file mode"},
551  {PI_BAD_FILE_FLAG , "bad file flag"},
552  {PI_BAD_FILE_READ , "bad file read"},
553  {PI_BAD_FILE_WRITE , "bad file write"},
554  {PI_FILE_NOT_ROPEN , "file not open for read"},
555  {PI_FILE_NOT_WOPEN , "file not open for write"},
556  {PI_BAD_FILE_SEEK , "bad file seek"},
557  {PI_NO_FILE_MATCH , "no files match pattern"},
558  {PI_NO_FILE_ACCESS , "no permission to access file"},
559  {PI_FILE_IS_A_DIR , "file is a directory"},
560  {PI_BAD_SHELL_STATUS , "bad shell return status"},
561  {PI_BAD_SCRIPT_NAME , "bad script name"},
562  {PI_BAD_SPI_BAUD , "bad SPI baud rate, not 50-500k"},
563  {PI_NOT_SPI_GPIO , "no bit bang SPI in progress on GPIO"},
564  {PI_BAD_EVENT_ID , "bad event id"},
565  {PI_CMD_INTERRUPTED , "command interrupted, Python"},
566 
567 };
568 
569 static char * fmtMdeStr="RW540123";
570 static char * fmtPudStr="ODU";
571 
572 static int cmdMatch(char *str)
573 {
574  int i;
575 
576  for (i=0; i<(sizeof(cmdInfo)/sizeof(cmdInfo_t)); i++)
577  {
578  if (strcasecmp(str, cmdInfo[i].name) == 0) return i;
579  }
580  return CMD_UNKNOWN_CMD;
581 }
582 
583 static int getNum(char *str, uint32_t *val, int8_t *opt)
584 {
585  int f, n;
586  intmax_t v;
587 
588  *opt = 0;
589 
590  f = sscanf(str, " %ji %n", &v, &n);
591 
592  if (f == 1)
593  {
594  *val = v;
595  *opt = CMD_NUMERIC;
596  return n;
597  }
598 
599  f = sscanf(str, " v%ji %n", &v, &n);
600 
601  if (f == 1)
602  {
603  *val = v;
604  if (v < PI_MAX_SCRIPT_VARS) *opt = CMD_VAR;
605  else *opt = -CMD_VAR;
606  return n;
607  }
608 
609  f = sscanf(str, " p%ji %n", &v, &n);
610 
611  if (f == 1)
612  {
613  *val = v;
614  if (v < PI_MAX_SCRIPT_PARAMS) *opt = CMD_PAR;
615  else *opt = -CMD_PAR;
616  return n;
617  }
618 
619  return 0;
620 }
621 
622 static char intCmdStr[32];
623 
624 char *cmdStr(void)
625 {
626  return intCmdStr;
627 }
628 
630  char *buf, uint32_t *p, unsigned ext_len, char *ext, cmdCtlParse_t *ctl)
631 {
632  int f, valid, idx, val, pp, pars, n, n2;
633  char *p8;
634  int32_t *p32;
635  char c;
636  uint32_t tp1=0, tp2=0, tp3=0, tp4=0, tp5=0;
637  int8_t to1, to2, to3, to4, to5;
638  int eaten;
639 
640  /* Check that ext is big enough for the largest message. */
641  if (ext_len < (4 * CMD_MAX_PARAM)) return CMD_EXT_TOO_SMALL;
642 
643  bzero(&ctl->opt, sizeof(ctl->opt));
644 
645  sscanf(buf+ctl->eaten, " %31s %n", intCmdStr, &pp);
646 
647  ctl->eaten += pp;
648 
649  p[0] = -1;
650 
651  idx = cmdMatch(intCmdStr);
652 
653  if (idx < 0) return idx;
654 
655  valid = 0;
656 
657  p[0] = cmdInfo[idx].cmd;
658  p[1] = 0;
659  p[2] = 0;
660  p[3] = 0;
661 
662  switch (cmdInfo[idx].vt)
663  {
664  case 101: /* BR1 BR2 CGI H HELP HWVER
665  DCRA HALT INRA NO
666  PIGPV POPA PUSHA RET T TICK WVBSY WVCLR
667  WVCRE WVGO WVGOR WVHLT WVNEW
668 
669  No parameters, always valid.
670  */
671  valid = 1;
672 
673  break;
674 
675  case 111: /* ADD AND BC1 BC2 BS1 BS2
676  CMP CSI DIV LDA LDAB MLT
677  MOD OR RLA RRA STAB SUB WAIT XOR
678 
679  One parameter, any value.
680  */
681  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
682 
683  if (ctl->opt[1] > 0) valid = 1;
684 
685  break;
686 
687  case 112: /* BI2CC FC GDC GPW I2CC I2CRB
688  MG MICS MILS MODEG NC NP PADG PFG PRG
689  PROCD PROCP PROCS PRRG R READ SLRC SPIC
690  WVDEL WVSC WVSM WVSP WVTX WVTXR BSPIC
691 
692  One positive parameter.
693  */
694  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
695 
696  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0)) valid = 1;
697 
698  break;
699 
700  case 113: /* DCR INR POP PUSH STA XA
701 
702  One register parameter.
703  */
704  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
705 
706  if ((ctl->opt[1] > 0) && (p[1] < PI_MAX_SCRIPT_VARS)) valid = 1;
707 
708  break;
709 
710  case 114: /* CALL JM JMP JNZ JP JZ TAG
711 
712  One numeric parameter, any value.
713  */
714  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
715  if (ctl->opt[1] == CMD_NUMERIC) valid = 1;
716 
717  break;
718 
719  case 115: /* PARSE PROC
720 
721  One parameter, string (rest of input).
722  */
723  p[3] = strlen(buf+ctl->eaten);
724  memcpy(ext, buf+ctl->eaten, p[3]);
725  ctl->eaten += p[3];
726  valid = 1;
727 
728  break;
729 
730  case 116: /* SYS
731 
732  One parameter, a string.
733  */
734  f = sscanf(buf+ctl->eaten, " %*s%n %n", &n, &n2);
735  if ((f >= 0) && n)
736  {
737  p[3] = n;
738  ctl->opt[3] = CMD_NUMERIC;
739  memcpy(ext, buf+ctl->eaten, n);
740  ctl->eaten += n2;
741  valid = 1;
742  }
743 
744  break;
745 
746  case 121: /* HC FR I2CRD I2CRR I2CRW I2CWB I2CWQ P
747  PADS PFS PRS PWM S SERVO SLR SLRI W
748  WDOG WRITE WVTXM
749 
750  Two positive parameters.
751  */
752  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
753  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
754 
755  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) &&
756  (ctl->opt[2] > 0) && ((int)p[2] >= 0)) valid = 1;
757 
758  break;
759 
760  case 122: /* NB
761 
762  Two parameters, first positive, second any value.
763  */
764  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
765  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
766 
767  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) &&
768  (ctl->opt[2] > 0)) valid = 1;
769 
770  break;
771 
772  case 123: /* LD RL RR
773 
774  Two parameters, first register, second any value.
775  */
776  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
777  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
778 
779  if ((ctl->opt[1] > 0) &&
780  (p[1] < PI_MAX_SCRIPT_VARS) &&
781  (ctl->opt[2] > 0)) valid = 1;
782 
783  break;
784 
785  case 124: /* X
786 
787  Two register parameters.
788  */
789  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
790  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
791 
792  if ((ctl->opt[1] > 0) && (p[1] < PI_MAX_SCRIPT_VARS) &&
793  (ctl->opt[2] > 0) && (p[2] < PI_MAX_SCRIPT_VARS)) valid = 1;
794 
795  break;
796 
797  case 125: /* M MODES
798 
799  Two parameters, first positive, second in 'RW540123'.
800  */
801  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
802 
803  f = sscanf(buf+ctl->eaten, " %c %n", &c, &n);
804 
805  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (f >= 1))
806  {
807  ctl->eaten += n;
808  val = toupper(c);
809  p8 = strchr(fmtMdeStr, val);
810 
811  if (p8 != NULL)
812  {
813  val = p8 - fmtMdeStr;
814  p[2] = val;
815  valid = 1;
816  }
817  }
818 
819  break;
820 
821  case 126: /* PUD
822 
823  Two parameters, first positive, second in 'ODU'.
824  */
825  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
826 
827  f = sscanf(buf+ctl->eaten, " %c %n", &c, &n);
828 
829  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) && (f >= 1))
830  {
831  ctl->eaten += n;
832  val = toupper(c);
833  p8 = strchr(fmtPudStr, val);
834  if (p8 != NULL)
835  {
836  val = p8 - fmtPudStr;
837  p[2] = val;
838  valid = 1;
839  }
840  }
841 
842  break;
843 
844  case 127: /* FL FO
845 
846  Two parameters, first a string, other positive.
847  */
848  f = sscanf(buf+ctl->eaten, " %*s%n %n", &n, &n2);
849  if ((f >= 0) && n)
850  {
851  p[3] = n;
852  ctl->opt[2] = CMD_NUMERIC;
853  memcpy(ext, buf+ctl->eaten, n);
854  ctl->eaten += n2;
855 
856  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
857 
858  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0))
859  valid = 1;
860  }
861 
862  break;
863 
864  case 128: /* SHELL
865 
866  Two string parameters, the first space teminated.
867  The second arbitrary.
868  */
869  f = sscanf(buf+ctl->eaten, " %*s%n %n", &n, &n2);
870 
871  if ((f >= 0) && n)
872  {
873  valid = 1;
874 
875  p[1] = n;
876  memcpy(ext, buf+ctl->eaten, n);
877  ctl->eaten += n;
878  ext[n] = 0; /* terminate first string */
879 
880  n2 = strlen(buf+ctl->eaten+1);
881  memcpy(ext+n+1, buf+ctl->eaten+1, n2);
882  ctl->eaten += n2;
883  ctl->eaten ++;
884  p[3] = p[1] + n2 + 1;
885  }
886 
887  break;
888 
889  case 131: /* BI2CO HP I2CO I2CPC I2CRI I2CWB I2CWW
890  SLRO SPIO TRIG
891 
892  Three positive parameters.
893  */
894  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
895  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
896  ctl->eaten += getNum(buf+ctl->eaten, &tp1, &ctl->opt[3]);
897 
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))
901  {
902  p[3] = 4;
903  memcpy(ext, &tp1, 4);
904  valid = 1;
905  }
906 
907  break;
908 
909  case 132: /* SERO
910 
911  Three parameters, first a string, rest >=0
912  */
913  f = sscanf(buf+ctl->eaten, " %*s%n %n", &n, &n2);
914  if ((f >= 0) && n)
915  {
916  p[3] = n;
917  ctl->opt[2] = CMD_NUMERIC;
918  memcpy(ext, buf+ctl->eaten, n);
919  ctl->eaten += n2;
920 
921  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
922  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
923 
924  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) &&
925  (ctl->opt[2] > 0) && ((int)p[2] >= 0))
926  valid = 1;
927  }
928 
929  break;
930 
931  case 133: /* FS
932 
933  Three parameters. First and third positive.
934  Second may be negative when interpreted as an int.
935  */
936  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
937  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
938  ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1);
939 
940  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) &&
941  (ctl->opt[2] > 0) &&
942  (to1 == CMD_NUMERIC) && ((int)tp1 >= 0))
943  {
944  p[3] = 4;
945  memcpy(ext, &tp1, 4);
946  valid = 1;
947  }
948 
949  break;
950 
951  case 134: /* BSPIO
952 
953  Six parameters. First to Fifth positive.
954  Sixth may be negative when interpreted as an int.
955  */
956  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
957  ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1);
958  ctl->eaten += getNum(buf+ctl->eaten, &tp2, &to2);
959  ctl->eaten += getNum(buf+ctl->eaten, &tp3, &to3);
960  ctl->eaten += getNum(buf+ctl->eaten, &tp4, &to4);
961  ctl->eaten += getNum(buf+ctl->eaten, &tp5, &to5);
962 
963  if ((ctl->opt[1] > 0) && ((int)p[1] >= 0) &&
964  (to1 == CMD_NUMERIC) && ((int)tp1 >= 0) &&
965  (to2 == CMD_NUMERIC) && ((int)tp2 >= 0) &&
966  (to3 == CMD_NUMERIC) && ((int)tp3 >= 0) &&
967  (to4 == CMD_NUMERIC) && ((int)tp4 >= 0) &&
968  (to5 == CMD_NUMERIC))
969  {
970  p[3] = 5 * 4;
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);
976  valid = 1;
977  }
978 
979  break;
980 
981  case 191: /* PROCR PROCU
982 
983  One to 11 parameters, first positive,
984  optional remainder, any value.
985  */
986  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
987 
988  if ((ctl->opt[1] == CMD_NUMERIC) && ((int)p[1] >= 0))
989  {
990  pars = 0;
991  p32 = (int32_t *)ext;
992 
993  while (pars < PI_MAX_SCRIPT_PARAMS)
994  {
995  ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1);
996  if (to1 == CMD_NUMERIC)
997  {
998  pars++;
999  *p32++ = tp1;
1000  }
1001  else break;
1002  }
1003 
1004  p[3] = pars * 4;
1005 
1006  valid = 1;
1007  }
1008 
1009  break;
1010 
1011  case 192: /* WVAG
1012 
1013  One or more triplets (gpios on, gpios off, delay),
1014  any value.
1015  */
1016 
1017  pars = 0;
1018  p32 = (int32_t *)ext;
1019 
1020  while (pars < CMD_MAX_PARAM)
1021  {
1022  ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1);
1023  if (to1 == CMD_NUMERIC)
1024  {
1025  pars++;
1026  *p32++ = tp1;
1027  }
1028  else break;
1029  }
1030 
1031  p[3] = pars * 4;
1032 
1033  if (pars && ((pars % 3) == 0)) valid = 1;
1034 
1035  break;
1036 
1037  case 193: /* BI2CZ BSCX BSPIX FW I2CWD I2CZ SERW
1038  SPIW SPIX
1039 
1040  Two or more parameters, first >=0, rest 0-255.
1041 
1042  BSCX is special case one or more.
1043  */
1044  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
1045 
1046  if ((ctl->opt[1] == CMD_NUMERIC) && ((int)p[1] >= 0))
1047  {
1048  pars = 0;
1049  p8 = ext;
1050 
1051  while (pars < CMD_MAX_PARAM)
1052  {
1053  eaten = getNum(buf+ctl->eaten, &tp1, &to1);
1054  if (to1 == CMD_NUMERIC)
1055  {
1056  if (((int)tp1>=0) && ((int)tp1<=255))
1057  {
1058  pars++;
1059  *p8++ = tp1;
1060  ctl->eaten += eaten;
1061  }
1062  else break; /* invalid number, end of command */
1063  }
1064  else break;
1065  }
1066 
1067  p[3] = pars;
1068 
1069  if (pars || (p[0]==PI_CMD_BSCX)) valid = 1;
1070  }
1071 
1072  break;
1073 
1074  case 194: /* I2CPK I2CWI I2CWK
1075 
1076  Three to 34 parameters, all 0-255.
1077  */
1078 
1079  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
1080  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
1081 
1082  if ((ctl->opt[1] == CMD_NUMERIC) &&
1083  (ctl->opt[2] == CMD_NUMERIC) &&
1084  ((int)p[1]>=0) && ((int)p[2]>=0) && ((int)p[2]<=255))
1085  {
1086  pars = 0;
1087  p8 = ext;
1088 
1089  while (pars < 32)
1090  {
1091  eaten = getNum(buf+ctl->eaten, &tp1, &to1);
1092  if (to1 == CMD_NUMERIC)
1093  {
1094  if (((int)tp1>=0) && ((int)tp1<=255))
1095  {
1096  pars++;
1097  *p8++ = tp1;
1098  ctl->eaten += eaten;
1099  }
1100  else break; /* invalid number, end of command */
1101  }
1102  else break;
1103  }
1104 
1105  p[3] = pars;
1106 
1107  if (pars > 0) valid = 1;
1108  }
1109 
1110  break;
1111 
1112  case 195: /* CF1 CF2
1113 
1114  Zero or more parameters, first two >=0, rest 0-255.
1115  */
1116  valid = 1;
1117 
1118  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
1119 
1120  if (ctl->opt[1] == CMD_NUMERIC)
1121  {
1122  if ((int)p[1] >= 0)
1123  {
1124  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
1125 
1126  if (ctl->opt[2] == CMD_NUMERIC)
1127  {
1128  if ((int)p[2] >= 0)
1129  {
1130  pars = 0;
1131  p8 = ext;
1132 
1133  while (pars < CMD_MAX_PARAM)
1134  {
1135  eaten = getNum(buf+ctl->eaten, &tp1, &to1);
1136  if (to1 == CMD_NUMERIC)
1137  {
1138  if (((int)tp1>=0) && ((int)tp1<=255))
1139  {
1140  pars++;
1141  *p8++ = tp1;
1142  ctl->eaten += eaten;
1143  }
1144  else break;
1145  }
1146  else break;
1147  }
1148 
1149  p[3] = pars;
1150  }
1151  else valid = 0;
1152  }
1153  }
1154  else valid = 0;
1155  }
1156 
1157  break;
1158 
1159  case 196: /* WVAS
1160 
1161  gpio baud offset char...
1162 
1163  p1 gpio
1164  p2 baud
1165  p3 len + 4
1166  ---------
1167  uint32_t databits
1168  uint32_t stophalfbits
1169  uint32_t offset
1170  uint8_t[len]
1171  */
1172  ctl->eaten += getNum(buf+ctl->eaten, &p[1], &ctl->opt[1]);
1173  ctl->eaten += getNum(buf+ctl->eaten, &p[2], &ctl->opt[2]);
1174  ctl->eaten += getNum(buf+ctl->eaten, &tp1, &to1);
1175  ctl->eaten += getNum(buf+ctl->eaten, &tp2, &to2);
1176  ctl->eaten += getNum(buf+ctl->eaten, &tp3, &to3);
1177 
1178  if ((ctl->opt[1] == CMD_NUMERIC) && ((int)p[1] >= 0) &&
1179  (ctl->opt[2] == CMD_NUMERIC) && ((int)p[2] > 0) &&
1180  (to1 == CMD_NUMERIC) &&
1181  (to2 == CMD_NUMERIC) &&
1182  (to3 == CMD_NUMERIC))
1183  {
1184  pars = 0;
1185 
1186  memcpy(ext, &tp1, 4);
1187  memcpy(ext+4, &tp2, 4);
1188  memcpy(ext+8, &tp3, 4);
1189  p8 = ext + 12;
1190  while (pars < CMD_MAX_PARAM)
1191  {
1192  eaten = getNum(buf+ctl->eaten, &tp1, &to1);
1193  if (to1 == CMD_NUMERIC)
1194  {
1195  if (((int)tp1>=0) && ((int)tp1<=255))
1196  {
1197  *p8++ = tp1;
1198  pars++;
1199  ctl->eaten += eaten;
1200  }
1201  else break; /* invalid number, end of command */
1202  }
1203  else break;
1204  }
1205 
1206  p[3] = pars + 12;
1207 
1208  if (pars > 0) valid = 1;
1209  }
1210 
1211  break;
1212 
1213  case 197: /* WVCHA
1214 
1215  One or more parameters, all 0-255.
1216  */
1217  pars = 0;
1218  p8 = ext;
1219 
1220  while (pars < CMD_MAX_PARAM)
1221  {
1222  eaten = getNum(buf+ctl->eaten, &tp1, &to1);
1223  if (to1 == CMD_NUMERIC)
1224  {
1225  if (((int)tp1>=0) && ((int)tp1<=255))
1226  {
1227  pars++;
1228  *p8++ = tp1;
1229  ctl->eaten += eaten;
1230  }
1231  else break; /* invalid number, end of command */
1232  }
1233  else break;
1234  }
1235 
1236  p[3] = pars;
1237 
1238  if (pars) valid = 1;
1239 
1240  break;
1241 
1242 
1243  }
1244 
1245  if (valid) return idx; else return CMD_BAD_PARAMETER;
1246 }
1247 
1248 char * cmdErrStr(int error)
1249 {
1250  int i;
1251 
1252  for (i=0; i<(sizeof(errInfo)/sizeof(errInfo_t)); i++)
1253  {
1254  if (errInfo[i].error == error) return errInfo[i].str;
1255  }
1256  return "unknown error";
1257 }
1258 
1259 int cmdParseScript(char *script, cmdScript_t *s, int diags)
1260 {
1261  int idx, len, b, i, j, tags, resolved;
1262  int status;
1263  uint32_t p[10];
1264  cmdInstr_t instr;
1265  cmdCtlParse_t ctl;
1266  char v[CMD_MAX_EXTENSION];
1267 
1268  ctl.eaten = 0;
1269 
1270  status = 0;
1271 
1272  cmdTagStep_t tag_step[PI_MAX_SCRIPT_TAGS];
1273 
1274  len = strlen(script);
1275 
1276  /* calloc space for PARAMS, VARS, CMDS, and STRINGS */
1277 
1278  b = (sizeof(int) * (PI_MAX_SCRIPT_PARAMS + PI_MAX_SCRIPT_VARS)) +
1279  (sizeof(cmdInstr_t) * (len + 2) / 2) + len;
1280 
1281  s->par = calloc(1, b);
1282 
1283  if (s->par == NULL) return -1;
1284 
1285  s->var = s->par + PI_MAX_SCRIPT_PARAMS;
1286 
1287  s->instr = (cmdInstr_t *)(s->var + PI_MAX_SCRIPT_VARS);
1288 
1289  s->str_area = (char *)(s->instr + ((len + 2) / 2));
1290 
1291  s->str_area_len = len;
1292  s->str_area_pos = 0;
1293 
1294  s->instrs = 0;
1295 
1296  tags = 0;
1297 
1298  idx = 0;
1299 
1300  while (ctl.eaten<len)
1301  {
1302  idx = cmdParse(script, p, CMD_MAX_EXTENSION, v, &ctl);
1303 
1304  if (idx >= 0)
1305  {
1306  if (p[3])
1307  {
1308  memcpy(s->str_area + s->str_area_pos, v, p[3]);
1309  s->str_area[s->str_area_pos + p[3]] = 0;
1310  p[4] = (intptr_t) s->str_area + s->str_area_pos;
1311  s->str_area_pos += (p[3] + 1);
1312  }
1313 
1314  memcpy(&instr.p, p, sizeof(instr.p));
1315 
1316  if (instr.p[0] == PI_CMD_TAG)
1317  {
1318  if (tags < PI_MAX_SCRIPT_TAGS)
1319  {
1320  /* check tag not already used */
1321  for (j=0; j<tags; j++)
1322  {
1323  if (tag_step[j].tag == instr.p[1])
1324  {
1325  if (diags)
1326  {
1327  fprintf(stderr, "Duplicate tag: %d\n", instr.p[1]);
1328  }
1329 
1330  if (!status) status = PI_DUP_TAG;
1331  idx = -1;
1332  }
1333  }
1334 
1335  tag_step[tags].tag = instr.p[1];
1336  tag_step[tags].step = s->instrs;
1337  tags++;
1338  }
1339  else
1340  {
1341  if (diags)
1342  {
1343  fprintf(stderr, "Too many tags: %d\n", instr.p[1]);
1344  }
1345  if (!status) status = PI_TOO_MANY_TAGS;
1346  idx = -1;
1347  }
1348  }
1349  }
1350  else
1351  {
1352  if (diags)
1353  {
1354  if (idx == CMD_UNKNOWN_CMD)
1355  fprintf(stderr, "Unknown command: %s\n", cmdStr());
1356  else
1357  fprintf(stderr, "Bad parameter to %s\n", cmdStr());
1358  }
1359  if (!status) status = PI_BAD_SCRIPT_CMD;
1360  }
1361 
1362  if (idx >= 0)
1363  {
1364  if (instr.p[0] != PI_CMD_TAG)
1365  {
1366  memcpy(instr.opt, &ctl.opt, sizeof(instr.opt));
1367  s->instr[s->instrs++] = instr;
1368  }
1369  }
1370  }
1371 
1372  for (i=0; i<s->instrs; i++)
1373  {
1374  instr = s->instr[i];
1375 
1376  /* resolve jumps */
1377 
1378  if ((instr.p[0] == PI_CMD_JMP) || (instr.p[0] == PI_CMD_CALL) ||
1379  (instr.p[0] == PI_CMD_JZ) || (instr.p[0] == PI_CMD_JNZ) ||
1380  (instr.p[0] == PI_CMD_JM) || (instr.p[0] == PI_CMD_JP))
1381  {
1382  resolved = 0;
1383 
1384  for (j=0; j<tags; j++)
1385  {
1386  if (instr.p[1] == tag_step[j].tag)
1387  {
1388  s->instr[i].p[1] = tag_step[j].step;
1389  resolved = 1;
1390  break;
1391  }
1392  }
1393 
1394  if (!resolved)
1395  {
1396  if (diags)
1397  {
1398  fprintf(stderr, "Can't resolve tag %d\n", instr.p[1]);
1399  }
1400  if (!status) status = PI_BAD_TAG;
1401  }
1402  }
1403  }
1404  return status;
1405 }
1406 
#define PI_DEPRECATED
Definition: pigpio.h:6385
#define PI_BAD_USER_GPIO
Definition: pigpio.h:6264
#define PI_FIL_OPEN_FAILED
Definition: pigpio.h:6393
#define PI_BAD_STOPBITS
Definition: pigpio.h:6367
#define PI_CMD_PRS
Definition: pigpio.h:6067
#define PI_FILE_IS_A_DIR
Definition: pigpio.h:6403
#define PI_BAD_CHAIN_CMD
Definition: pigpio.h:6381
#define PI_CMD_WVSC
Definition: pigpio.h:6097
#define PI_CMD_FL
Definition: pigpio.h:6186
#define PI_BAD_CHAIN_DELAY
Definition: pigpio.h:6382
#define PI_CMD_CF1
Definition: pigpio.h:6154
s
Definition: DHT22.py:257
#define PI_INIT_FAILED
Definition: pigpio.h:6263
#define PI_CMD_HWVER
Definition: pigpio.h:6078
#define PI_CMD_BR1
Definition: pigpio.h:6071
#define PI_BAD_CHANNEL
Definition: pigpio.h:6290
#define PI_CMD_BR2
Definition: pigpio.h:6072
#define PI_CMD_CMDW
Definition: pigpio.h:6221
#define PI_CMD_NC
Definition: pigpio.h:6082
#define PI_CMD_XA
Definition: pigpio.h:6257
int8_t opt[4]
Definition: command.h:90
#define PI_CMD_PROCR
Definition: pigpio.h:6101
#define PI_CMD_ADD
Definition: pigpio.h:6217
cmdInfo_t cmdInfo[]
Definition: command.c:41
#define PI_CMD_WVTXR
Definition: pigpio.h:6113
#define PI_CMD_RL
Definition: pigpio.h:6247
#define PI_BAD_WAVE_ID
Definition: pigpio.h:6331
#define PI_BAD_CFG_INTERNAL
Definition: pigpio.h:6298
#define PI_CMD_PARSE
Definition: pigpio.h:6109
#define PI_CMD_I2CWS
Definition: pigpio.h:6122
#define PI_CMD_DCRA
Definition: pigpio.h:6224
#define PI_NOT_PWM_GPIO
Definition: pigpio.h:6357
#define PI_CMD_BC2
Definition: pigpio.h:6074
#define PI_BAD_MALLOC_MODE
Definition: pigpio.h:6369
#define PI_BAD_SHELL_STATUS
Definition: pigpio.h:6404
#define PI_BAD_HPWM_FREQ
Definition: pigpio.h:6361
#define PI_BAD_IF_FLAGS
Definition: pigpio.h:6289
#define PI_CMD_POP
Definition: pigpio.h:6242
#define PI_BAD_SPI_SPEED
Definition: pigpio.h:6343
#define PI_CMD_FO
Definition: pigpio.h:6181
#define PI_BAD_STRENGTH
Definition: pigpio.h:6392
#define PI_BAD_WVSP_COMMND
Definition: pigpio.h:6309
int * par
Definition: command.h:100
#define PI_CMD_PFS
Definition: pigpio.h:6068
#define CMD_BAD_PARAMETER
Definition: command.h:44
f
#define PI_CHAIN_LOOP_CNT
Definition: pigpio.h:6378
#define PI_TOO_MANY_SEGS
Definition: pigpio.h:6370
#define PI_BAD_MS
Definition: pigpio.h:6272
#define PI_SER_READ_FAILED
Definition: pigpio.h:6351
#define PI_BAD_SERIAL_STRUC
Definition: pigpio.h:6303
#define PI_CMD_PFG
Definition: pigpio.h:6084
#define PI_BAD_FOREVER
Definition: pigpio.h:6389
#define PI_BAD_MODE
Definition: pigpio.h:6266
#define PI_BAD_PAD
Definition: pigpio.h:6391
#define PI_BAD_MICROS
Definition: pigpio.h:6275
#define PI_CMD_FG
Definition: pigpio.h:6170
#define PI_BAD_SOCKET_PORT
Definition: pigpio.h:6292
#define PI_BAD_I2C_WLEN
Definition: pigpio.h:6374
#define PI_CMD_GPW
Definition: pigpio.h:6149
#define PI_BAD_TAG
Definition: pigpio.h:6328
#define PI_CMD_SPIR
Definition: pigpio.h:6136
#define PI_CMD_PUSHA
Definition: pigpio.h:6245
#define PI_BAD_SMBUS_CMD
Definition: pigpio.h:6372
#define PI_BAD_PUD
Definition: pigpio.h:6268
#define PI_BAD_CLK_MICROS
Definition: pigpio.h:6281
#define PI_CMD_I2CWB
Definition: pigpio.h:6124
#define PI_CMD_SPIX
Definition: pigpio.h:6138
#define PI_CHAIN_TOO_BIG
Definition: pigpio.h:6384
#define PI_BAD_FLAGS
Definition: pigpio.h:6342
#define PI_CMD_MODES
Definition: pigpio.h:6061
#define PI_CMD_BI2CC
Definition: pigpio.h:6157
void error(const char *msg)
int str_area_len
Definition: command.h:105
#define PI_CMD_SPIW
Definition: pigpio.h:6137
#define CMD_MAX_EXTENSION
Definition: command.h:41
#define PI_EMPTY_WAVEFORM
Definition: pigpio.h:6334
#define PI_BAD_FILE_WRITE
Definition: pigpio.h:6397
#define PI_BAD_FILE_FLAG
Definition: pigpio.h:6395
#define PI_CMD_BC1
Definition: pigpio.h:6073
#define PI_BAD_DATABITS
Definition: pigpio.h:6366
static errInfo_t errInfo[]
Definition: command.c:420
#define PI_CMD_WVNEW
Definition: pigpio.h:6114
#define PI_CMD_PRG
Definition: pigpio.h:6083
#define PI_CMD_WVSP
Definition: pigpio.h:6096
#define PI_CMD_I2CRK
Definition: pigpio.h:6127
#define PI_CMD_INTERRUPTED
Definition: pigpio.h:6409
#define PI_CMD_LDA
Definition: pigpio.h:6236
#define PI_CMD_SYS
Definition: pigpio.h:6254
#define PI_CMD_SERDA
Definition: pigpio.h:6146
#define PI_BAD_PARAM
Definition: pigpio.h:6346
#define PI_CMD_WAIT
Definition: pigpio.h:6255
#define CMD_VAR
Definition: command.h:51
#define PI_CMD_READ
Definition: pigpio.h:6064
#define PI_CMD_WVCHA
Definition: pigpio.h:6163
#define PI_CMD_WVHLT
Definition: pigpio.h:6094
#define PI_CMD_SERO
Definition: pigpio.h:6140
#define PI_CMD_POPA
Definition: pigpio.h:6243
#define PI_CMD_HP
Definition: pigpio.h:6152
#define PI_CMD_PUD
Definition: pigpio.h:6063
#define PI_BAD_FILE_MODE
Definition: pigpio.h:6394
#define PI_I2C_READ_FAILED
Definition: pigpio.h:6348
#define PI_CMD_JM
Definition: pigpio.h:6229
#define PI_FILE_NOT_WOPEN
Definition: pigpio.h:6399
#define PI_CMD_FC
Definition: pigpio.h:6182
name
Definition: setup.py:5
#define PI_NO_FILE_MATCH
Definition: pigpio.h:6401
#define PI_CMD_MOD
Definition: pigpio.h:6239
#define PI_CMD_SPIO
Definition: pigpio.h:6134
char * str_area
Definition: command.h:104
#define PI_CMD_PROC
Definition: pigpio.h:6099
#define PI_BAD_SECO_CHANNEL
Definition: pigpio.h:6294
#define PI_CMD_FR
Definition: pigpio.h:6183
#define PI_BAD_BUF_MILLIS
Definition: pigpio.h:6282
#define PI_BAD_PULSEWIDTH
Definition: pigpio.h:6269
int cmdParseScript(char *script, cmdScript_t *s, int diags)
Definition: command.c:1259
#define PI_CMD_WVTXM
Definition: pigpio.h:6175
#define PI_NOT_HPWM_GPIO
Definition: pigpio.h:6360
#define PI_CMD_I2CC
Definition: pigpio.h:6117
#define PI_CMD_JZ
Definition: pigpio.h:6233
#define PI_CMD_EVT
Definition: pigpio.h:6197
#define PI_CMD_WVAG
Definition: pigpio.h:6089
int * var
Definition: command.h:101
#define CMD_NUMERIC
Definition: command.h:50
#define PI_SOME_PERMITTED
Definition: pigpio.h:6306
#define PI_CMD_WVGOR
Definition: pigpio.h:6092
#define PI_CMD_OR
Definition: pigpio.h:6241
int instrs
Definition: command.h:103
#define PI_BAD_EDGE
Definition: pigpio.h:6387
#define PI_BAD_FILE_SEEK
Definition: pigpio.h:6400
#define PI_CMD_EVM
Definition: pigpio.h:6196
#define PI_BAD_FIFO_COMMAND
Definition: pigpio.h:6293
#define PI_CMD_I2CPC
Definition: pigpio.h:6131
#define PI_NOT_SPI_GPIO
Definition: pigpio.h:6407
#define PI_CMD_WVTX
Definition: pigpio.h:6112
#define PI_NO_WAVEFORM_ID
Definition: pigpio.h:6335
#define PI_CMD_RLA
Definition: pigpio.h:6248
#define PI_MAX_SCRIPT_VARS
Definition: pigpio.h:798
#define PI_NOT_HCLK_GPIO
Definition: pigpio.h:6359
#define PI_BAD_EVENT_ID
Definition: pigpio.h:6408
#define PI_BAD_LEVEL
Definition: pigpio.h:6267
#define PI_NO_AUX_SPI
Definition: pigpio.h:6356
#define PI_CMD_CMP
Definition: pigpio.h:6222
#define PI_NO_ALERT_FUNC
Definition: pigpio.h:6278
#define PI_BAD_I2C_BUS
Definition: pigpio.h:6339
#define PI_CMD_SLR
Definition: pigpio.h:6104
#define PI_CMD_TRIG
Definition: pigpio.h:6098
#define PI_CMD_WVTAT
Definition: pigpio.h:6176
#define PI_INITIALISED
Definition: pigpio.h:6296
#define PI_BAD_WDOG_TIMEOUT
Definition: pigpio.h:6277
#define PI_TOO_MANY_CBS
Definition: pigpio.h:6332
#define PI_SCRIPT_NOT_READY
Definition: pigpio.h:6327
#define PI_CMD_RET
Definition: pigpio.h:6246
#define PI_BAD_CLK_SOURCE
Definition: pigpio.h:6280
#define PI_CMD_SPIC
Definition: pigpio.h:6135
#define PI_BAD_SCRIPT_ID
Definition: pigpio.h:6312
#define PI_CMD_PIGPV
Definition: pigpio.h:6087
#define PI_CMD_CGI
Definition: pigpio.h:6167
#define PI_MAX_SCRIPT_PARAMS
Definition: pigpio.h:799
#define PI_CMD_SUB
Definition: pigpio.h:6253
#define PI_CMD_BI2CZ
Definition: pigpio.h:6159
#define PI_CHAIN_NESTING
Definition: pigpio.h:6383
#define PI_CMD_WVSM
Definition: pigpio.h:6095
#define PI_CMD_LDAB
Definition: pigpio.h:6237
#define PI_CMD_JMP
Definition: pigpio.h:6230
#define PI_CMD_I2CWD
Definition: pigpio.h:6119
#define PI_BAD_PULSELEN
Definition: pigpio.h:6310
#define PI_TOO_MANY_OOL
Definition: pigpio.h:6333
#define PI_BAD_SCRIPT_NAME
Definition: pigpio.h:6405
#define PI_BAD_SPI_BAUD
Definition: pigpio.h:6406
#define PI_TOO_MANY_TAGS
Definition: pigpio.h:6318
#define PI_CMD_X
Definition: pigpio.h:6256
#define PI_NOT_INITIALISED
Definition: pigpio.h:6295
#define PI_CMD_I2CRW
Definition: pigpio.h:6125
int step
Definition: command.h:84
#define PI_CMD_EVTWT
Definition: pigpio.h:6259
#define PI_CMD_I2CWK
Definition: pigpio.h:6128
#define PI_CMD_BS1
Definition: pigpio.h:6075
#define PI_CMD_JNZ
Definition: pigpio.h:6231
#define PI_SER_WRITE_FAILED
Definition: pigpio.h:6350
#define PI_CMD_BSCX
Definition: pigpio.h:6194
#define PI_CMD_PRRG
Definition: pigpio.h:6085
static char intCmdStr[32]
Definition: command.c:622
#define PI_SPI_XFER_FAILED
Definition: pigpio.h:6354
#define CMD_UNKNOWN_CMD
Definition: command.h:43
#define PI_BAD_CLK_PERIPH
Definition: pigpio.h:6279
#define PI_NOT_SERIAL_GPIO
Definition: pigpio.h:6302
#define PI_BAD_WVSM_COMMND
Definition: pigpio.h:6308
#define PI_BAD_SER_DEVICE
Definition: pigpio.h:6344
#define PI_CMD_SERVO
Definition: pigpio.h:6069
#define PI_CMD_I2CWI
Definition: pigpio.h:6130
#define PI_BAD_I2C_SEG
Definition: pigpio.h:6371
#define PI_CMD_AND
Definition: pigpio.h:6218
#define PI_CMD_PWM
Definition: pigpio.h:6066
char * cmdStr(void)
Definition: command.c:624
#define PI_CMD_SERC
Definition: pigpio.h:6141
#define PI_CMD_WRITE
Definition: pigpio.h:6065
int cmd
Definition: command.h:75
#define PI_GPIO_IN_USE
Definition: pigpio.h:6314
#define PI_CMD_CSI
Definition: pigpio.h:6168
#define PI_SER_OPEN_FAILED
Definition: pigpio.h:6337
#define PI_CMD_PROCU
Definition: pigpio.h:6199
#define PI_CMD_WDOG
Definition: pigpio.h:6070
#define PI_CMD_FN
Definition: pigpio.h:6171
#define PI_CMD_BSPIC
Definition: pigpio.h:6190
#define PI_CMD_SERR
Definition: pigpio.h:6144
#define PI_SER_READ_NO_DATA
Definition: pigpio.h:6352
int status
Definition: pigs.c:57
#define PI_CMD_MLT
Definition: pigpio.h:6238
#define PI_BAD_DUTYRANGE
Definition: pigpio.h:6283
#define PI_CMD_I2CRD
Definition: pigpio.h:6118
#define PI_CMD_NP
Definition: pigpio.h:6081
#define PI_CMD_I2CO
Definition: pigpio.h:6116
#define PI_BAD_VAR_NUM
Definition: pigpio.h:6320
#define PI_CMD_I2CRI
Definition: pigpio.h:6129
#define PI_TOO_MANY_CHARS
Definition: pigpio.h:6301
#define PI_CMD_MICS
Definition: pigpio.h:6107
#define PI_CMD_TICK
Definition: pigpio.h:6077
#define PI_CMD_PROCD
Definition: pigpio.h:6100
#define PI_CMD_CMDR
Definition: pigpio.h:6220
#define PI_TIMER_FAILED
Definition: pigpio.h:6276
#define PI_FILE_NOT_ROPEN
Definition: pigpio.h:6398
#define PI_NO_MEMORY
Definition: pigpio.h:6322
#define PI_CMD_FS
Definition: pigpio.h:6185
cmdInstr_t * instr
Definition: command.h:102
#define PI_BAD_SER_SPEED
Definition: pigpio.h:6345
#define PI_NOT_PERMITTED
Definition: pigpio.h:6305
#define CMD_MAX_PARAM
Definition: command.h:40
int cmdParse(char *buf, uint32_t *p, unsigned ext_len, char *ext, cmdCtlParse_t *ctl)
Definition: command.c:629
#define PI_BAD_DUTYCYCLE
Definition: pigpio.h:6270
#define PI_CMD_I2CRS
Definition: pigpio.h:6121
#define PI_BAD_PARAM_NUM
Definition: pigpio.h:6316
#define PI_CMD_HALT
Definition: pigpio.h:6226
#define PI_BAD_SECONDS
Definition: pigpio.h:6274
static int cmdMatch(char *str)
Definition: command.c:572
#define PI_CMD_SERRB
Definition: pigpio.h:6142
#define PI_BAD_SCRIPT
Definition: pigpio.h:6311
#define PI_NO_FILE_ACCESS
Definition: pigpio.h:6402
static char * fmtPudStr
Definition: command.c:570
#define PI_BAD_MILS_DELAY
Definition: pigpio.h:6330
int8_t opt[4]
Definition: command.h:70
#define PI_CMD_STAB
Definition: pigpio.h:6252
#define PI_CMD_MILS
Definition: pigpio.h:6108
#define PI_CMD_NOP
Definition: pigpio.h:6240
#define PI_BAD_FILTER
Definition: pigpio.h:6390
#define PI_CMD_I2CPK
Definition: pigpio.h:6132
#define PI_CMD_TAG
Definition: pigpio.h:6234
#define PI_BAD_HPWM_DUTY
Definition: pigpio.h:6362
#define PI_CMD_SERW
Definition: pigpio.h:6145
#define PI_CMD_DCR
Definition: pigpio.h:6223
#define PI_CMD_WVGO
Definition: pigpio.h:6091
#define PI_BAD_HCLK_PASS
Definition: pigpio.h:6364
#define PI_CMD_HC
Definition: pigpio.h:6151
char * cmdUsage
Definition: command.c:264
#define PI_TOO_MANY_PULSES
Definition: pigpio.h:6300
#define PI_CMD_PADG
Definition: pigpio.h:6179
#define PI_CMD_HELP
Definition: pigpio.h:6086
#define PI_CMD_XOR
Definition: pigpio.h:6258
#define PI_CMD_SHELL
Definition: pigpio.h:6188
#define PI_CMD_I2CZ
Definition: pigpio.h:6161
uint32_t tag
Definition: command.h:83
#define PI_BAD_SER_OFFSET
Definition: pigpio.h:6313
#define PI_CMD_STA
Definition: pigpio.h:6251
#define PI_MAX_SCRIPT_TAGS
Definition: pigpio.h:797
#define PI_CMD_WVDEL
Definition: pigpio.h:6111
#define PI_BAD_SERIAL_BUF
Definition: pigpio.h:6304
#define PI_CMD_WVCLR
Definition: pigpio.h:6088
#define PI_CMD_SLRC
Definition: pigpio.h:6105
#define PI_CMD_FW
Definition: pigpio.h:6184
#define PI_BAD_SER_INVERT
Definition: pigpio.h:6386
#define PI_CMD_INRA
Definition: pigpio.h:6228
#define PI_CMD_RR
Definition: pigpio.h:6249
#define PI_BAD_I2C_ADDR
Definition: pigpio.h:6340
#define PI_BAD_HCLK_FREQ
Definition: pigpio.h:6363
#define PI_CMD_SERWB
Definition: pigpio.h:6143
#define PI_BAD_PATHNAME
Definition: pigpio.h:6286
#define PI_BAD_GPIO
Definition: pigpio.h:6265
#define PI_CMD_BI2CO
Definition: pigpio.h:6158
#define PI_CMD_BSPIO
Definition: pigpio.h:6191
#define PI_BAD_FILE_READ
Definition: pigpio.h:6396
#define PI_DUP_TAG
Definition: pigpio.h:6317
#define PI_CHAIN_COUNTER
Definition: pigpio.h:6380
#define PI_CMD_PADS
Definition: pigpio.h:6178
#define PI_I2C_OPEN_FAILED
Definition: pigpio.h:6336
#define PI_BAD_CHAIN_LOOP
Definition: pigpio.h:6379
#define PI_BAD_HANDLE
Definition: pigpio.h:6288
#define PI_SPI_OPEN_FAILED
Definition: pigpio.h:6338
#define PI_NO_SCRIPT_ROOM
Definition: pigpio.h:6321
#define PI_BAD_ISR_INIT
Definition: pigpio.h:6388
#define PI_CMD_MODEG
Definition: pigpio.h:6062
#define PI_BAD_I2C_BAUD
Definition: pigpio.h:6377
#define PI_NOT_SERVO_GPIO
Definition: pigpio.h:6358
#define PI_CMD_WVAS
Definition: pigpio.h:6090
#define PI_CMD_I2CWW
Definition: pigpio.h:6126
uint32_t p[5]
Definition: command.h:89
#define PI_CMD_CF2
Definition: pigpio.h:6155
char * str
Definition: command.c:417
#define PI_CMD_I2CRB
Definition: pigpio.h:6123
#define PI_TOO_MANY_PARAM
Definition: pigpio.h:6325
#define PI_MSG_TOOBIG
Definition: pigpio.h:6368
#define PI_CMD_RRA
Definition: pigpio.h:6250
#define PI_BAD_POINTER
Definition: pigpio.h:6355
#define PI_BAD_I2C_RLEN
Definition: pigpio.h:6375
int str_area_pos
Definition: command.h:106
#define PI_UNKNOWN_COMMAND
Definition: pigpio.h:6353
#define PI_CMD_PROCP
Definition: pigpio.h:6106
#define PI_HPWM_ILLEGAL
Definition: pigpio.h:6365
#define CMD_PAR
Definition: command.h:52
static char * fmtMdeStr
Definition: command.c:569
#define PI_BAD_SERIAL_COUNT
Definition: pigpio.h:6315
#define PI_CMD_WVCRE
Definition: pigpio.h:6110
#define PI_CMD_DIV
Definition: pigpio.h:6225
#define PI_CMD_NO
Definition: pigpio.h:6079
#define PI_CMD_BS2
Definition: pigpio.h:6076
#define PI_CMD_INR
Definition: pigpio.h:6227
char * cmdErrStr(int error)
Definition: command.c:1248
#define PI_BAD_WAVE_MODE
Definition: pigpio.h:6297
#define PI_CMD_CALL
Definition: pigpio.h:6219
#define PI_BAD_SCRIPT_CMD
Definition: pigpio.h:6319
#define PI_CMD_PROCS
Definition: pigpio.h:6102
#define PI_CMD_PUSH
Definition: pigpio.h:6244
#define PI_SOCK_WRIT_FAILED
Definition: pigpio.h:6324
#define PI_BAD_MICS_DELAY
Definition: pigpio.h:6329
#define PI_CMD_BSPIX
Definition: pigpio.h:6192
int error
Definition: command.c:416
#define PI_CMD_I2CWQ
Definition: pigpio.h:6120
#define PI_BAD_TIMETYPE
Definition: pigpio.h:6273
#define PI_NO_HANDLE
Definition: pigpio.h:6287
#define PI_BAD_SIGNUM
Definition: pigpio.h:6285
#define PI_CMD_WVBSY
Definition: pigpio.h:6093
#define PI_BAD_TIMER
Definition: pigpio.h:6271
#define PI_I2C_WRITE_FAILED
Definition: pigpio.h:6347
#define PI_BAD_WAVE_BAUD
Definition: pigpio.h:6299
#define PI_BAD_I2C_CMD
Definition: pigpio.h:6376
#define PI_NOT_I2C_GPIO
Definition: pigpio.h:6373
#define PI_CMD_LD
Definition: pigpio.h:6235
#define PI_BAD_WVSC_COMMND
Definition: pigpio.h:6307
#define PI_CMD_GDC
Definition: pigpio.h:6148
#define PI_BAD_SPI_COUNT
Definition: pigpio.h:6349
#define PI_CMD_SLRO
Definition: pigpio.h:6103
#define PI_BAD_SPI_CHANNEL
Definition: pigpio.h:6341
#define PI_CMD_SLRI
Definition: pigpio.h:6165
#define PI_CMD_NB
Definition: pigpio.h:6080
#define CMD_EXT_TOO_SMALL
Definition: command.h:45
#define PI_CMD_JP
Definition: pigpio.h:6232
static int getNum(char *str, uint32_t *val, int8_t *opt)
Definition: command.c:583
#define PI_SOCK_READ_FAILED
Definition: pigpio.h:6323


cob_hand_bridge
Author(s): Mathias Lüdtke
autogenerated on Tue Oct 20 2020 03:35:57