diff --git a/command.c b/command.c index 6bd6fae..32b59de 100644 --- a/command.c +++ b/command.c @@ -26,7 +26,7 @@ For more information, please refer to */ /* -This version is for pigpio version 39+ +This version is for pigpio version 46+ */ #include @@ -185,6 +185,7 @@ cmdInfo_t cmdInfo[]= {PI_CMD_WVSM, "WVSM", 112, 2}, // gpioWaveGet*Micros {PI_CMD_WVSP, "WVSP", 112, 2}, // gpioWaveGet*Pulses {PI_CMD_WVTX, "WVTX", 112, 2}, // gpioWaveTxSend + {PI_CMD_WVTXM, "WVTXM", 121, 2}, // gpioWaveTxSend {PI_CMD_WVTXR, "WVTXR", 112, 2}, // gpioWaveTxSend {PI_CMD_ADD , "ADD" , 111, 0}, @@ -345,6 +346,7 @@ WVSC 0,1,2 Wave get DMA control block stats\n\ WVSM 0,1,2 Wave get micros stats\n\ WVSP 0,1,2 Wave get pulses stats\n\ WVTX wid Transmit wave as one-shot\n\ +WVTXM wid wmde Transmit wave using mode\n\ WVTXR wid Transmit wave repeatedly\n\ \n\ \n\ @@ -682,7 +684,7 @@ int cmdParse( break; case 121: /* HC I2CRD I2CRR I2CRW I2CWB I2CWQ P PFS PRS - PWM S SERVO SLR SLRI W WDOG WRITE + PWM S SERVO SLR SLRI W WDOG WRITE WVTXM Two positive parameters. */ diff --git a/pigpio.3 b/pigpio.3 index a534ab0..c4dd556 100644 --- a/pigpio.3 +++ b/pigpio.3 @@ -1968,6 +1968,14 @@ Returns 0 if OK, otherwise PI_BAD_WAVE_ID. .IP "" 4 This function transmits the waveform with id wave_id. The mode determines whether the waveform is sent once or cycles endlessly. +The SYNC variants wait for the current waveform to reach the +end of a cycle or finish before starting the new waveform. + +.br + +.br +WARNING: bad things may happen if you delete the previous +waveform before it has been synced to the new waveform. .br @@ -1981,7 +1989,9 @@ NOTE: Any hardware PWM started by \fBgpioHardwarePWM\fP will be cancelled. .EX wave_id: >=0, as returned by \fBgpioWaveCreate\fP .br -wave_mode: 0 (PI_WAVE_MODE_ONE_SHOT), 1 (PI_WAVE_MODE_REPEAT) +wave_mode: PI_WAVE_MODE_ONE_SHOT, PI_WAVE_MODE_REPEAT, +.br + PI_WAVE_MODE_ONE_SHOT_SYNC, PI_WAVE_MODE_REPEAT_SYNC .br .EE @@ -7540,17 +7550,23 @@ A number identifying a waveform created by \fBgpioWaveCreate\fP. .br .br -The mode of waveform transmission, whether it is sent once or cycles -repeatedly. +The mode determines if the waveform is sent once or cycles +repeatedly. The SYNC variants wait for the current waveform +to reach the end of a cycle or finish before starting the new +waveform. .br .br .EX -PI_WAVE_MODE_ONE_SHOT 0 +PI_WAVE_MODE_ONE_SHOT 0 .br -PI_WAVE_MODE_REPEAT 1 +PI_WAVE_MODE_REPEAT 1 +.br +PI_WAVE_MODE_ONE_SHOT_SYNC 2 +.br +PI_WAVE_MODE_REPEAT_SYNC 3 .br .EE @@ -7801,6 +7817,10 @@ A 16-bit word value. #define PI_CMD_NOIB 99 .br +.br +#define PI_CMD_WVTXM 100 +.br + .br .EE @@ -7877,7 +7897,7 @@ A 16-bit word value. .br #define PI_INITIALISED -32 // function called after gpioInitialise .br -#define PI_BAD_WAVE_MODE -33 // waveform mode not 0-1 +#define PI_BAD_WAVE_MODE -33 // waveform mode not 0-3 .br #define PI_BAD_CFG_INTERNAL -34 // bad parameter in gpioCfgInternals call .br diff --git a/pigpio.c b/pigpio.c index d7625f7..f8a038f 100644 --- a/pigpio.c +++ b/pigpio.c @@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to */ -/* pigpio version 45 */ +/* pigpio version 46 */ /* include ------------------------------------------------------- */ @@ -1133,6 +1133,9 @@ static int libInitialised = 0; /* initialise every gpioInitialise */ static struct timespec libStarted; + +static uint32_t reportedLevel = 0; + static int waveClockInited = 0; static volatile gpioStats_t gpioStats; @@ -1165,6 +1168,8 @@ static int waveOutBotOOL = PI_WAVE_COUNT_PAGES*OOL_PER_OPAGE; static int waveOutTopOOL = NUM_WAVE_OOL; static int waveOutCount = 0; +static uint32_t *waveEndPtr = NULL; + static volatile uint32_t alertBits = 0; static volatile uint32_t monitorBits = 0; static volatile uint32_t notifyBits = 0; @@ -2179,6 +2184,9 @@ static int myDoCommand(uint32_t *p, unsigned bufSize, char *buf) case PI_CMD_WVTX: res = gpioWaveTxSend(p[1], PI_WAVE_MODE_ONE_SHOT); break; + case PI_CMD_WVTXM: + res = gpioWaveTxSend(p[1], p[2]); break; + case PI_CMD_WVTXR: res = gpioWaveTxSend(p[1], PI_WAVE_MODE_REPEAT); break; @@ -5253,9 +5261,8 @@ static void alertNoiseFilter(gpioSample_t *sample, int numSamples) } } -uint32_t _reportedLevel, _changedBits; - -static void alertEmit(gpioSample_t *sample, int numSamples, uint32_t eTick) +static void alertEmit( + gpioSample_t *sample, int numSamples, uint32_t changedBits, uint32_t eTick) { uint32_t oldLevel, newLevel; int32_t diff; @@ -5268,7 +5275,7 @@ static void alertEmit(gpioSample_t *sample, int numSamples, uint32_t eTick) char fifo[32]; gpioReport_t report[MAX_REPORT]; - if (_changedBits) + if (changedBits) { if (gpioGetSamples.func) { @@ -5286,9 +5293,9 @@ static void alertEmit(gpioSample_t *sample, int numSamples, uint32_t eTick) /* call alert callbacks for each bit transition */ - if (_changedBits & alertBits) + if (changedBits & alertBits) { - oldLevel = (_reportedLevel & alertBits); + oldLevel = (reportedLevel & alertBits); for (d=0; d= gpioAlert[b].wdSteadyUs) + if (gpioAlert[b].wdSteadyUs) { - timeoutBits |= (1<= gpioAlert[b].wdSteadyUs) { - if (gpioAlert[b].ex) + timeoutBits |= (1<= MAX_REPORT) + reports++; + + if (reports >= MAX_REPORT) { - totalSamples += compactedSamples; + totalSamples += reports; /* Rebase watchdog timeouts */ - if (wdogBits) alertWdogCheck(sample, compactedSamples); + if (wdogBits) alertWdogCheck(sample, reports); - gpioStats.numSamples += compactedSamples; + gpioStats.numSamples += reports; - alertEmit(sample, compactedSamples, sample[rp].tick); + alertEmit(sample, reports, changedBits, sample[rp].tick); - compactedSamples = 0; + changedBits = 0; + reports = 0; } } } - if (compactedSamples) + if (reports) { - totalSamples += compactedSamples; + totalSamples += reports; /* Rebase watchdog timeouts */ - if (wdogBits) alertWdogCheck(sample, compactedSamples); + if (wdogBits) alertWdogCheck(sample, reports); - gpioStats.numSamples += compactedSamples; + gpioStats.numSamples += reports; } - alertEmit(sample, compactedSamples, sTick); + alertEmit(sample, reports, changedBits, sTick); if (totalSamples > gpioStats.maxSamples) gpioStats.maxSamples = numSamples; @@ -8346,6 +8362,8 @@ int gpioWaveClear(void) waveOutCount = 0; + waveEndPtr = NULL; + return 0; } @@ -8818,7 +8836,7 @@ int gpioWaveTxSend(unsigned wave_id, unsigned wave_mode) if ((wave_id >= waveOutCount) || waveInfo[wave_id].deleted) SOFT_ERROR(PI_BAD_WAVE_ID, "bad wave id (%d)", wave_id); - if (wave_mode > PI_WAVE_MODE_REPEAT) + if (wave_mode > PI_WAVE_MODE_REPEAT_SYNC) SOFT_ERROR(PI_BAD_WAVE_MODE, "bad wave mode (%d)", wave_mode); if (!waveClockInited) @@ -8828,16 +8846,28 @@ int gpioWaveTxSend(unsigned wave_id, unsigned wave_mode) waveClockInited = 1; } - dmaOut[DMA_CS] = DMA_CHANNEL_RESET; - - dmaOut[DMA_CONBLK_AD] = 0; - p = rawWaveCBAdr(waveInfo[wave_id].topCB); - if (wave_mode == PI_WAVE_MODE_ONE_SHOT) p->next = 0; - else p->next = waveCbPOadr(waveInfo[wave_id].botCB+1); + if ((wave_mode & 1) == PI_WAVE_MODE_ONE_SHOT) + p->next = 0; + else + p->next = waveCbPOadr(waveInfo[wave_id].botCB+1); - initDMAgo((uint32_t *)dmaOut, waveCbPOadr(waveInfo[wave_id].botCB)); + if (waveEndPtr && (wave_mode > PI_WAVE_MODE_REPEAT)) + { + *waveEndPtr = waveCbPOadr(waveInfo[wave_id].botCB+1); + + if (!dmaOut[DMA_CONBLK_AD]) + { + initDMAgo((uint32_t *)dmaOut, waveCbPOadr(waveInfo[wave_id].botCB)); + } + } + else + { + initDMAgo((uint32_t *)dmaOut, waveCbPOadr(waveInfo[wave_id].botCB)); + } + + waveEndPtr = &p->next; /* for compatability with the deprecated gpioWaveTxStart return the number of cbs @@ -9035,7 +9065,7 @@ int gpioWaveChain(char *buf, unsigned bufSize) rawCbs_t *p; int i, wid, cmd, loop, counters; unsigned cycles; - uint32_t repeat, next; + uint32_t repeat, next, *endPtr; int stk_pos[10], stk_lev=0; cb = 0; @@ -9053,8 +9083,9 @@ int gpioWaveChain(char *buf, unsigned bufSize) } dmaOut[DMA_CS] = DMA_CHANNEL_RESET; - dmaOut[DMA_CONBLK_AD] = 0; + waveEndPtr = NULL; + endPtr = NULL; /* add delay cb at start of DMA */ @@ -9242,6 +9273,7 @@ int gpioWaveChain(char *buf, unsigned bufSize) p->dst = (uint32_t) (&dmaOBus[0]->periphData); p->length = 4; p->next = waveCbPOadr(chainGetCB(loop)); + endPtr = &p->next; } else SOFT_ERROR(PI_BAD_CHAIN_CMD, @@ -9290,8 +9322,12 @@ int gpioWaveChain(char *buf, unsigned bufSize) p->length = 4; p->next = 0; + if (!endPtr) endPtr = &p->next; + initDMAgo((uint32_t *)dmaOut, waveCbPOadr(chainGetCB(0))); + waveEndPtr = endPtr; + return 0; } @@ -9318,9 +9354,10 @@ int gpioWaveTxStop(void) CHECK_INITED; dmaOut[DMA_CS] = DMA_CHANNEL_RESET; - dmaOut[DMA_CONBLK_AD] = 0; + waveEndPtr = NULL; + return 0; } diff --git a/pigpio.h b/pigpio.h index 3c8d329..3be23d4 100644 --- a/pigpio.h +++ b/pigpio.h @@ -31,7 +31,7 @@ For more information, please refer to #include #include -#define PIGPIO_VERSION 45 +#define PIGPIO_VERSION 46 /*TEXT @@ -599,8 +599,10 @@ typedef void *(gpioThreadFunc_t) (void *); /* wave tx mode */ -#define PI_WAVE_MODE_ONE_SHOT 0 -#define PI_WAVE_MODE_REPEAT 1 +#define PI_WAVE_MODE_ONE_SHOT 0 +#define PI_WAVE_MODE_REPEAT 1 +#define PI_WAVE_MODE_ONE_SHOT_SYNC 2 +#define PI_WAVE_MODE_REPEAT_SYNC 3 /* I2C, SPI, SER */ @@ -1748,12 +1750,18 @@ int gpioWaveTxSend(unsigned wave_id, unsigned wave_mode); /*D This function transmits the waveform with id wave_id. The mode determines whether the waveform is sent once or cycles endlessly. +The SYNC variants wait for the current waveform to reach the +end of a cycle or finish before starting the new waveform. + +WARNING: bad things may happen if you delete the previous +waveform before it has been synced to the new waveform. NOTE: Any hardware PWM started by [*gpioHardwarePWM*] will be cancelled. . . wave_id: >=0, as returned by [*gpioWaveCreate*] -wave_mode: 0 (PI_WAVE_MODE_ONE_SHOT), 1 (PI_WAVE_MODE_REPEAT) +wave_mode: PI_WAVE_MODE_ONE_SHOT, PI_WAVE_MODE_REPEAT, + PI_WAVE_MODE_ONE_SHOT_SYNC, PI_WAVE_MODE_REPEAT_SYNC . . Returns the number of DMA control blocks in the waveform if OK, @@ -4780,12 +4788,16 @@ A number identifying a waveform created by [*gpioWaveCreate*]. wave_mode:: -The mode of waveform transmission, whether it is sent once or cycles -repeatedly. +The mode determines if the waveform is sent once or cycles +repeatedly. The SYNC variants wait for the current waveform +to reach the end of a cycle or finish before starting the new +waveform. . . -PI_WAVE_MODE_ONE_SHOT 0 -PI_WAVE_MODE_REPEAT 1 +PI_WAVE_MODE_ONE_SHOT 0 +PI_WAVE_MODE_REPEAT 1 +PI_WAVE_MODE_ONE_SHOT_SYNC 2 +PI_WAVE_MODE_REPEAT_SYNC 3 . . wVal::0-65535 (Hex 0x0-0xFFFF, Octal 0-0177777) @@ -4910,6 +4922,8 @@ PARAMS*/ #define PI_CMD_NOIB 99 +#define PI_CMD_WVTXM 100 + /*DEF_E*/ /* @@ -5005,7 +5019,7 @@ after this command is issued. #define PI_BAD_SECO_CHANNEL -30 // DMA secondary channel not 0-6 #define PI_NOT_INITIALISED -31 // function called before gpioInitialise #define PI_INITIALISED -32 // function called after gpioInitialise -#define PI_BAD_WAVE_MODE -33 // waveform mode not 0-1 +#define PI_BAD_WAVE_MODE -33 // waveform mode not 0-3 #define PI_BAD_CFG_INTERNAL -34 // bad parameter in gpioCfgInternals call #define PI_BAD_WAVE_BAUD -35 // baud rate not 50-250K(RX)/50-1M(TX) #define PI_TOO_MANY_PULSES -36 // waveform has too many pulses diff --git a/pigpio.py b/pigpio.py index 4aa486f..b960fdf 100644 --- a/pigpio.py +++ b/pigpio.py @@ -180,6 +180,7 @@ wave_delete Deletes one or more waveforms wave_send_once Transmits a waveform once wave_send_repeat Transmits a waveform repeatedly +wave_send_using_mode Transmits a waveform in the chosen mode wave_chain Transmits a chain of waveforms @@ -268,7 +269,7 @@ import threading import os import atexit -VERSION = "1.26" +VERSION = "1.27" exceptions = True @@ -321,6 +322,13 @@ NTFY_FLAGS_ALIVE = (1 << 6) NTFY_FLAGS_WDOG = (1 << 5) NTFY_FLAGS_GPIO = 31 +# wave modes + +WAVE_MODE_ONE_SHOT =0 +WAVE_MODE_REPEAT =1 +WAVE_MODE_ONE_SHOT_SYNC=2 +WAVE_MODE_REPEAT_SYNC =3 + # pigpio command numbers _PI_CMD_MODES= 0 @@ -445,6 +453,8 @@ _PI_CMD_CSI =96 _PI_CMD_FG =97 _PI_CMD_FN =98 +_PI_CMD_WVTXM=100 + # pigpio error numbers _PI_INIT_FAILED =-1 @@ -1995,6 +2005,40 @@ class pi(): """ return _u2i(_pigpio_command(self.sl, _PI_CMD_WVTXR, wave_id, 0)) + def wave_send_using_mode(self, wave_id, mode): + """ + Transmits the waveform with id wave_id using mode mode. + + wave_id:= >=0 (as returned by a prior call to [*wave_create*]). + mode:= WAVE_MODE_ONE_SHOT, WAVE_MODE_REPEAT, + WAVE_MODE_ONE_SHOT_SYNC, or WAVE_MODE_REPEAT_SYNC. + + WAVE_MODE_ONE_SHOT: same as [*wave_send_once*]. + + WAVE_MODE_REPEAT same as [*wave_send_repeat*]. + + WAVE_MODE_ONE_SHOT_SYNC same as [*wave_send_once*] but tries + to sync with the previous waveform. + + WAVE_MODE_REPEAT_SYNC same as [*wave_send_repeat*] but tries + to sync with the previous waveform. + + WARNING: bad things may happen if you delete the previous + waveform before it has been synced to the new waveform. + + NOTE: Any hardware PWM started by [*hardware_PWM*] will + be cancelled. + + wave_id:= >=0 (as returned by a prior call to [*wave_create*]). + + Returns the number of DMA control blocks used in the waveform. + + ... + cbs = pi.wave_send_using_mode(wid, WAVE_MODE_REPEAT_SYNC) + ... + """ + return _u2i(_pigpio_command(self.sl, _PI_CMD_WVTXM, wave_id, mode)) + def wave_tx_busy(self): """ Returns 1 if a waveform is currently being transmitted, @@ -4025,7 +4069,10 @@ def xref(): SET = 1 TIMEOUT = 2 # only returned for a watchdog timeout - mode: 0-7 + mode: + + 1.The operational mode of a gpio, normally INPUT or OUTPUT. + ALT0 = 4 ALT1 = 5 ALT2 = 6 @@ -4035,6 +4082,13 @@ def xref(): INPUT = 0 OUTPUT = 1 + 2. The mode of waveform transmission. + + WAVE_MODE_ONE_SHOT = 0 + WAVE_MODE_REPEAT = 1 + WAVE_MODE_ONE_SHOT_SYNC = 2 + WAVE_MODE_REPEAT_SYNC = 3 + offset: 0- The offset wave data starts from the beginning of the waveform being currently defined. diff --git a/pigpiod_if2.3 b/pigpiod_if2.3 index 533519c..44fe60e 100644 --- a/pigpiod_if2.3 +++ b/pigpiod_if2.3 @@ -1093,8 +1093,8 @@ Sets a glitch filter on a gpio. .br Level changes on the gpio are not reported unless the level has been stable for at least \fBsteady\fP microseconds. The -level is then reported. Level changes of less than \fBsteady\fP -microseconds are ignored. +level is then reported. Level changes of less than +\fBsteady\fP microseconds are ignored. .br @@ -1398,8 +1398,8 @@ Frequencies above 30MHz are unlikely to work. .br .br -NOTE: Any waveform started by \fBwave_send_once\fP, \fBwave_send_repeat\fP, -or \fBwave_chain\fP will be cancelled. +NOTE: Any waveform started by \fBwave_send_*\fP or \fBwave_chain\fP +will be cancelled. .br @@ -1943,6 +1943,65 @@ wave_id: >=0, as returned by \fBwave_create\fP. Returns the number of DMA control blocks in the waveform if OK, otherwise PI_BAD_WAVE_ID, or PI_BAD_WAVE_MODE. +.IP "\fBint wave_send_using_mode(int pi, unsigned wave_id, unsigned mode)\fP" +.IP "" 4 +Transmits the waveform with id wave_id using mode mode. + +.br + +.br + +.EX + pi: 0- (as returned by \fBpigpio_start\fP). +.br +wave_id: >=0, as returned by \fBwave_create\fP. +.br + mode: PI_WAVE_MODE_ONE_SHOT, PI_WAVE_MODE_REPEAT, +.br + PI_WAVE_MODE_ONE_SHOT_SYNC, or PI_WAVE_MODE_REPEAT_SYNC. +.br + +.EE + +.br + +.br +PI_WAVE_MODE_ONE_SHOT: same as \fBwave_send_once\fP. + +.br + +.br +PI_WAVE_MODE_REPEAT same as \fBwave_send_repeat\fP. + +.br + +.br +PI_WAVE_MODE_ONE_SHOT_SYNC same as \fBwave_send_once\fP but tries +to sync with the previous waveform. + +.br + +.br +PI_WAVE_MODE_REPEAT_SYNC same as \fBwave_send_repeat\fP but tries +to sync with the previous waveform. + +.br + +.br +WARNING: bad things may happen if you delete the previous +waveform before it has been synced to the new waveform. + +.br + +.br +NOTE: Any hardware PWM started by \fBhardware_PWM\fP will be cancelled. + +.br + +.br +Returns the number of DMA control blocks in the waveform if OK, +otherwise PI_BAD_WAVE_ID, or PI_BAD_WAVE_MODE. + .IP "\fBint wave_chain(int pi, char *buf, unsigned bufSize)\fP" .IP "" 4 This function transmits a chain of waveforms. @@ -4721,8 +4780,8 @@ PI_TIMEOUT 2 .br -.IP "\fBmode\fP: 0-7" 0 -The operational mode of a gpio, normally INPUT or OUTPUT. +.IP "\fBmode\fP" 0 +1. The operational mode of a gpio, normally INPUT or OUTPUT. .br @@ -4750,6 +4809,27 @@ PI_ALT5 2 .br +.br +2. The mode of waveform transmission. + +.br + +.br + +.EX +PI_WAVE_MODE_ONE_SHOT 0 +.br +PI_WAVE_MODE_REPEAT 1 +.br +PI_WAVE_MODE_ONE_SHOT_SYNC 2 +.br +PI_WAVE_MODE_REPEAT_SYNC 3 +.br + +.EE + +.br + .br .IP "\fBnumBytes\fP" 0 diff --git a/pigpiod_if2.c b/pigpiod_if2.c index 8067e97..e5971f2 100644 --- a/pigpiod_if2.c +++ b/pigpiod_if2.c @@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to */ -/* PIGPIOD_IF2_VERSION 2 */ +/* PIGPIOD_IF2_VERSION 3 */ #include #include @@ -852,6 +852,9 @@ int wave_send_once(int pi, unsigned wave_id) int wave_send_repeat(int pi, unsigned wave_id) {return pigpio_command(pi, PI_CMD_WVTXR, wave_id, 0, 1);} +int wave_send_using_mode(int pi, unsigned wave_id, unsigned mode) + {return pigpio_command(pi, PI_CMD_WVTXM, wave_id, mode, 1);} + int wave_chain(int pi, char *buf, unsigned bufSize) { gpioExtent_t ext[1]; diff --git a/pigpiod_if2.h b/pigpiod_if2.h index 60d4101..51846c4 100644 --- a/pigpiod_if2.h +++ b/pigpiod_if2.h @@ -30,7 +30,7 @@ For more information, please refer to #include "pigpio.h" -#define PIGPIOD_IF2_VERSION 2 +#define PIGPIOD_IF2_VERSION 3 /*TEXT @@ -190,6 +190,7 @@ wave_delete Deletes one or more waveforms wave_send_once Transmits a waveform once wave_send_repeat Transmits a waveform repeatedly +wave_send_using_mode Transmits a waveform in the chosen mode wave_chain Transmits a chain of waveforms @@ -825,8 +826,8 @@ Sets a glitch filter on a gpio. Level changes on the gpio are not reported unless the level has been stable for at least [*steady*] microseconds. The -level is then reported. Level changes of less than [*steady*] -microseconds are ignored. +level is then reported. Level changes of less than +[*steady*] microseconds are ignored. . . pi: 0- (as returned by [*pigpio_start*]). @@ -1006,8 +1007,8 @@ int hardware_PWM(int pi, unsigned gpio, unsigned PWMfreq, uint32_t PWMduty); Starts hardware PWM on a gpio at the specified frequency and dutycycle. Frequencies above 30MHz are unlikely to work. -NOTE: Any waveform started by [*wave_send_once*], [*wave_send_repeat*], -or [*wave_chain*] will be cancelled. +NOTE: Any waveform started by [*wave_send_**] or [*wave_chain*] +will be cancelled. This function is only valid if the pigpio main clock is PCM. The main clock defaults to PCM but may be overridden when the pigpio @@ -1276,6 +1277,7 @@ Wave ids are allocated in order, 0, 1, 2, etc. Returns 0 if OK, otherwise PI_BAD_WAVE_ID. D*/ + /*F*/ int wave_send_once(int pi, unsigned wave_id); /*D @@ -1293,6 +1295,7 @@ Returns the number of DMA control blocks in the waveform if OK, otherwise PI_BAD_WAVE_ID, or PI_BAD_WAVE_MODE. D*/ + /*F*/ int wave_send_repeat(int pi, unsigned wave_id); /*D @@ -1311,6 +1314,38 @@ Returns the number of DMA control blocks in the waveform if OK, otherwise PI_BAD_WAVE_ID, or PI_BAD_WAVE_MODE. D*/ + +/*F*/ +int wave_send_using_mode(int pi, unsigned wave_id, unsigned mode); +/*D +Transmits the waveform with id wave_id using mode mode. + +. . + pi: 0- (as returned by [*pigpio_start*]). +wave_id: >=0, as returned by [*wave_create*]. + mode: PI_WAVE_MODE_ONE_SHOT, PI_WAVE_MODE_REPEAT, + PI_WAVE_MODE_ONE_SHOT_SYNC, or PI_WAVE_MODE_REPEAT_SYNC. +. . + +PI_WAVE_MODE_ONE_SHOT: same as [*wave_send_once*]. + +PI_WAVE_MODE_REPEAT same as [*wave_send_repeat*]. + +PI_WAVE_MODE_ONE_SHOT_SYNC same as [*wave_send_once*] but tries +to sync with the previous waveform. + +PI_WAVE_MODE_REPEAT_SYNC same as [*wave_send_repeat*] but tries +to sync with the previous waveform. + +WARNING: bad things may happen if you delete the previous +waveform before it has been synced to the new waveform. + +NOTE: Any hardware PWM started by [*hardware_PWM*] will be cancelled. + +Returns the number of DMA control blocks in the waveform if OK, +otherwise PI_BAD_WAVE_ID, or PI_BAD_WAVE_MODE. +D*/ + /*F*/ int wave_chain(int pi, char *buf, unsigned bufSize); /*D @@ -2858,8 +2893,8 @@ reported as PI_TIMEOUT. See [*set_watchdog*]. PI_TIMEOUT 2 . . -mode::0-7 -The operational mode of a gpio, normally INPUT or OUTPUT. +mode:: +1. The operational mode of a gpio, normally INPUT or OUTPUT. . . PI_INPUT 0 @@ -2872,6 +2907,15 @@ PI_ALT4 3 PI_ALT5 2 . . +2. The mode of waveform transmission. + +. . +PI_WAVE_MODE_ONE_SHOT 0 +PI_WAVE_MODE_REPEAT 1 +PI_WAVE_MODE_ONE_SHOT_SYNC 2 +PI_WAVE_MODE_REPEAT_SYNC 3 +. . + numBytes:: The number of bytes used to store characters in a string. Depending on the number of bits per character there may be 1, 2, or 4 bytes @@ -2997,7 +3041,7 @@ A SPI channel, 0-2. spi_flags:: See [*spi_open*]. -steady :: 0-300000 +steady:: 0-300000 The number of microseconds level changes must be stable for before reporting the level changed ([*set_glitch_filter*]) or triggering diff --git a/pigs.1 b/pigs.1 index d46ec02..2340e1c 100644 --- a/pigs.1 +++ b/pigs.1 @@ -3700,6 +3700,51 @@ ERROR: non existent wave id .br +.IP "\fBWVTXM wid wmde\fP - Transmits waveform using mode" +.IP "" 4 + +.br +This command transmits the waveform with id \fBwid\fP using mode \fBwmde\fP. + +.br +The mode may be send once (0), send repeatedly (1), send once but +first sync with previous wave (2), or send repeatedly but first +sync with previous wave (3). + +.br +WARNING: bad things may happen if you delete the previous +waveform before it has been synced to the new waveform. + +.br +NOTE: Any hardware PWM started by \fBHP\fP will be cancelled. + +.br +Upon success the number of DMA control blocks in the waveform is returned. +On error a negative status code will be returned. + +.br + +\fBExample\fP +.br + +.EX +$ pigs wvtxm 1 3 +.br +75 +.br + +.br +$ pigs wvtxm 2 0 +.br +-66 +.br +ERROR: non existent wave id +.br + +.EE + +.br + .IP "\fBWVTXR wid\fP - Transmits waveform repeatedly" .IP "" 4 @@ -4078,6 +4123,21 @@ When a waveform is created it is given an id (0, 1, 2, ...). .br +.IP "\fBwmde\fP - mode (0-3)" 0 +The command expects a wave transmission mode. + +.br +0 = send once +.br +1 = send repeatedly +.br +2 = send once but first sync with previous wave +.br +3 = send repeatedly but first sync with previous wave +.br + +.br + .IP "\fBws\fP - wave stats sucommand (0-2)" 0 The command expects a subcommand. @@ -4350,6 +4410,8 @@ The WAIT command parameter is a bit-mask with 1 set for gpios of interest. The SYS script receives two unsigned parameters: the accumulator A and the current gpio levels. +.br + .SH SEE ALSO pigpiod(1), pig2vcd(1), pigpio(3), pigpiod_if(3), pigpiod_if2(3) diff --git a/setup.py b/setup.py index 15d792e..7bb9ccc 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from distutils.core import setup setup(name='pigpio', - version='1.26', + version='1.27', author='joan', author_email='joan@abyz.co.uk', maintainer='joan', diff --git a/x_pigs b/x_pigs index 8410f10..accaabb 100755 --- a/x_pigs +++ b/x_pigs @@ -49,7 +49,7 @@ s=$(pigs bs2 0) if [[ $s = "" ]]; then echo "BS2 ok"; else echo "BS2 fail ($s)"; fi s=$(pigs h) -if [[ ${#s} = 4502 ]]; then echo "HELP ok"; else echo "HELP fail (${#s})"; fi +if [[ ${#s} = 4544 ]]; then echo "HELP ok"; else echo "HELP fail (${#s})"; fi s=$(pigs hwver) if [[ $s -ne 0 ]]; then echo "HWVER ok"; else echo "HWVER fail ($s)"; fi