{PI_CMD_WVBSY, "WVBSY", 101, 2, 1}, // gpioWaveTxBusy
{PI_CMD_WVCHA, "WVCHA", 197, 0, 0}, // gpioWaveChain
{PI_CMD_WVCLR, "WVCLR", 101, 0, 1}, // gpioWaveClear
- {PI_CMD_WVCRE, "WVCRE", 101, 2, 1}, // gpioWaveCreate
+ {PI_CMD_WVCRE, "WVCRE", 112, 2, 1}, // gpioWaveCreate
{PI_CMD_WVDEL, "WVDEL", 112, 0, 1}, // gpioWaveDelete
{PI_CMD_WVGO, "WVGO" , 101, 2, 0}, // gpioWaveTxStart
{PI_CMD_WVGOR, "WVGOR", 101, 2, 0}, // gpioWaveTxStart
case PI_CMD_WVCLR: res = gpioWaveClear(); break;
- case PI_CMD_WVCRE: res = gpioWaveCreate(); break;
+ case PI_CMD_WVCRE: res = gpioWaveCreate(p[1]); break;
case PI_CMD_WVDEL: res = gpioWaveDelete(p[1]); break;
/* ----------------------------------------------------------------------- */
-static int wave2Cbs(unsigned wave_mode, int *CB, int *BOOL, int *TOOL)
+static int wave2Cbs(unsigned wave_mode, int *CB, int *BOOL, int *TOOL, int size)
{
int botCB=*CB, botOOL=*BOOL, topOOL=*TOOL;
}
}
+ /* pad the wave */
+ botCB = *CB + NUM_WAVE_CBS / size - 1;
+ botOOL = *BOOL + NUM_WAVE_OOL / size - 1;
+ //topOOL = *TOOL - (NUM_WAVE_OOL / size / 8);
+
+ /* link the last CB to end of wave */
+
+ p->next = waveCbPOadr(botCB);
+
+ /* add dummy cb at end of DMA */
+
+ p = rawWaveCBAdr(botCB++);
+ p->info = NORMAL_DMA | DMA_DEST_IGNORE;
+ p->src = waveOOLPOadr(botOOL++);
+ p->dst = ((GPIO_BASE + (GPSET0*4)) & 0x00ffffff) | PI_PERI_BUS;
+ p->length = 4;
+ p->next = 0;
+
+
if (p != NULL)
{
if (wave_mode == PI_WAVE_MODE_ONE_SHOT)
/* ----------------------------------------------------------------------- */
-int gpioWaveCreate(void)
+int gpioWaveCreate(int size) // Fix: Make variadic.
{
int i, wid;
int numCB, numBOOL, numTOOL;
/* What resources are needed? */
- waveCBsOOLs(&numCB, &numBOOL, &numTOOL);
+ if (size == 0)
+ waveCBsOOLs(&numCB, &numBOOL, &numTOOL);
+
+ else {
+ numCB = NUM_WAVE_CBS / size;
+ numBOOL = NUM_WAVE_OOL / size;
+ numTOOL = 0; // ignore TOOL, ie, no flags support
+ }
wid = -1;
BOOL = waveInfo[wid].botOOL;
TOOL = waveInfo[wid].topOOL;
- wave2Cbs(PI_WAVE_MODE_ONE_SHOT, &CB, &BOOL, &TOOL);
+ wave2Cbs(PI_WAVE_MODE_ONE_SHOT, &CB, &BOOL, &TOOL, size);
/* Sanity check. */
numTOOL, waveInfo[wid].topOOL-TOOL);
}
+ DBG(DBG_USER, "Wave Stats: wid=%d CBs %d BOOL %d TOOL %d", wid,
+ numCB, numBOOL, numTOOL);
+
waveInfo[wid].deleted = 0;
/* Consume waves. */
/*F*/
-int gpioWaveCreate(void);
+int gpioWaveCreate(int);
/*D
This function creates a waveform from the data provided by the prior
calls to the [*gpioWaveAdd**] functions. Upon success a wave id
else:
return 0
- def wave_create(self):
+ def wave_create(self, size):
"""
Creates a waveform from the data provided by the prior calls
to the [*wave_add_**] functions.
wid = pi.wave_create()
...
"""
- return _u2i(_pigpio_command(self.sl, _PI_CMD_WVCRE, 0, 0))
+ return _u2i(_pigpio_command(self.sl, _PI_CMD_WVCRE, size, 0))
def wave_delete(self, wave_id):
"""
e = gpioWaveAddGeneric(4, wf);
CHECK(5, 2, e, 4, 0, "pulse, wave add generic");
- wid = gpioWaveCreate();
+ wid = gpioWaveCreate(0);
e = gpioWaveTxSend(wid, PI_WAVE_MODE_REPEAT);
if (e < 14) CHECK(5, 3, e, 9, 0, "wave tx repeat");
else CHECK(5, 3, e, 19, 0, "wave tx repeat");
e = gpioWaveAddSerial(GPIO, BAUD, 8, 2, 5000000, strlen(TEXT), TEXT);
CHECK(5, 7, e, 3405, 0, "wave clear, wave add serial");
- wid = gpioWaveCreate();
+ wid = gpioWaveCreate(0);
e = gpioWaveTxSend(wid, PI_WAVE_MODE_ONE_SHOT);
if (e < 6964) CHECK(5, 8, e, 6811, 0, "wave tx start");
else CHECK(5, 8, e, 7116, 0, "wave tx start");