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  }
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 
PI_BAD_EDGE
#define PI_BAD_EDGE
Definition: pigpio.h:6387
PI_BAD_SER_OFFSET
#define PI_BAD_SER_OFFSET
Definition: pigpio.h:6313
PI_BAD_PARAM_NUM
#define PI_BAD_PARAM_NUM
Definition: pigpio.h:6316
PI_BAD_WVSM_COMMND
#define PI_BAD_WVSM_COMMND
Definition: pigpio.h:6308
PI_TOO_MANY_CBS
#define PI_TOO_MANY_CBS
Definition: pigpio.h:6332
PI_CMD_MICS
#define PI_CMD_MICS
Definition: pigpio.h:6107
PI_BAD_DATABITS
#define PI_BAD_DATABITS
Definition: pigpio.h:6366
PI_BAD_HANDLE
#define PI_BAD_HANDLE
Definition: pigpio.h:6288
PI_CMD_BSPIC
#define PI_CMD_BSPIC
Definition: pigpio.h:6190
PI_CMD_TAG
#define PI_CMD_TAG
Definition: pigpio.h:6234
PI_NO_AUX_SPI
#define PI_NO_AUX_SPI
Definition: pigpio.h:6356
PI_CMD_PROCD
#define PI_CMD_PROCD
Definition: pigpio.h:6100
PI_BAD_ISR_INIT
#define PI_BAD_ISR_INIT
Definition: pigpio.h:6388
PI_BAD_FILE_WRITE
#define PI_BAD_FILE_WRITE
Definition: pigpio.h:6397
error
void error(const char *msg)
Definition: embedded_linux_comms.c:39
PI_NO_WAVEFORM_ID
#define PI_NO_WAVEFORM_ID
Definition: pigpio.h:6335
gpio_status.c
c
Definition: gpio_status.py:61
PI_CMD_SERDA
#define PI_CMD_SERDA
Definition: pigpio.h:6146
PI_CMD_BI2CZ
#define PI_CMD_BI2CZ
Definition: pigpio.h:6159
PI_CMD_PADS
#define PI_CMD_PADS
Definition: pigpio.h:6178
PI_BAD_DUTYRANGE
#define PI_BAD_DUTYRANGE
Definition: pigpio.h:6283
PI_CMD_WAIT
#define PI_CMD_WAIT
Definition: pigpio.h:6255
PI_CMD_DCR
#define PI_CMD_DCR
Definition: pigpio.h:6223
PI_BAD_SCRIPT
#define PI_BAD_SCRIPT
Definition: pigpio.h:6311
PI_CMD_NP
#define PI_CMD_NP
Definition: pigpio.h:6081
PI_BAD_MICS_DELAY
#define PI_BAD_MICS_DELAY
Definition: pigpio.h:6329
PI_CMD_WVNEW
#define PI_CMD_WVNEW
Definition: pigpio.h:6114
PI_BAD_PATHNAME
#define PI_BAD_PATHNAME
Definition: pigpio.h:6286
PI_HPWM_ILLEGAL
#define PI_HPWM_ILLEGAL
Definition: pigpio.h:6365
cmdTagStep_t
Definition: command.h:81
PI_BAD_CLK_PERIPH
#define PI_BAD_CLK_PERIPH
Definition: pigpio.h:6279
PI_CMD_BSPIO
#define PI_CMD_BSPIO
Definition: pigpio.h:6191
PI_CMD_PROCS
#define PI_CMD_PROCS
Definition: pigpio.h:6102
PI_CMD_PROC
#define PI_CMD_PROC
Definition: pigpio.h:6099
PI_CMD_NOP
#define PI_CMD_NOP
Definition: pigpio.h:6240
PI_CMD_INRA
#define PI_CMD_INRA
Definition: pigpio.h:6228
PI_BAD_SPI_BAUD
#define PI_BAD_SPI_BAUD
Definition: pigpio.h:6406
PI_CMD_CMP
#define PI_CMD_CMP
Definition: pigpio.h:6222
PI_CMD_I2CWI
#define PI_CMD_I2CWI
Definition: pigpio.h:6130
PCF8591.v
v
Definition: PCF8591.py:41
PI_NOT_SERVO_GPIO
#define PI_NOT_SERVO_GPIO
Definition: pigpio.h:6358
PI_CMD_POPA
#define PI_CMD_POPA
Definition: pigpio.h:6243
PI_BAD_SER_INVERT
#define PI_BAD_SER_INVERT
Definition: pigpio.h:6386
PI_CMD_SPIC
#define PI_CMD_SPIC
Definition: pigpio.h:6135
PI_CMD_SPIO
#define PI_CMD_SPIO
Definition: pigpio.h:6134
PI_CMD_HP
#define PI_CMD_HP
Definition: pigpio.h:6152
PI_CMD_SERR
#define PI_CMD_SERR
Definition: pigpio.h:6144
PI_CMD_STA
#define PI_CMD_STA
Definition: pigpio.h:6251
PI_CMD_SLRO
#define PI_CMD_SLRO
Definition: pigpio.h:6103
PI_CMD_XOR
#define PI_CMD_XOR
Definition: pigpio.h:6258
PI_CMD_WVTXM
#define PI_CMD_WVTXM
Definition: pigpio.h:6175
PI_CMD_FW
#define PI_CMD_FW
Definition: pigpio.h:6184
PI_SER_READ_NO_DATA
#define PI_SER_READ_NO_DATA
Definition: pigpio.h:6352
CMD_PAR
#define CMD_PAR
Definition: command.h:52
fmtMdeStr
static char * fmtMdeStr
Definition: command.c:569
PI_I2C_OPEN_FAILED
#define PI_I2C_OPEN_FAILED
Definition: pigpio.h:6336
PI_CMD_WVDEL
#define PI_CMD_WVDEL
Definition: pigpio.h:6111
PI_TOO_MANY_TAGS
#define PI_TOO_MANY_TAGS
Definition: pigpio.h:6318
PI_CMD_WVGOR
#define PI_CMD_WVGOR
Definition: pigpio.h:6092
PI_CMD_PRS
#define PI_CMD_PRS
Definition: pigpio.h:6067
PI_TOO_MANY_PULSES
#define PI_TOO_MANY_PULSES
Definition: pigpio.h:6300
PI_MAX_SCRIPT_TAGS
#define PI_MAX_SCRIPT_TAGS
Definition: pigpio.h:797
PI_CMD_AND
#define PI_CMD_AND
Definition: pigpio.h:6218
PI_CMD_WVAS
#define PI_CMD_WVAS
Definition: pigpio.h:6090
PI_CMD_HALT
#define PI_CMD_HALT
Definition: pigpio.h:6226
cmdCtlParse_t
Definition: command.h:67
PI_BAD_BUF_MILLIS
#define PI_BAD_BUF_MILLIS
Definition: pigpio.h:6282
PI_CMD_CMDR
#define PI_CMD_CMDR
Definition: pigpio.h:6220
PI_CMD_I2CZ
#define PI_CMD_I2CZ
Definition: pigpio.h:6161
PI_NO_FILE_ACCESS
#define PI_NO_FILE_ACCESS
Definition: pigpio.h:6402
PI_SPI_XFER_FAILED
#define PI_SPI_XFER_FAILED
Definition: pigpio.h:6354
PI_BAD_CHAIN_DELAY
#define PI_BAD_CHAIN_DELAY
Definition: pigpio.h:6382
CMD_NUMERIC
#define CMD_NUMERIC
Definition: command.h:50
PI_CMD_NC
#define PI_CMD_NC
Definition: pigpio.h:6082
PI_CMD_PUSH
#define PI_CMD_PUSH
Definition: pigpio.h:6244
PI_BAD_TIMER
#define PI_BAD_TIMER
Definition: pigpio.h:6271
PI_INITIALISED
#define PI_INITIALISED
Definition: pigpio.h:6296
PI_CMD_RRA
#define PI_CMD_RRA
Definition: pigpio.h:6250
PI_CMD_INR
#define PI_CMD_INR
Definition: pigpio.h:6227
PI_CMD_BS1
#define PI_CMD_BS1
Definition: pigpio.h:6075
PI_DUP_TAG
#define PI_DUP_TAG
Definition: pigpio.h:6317
PI_BAD_SCRIPT_CMD
#define PI_BAD_SCRIPT_CMD
Definition: pigpio.h:6319
PI_CMD_WVSC
#define PI_CMD_WVSC
Definition: pigpio.h:6097
PI_CMD_JNZ
#define PI_CMD_JNZ
Definition: pigpio.h:6231
PI_SOCK_WRIT_FAILED
#define PI_SOCK_WRIT_FAILED
Definition: pigpio.h:6324
PI_BAD_I2C_BAUD
#define PI_BAD_I2C_BAUD
Definition: pigpio.h:6377
PI_SOME_PERMITTED
#define PI_SOME_PERMITTED
Definition: pigpio.h:6306
PI_CMD_POP
#define PI_CMD_POP
Definition: pigpio.h:6242
PI_BAD_HPWM_FREQ
#define PI_BAD_HPWM_FREQ
Definition: pigpio.h:6361
PI_BAD_STRENGTH
#define PI_BAD_STRENGTH
Definition: pigpio.h:6392
PI_BAD_CHANNEL
#define PI_BAD_CHANNEL
Definition: pigpio.h:6290
PI_CMD_PIGPV
#define PI_CMD_PIGPV
Definition: pigpio.h:6087
PI_BAD_SPI_CHANNEL
#define PI_BAD_SPI_CHANNEL
Definition: pigpio.h:6341
PI_CMD_I2CWS
#define PI_CMD_I2CWS
Definition: pigpio.h:6122
PI_BAD_SCRIPT_NAME
#define PI_BAD_SCRIPT_NAME
Definition: pigpio.h:6405
PI_CMD_HELP
#define PI_CMD_HELP
Definition: pigpio.h:6086
PI_CMD_TRIG
#define PI_CMD_TRIG
Definition: pigpio.h:6098
PI_CMD_BR1
#define PI_CMD_BR1
Definition: pigpio.h:6071
CMD_BAD_PARAMETER
#define CMD_BAD_PARAMETER
Definition: command.h:44
cmdStr
char * cmdStr(void)
Definition: command.c:624
PI_BAD_MS
#define PI_BAD_MS
Definition: pigpio.h:6272
PI_CMD_BC2
#define PI_CMD_BC2
Definition: pigpio.h:6074
PI_BAD_I2C_CMD
#define PI_BAD_I2C_CMD
Definition: pigpio.h:6376
PI_MAX_SCRIPT_PARAMS
#define PI_MAX_SCRIPT_PARAMS
Definition: pigpio.h:799
PI_DEPRECATED
#define PI_DEPRECATED
Definition: pigpio.h:6385
PI_SER_WRITE_FAILED
#define PI_SER_WRITE_FAILED
Definition: pigpio.h:6350
PI_BAD_HCLK_FREQ
#define PI_BAD_HCLK_FREQ
Definition: pigpio.h:6363
PI_BAD_SIGNUM
#define PI_BAD_SIGNUM
Definition: pigpio.h:6285
PI_CMD_MLT
#define PI_CMD_MLT
Definition: pigpio.h:6238
PI_CMD_DCRA
#define PI_CMD_DCRA
Definition: pigpio.h:6224
PI_CMD_EVTWT
#define PI_CMD_EVTWT
Definition: pigpio.h:6259
PI_CMD_PROCR
#define PI_CMD_PROCR
Definition: pigpio.h:6101
PI_BAD_MICROS
#define PI_BAD_MICROS
Definition: pigpio.h:6275
f
f
PI_CMD_CALL
#define PI_CMD_CALL
Definition: pigpio.h:6219
PI_CMD_BI2CO
#define PI_CMD_BI2CO
Definition: pigpio.h:6158
PI_NO_SCRIPT_ROOM
#define PI_NO_SCRIPT_ROOM
Definition: pigpio.h:6321
PI_TOO_MANY_PARAM
#define PI_TOO_MANY_PARAM
Definition: pigpio.h:6325
PI_CMD_PWM
#define PI_CMD_PWM
Definition: pigpio.h:6066
PI_MSG_TOOBIG
#define PI_MSG_TOOBIG
Definition: pigpio.h:6368
PI_BAD_TIMETYPE
#define PI_BAD_TIMETYPE
Definition: pigpio.h:6273
PI_CMD_SERC
#define PI_CMD_SERC
Definition: pigpio.h:6141
PI_CMD_SERVO
#define PI_CMD_SERVO
Definition: pigpio.h:6069
PI_CMD_SPIW
#define PI_CMD_SPIW
Definition: pigpio.h:6137
PI_BAD_I2C_ADDR
#define PI_BAD_I2C_ADDR
Definition: pigpio.h:6340
PI_CMD_WRITE
#define PI_CMD_WRITE
Definition: pigpio.h:6065
PI_BAD_SER_DEVICE
#define PI_BAD_SER_DEVICE
Definition: pigpio.h:6344
PI_CMD_PROCU
#define PI_CMD_PROCU
Definition: pigpio.h:6199
PI_CMD_BI2CC
#define PI_CMD_BI2CC
Definition: pigpio.h:6157
PI_BAD_POINTER
#define PI_BAD_POINTER
Definition: pigpio.h:6355
PI_NOT_PERMITTED
#define PI_NOT_PERMITTED
Definition: pigpio.h:6305
command.h
PI_SOCK_READ_FAILED
#define PI_SOCK_READ_FAILED
Definition: pigpio.h:6323
cmdCtlParse_t::opt
int8_t opt[4]
Definition: command.h:70
PI_CMD_I2CO
#define PI_CMD_I2CO
Definition: pigpio.h:6116
PI_CMD_TICK
#define PI_CMD_TICK
Definition: pigpio.h:6077
CMD_MAX_PARAM
#define CMD_MAX_PARAM
Definition: command.h:40
PI_CMD_WDOG
#define PI_CMD_WDOG
Definition: pigpio.h:6070
cmdTagStep_t::step
int step
Definition: command.h:84
PI_GPIO_IN_USE
#define PI_GPIO_IN_USE
Definition: pigpio.h:6314
PI_BAD_I2C_SEG
#define PI_BAD_I2C_SEG
Definition: pigpio.h:6371
PI_CMD_I2CRS
#define PI_CMD_I2CRS
Definition: pigpio.h:6121
PI_BAD_USER_GPIO
#define PI_BAD_USER_GPIO
Definition: pigpio.h:6264
PI_BAD_FILE_FLAG
#define PI_BAD_FILE_FLAG
Definition: pigpio.h:6395
PI_CMD_WVCLR
#define PI_CMD_WVCLR
Definition: pigpio.h:6088
PI_CMD_SERWB
#define PI_CMD_SERWB
Definition: pigpio.h:6143
PI_CMD_FO
#define PI_CMD_FO
Definition: pigpio.h:6181
cmdMatch
static int cmdMatch(char *str)
Definition: command.c:572
PI_CMD_SPIX
#define PI_CMD_SPIX
Definition: pigpio.h:6138
CMD_VAR
#define CMD_VAR
Definition: command.h:51
PI_BAD_FILE_READ
#define PI_BAD_FILE_READ
Definition: pigpio.h:6396
cmdInstr_t::p
uint32_t p[5]
Definition: command.h:89
PI_SPI_OPEN_FAILED
#define PI_SPI_OPEN_FAILED
Definition: pigpio.h:6338
PI_TOO_MANY_SEGS
#define PI_TOO_MANY_SEGS
Definition: pigpio.h:6370
PI_UNKNOWN_COMMAND
#define PI_UNKNOWN_COMMAND
Definition: pigpio.h:6353
PI_BAD_CFG_INTERNAL
#define PI_BAD_CFG_INTERNAL
Definition: pigpio.h:6298
PI_CMD_I2CRB
#define PI_CMD_I2CRB
Definition: pigpio.h:6123
cmdInstr_t
Definition: command.h:87
PI_CMD_WVBSY
#define PI_CMD_WVBSY
Definition: pigpio.h:6093
PI_CMD_MODES
#define PI_CMD_MODES
Definition: pigpio.h:6061
PI_BAD_TAG
#define PI_BAD_TAG
Definition: pigpio.h:6328
PI_BAD_SER_SPEED
#define PI_BAD_SER_SPEED
Definition: pigpio.h:6345
PI_CMD_WVGO
#define PI_CMD_WVGO
Definition: pigpio.h:6091
PI_CMD_NB
#define PI_CMD_NB
Definition: pigpio.h:6080
PI_BAD_MODE
#define PI_BAD_MODE
Definition: pigpio.h:6266
PI_CMD_SERRB
#define PI_CMD_SERRB
Definition: pigpio.h:6142
PI_CMD_SHELL
#define PI_CMD_SHELL
Definition: pigpio.h:6188
PI_CMD_SERW
#define PI_CMD_SERW
Definition: pigpio.h:6145
PI_BAD_MILS_DELAY
#define PI_BAD_MILS_DELAY
Definition: pigpio.h:6330
PI_CMD_I2CC
#define PI_CMD_I2CC
Definition: pigpio.h:6117
PI_CMD_I2CWQ
#define PI_CMD_I2CWQ
Definition: pigpio.h:6120
PI_CMD_PUD
#define PI_CMD_PUD
Definition: pigpio.h:6063
PI_CMD_ADD
#define PI_CMD_ADD
Definition: pigpio.h:6217
PI_BAD_VAR_NUM
#define PI_BAD_VAR_NUM
Definition: pigpio.h:6320
PI_BAD_I2C_RLEN
#define PI_BAD_I2C_RLEN
Definition: pigpio.h:6375
PI_CMD_WVSP
#define PI_CMD_WVSP
Definition: pigpio.h:6096
PI_TOO_MANY_CHARS
#define PI_TOO_MANY_CHARS
Definition: pigpio.h:6301
CMD_MAX_EXTENSION
#define CMD_MAX_EXTENSION
Definition: command.h:41
PI_CMD_OR
#define PI_CMD_OR
Definition: pigpio.h:6241
PI_CMD_FL
#define PI_CMD_FL
Definition: pigpio.h:6186
cmdParseScript
int cmdParseScript(char *script, cmdScript_t *s, int diags)
Definition: command.c:1259
PI_CMD_FS
#define PI_CMD_FS
Definition: pigpio.h:6185
PI_CMD_DIV
#define PI_CMD_DIV
Definition: pigpio.h:6225
PI_CMD_EVT
#define PI_CMD_EVT
Definition: pigpio.h:6197
cmdInfo_t
Definition: command.h:73
cmdUsage
char * cmdUsage
Definition: command.c:264
cmdCtlParse_t::eaten
int eaten
Definition: command.h:69
PI_NOT_SPI_GPIO
#define PI_NOT_SPI_GPIO
Definition: pigpio.h:6407
PI_CMD_FC
#define PI_CMD_FC
Definition: pigpio.h:6182
PI_BAD_FILE_SEEK
#define PI_BAD_FILE_SEEK
Definition: pigpio.h:6400
PI_BAD_FLAGS
#define PI_BAD_FLAGS
Definition: pigpio.h:6342
PI_CMD_JZ
#define PI_CMD_JZ
Definition: pigpio.h:6233
PI_BAD_FILTER
#define PI_BAD_FILTER
Definition: pigpio.h:6390
PI_CMD_JP
#define PI_CMD_JP
Definition: pigpio.h:6232
errInfo_t
Definition: command.c:414
PI_NOT_I2C_GPIO
#define PI_NOT_I2C_GPIO
Definition: pigpio.h:6373
PI_NO_HANDLE
#define PI_NO_HANDLE
Definition: pigpio.h:6287
PI_CMD_BSPIX
#define PI_CMD_BSPIX
Definition: pigpio.h:6192
PI_CMD_MODEG
#define PI_CMD_MODEG
Definition: pigpio.h:6062
fmtPudStr
static char * fmtPudStr
Definition: command.c:570
PI_CMD_RLA
#define PI_CMD_RLA
Definition: pigpio.h:6248
PI_CMD_XA
#define PI_CMD_XA
Definition: pigpio.h:6257
PI_BAD_HCLK_PASS
#define PI_BAD_HCLK_PASS
Definition: pigpio.h:6364
DHT22.s
s
Definition: DHT22.py:257
cmdInstr_t::opt
int8_t opt[4]
Definition: command.h:90
PI_BAD_WAVE_ID
#define PI_BAD_WAVE_ID
Definition: pigpio.h:6331
PI_CMD_BR2
#define PI_CMD_BR2
Definition: pigpio.h:6072
PI_CMD_FG
#define PI_CMD_FG
Definition: pigpio.h:6170
PI_CMD_CMDW
#define PI_CMD_CMDW
Definition: pigpio.h:6221
PI_CMD_PADG
#define PI_CMD_PADG
Definition: pigpio.h:6179
PI_CMD_I2CWW
#define PI_CMD_I2CWW
Definition: pigpio.h:6126
PI_CMD_I2CPK
#define PI_CMD_I2CPK
Definition: pigpio.h:6132
PI_CMD_SLRI
#define PI_CMD_SLRI
Definition: pigpio.h:6165
pigpio.h
PI_CMD_HC
#define PI_CMD_HC
Definition: pigpio.h:6151
cmdInfo_t::cmd
int cmd
Definition: command.h:75
PI_BAD_WAVE_MODE
#define PI_BAD_WAVE_MODE
Definition: pigpio.h:6297
setup.name
name
Definition: setup.py:5
cmdTagStep_t::tag
uint32_t tag
Definition: command.h:83
PI_CMD_BS2
#define PI_CMD_BS2
Definition: pigpio.h:6076
PI_BAD_WVSP_COMMND
#define PI_BAD_WVSP_COMMND
Definition: pigpio.h:6309
PI_BAD_GPIO
#define PI_BAD_GPIO
Definition: pigpio.h:6265
PI_CMD_X
#define PI_CMD_X
Definition: pigpio.h:6256
PI_CMD_WVTX
#define PI_CMD_WVTX
Definition: pigpio.h:6112
PI_BAD_SPI_SPEED
#define PI_BAD_SPI_SPEED
Definition: pigpio.h:6343
PI_BAD_SMBUS_CMD
#define PI_BAD_SMBUS_CMD
Definition: pigpio.h:6372
PI_BAD_STOPBITS
#define PI_BAD_STOPBITS
Definition: pigpio.h:6367
PI_BAD_CHAIN_LOOP
#define PI_BAD_CHAIN_LOOP
Definition: pigpio.h:6379
PI_BAD_CHAIN_CMD
#define PI_BAD_CHAIN_CMD
Definition: pigpio.h:6381
PI_CMD_SLRC
#define PI_CMD_SLRC
Definition: pigpio.h:6105
PI_CMD_LDA
#define PI_CMD_LDA
Definition: pigpio.h:6236
PI_CMD_RL
#define PI_CMD_RL
Definition: pigpio.h:6247
PI_NOT_HPWM_GPIO
#define PI_NOT_HPWM_GPIO
Definition: pigpio.h:6360
intCmdStr
static char intCmdStr[32]
Definition: command.c:622
PI_CMD_HWVER
#define PI_CMD_HWVER
Definition: pigpio.h:6078
cmdErrStr
char * cmdErrStr(int error)
Definition: command.c:1248
CMD_UNKNOWN_CMD
#define CMD_UNKNOWN_CMD
Definition: command.h:43
PI_CMD_INTERRUPTED
#define PI_CMD_INTERRUPTED
Definition: pigpio.h:6409
PI_CMD_JM
#define PI_CMD_JM
Definition: pigpio.h:6229
PI_CMD_BSCX
#define PI_CMD_BSCX
Definition: pigpio.h:6194
PI_CMD_PARSE
#define PI_CMD_PARSE
Definition: pigpio.h:6109
PI_NO_ALERT_FUNC
#define PI_NO_ALERT_FUNC
Definition: pigpio.h:6278
PI_BAD_FIFO_COMMAND
#define PI_BAD_FIFO_COMMAND
Definition: pigpio.h:6293
PI_CMD_BC1
#define PI_CMD_BC1
Definition: pigpio.h:6073
PI_CMD_SPIR
#define PI_CMD_SPIR
Definition: pigpio.h:6136
PI_CMD_PFG
#define PI_CMD_PFG
Definition: pigpio.h:6084
PI_CMD_PRG
#define PI_CMD_PRG
Definition: pigpio.h:6083
PI_CMD_CF2
#define PI_CMD_CF2
Definition: pigpio.h:6155
PI_CMD_PROCP
#define PI_CMD_PROCP
Definition: pigpio.h:6106
PI_CMD_NO
#define PI_CMD_NO
Definition: pigpio.h:6079
PI_MAX_SCRIPT_VARS
#define PI_MAX_SCRIPT_VARS
Definition: pigpio.h:798
PI_CMD_SYS
#define PI_CMD_SYS
Definition: pigpio.h:6254
PI_CMD_WVHLT
#define PI_CMD_WVHLT
Definition: pigpio.h:6094
PI_BAD_WVSC_COMMND
#define PI_BAD_WVSC_COMMND
Definition: pigpio.h:6307
PI_BAD_SPI_COUNT
#define PI_BAD_SPI_COUNT
Definition: pigpio.h:6349
PI_CMD_I2CRK
#define PI_CMD_I2CRK
Definition: pigpio.h:6127
PI_TOO_MANY_OOL
#define PI_TOO_MANY_OOL
Definition: pigpio.h:6333
PI_CMD_JMP
#define PI_CMD_JMP
Definition: pigpio.h:6230
PI_CMD_I2CPC
#define PI_CMD_I2CPC
Definition: pigpio.h:6131
PI_CMD_I2CRW
#define PI_CMD_I2CRW
Definition: pigpio.h:6125
PI_BAD_WDOG_TIMEOUT
#define PI_BAD_WDOG_TIMEOUT
Definition: pigpio.h:6277
CMD_EXT_TOO_SMALL
#define CMD_EXT_TOO_SMALL
Definition: command.h:45
PI_BAD_PARAM
#define PI_BAD_PARAM
Definition: pigpio.h:6346
PI_SER_READ_FAILED
#define PI_SER_READ_FAILED
Definition: pigpio.h:6351
PI_CMD_SUB
#define PI_CMD_SUB
Definition: pigpio.h:6253
getNum
static int getNum(char *str, uint32_t *val, int8_t *opt)
Definition: command.c:583
PI_BAD_I2C_WLEN
#define PI_BAD_I2C_WLEN
Definition: pigpio.h:6374
PI_CMD_READ
#define PI_CMD_READ
Definition: pigpio.h:6064
PI_CHAIN_NESTING
#define PI_CHAIN_NESTING
Definition: pigpio.h:6383
PI_BAD_SERIAL_COUNT
#define PI_BAD_SERIAL_COUNT
Definition: pigpio.h:6315
PI_CMD_CF1
#define PI_CMD_CF1
Definition: pigpio.h:6154
PI_BAD_SERIAL_STRUC
#define PI_BAD_SERIAL_STRUC
Definition: pigpio.h:6303
PI_BAD_PUD
#define PI_BAD_PUD
Definition: pigpio.h:6268
PI_CMD_GDC
#define PI_CMD_GDC
Definition: pigpio.h:6148
PI_CMD_I2CWK
#define PI_CMD_I2CWK
Definition: pigpio.h:6128
PI_CMD_WVCHA
#define PI_CMD_WVCHA
Definition: pigpio.h:6163
PI_CMD_EVM
#define PI_CMD_EVM
Definition: pigpio.h:6196
PI_NOT_SERIAL_GPIO
#define PI_NOT_SERIAL_GPIO
Definition: pigpio.h:6302
PI_CMD_CGI
#define PI_CMD_CGI
Definition: pigpio.h:6167
PI_I2C_WRITE_FAILED
#define PI_I2C_WRITE_FAILED
Definition: pigpio.h:6347
PI_CMD_WVCRE
#define PI_CMD_WVCRE
Definition: pigpio.h:6110
PI_FIL_OPEN_FAILED
#define PI_FIL_OPEN_FAILED
Definition: pigpio.h:6393
PI_CMD_CSI
#define PI_CMD_CSI
Definition: pigpio.h:6168
PI_CMD_RET
#define PI_CMD_RET
Definition: pigpio.h:6246
PI_NOT_PWM_GPIO
#define PI_NOT_PWM_GPIO
Definition: pigpio.h:6357
PI_BAD_CLK_MICROS
#define PI_BAD_CLK_MICROS
Definition: pigpio.h:6281
cmdParse
int cmdParse(char *buf, uint32_t *p, unsigned ext_len, char *ext, cmdCtlParse_t *ctl)
Definition: command.c:629
PI_EMPTY_WAVEFORM
#define PI_EMPTY_WAVEFORM
Definition: pigpio.h:6334
PI_BAD_IF_FLAGS
#define PI_BAD_IF_FLAGS
Definition: pigpio.h:6289
cmdInfo
cmdInfo_t cmdInfo[]
Definition: command.c:41
PI_INIT_FAILED
#define PI_INIT_FAILED
Definition: pigpio.h:6263
PI_NOT_INITIALISED
#define PI_NOT_INITIALISED
Definition: pigpio.h:6295
PI_CMD_MOD
#define PI_CMD_MOD
Definition: pigpio.h:6239
PI_CMD_LD
#define PI_CMD_LD
Definition: pigpio.h:6235
PI_CHAIN_LOOP_CNT
#define PI_CHAIN_LOOP_CNT
Definition: pigpio.h:6378
PI_CMD_I2CRI
#define PI_CMD_I2CRI
Definition: pigpio.h:6129
PI_BAD_SOCKET_PORT
#define PI_BAD_SOCKET_PORT
Definition: pigpio.h:6292
PI_BAD_WAVE_BAUD
#define PI_BAD_WAVE_BAUD
Definition: pigpio.h:6299
PI_BAD_EVENT_ID
#define PI_BAD_EVENT_ID
Definition: pigpio.h:6408
PI_BAD_PULSEWIDTH
#define PI_BAD_PULSEWIDTH
Definition: pigpio.h:6269
PI_BAD_LEVEL
#define PI_BAD_LEVEL
Definition: pigpio.h:6267
PI_CHAIN_TOO_BIG
#define PI_CHAIN_TOO_BIG
Definition: pigpio.h:6384
PI_CMD_MILS
#define PI_CMD_MILS
Definition: pigpio.h:6108
PI_CMD_WVTXR
#define PI_CMD_WVTXR
Definition: pigpio.h:6113
PI_CMD_WVTAT
#define PI_CMD_WVTAT
Definition: pigpio.h:6176
PI_BAD_HPWM_DUTY
#define PI_BAD_HPWM_DUTY
Definition: pigpio.h:6362
PI_SCRIPT_NOT_READY
#define PI_SCRIPT_NOT_READY
Definition: pigpio.h:6327
PI_FILE_IS_A_DIR
#define PI_FILE_IS_A_DIR
Definition: pigpio.h:6403
PI_NO_FILE_MATCH
#define PI_NO_FILE_MATCH
Definition: pigpio.h:6401
PI_CMD_LDAB
#define PI_CMD_LDAB
Definition: pigpio.h:6237
PI_CMD_I2CWB
#define PI_CMD_I2CWB
Definition: pigpio.h:6124
PI_BAD_I2C_BUS
#define PI_BAD_I2C_BUS
Definition: pigpio.h:6339
PI_BAD_DUTYCYCLE
#define PI_BAD_DUTYCYCLE
Definition: pigpio.h:6270
PI_CMD_GPW
#define PI_CMD_GPW
Definition: pigpio.h:6149
PI_FILE_NOT_WOPEN
#define PI_FILE_NOT_WOPEN
Definition: pigpio.h:6399
PI_SER_OPEN_FAILED
#define PI_SER_OPEN_FAILED
Definition: pigpio.h:6337
errInfo_t::error
int error
Definition: command.c:416
PI_CMD_WVSM
#define PI_CMD_WVSM
Definition: pigpio.h:6095
PI_BAD_SERIAL_BUF
#define PI_BAD_SERIAL_BUF
Definition: pigpio.h:6304
PI_BAD_SECONDS
#define PI_BAD_SECONDS
Definition: pigpio.h:6274
PI_CMD_FN
#define PI_CMD_FN
Definition: pigpio.h:6171
PI_CMD_I2CRD
#define PI_CMD_I2CRD
Definition: pigpio.h:6118
PI_BAD_FOREVER
#define PI_BAD_FOREVER
Definition: pigpio.h:6389
PI_NOT_HCLK_GPIO
#define PI_NOT_HCLK_GPIO
Definition: pigpio.h:6359
PI_BAD_PULSELEN
#define PI_BAD_PULSELEN
Definition: pigpio.h:6310
cmdScript_t
Definition: command.h:93
PI_BAD_SHELL_STATUS
#define PI_BAD_SHELL_STATUS
Definition: pigpio.h:6404
PI_CMD_PUSHA
#define PI_CMD_PUSHA
Definition: pigpio.h:6245
PI_CMD_WVAG
#define PI_CMD_WVAG
Definition: pigpio.h:6089
PI_CMD_SLR
#define PI_CMD_SLR
Definition: pigpio.h:6104
PI_CMD_I2CWD
#define PI_CMD_I2CWD
Definition: pigpio.h:6119
PI_BAD_FILE_MODE
#define PI_BAD_FILE_MODE
Definition: pigpio.h:6394
PI_I2C_READ_FAILED
#define PI_I2C_READ_FAILED
Definition: pigpio.h:6348
PI_TIMER_FAILED
#define PI_TIMER_FAILED
Definition: pigpio.h:6276
PI_CMD_PFS
#define PI_CMD_PFS
Definition: pigpio.h:6068
PI_BAD_PAD
#define PI_BAD_PAD
Definition: pigpio.h:6391
PI_BAD_SCRIPT_ID
#define PI_BAD_SCRIPT_ID
Definition: pigpio.h:6312
PI_BAD_MALLOC_MODE
#define PI_BAD_MALLOC_MODE
Definition: pigpio.h:6369
PI_CMD_STAB
#define PI_CMD_STAB
Definition: pigpio.h:6252
PI_CMD_RR
#define PI_CMD_RR
Definition: pigpio.h:6249
PI_CHAIN_COUNTER
#define PI_CHAIN_COUNTER
Definition: pigpio.h:6380
status
int status
Definition: pigs.c:57
errInfo
static errInfo_t errInfo[]
Definition: command.c:420
PI_CMD_SERO
#define PI_CMD_SERO
Definition: pigpio.h:6140
PI_BAD_CLK_SOURCE
#define PI_BAD_CLK_SOURCE
Definition: pigpio.h:6280
PI_BAD_SECO_CHANNEL
#define PI_BAD_SECO_CHANNEL
Definition: pigpio.h:6294
PI_CMD_FR
#define PI_CMD_FR
Definition: pigpio.h:6183
errInfo_t::str
char * str
Definition: command.c:417
PI_CMD_PRRG
#define PI_CMD_PRRG
Definition: pigpio.h:6085
PI_FILE_NOT_ROPEN
#define PI_FILE_NOT_ROPEN
Definition: pigpio.h:6398
PI_NO_MEMORY
#define PI_NO_MEMORY
Definition: pigpio.h:6322


cob_hand_bridge
Author(s): Mathias Lüdtke
autogenerated on Fri Aug 2 2024 09:40:56