@@ -96,6 +96,7 @@ struct rmt_obj_s
96
96
void * arg;
97
97
TaskHandle_t rxTaskHandle;
98
98
bool rx_completed;
99
+ bool tx_not_rx;
99
100
};
100
101
101
102
/**
@@ -109,15 +110,15 @@ static xSemaphoreHandle g_rmt_objlocks[MAX_CHANNELS] = {
109
110
};
110
111
111
112
static rmt_obj_t g_rmt_objects[MAX_CHANNELS] = {
112
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
113
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
114
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
115
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
113
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
114
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
115
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
116
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
116
117
#if MAX_CHANNELS > 4
117
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
118
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
119
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
120
- { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true},
118
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
119
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
120
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
121
+ { false, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, true, true },
121
122
#endif
122
123
};
123
124
@@ -248,14 +249,34 @@ static bool _rmtCreateRxTask(rmt_obj_t* rmt)
248
249
return true;
249
250
}
250
251
252
+ // Helper function to test if an RMT channel is correctly assigned to TX or RX, issuing an error message if necessary
253
+ // Also test RMT pointer for NULL and returns false in case it is NULL
254
+ // return true when it is correctly assigned, false otherwise
255
+ static bool _rmtCheckTXnotRX(rmt_obj_t* rmt, bool tx_not_rx)
256
+ {
257
+ if (!rmt) { // also returns false on NULL
258
+ return false;
259
+ }
260
+
261
+ if (rmt->tx_not_rx == tx_not_rx) { // matches expected RX/TX channel
262
+ return true;
263
+ }
264
+
265
+ if (tx_not_rx) { // expected TX channel
266
+ log_e("Can't write on a RX RMT Channel");
267
+ } else{ // expected RX channel
268
+ log_e("Can't read on a TX RMT Channel");
269
+ }
270
+ return false; // missmatched
271
+ }
251
272
252
273
/**
253
274
* Public method definitions
254
275
*/
255
276
256
277
bool rmtSetCarrier(rmt_obj_t* rmt, bool carrier_en, bool carrier_level, uint32_t low, uint32_t high)
257
278
{
258
- if (!rmt || low > 0xFFFF || high > 0xFFFF) {
279
+ if (!_rmtCheckTXnotRX( rmt, RMT_TX_MODE) || low > 0xFFFF || high > 0xFFFF) {
259
280
return false;
260
281
}
261
282
size_t channel = rmt->channel;
@@ -268,7 +289,7 @@ bool rmtSetCarrier(rmt_obj_t* rmt, bool carrier_en, bool carrier_level, uint32_t
268
289
269
290
bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level)
270
291
{
271
- if (!rmt || filter_level > 0xFF) {
292
+ if (!_rmtCheckTXnotRX( rmt, RMT_RX_MODE) || filter_level > 0xFF) {
272
293
return false;
273
294
}
274
295
size_t channel = rmt->channel;
@@ -281,7 +302,7 @@ bool rmtSetFilter(rmt_obj_t* rmt, bool filter_en, uint32_t filter_level)
281
302
282
303
bool rmtSetRxThreshold(rmt_obj_t* rmt, uint32_t value)
283
304
{
284
- if (!rmt || value > 0xFFFF) {
305
+ if (!_rmtCheckTXnotRX( rmt, RMT_RX_MODE) || value > 0xFFFF) {
285
306
return false;
286
307
}
287
308
size_t channel = rmt->channel;
@@ -306,14 +327,17 @@ bool rmtDeinit(rmt_obj_t *rmt)
306
327
307
328
RMT_MUTEX_LOCK(rmt->channel);
308
329
// force stopping rmt processing
309
- rmt_rx_stop(rmt->channel);
310
- rmt_tx_stop(rmt->channel);
330
+ if (rmt->tx_not_rx) {
331
+ rmt_tx_stop(rmt->channel);
332
+ } else {
333
+ rmt_rx_stop(rmt->channel);
334
+ if(rmt->rxTaskHandle){
335
+ vTaskDelete(rmt->rxTaskHandle);
336
+ rmt->rxTaskHandle = NULL;
337
+ }
338
+ }
311
339
312
- if(rmt->rxTaskHandle){
313
- vTaskDelete(rmt->rxTaskHandle);
314
- rmt->rxTaskHandle = NULL;
315
- }
316
- rmt_driver_uninstall(rmt->channel);
340
+ rmt_driver_uninstall(rmt->channel);
317
341
318
342
size_t from = rmt->channel;
319
343
size_t to = rmt->buffers + rmt->channel;
@@ -330,6 +354,7 @@ bool rmtDeinit(rmt_obj_t *rmt)
330
354
#if !CONFIG_DISABLE_HAL_LOCKS
331
355
if(g_rmt_objlocks[from] != NULL) {
332
356
vSemaphoreDelete(g_rmt_objlocks[from]);
357
+ g_rmt_objlocks[from] = NULL;
333
358
}
334
359
#endif
335
360
@@ -338,10 +363,9 @@ bool rmtDeinit(rmt_obj_t *rmt)
338
363
339
364
bool rmtLoop(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
340
365
{
341
- if (!rmt) {
366
+ if (!_rmtCheckTXnotRX( rmt, RMT_TX_MODE) ) {
342
367
return false;
343
368
}
344
-
345
369
int channel = rmt->channel;
346
370
RMT_MUTEX_LOCK(channel);
347
371
rmt_tx_stop(channel);
@@ -353,10 +377,9 @@ bool rmtLoop(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
353
377
354
378
bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
355
379
{
356
- if (!rmt) {
380
+ if (!_rmtCheckTXnotRX( rmt, RMT_TX_MODE) ) {
357
381
return false;
358
382
}
359
-
360
383
int channel = rmt->channel;
361
384
RMT_MUTEX_LOCK(channel);
362
385
rmt_tx_stop(channel);
@@ -368,10 +391,9 @@ bool rmtWrite(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
368
391
369
392
bool rmtWriteBlocking(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
370
393
{
371
- if (!rmt) {
394
+ if (!_rmtCheckTXnotRX( rmt, RMT_TX_MODE) ) {
372
395
return false;
373
396
}
374
-
375
397
int channel = rmt->channel;
376
398
RMT_MUTEX_LOCK(channel);
377
399
rmt_tx_stop(channel);
@@ -383,18 +405,17 @@ bool rmtWriteBlocking(rmt_obj_t* rmt, rmt_data_t* data, size_t size)
383
405
384
406
bool rmtReadData(rmt_obj_t* rmt, uint32_t* data, size_t size)
385
407
{
386
- if (!rmt) {
408
+ if (!_rmtCheckTXnotRX( rmt, RMT_RX_MODE) ) {
387
409
return false;
388
410
}
389
-
390
411
rmtReadAsync(rmt, (rmt_data_t*) data, size, NULL, false, 0);
391
412
return true;
392
413
}
393
414
394
415
395
416
bool rmtBeginReceive(rmt_obj_t* rmt)
396
417
{
397
- if (!rmt) {
418
+ if (!_rmtCheckTXnotRX( rmt, RMT_RX_MODE) ) {
398
419
return false;
399
420
}
400
421
int channel = rmt->channel;
@@ -418,7 +439,7 @@ bool rmtReceiveCompleted(rmt_obj_t* rmt)
418
439
419
440
bool rmtRead(rmt_obj_t* rmt, rmt_rx_data_cb_t cb, void * arg)
420
441
{
421
- if (!rmt || !cb ) {
442
+ if (!_rmtCheckTXnotRX( rmt, RMT_RX_MODE) ) {
422
443
return false;
423
444
}
424
445
int channel = rmt->channel;
@@ -449,15 +470,19 @@ bool rmtEnd(rmt_obj_t* rmt)
449
470
int channel = rmt->channel;
450
471
451
472
RMT_MUTEX_LOCK(channel);
452
- rmt_rx_stop(channel);
453
- rmt->rx_completed = true;
473
+ if (rmt->tx_not_rx) {
474
+ rmt_tx_stop(channel);
475
+ } else {
476
+ rmt_rx_stop(channel);
477
+ rmt->rx_completed = true;
478
+ }
454
479
RMT_MUTEX_UNLOCK(channel);
455
480
return true;
456
481
}
457
482
458
483
bool rmtReadAsync(rmt_obj_t* rmt, rmt_data_t* data, size_t size, void* eventFlag, bool waitForData, uint32_t timeout)
459
484
{
460
- if (!rmt) {
485
+ if (!_rmtCheckTXnotRX( rmt, RMT_RX_MODE) ) {
461
486
return false;
462
487
}
463
488
int channel = rmt->channel;
@@ -568,6 +593,7 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, rmt_reserve_memsize_t memsize)
568
593
rmt->data_size = 0;
569
594
rmt->rx_completed = false;
570
595
rmt->events = NULL;
596
+ rmt->tx_not_rx = tx_not_rx;
571
597
572
598
#if !CONFIG_DISABLE_HAL_LOCKS
573
599
if(g_rmt_objlocks[channel] == NULL) {
0 commit comments