@@ -285,8 +285,7 @@ bool rmtDeinit(int pin) {
285285 return false;
286286}
287287
288- static bool _rmtWrite (int pin , rmt_data_t * data , size_t num_rmt_symbols , bool blocking , bool loop , uint32_t timeout_ms ) {
289- rmt_bus_handle_t bus = _rmtGetBus (pin , __FUNCTION__ );
288+ static bool _rmtWrite (int pin , rmt_data_t * data , size_t num_rmt_symbols , bool blocking , uint32_t loop , uint32_t timeout_ms ) { rmt_bus_handle_t bus = _rmtGetBus (pin , __FUNCTION__ );
290289 if (bus == NULL ) {
291290 return false;
292291 }
@@ -308,6 +307,10 @@ static bool _rmtWrite(int pin, rmt_data_t *data, size_t num_rmt_symbols, bool bl
308307 "GPIO: %d - Currently in Loop Mode: [%s] | Asked to Loop: %s, LoopCancel: %s" , pin , bus -> rmt_ch_is_looping ? "YES" : "NO" , loop ? "YES" : "NO" ,
309308 loopCancel ? "YES" : "NO"
310309 );
310+ // loop == 1 means infinite loop.
311+ if (loop > 1 ) {
312+ log_v ("GPIO: %d - Loop count: %lu times" , pin , loop );
313+ }
311314
312315 if ((xEventGroupGetBits (bus -> rmt_events ) & RMT_FLAG_TX_DONE ) == 0 ) {
313316 log_v ("GPIO %d - RMT Write still pending to be completed." , pin );
@@ -336,8 +339,8 @@ static bool _rmtWrite(int pin, rmt_data_t *data, size_t num_rmt_symbols, bool bl
336339 bus -> rmt_ch_is_looping = false;
337340 } else { // new writing | looping request
338341 // looping | Writing over a previous looping state is valid
339- if (loop ) {
340- transmit_cfg .loop_count = -1 ; // enable infinite loop mode
342+ if (loop ) {
343+ transmit_cfg .loop_count = ( loop == 1 ) ? -1 : loop ;
341344 // keeps RMT_FLAG_TX_DONE set - it never changes
342345 } else {
343346 // looping mode never sets this flag (IDF 5.1) in the callback
@@ -349,7 +352,8 @@ static bool _rmtWrite(int pin, rmt_data_t *data, size_t num_rmt_symbols, bool bl
349352 log_w ("GPIO %d - RMT Transmission failed." , pin );
350353 } else { // transmit OK
351354 if (loop ) {
352- bus -> rmt_ch_is_looping = true; // for ever... until a channel canceling or new writing
355+ bus -> rmt_ch_is_looping = true; // for ever... until a channel canceling or new writing.
356+ // NOTE: even if loop count is finite number
353357 } else {
354358 if (blocking ) {
355359 // wait for transmission confirmation | timeout
@@ -402,15 +406,20 @@ static bool _rmtRead(int pin, rmt_data_t *data, size_t *num_rmt_symbols, bool wa
402406}
403407
404408bool rmtWrite (int pin , rmt_data_t * data , size_t num_rmt_symbols , uint32_t timeout_ms ) {
405- return _rmtWrite (pin , data , num_rmt_symbols , true /*blocks*/ , false /*looping*/ , timeout_ms );
409+ return _rmtWrite (pin , data , num_rmt_symbols , true /*blocks*/ , 0 /*looping*/ , timeout_ms );
406410}
407411
408412bool rmtWriteAsync (int pin , rmt_data_t * data , size_t num_rmt_symbols ) {
409- return _rmtWrite (pin , data , num_rmt_symbols , false /*blocks*/ , false /*looping*/ , 0 /*N/A*/ );
413+ return _rmtWrite (pin , data , num_rmt_symbols , false /*blocks*/ , 0 /*looping*/ , 0 /*N/A*/ );
410414}
411415
412416bool rmtWriteLooping (int pin , rmt_data_t * data , size_t num_rmt_symbols ) {
413- return _rmtWrite (pin , data , num_rmt_symbols , false /*blocks*/ , true /*looping*/ , 0 /*N/A*/ );
417+ return _rmtWrite (pin , data , num_rmt_symbols , false /*blocks*/ , 1 /*looping*/ , 0 /*N/A*/ );
418+ }
419+
420+ // Same as rmtWriteLooping(...) but limits number of loops to "loop_count"
421+ bool rmtWriteLoopingCount (int pin , rmt_data_t * data , size_t num_rmt_symbols , uint32_t loop_count ) {
422+ return _rmtWrite (pin , data , num_rmt_symbols , false /*blocks*/ , loop_count /*looping*/ , 0 /*N/A*/ );
414423}
415424
416425bool rmtTransmitCompleted (int pin ) {
0 commit comments