Skip to content

Add RMT receiver #104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 30 commits into from
Nov 12, 2022
Merged

Add RMT receiver #104

merged 30 commits into from
Nov 12, 2022

Conversation

enelson1001
Copy link
Contributor

Adding receive capability to RMT. I am new to rust so code should be reviewed as it might not represent the rust way of doing things.

@enelson1001
Copy link
Contributor Author

How do I run the ci.yml on my fork on my local pc?

@MabezDev
Copy link
Member

How do I run the ci.yml on my fork on my local pc?

https://github.com/nektos/act could work, alternatively, you can keep pushing here and we'll squash the commit history when its ready to merge :).

@enelson1001
Copy link
Contributor Author

When testing rmt-transceiver.rs I see the following output.

I (0) cpu_start: Starting scheduler on APP CPU.
I (348) mcpwm_test: Starting APP!
I (348) gpio: GPIO[36]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
W (368) mcpwm_test: Rx Loop
I (368) gpio: GPIO[25]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
E (378) mcpwm_test: Tx Loop
W (868) mcpwm_test: Rx Loop
W (1368) mcpwm_test: Rx Loop
E (1378) mcpwm_test: Tx Loop
W (1868) mcpwm_test: Rx Loop
W (1868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (1868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (1878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (1888) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (1898) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (2378) mcpwm_test: Tx Loop
W (2408) mcpwm_test: Rx Loop
W (2408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (2428) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (2438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (2948) mcpwm_test: Rx Loop
W (2948) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2948) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2958) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (2968) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (2978) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)

In theory the transmit time for the RMT signal (total time) should be 3.930 milliseconds. The Tx loop from above has timestamp 378, the 2nd and 3rd RX loop time stamps are 868 and 1368. Not sure why one of those Rx loop timestamps did not pick up the 1st Tx loop? The 2nd Tx Loop and beyond gets picked up by the Rx loop. Strange?

@enelson1001
Copy link
Contributor Author

Maybe the problem (or maybe it is not a problem) is with logging. In the screen capture below it shows 2 Rx Loops one right after another (timestamp 2408, 2948) but only one Tx Loop (timestamp 2378). From ten on out I see one Tx Loop and 2 Rx Loops (one with data the other empty) which is correct since Rx Loop is every 500 milliseconds and Tx Loop is every 1 second.
I not sure why the screen output should look as it is shown and if it really is a problem.

I (348) mcpwm_test: Starting APP!
I (348) gpio: GPIO[36]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
W (368) mcpwm_test: Rx Loop
I (368) gpio: GPIO[25]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
E (378) mcpwm_test: Tx Loop
W (868) mcpwm_test: Rx Loop
W (1368) mcpwm_test: Rx Loop
E (1378) mcpwm_test: Tx Loop
W (1868) mcpwm_test: Rx Loop
W (1868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (1868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (1878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (1888) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (1898) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (2378) mcpwm_test: Tx Loop
W (2408) mcpwm_test: Rx Loop
W (2408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (2428) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (2438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (2948) mcpwm_test: Rx Loop
W (2948) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2948) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (2958) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (2968) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (2978) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (3378) mcpwm_test: Tx Loop
W (3488) mcpwm_test: Rx Loop
W (3488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (3488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (3498) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (3508) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (3518) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (4028) mcpwm_test: Rx Loop
E (4378) mcpwm_test: Tx Loop
W (4528) mcpwm_test: Rx Loop
W (4528) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (4528) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (4538) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (4548) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (4558) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (5068) mcpwm_test: Rx Loop
E (5378) mcpwm_test: Tx Loop
W (5568) mcpwm_test: Rx Loop
W (5568) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (5568) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (5578) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (5588) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (5598) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (6108) mcpwm_test: Rx Loop
E (6378) mcpwm_test: Tx Loop
W (6608) mcpwm_test: Rx Loop
W (6608) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (6608) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (6618) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (6628) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (6638) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (7148) mcpwm_test: Rx Loop
E (7378) mcpwm_test: Tx Loop
W (7648) mcpwm_test: Rx Loop
W (7648) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (7648) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (7658) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (7668) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (7678) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (8188) mcpwm_test: Rx Loop
E (8378) mcpwm_test: Tx Loop
W (8688) mcpwm_test: Rx Loop
W (8688) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (8688) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (8698) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (8708) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (8718) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (9228) mcpwm_test: Rx Loop
E (9378) mcpwm_test: Tx Loop
W (9728) mcpwm_test: Rx Loop
W (9728) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (9728) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (9738) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (9748) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (9758) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (10268) mcpwm_test: Rx Loop
E (10378) mcpwm_test: Tx Loop
W (10768) mcpwm_test: Rx Loop
W (10768) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (10768) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (10778) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (10788) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (10798) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (11308) mcpwm_test: Rx Loop
E (11378) mcpwm_test: Tx Loop
W (11808) mcpwm_test: Rx Loop
W (11808) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (11808) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (11818) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (11828) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (11838) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (12348) mcpwm_test: Rx Loop
E (12378) mcpwm_test: Tx Loop
W (12848) mcpwm_test: Rx Loop
W (12848) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (12848) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (12858) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (12868) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (12878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (13378) mcpwm_test: Tx Loop
W (13388) mcpwm_test: Rx Loop
W (13388) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (13388) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (13398) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (13408) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (13418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (13928) mcpwm_test: Rx Loop
E (14378) mcpwm_test: Tx Loop
W (14428) mcpwm_test: Rx Loop
W (14428) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (14428) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (14438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (14448) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (14458) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (14968) mcpwm_test: Rx Loop
E (15378) mcpwm_test: Tx Loop
W (15468) mcpwm_test: Rx Loop
W (15468) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (15468) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (15478) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (15488) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (15498) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (16008) mcpwm_test: Rx Loop
E (16378) mcpwm_test: Tx Loop
W (16508) mcpwm_test: Rx Loop
W (16508) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (16508) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (16518) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (16528) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (16538) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (17048) mcpwm_test: Rx Loop
E (17378) mcpwm_test: Tx Loop
W (17548) mcpwm_test: Rx Loop
W (17548) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (17548) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (17558) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (17568) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (17578) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (18088) mcpwm_test: Rx Loop
E (18378) mcpwm_test: Tx Loop
W (18588) mcpwm_test: Rx Loop
W (18588) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (18588) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (18598) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (18608) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (18618) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (19128) mcpwm_test: Rx Loop
E (19378) mcpwm_test: Tx Loop
W (19628) mcpwm_test: Rx Loop
W (19628) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (19628) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (19638) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (19648) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (19658) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (20168) mcpwm_test: Rx Loop
E (20378) mcpwm_test: Tx Loop
W (20668) mcpwm_test: Rx Loop
W (20668) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (20668) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (20678) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (20688) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (20698) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (21208) mcpwm_test: Rx Loop
E (21378) mcpwm_test: Tx Loop
W (21708) mcpwm_test: Rx Loop
W (21708) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (21708) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (21718) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (21728) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (21738) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (22248) mcpwm_test: Rx Loop
E (22378) mcpwm_test: Tx Loop
W (22748) mcpwm_test: Rx Loop
W (22748) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (22748) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (22758) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (22768) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (22778) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (23288) mcpwm_test: Rx Loop
E (23378) mcpwm_test: Tx Loop
W (23788) mcpwm_test: Rx Loop
W (23788) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (23788) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (23798) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (23808) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (23818) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (24328) mcpwm_test: Rx Loop
E (24378) mcpwm_test: Tx Loop
W (24828) mcpwm_test: Rx Loop
W (24828) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (24828) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (24838) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (24848) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (24858) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (25368) mcpwm_test: Rx Loop
E (25378) mcpwm_test: Tx Loop
W (25868) mcpwm_test: Rx Loop
W (25868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (25868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (25878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (25888) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (25898) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (26378) mcpwm_test: Tx Loop
W (26408) mcpwm_test: Rx Loop
W (26408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (26408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (26418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (26428) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (26438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (26948) mcpwm_test: Rx Loop
E (27378) mcpwm_test: Tx Loop
W (27448) mcpwm_test: Rx Loop
W (27448) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (27448) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (27458) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (27468) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (27478) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (27988) mcpwm_test: Rx Loop
E (28378) mcpwm_test: Tx Loop
W (28488) mcpwm_test: Rx Loop
W (28488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (28488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (28498) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (28508) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (28518) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (29028) mcpwm_test: Rx Loop
E (29378) mcpwm_test: Tx Loop
W (29528) mcpwm_test: Rx Loop
W (29528) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (29528) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (29538) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (29548) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (29558) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (30068) mcpwm_test: Rx Loop
E (30378) mcpwm_test: Tx Loop
W (30568) mcpwm_test: Rx Loop
W (30568) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (30568) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (30578) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (30588) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (30598) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (31108) mcpwm_test: Rx Loop
E (31378) mcpwm_test: Tx Loop
W (31608) mcpwm_test: Rx Loop
W (31608) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (31608) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (31618) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (31628) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (31638) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (32148) mcpwm_test: Rx Loop
E (32378) mcpwm_test: Tx Loop
W (32648) mcpwm_test: Rx Loop
W (32648) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (32648) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (32658) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (32668) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (32678) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (33188) mcpwm_test: Rx Loop
E (33378) mcpwm_test: Tx Loop
W (33688) mcpwm_test: Rx Loop
W (33688) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (33688) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (33698) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (33708) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (33718) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (34228) mcpwm_test: Rx Loop
E (34378) mcpwm_test: Tx Loop
W (34728) mcpwm_test: Rx Loop
W (34728) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (34728) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (34738) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (34748) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (34758) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (35268) mcpwm_test: Rx Loop
E (35378) mcpwm_test: Tx Loop
W (35768) mcpwm_test: Rx Loop
W (35768) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (35768) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (35778) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (35788) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (35798) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (36308) mcpwm_test: Rx Loop
E (36378) mcpwm_test: Tx Loop
W (36808) mcpwm_test: Rx Loop
W (36808) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (36808) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (36818) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (36828) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (36838) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (37348) mcpwm_test: Rx Loop
E (37378) mcpwm_test: Tx Loop
W (37848) mcpwm_test: Rx Loop
W (37848) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (37848) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (37858) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (37868) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (37878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (38378) mcpwm_test: Tx Loop
W (38388) mcpwm_test: Rx Loop
W (38388) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (38388) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (38398) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (38408) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (38418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (38928) mcpwm_test: Rx Loop
E (39378) mcpwm_test: Tx Loop
W (39428) mcpwm_test: Rx Loop
W (39428) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (39428) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (39438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (39448) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (39458) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (39968) mcpwm_test: Rx Loop
E (40378) mcpwm_test: Tx Loop
W (40468) mcpwm_test: Rx Loop
W (40468) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (40468) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (40478) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (40488) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (40498) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (41008) mcpwm_test: Rx Loop
E (41378) mcpwm_test: Tx Loop
W (41508) mcpwm_test: Rx Loop
W (41508) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (41508) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (41518) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (41528) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (41538) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (42048) mcpwm_test: Rx Loop
E (42378) mcpwm_test: Tx Loop
W (42548) mcpwm_test: Rx Loop
W (42548) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (42548) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (42558) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (42568) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (42578) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (43088) mcpwm_test: Rx Loop
E (43378) mcpwm_test: Tx Loop
W (43588) mcpwm_test: Rx Loop
W (43588) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (43588) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (43598) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (43608) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (43618) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (44128) mcpwm_test: Rx Loop
E (44378) mcpwm_test: Tx Loop
W (44628) mcpwm_test: Rx Loop
W (44628) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (44628) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (44638) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (44648) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (44658) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (45168) mcpwm_test: Rx Loop
E (45378) mcpwm_test: Tx Loop
W (45668) mcpwm_test: Rx Loop
W (45668) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (45668) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (45678) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (45688) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (45698) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (46208) mcpwm_test: Rx Loop
E (46378) mcpwm_test: Tx Loop
W (46708) mcpwm_test: Rx Loop
W (46708) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (46708) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (46718) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (46728) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (46738) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (47248) mcpwm_test: Rx Loop
E (47378) mcpwm_test: Tx Loop
W (47748) mcpwm_test: Rx Loop
W (47748) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (47748) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (47758) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (47768) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (47778) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (48288) mcpwm_test: Rx Loop
E (48378) mcpwm_test: Tx Loop
W (48788) mcpwm_test: Rx Loop
W (48788) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (48788) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (48798) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (48808) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (48818) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (49328) mcpwm_test: Rx Loop
E (49378) mcpwm_test: Tx Loop
W (49828) mcpwm_test: Rx Loop
W (49828) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (49828) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (49838) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (49848) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (49858) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (50368) mcpwm_test: Rx Loop
E (50378) mcpwm_test: Tx Loop
W (50868) mcpwm_test: Rx Loop
W (50868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (50868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (50878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (50888) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (50898) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (51378) mcpwm_test: Tx Loop
W (51408) mcpwm_test: Rx Loop
W (51408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (51408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (51418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (51428) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (51438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (51948) mcpwm_test: Rx Loop
E (52378) mcpwm_test: Tx Loop
W (52448) mcpwm_test: Rx Loop
W (52448) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (52448) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (52458) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (52468) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (52478) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (52988) mcpwm_test: Rx Loop
E (53378) mcpwm_test: Tx Loop
W (53488) mcpwm_test: Rx Loop
W (53488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (53488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (53498) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (53508) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (53518) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (54028) mcpwm_test: Rx Loop
E (54378) mcpwm_test: Tx Loop
W (54528) mcpwm_test: Rx Loop
W (54528) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (54528) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (54538) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (54548) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (54558) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (55068) mcpwm_test: Rx Loop
E (55378) mcpwm_test: Tx Loop
W (55568) mcpwm_test: Rx Loop
W (55568) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (55568) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (55578) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (55588) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (55598) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (56108) mcpwm_test: Rx Loop
E (56378) mcpwm_test: Tx Loop
W (56608) mcpwm_test: Rx Loop
W (56608) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (56608) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (56618) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (56628) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (56638) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (57148) mcpwm_test: Rx Loop
E (57378) mcpwm_test: Tx Loop
W (57648) mcpwm_test: Rx Loop
W (57648) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (57648) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (57658) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (57668) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (57678) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (58188) mcpwm_test: Rx Loop
E (58378) mcpwm_test: Tx Loop
W (58688) mcpwm_test: Rx Loop
W (58688) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (58688) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (58698) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (58708) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (58718) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (59228) mcpwm_test: Rx Loop
E (59378) mcpwm_test: Tx Loop
W (59728) mcpwm_test: Rx Loop
W (59728) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (59728) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (59738) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (59748) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (59758) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (60268) mcpwm_test: Rx Loop
E (60378) mcpwm_test: Tx Loop
W (60768) mcpwm_test: Rx Loop
W (60768) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (60768) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (60778) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (60788) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (60798) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (61308) mcpwm_test: Rx Loop
E (61378) mcpwm_test: Tx Loop
W (61808) mcpwm_test: Rx Loop
W (61808) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (61808) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (61818) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (61828) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (61838) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (62348) mcpwm_test: Rx Loop
E (62378) mcpwm_test: Tx Loop
W (62848) mcpwm_test: Rx Loop
W (62848) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (62848) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (62858) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (62868) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (62878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (63378) mcpwm_test: Tx Loop
W (63388) mcpwm_test: Rx Loop
W (63388) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (63388) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (63398) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (63408) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (63418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (63928) mcpwm_test: Rx Loop
E (64378) mcpwm_test: Tx Loop
W (64428) mcpwm_test: Rx Loop
W (64428) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (64428) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (64438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (64448) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (64458) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (64968) mcpwm_test: Rx Loop
E (65378) mcpwm_test: Tx Loop
W (65468) mcpwm_test: Rx Loop
W (65468) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (65468) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (65478) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (65488) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (65498) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (66008) mcpwm_test: Rx Loop
E (66378) mcpwm_test: Tx Loop
W (66508) mcpwm_test: Rx Loop
W (66508) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (66508) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (66518) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (66528) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (66538) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (67048) mcpwm_test: Rx Loop
E (67378) mcpwm_test: Tx Loop
W (67548) mcpwm_test: Rx Loop
W (67548) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (67548) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (67558) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (67568) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (67578) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (68088) mcpwm_test: Rx Loop
E (68378) mcpwm_test: Tx Loop
W (68588) mcpwm_test: Rx Loop
W (68588) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (68588) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (68598) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (68608) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (68618) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (69128) mcpwm_test: Rx Loop
E (69378) mcpwm_test: Tx Loop
W (69628) mcpwm_test: Rx Loop
W (69628) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (69628) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (69638) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (69648) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (69658) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (70168) mcpwm_test: Rx Loop
E (70378) mcpwm_test: Tx Loop
W (70668) mcpwm_test: Rx Loop
W (70668) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (70668) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (70678) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (70688) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (70698) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (71208) mcpwm_test: Rx Loop
E (71378) mcpwm_test: Tx Loop
W (71708) mcpwm_test: Rx Loop
W (71708) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (71708) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (71718) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (71728) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (71738) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (72248) mcpwm_test: Rx Loop
E (72378) mcpwm_test: Tx Loop
W (72748) mcpwm_test: Rx Loop
W (72748) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (72748) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (72758) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (72768) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (72778) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (73288) mcpwm_test: Rx Loop
E (73378) mcpwm_test: Tx Loop
W (73788) mcpwm_test: Rx Loop
W (73788) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (73788) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (73798) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (73808) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (73818) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (74328) mcpwm_test: Rx Loop
E (74378) mcpwm_test: Tx Loop
W (74828) mcpwm_test: Rx Loop
W (74828) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (74828) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (74838) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (74848) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (74858) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (75368) mcpwm_test: Rx Loop
E (75378) mcpwm_test: Tx Loop
W (75868) mcpwm_test: Rx Loop
W (75868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (75868) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (75878) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (75888) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (75898) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
E (76378) mcpwm_test: Tx Loop
W (76408) mcpwm_test: Rx Loop
W (76408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (76408) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (76418) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (76428) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (76438) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (76948) mcpwm_test: Rx Loop
E (77378) mcpwm_test: Tx Loop
W (77448) mcpwm_test: Rx Loop
W (77448) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (77448) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (77458) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (77468) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (77478) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (77988) mcpwm_test: Rx Loop
E (78378) mcpwm_test: Tx Loop
W (78488) mcpwm_test: Rx Loop
W (78488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (78488) mcpwm_test: level0 = High   dur0 = PulseTicks(620)   level1 = Low   dur1 = PulseTicks(620)
W (78498) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(410)
W (78508) mcpwm_test: level0 = High   dur0 = PulseTicks(410)   level1 = Low   dur1 = PulseTicks(210)
W (78518) mcpwm_test: level0 = High   dur0 = PulseTicks(210)   level1 = Low   dur1 = PulseTicks(0)
W (79028) mcpwm_test: Rx Loop

@ivmarkov
Copy link
Collaborator

ivmarkov commented Aug 4, 2022

@MabezDev I think you are following the development of RMT and mcpwm. Would you like to review this and #93 and merge when you think this stuff is in a good shape?

@enelson1001
Copy link
Contributor Author

Can someone explain what the Clippy errors mean.

@MabezDev
Copy link
Member

MabezDev commented Aug 5, 2022

Can someone explain what the Clippy errors mean.

CI was stuck on an old nightly which broke libc, its now fixed with this commit in master 5edffda. If you rebase this branch on top of master it should fix the errors :).

@enelson1001
Copy link
Contributor Author

I am getting build errors that I do not understand why they are happening. These occur in the example file rmt_transceiver.rs

error[E0432]: unresolved import `log`
  --> examples/rmt_transceiver.rs:23:5
   |
23 | use log::*;
   |     ^^^ use of undeclared crate or module `log`

error: cannot find macro `error` in this scope
  --> examples/rmt_transceiver.rs:94:9
   |
94 |         error!("Tx Loop");
   |         ^^^^^

error: cannot find macro `warn` in this scope
  --> examples/rmt_transceiver.rs:61:17
   |
61 |                 warn!(
   |                 ^^^^
   |
   = note: `warn` is in scope, but it is an attribute: `#[warn]`

error: cannot find macro `warn` in this scope
  --> examples/rmt_transceiver.rs:52:9
   |
52 |         warn!("Rx Loop");
   |         ^^^^
   |
   = note: `warn` is in scope, but it is an attribute: `#[warn]`

error: cannot find macro `info` in this scope
  --> examples/rmt_transceiver.rs:38:5
   |
38 |     info!("Starting APP!");
   |     ^^^^

error[E0433]: failed to resolve: use of undeclared crate or module `esp_idf_svc`
  --> examples/rmt_transceiver.rs:36:5
   |
36 |     esp_idf_svc::log::EspLogger::initialize_default();
   |     ^^^^^^^^^^^ use of undeclared crate or module `esp_idf_svc`
   |
help: there is a crate or module with a similar name
   |
36 |     esp_idf_sys::log::EspLogger::initialize_default();
   |     ~~~~~~~~~~~

Is there some reason we can't use log in examples?

@ivmarkov
Copy link
Collaborator

ivmarkov commented Sep 11, 2022

I am getting build errors that I do not understand why they are happening. These occur in the example file rmt_transceiver.rs

error[E0432]: unresolved import `log`
  --> examples/rmt_transceiver.rs:23:5
   |
23 | use log::*;
   |     ^^^ use of undeclared crate or module `log`

error: cannot find macro `error` in this scope
  --> examples/rmt_transceiver.rs:94:9
   |
94 |         error!("Tx Loop");
   |         ^^^^^

error: cannot find macro `warn` in this scope
  --> examples/rmt_transceiver.rs:61:17
   |
61 |                 warn!(
   |                 ^^^^
   |
   = note: `warn` is in scope, but it is an attribute: `#[warn]`

error: cannot find macro `warn` in this scope
  --> examples/rmt_transceiver.rs:52:9
   |
52 |         warn!("Rx Loop");
   |         ^^^^
   |
   = note: `warn` is in scope, but it is an attribute: `#[warn]`

error: cannot find macro `info` in this scope
  --> examples/rmt_transceiver.rs:38:5
   |
38 |     info!("Starting APP!");
   |     ^^^^

error[E0433]: failed to resolve: use of undeclared crate or module `esp_idf_svc`
  --> examples/rmt_transceiver.rs:36:5
   |
36 |     esp_idf_svc::log::EspLogger::initialize_default();
   |     ^^^^^^^^^^^ use of undeclared crate or module `esp_idf_svc`
   |
help: there is a crate or module with a similar name
   |
36 |     esp_idf_sys::log::EspLogger::initialize_default();
   |     ~~~~~~~~~~~

Is there some reason we can't use log in examples?

Too long to explain... :( please use println!

Change gpio pins for esp32-c3
@ivmarkov
Copy link
Collaborator

ivmarkov commented Sep 18, 2022

Would it be possible to rebase this PR for latest master? I just merged next into it so there are lots of changes.

@enelson1001
Copy link
Contributor Author

It looks like a lot of changes to rmt.rs
I am curious why TransmitConfig was changed to Config. It seemed to be an appropriate name since there is a transmit config and a receive config for the RMT I was implementing ReceiveConfig for the receiver. Should I keep ReceiveConfig or do you have something else in mind.

@ivmarkov
Copy link
Collaborator

ivmarkov commented Sep 22, 2022

It looks like a lot of changes to rmt.rs I am curious why TransmitConfig was changed to Config. It seemed to be an appropriate name since there is a transmit config and a receive config for the RMT I was implementing ReceiveConfig for the receiver. Should I keep ReceiveConfig or do you have something else in mind.

By all means keep ReceiveConfig as it is. I've renamed Config back to TransmitConfig. With all the changes, it escaped my mind completely, that the receiver part is coming. :)

Do you think you could rebase your changes on top of latest master? The previous release I've kept in a separate branch, but I don't have the time to push into it new functionality. It is only there for bugfixes that would fix crashes and other gross errors.

@ivmarkov
Copy link
Collaborator

@enelson1001 The PR is still reported as having conflicts by github.

@enelson1001
Copy link
Contributor Author

I have been playing some more with the RMT Receiver and I think I would like to change PulsePair duration0 and duration1 to u16 types. I need the duration value from PulslePair not PulseTicks ( I cannot get the 0 field of PulseTicks because it is private).

In my example I need to compare duration0 and duration1 so the duration's are between a minimum value and a maximum value.

 New PulsePair



pub struct PulsePair {
    pub level0: PinState,
    pub duration0: u16,
    pub level1: PinState,
    pub duration1: u16,
}

impl PulsePair {
    pub fn new(lvl0: u32, dur0: u32, lvl1: u32, dur1: u32) -> Self {
        let level0 = match lvl0 {
            0 => PinState::Low,
            _ => PinState::High,
        };

        let duration0 = dur0 as u16;

        let level1 = match lvl1 {
            0 => PinState::Low,
            _ => PinState::High,
        };

        let duration1 = dur1 as u16;

        PulsePair {
            level0,
            duration0,
            level1,
            duration1,
        }
    }
}

My partial example

 const SHORT_PULSE_MIN: u16 = 196;
 const SHORT_PULSE_MAX: u16 = 244;

/*
     *********************** SET UP RMT RECEIVER ******************************
     */
    let input_pin = peripherals.pins.gpio2;
    //let input_pin = peripherals.pins.gpio36;
    let rx_rmt_channel: CHANNEL2 = peripherals.rmt.channel2;
    let rx_config = ReceiveConfig::new().idle_threshold(700u16);
    let mut rx = RxRmtDriver::new(rx_rmt_channel, input_pin, &rx_config, 1000)?;
    let _rx_start = rx.start().unwrap();

    let _receive_task = thread::spawn(move || loop {
        //println!("Rx Loop");

        // See sdkconfig.defaults to determine the tick time value ( default is one tick = 10 milliseconds)
        // Set ticks_to_wait to 0 for non-blocking
        let ticks_to_wait = 0;
        let length = rx.get_rmt_items(ticks_to_wait).unwrap();
        let mut sync_count: u8 = 0;
        let mut sync_found = false;

        if length != 0 {
            for n in 0..length / 4 {
                
                let lo_time = rx.pulse_pair_vec[n as usize].duration0;

                let hi_time = rx.pulse_pair_vec[n as usize].duration1;
                

                let is_lo_time_sync_pulse = (lo_time > SYNC_PULSE_MIN) & (lo_time < SYNC_PULSE_MAX);
                let is_hi_time_sync_pulse = (hi_time > SYNC_PULSE_MIN) & (hi_time < SYNC_PULSE_MAX);

Is this the correct way to go or is there a better way?

Copy link
Collaborator

@ivmarkov ivmarkov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this driver is in a great shape! I have several suggestions which achieve one thing - getting rid of the requirement for "alloc" and simultaneously - making the API somewhat compatible with e.g. how the Read Rust trait is modeled as well as how other "data receiving" drivers in the HAL work.

Once you address the changes, we should merge. Just in time for the new release of the HAL from master.

/// Use [`RxRmtDriver::start()`] to receive pulses.
///
/// See the [rmt module][crate::rmt] for more information.
use alloc::vec::Vec;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this driver needs alloc at all - see below.

pub struct RxRmtDriver<'d> {
channel: u8,
_p: PhantomData<&'d mut ()>,
pub pulse_pair_vec: Vec<PulsePair>,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why should that be a member at all? Remove. (And see below for an alternative suggestion.)

_channel: impl Peripheral<P = C> + 'd,
pin: impl Peripheral<P = impl InputPin> + 'd,
config: &ReceiveConfig,
rx_buffer_size_in_bytes: u32,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be usize, not u32. I also suggest to change the semantics of this to be size-in-PulsePair-instances, i.e. rename to just rx_buffer_size and do the math to bytes inside the constructor.

},
};

let pulse_pair_size: u32 = rx_buffer_size_in_bytes / 4;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do the opposite math here.

};

let pulse_pair_size: u32 = rx_buffer_size_in_bytes / 4;
let pulse_pair_vec: Vec<PulsePair> =
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove


unsafe {
esp!(rmt_config(&sys_config))?;
esp!(rmt_driver_install(C::channel(), rx_buffer_size_in_bytes, 0))?;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Opposite math and cast as u32.

}

// Set ticks_to_wait to 0 for non-blocking.
pub fn get_rmt_items(&mut self, ticks_to_wait: u32) -> Result<u32, EspError> {
Copy link
Collaborator

@ivmarkov ivmarkov Nov 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Rename to simply receive
  2. ticks_to_wait should be of TickType_t type. See also the delay module. This way the user can e.g. pass delay::BLOCK here.
  3. Method should take a &mut [PulsePair] buffer reference
  4. Method should return usize, not u32, which would be the number of items fetched from the ring buffer and written back to the user-supplied buffer

esp!(rmt_get_ringbuf_handle(self.channel(), &mut rmt_handle))
.expect("Failed to get ringbuffer handle");

let rmt_items = xRingbufferReceive(rmt_handle as *mut _, &mut length, ticks_to_wait)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change this to xRingbufferReceiveUpTo and pass to it <user-supplied-buf-reference>.len() * 4

}

impl PulsePair {
pub fn new(lvl0: u32, dur0: u32, lvl1: u32, dur1: u32) -> Self {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that this constructor takes "raw" ESP IDF values of type u32 I don't think it should be public.

@ivmarkov ivmarkov merged commit 8e31252 into esp-rs:master Nov 12, 2022
@enelson1001
Copy link
Contributor Author

I am testing latest master (I think). In my project Cargo.toml i have the following.

[dependencies]
esp-idf-sys = { version = "0.31.9", features = ["binstart"] }
esp-idf-hal = { git = "https://github.com/esp-rs/esp-idf-hal" }
crossbeam-channel = "0.5"

But when I try and compile I get the following error (I am not using SPI at the moment)

error[E0632]: cannot provide explicit generic arguments when `impl Trait` is used in argument position
   --> /home/ed/.cargo/git/checkouts/esp-idf-hal-923d08f725716f5e/5667be9/src/spi.rs:361:54
    |
361 |         let max_transfer_size = Self::new_internal::<SPI1>(sclk, sdo, sdi, dma)?;
    |                                                      ^^^^ explicit generic argument not allowed
    |
    = note: see issue #83701 <https://github.com/rust-lang/rust/issues/83701> for more information
    = help: add `#![feature(explicit_generic_args_with_impl_trait)]` to the crate attributes to enable

error[E0632]: cannot provide explicit generic arguments when `impl Trait` is used in argument position
   --> /home/ed/.cargo/git/checkouts/esp-idf-hal-923d08f725716f5e/5667be9/src/spi.rs:377:54
    |
377 |         let max_transfer_size = Self::new_internal::<SPI>(sclk, sdo, sdi, dma)?;
    |                                                      ^^^ explicit generic argument not allowed
    |
    = note: see issue #83701 <https://github.com/rust-lang/rust/issues/83701> for more information
    = help: add `#![feature(explicit_generic_args_with_impl_trait)]` to the crate attributes to enable

For more information about this error, try `rustc --explain E0632`.
error: could not compile `esp-idf-hal` due to 2 previous errors

First question:
With the Caro.toml file set as stated above, Am I using the latest MASTER?

Second question:
Do you see this error on your builds?

@enelson1001
Copy link
Contributor Author

And thanks for finishing the RMT receive. It would have taken me another month, probably more to implement the changes you made. I still have a lot to learn.

@ivmarkov
Copy link
Collaborator

First question:
With the Caro.toml file set as stated above, Am I using the latest MASTER?

Yes.

Second question:
Do you see this error on your builds?

No. You are seeing this because your toolchain is too old. With that said, I'll remove the turbofish when calling internal_new as it is not actually necessary.

@ivmarkov
Copy link
Collaborator

ivmarkov commented Nov 13, 2022

And thanks for finishing the RMT receive. It would have taken me another month, probably more to implement the changes you made. I still have a lot to learn.

I would appreciate if you test the changed code though. I don't have a setup for testing the RMT stuff.

@enelson1001
Copy link
Contributor Author

Tested example but it is crashing. I changed CONFIG_ESP_MAIN_TASK_STACK_SIZE=14000 but that did not help.

I (313) spi_flash: flash io: dio
I (318) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Starting APP!
Rx Loop
***ERROR*** A stack overflow in task pthread has been detected.
Backtrace: 0x40081dca:0x3ffb84e0 0x40085ea5:0x3ffb8500 0x40088aaa:0x3ffb8520 0x40087454:0x3ffb85a0 0x40085fa0:0x3ffb85d0 0x40085f52:0x400d7cb0 |<-CORRUPTED
0x40081dca - panic_abort
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/esp_system/panic.c:402
0x40085ea5 - esp_system_abort
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/esp_system/esp_system.c:128
0x40088aaa - vApplicationStackOverflowHook
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/freertos/port/xtensa/port.c:394
0x40087454 - vTaskSwitchContext
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/freertos/tasks.c:3504
0x40085fa0 - _frxt_dispatch
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/freertos/port/xtensa/portasm.S:436
0x40085f52 - _frxt_int_exit
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/freertos/port/xtensa/portasm.S:231
0x400d7cb0 - std::io::error::Error::kind
    at /home/ed/.rustup/toolchains/esp/lib/rustlib/src/rust/library/std/src/io/error.rs:892
ELF file SHA256: 0000000000000000
Rebooting...
ets Jun  8 2016 00:22:57

Question 1
For my project how do you specify portMAX_DELAY for receive. I tried the following in my project but that didn't work.

let rmt_items = rmt_rx.receive(&mut pulses, TickType(Block)).unwrap();
    |                                        -------              ^^^^^^^^^^^^^^^ expected `u32`, found struct `TickType`
    |                                        |
    |                                        arguments to this function are incorrect

Question 2
For my project I need the pulse ticks as u16. How do you get u16 value from PulseTicks. I tried the following but didn't work.

let rmt_items = rmt_rx.receive(&mut pulses, TickType(Block)).unwrap();
                let pulses = &pulses[..rmt_items];
                if !pulses.is_empty() {
                    for (pulse0, pulse1) in pulses {

                        // Determine the type of symbol from the pulse durations
                        let symbol = self.get_symbol((pulse0.ticks.0, pulse1.ticks.0));

But get the following error.

error[E0616]: field `0` of struct `PulseTicks` is private
let symbol = self.get_symbol((pulse0.ticks.0, pulse1.ticks.0));
                                           ^ private field  

let symbol = self.get_symbol((pulse0.ticks.0, pulse1.ticks.0));
                                                           ^ private field

@enelson1001
Copy link
Contributor Author

The cause of the crash is this line.

let mut pulses = [(Pulse::zero(), Pulse::zero()); 250];

I put a println statement after this line of code and it never gets printed.

@ivmarkov
Copy link
Collaborator

Tested example but it is crashing. I changed CONFIG_ESP_MAIN_TASK_STACK_SIZE=14000 but that did not help.

You are changing the stack of the main task/thread, while the buffer is allocated on another task/thread. I've fixed the example accordingly.

For my project how do you specify portMAX_DELAY for receive. I tried the following in my project but that didn't work.

delay::BLOCK

Question 2 For my project I need the pulse ticks as u16. How do you get u16 value from PulseTicks. I tried the following but didn't work.

That's an omission. I've added a PulseTicks::ticks() method now.

@enelson1001
Copy link
Contributor Author

Example fails with different type of failure. I added a couple of println. Seems to fail in TX thread.

I (310) spi_flash: detected chip: gd
I (313) spi_flash: flash io: dio
I (318) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Starting APP!
Rx Loop
RX - Got here
Tx Loop
assert failed: xRingbufferReceiveUpTo ringbuf.c:1247 (pxRingbuffer->uxRingbufferFlags & ( ( UBaseType_t ) 2 ))
Backtrace: 0x40081dca:0x3ffba090 0x40085ea5:0x3ffba0b0 0x4008ace1:0x3ffba0d0 0x40085ca2:0x3ffba1f0 0x400d6229:0x3ffba230 0x400d4ecd:0x3ffba2b0 0x400d4862:0x3ffbab10 0x400dfd1b:0x3ffbab40 0x400dfd72:0x3ffbab60 0x400e8bf0:0x3ffbab80 0x401021a4:0x3ffbaba0
0x40081dca - panic_abort
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/esp_system/panic.c:402
0x40085ea5 - esp_system_abort
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/esp_system/esp_system.c:128
0x4008ace1 - __assert_func
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/newlib/assert.c:85
0x40085ca2 - xRingbufferReceiveUpTo
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/esp_ringbuf/ringbuf.c:1247
0x400d6229 - esp_idf_hal::rmt::RxRmtDriver::receive
    at /home/ed/.cargo/git/checkouts/esp-idf-hal-923d08f725716f5e/01ca210/src/rmt.rs:991
0x400d4ecd - mcpwm_test::main::{{closure}}
    at /home/ed/esp-rust-projects/mcpwm-test/src/main.rs:58
0x400d4862 - std::thread::Builder::spawn_unchecked_::{{closure}}::{{closure}}
    at /home/ed/.rustup/toolchains/esp/lib/rustlib/src/rust/library/std/src/thread/mod.rs:514
0x400dfd1b - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once
    at /home/ed/.rustup/toolchains/esp/lib/rustlib/src/rust/library/alloc/src/boxed.rs:1940
0x400dfd72 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once
    at /home/ed/.rustup/toolchains/esp/lib/rustlib/src/rust/library/alloc/src/boxed.rs:1940
0x400e8bf0 - std::sys::unix::thread::Thread::new::thread_start
    at /home/ed/.rustup/toolchains/esp/lib/rustlib/src/rust/library/std/src/sys/unix/thread.rs:108
0x401021a4 - pthread_task_func
    at /home/ed/esp-rust-projects/mcpwm-test/.embuild/espressif/esp-idf/release-v4.4/components/pthread/pthread.c:195
ELF file SHA256: 0000000000000000
Rebooting...

@enelson1001
Copy link
Contributor Author

enelson1001 commented Nov 14, 2022

Looking at rmt.rs and what changed.

Line 991 - latest rmt.rs
xRingbufferReceiveUpTo(
                rmt_handle as *mut _,
                &mut length,
                ticks_to_wait,
                buf.len() as _,
            ) as *mut rmt_item32_t

In esp-idf-v4.4 file components/esp_ringbuf.c

line 1247
configASSERT(pxRingbuffer->uxRingbufferFlags & rbBYTE_BUFFER_FLAG);    //This function should only be called for byte buffers

Is buf a byte buffer?

Where before it used

Previous rmt.rs
 let rmt_items = xRingbufferReceive(rmt_handle as *mut _, &mut length, ticks_to_wait)
                as *mut rmt_item32_t;

Could this be the problem?

@ivmarkov
Copy link
Collaborator

Where before it used

Previous rmt.rs
 let rmt_items = xRingbufferReceive(rmt_handle as *mut _, &mut length, ticks_to_wait)
                as *mut rmt_item32_t;

Could this be the problem?

Yes, that's the problem. The ring buffer in the RMT driver is NOSPLIT and unfortunately is not a byte buffered one, so the *UpTo function cannot be used. :(

The problem with the regular xRingBufferReceive function and the reason I tried to replace it with *UpTo is that the data xRingBufferReceive returns might not be fitting into the user supplied buffer - and as such - the *UpTo function offered a better alternative.

Not everything is lost though. What we can do - in case the user supplied buffer is not large enough - is to preserve - in a pair of temporary (raw pointer, length) state variable - the data which is in the ring buffer and which was received and then return an error to the user that he has to pass a bigger buffer. Once we get the bigger buffer, we can fill it in with the data preserved in the temporary state and only then return it (i.e. mark it as free) to the ring buffer.

@enelson1001
Copy link
Contributor Author

When I used the ringbuffer in the past esp-idf would spit out an error message that the ringbuffer had overflowed. But can't remember how it handled the buffer after the overflow notification.

@ivmarkov
Copy link
Collaborator

If the RMT interrupt code cannot insert data in the ringbuffer, I think this data would simply be dropped to the floor. And this is I think orthogonal to our discussion anyway.

@ivmarkov
Copy link
Collaborator

... as we are discussing what to do when reading from the ring buffer, not what happens when the interrupt code of the driver pushes stuff to the ring buffer. And reading - one way or another - has to be quick anyway, yes. Or else you'll have data dropped. But we have no control over that. It is up to the user.

@enelson1001
Copy link
Contributor Author

Once we get the bigger buffer, we can fill it in with the data preserved in the temporary state and only then return it (i.e. mark it as free) to the ring buffer.

Is there a limit on how big this buffer can grow? I guess it depends upon how big the stack is in the thread?

@ivmarkov
Copy link
Collaborator

Nobody says that the user should provide a buffer allocated on the stack. &mut can point to a Box on the heap as well, or to a Vec.

@ivmarkov
Copy link
Collaborator

@enelson1001 OK so I've quickly prototyped a possible solution. Not sure it will work right out of the box, but you can give it a try!

@enelson1001
Copy link
Contributor Author

yes

@enelson1001
Copy link
Contributor Author

error[E0432]: unresolved import `esp_idf_hal::rmt::Receive`
  --> src/main.rs:26:53
   |
26 |     FixedLengthSignal, PinState, Pulse, PulseTicks, Receive, RmtReceiveConfig, RmtTransmitConfig,
   |                                                     ^^^^^^^ no `Receive` in `rmt`

For more information about this error, try `rustc --explain E0432`.
error: could not compile `mcpwm-test` due to previous error

@enelson1001
Copy link
Contributor Author

Sorry forgot to do cargo update. trying again

@enelson1001
Copy link
Contributor Author

Looks good

I (0) cpu_start: App cpu up.
I (239) cpu_start: Pro cpu start user code
I (239) cpu_start: cpu freq: 160000000
I (239) cpu_start: Application information:
I (243) cpu_start: Project name:     libespidf
I (248) cpu_start: App version:      1
I (253) cpu_start: Compile time:     Nov 13 2022 13:46:47
I (259) cpu_start: ELF file SHA256:  0000000000000000...
I (265) cpu_start: ESP-IDF:          76caa64-dirty
I (271) heap_init: Initializing. RAM available for dynamic allocation:
I (278) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (284) heap_init: At 3FFB2C28 len 0002D3D8 (180 KiB): DRAM
I (290) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (296) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (303) heap_init: At 4008BD70 len 00014290 (80 KiB): IRAM
I (310) spi_flash: detected chip: gd
I (313) spi_flash: flash io: dio
I (318) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Starting APP!
Rx Loop
Tx Loop
Rx Loop
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(410), pin_state: Low }
0=Pulse { ticks: PulseTicks(410), pin_state: High }, 1=Pulse { ticks: PulseTicks(210), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(0), pin_state: Low }
Tx Loop
Rx Loop
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(410), pin_state: Low }
0=Pulse { ticks: PulseTicks(410), pin_state: High }, 1=Pulse { ticks: PulseTicks(210), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(0), pin_state: Low }
Rx Loop
Tx Loop
Rx Loop
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(410), pin_state: Low }
0=Pulse { ticks: PulseTicks(410), pin_state: High }, 1=Pulse { ticks: PulseTicks(210), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(0), pin_state: Low }
Rx Loop
Tx Loop
Rx Loop
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(410), pin_state: Low }
0=Pulse { ticks: PulseTicks(410), pin_state: High }, 1=Pulse { ticks: PulseTicks(210), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(0), pin_state: Low }
Rx Loop
Tx Loop
Rx Loop
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(410), pin_state: Low }
0=Pulse { ticks: PulseTicks(410), pin_state: High }, 1=Pulse { ticks: PulseTicks(210), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(0), pin_state: Low }
Rx Loop
Tx Loop
Rx Loop
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(410), pin_state: Low }
0=Pulse { ticks: PulseTicks(410), pin_state: High }, 1=Pulse { ticks: PulseTicks(210), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(0), pin_state: Low }
Rx Loop
Tx Loop
Rx Loop
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(620), pin_state: High }, 1=Pulse { ticks: PulseTicks(620), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(410), pin_state: Low }
0=Pulse { ticks: PulseTicks(410), pin_state: High }, 1=Pulse { ticks: PulseTicks(210), pin_state: Low }
0=Pulse { ticks: PulseTicks(210), pin_state: High }, 1=Pulse { ticks: PulseTicks(0), pin_state: Low }
Rx Loop

@enelson1001
Copy link
Contributor Author

Maybe I should try with buffer set to 4? To see how it reacts.

@enelson1001
Copy link
Contributor Author

enelson1001 commented Nov 14, 2022

Buffer set to 4.

/*
     *********************** SET UP RMT RECEIVER ******************************
     */
    let mut rx = RxRmtDriver::new(
        peripherals.rmt.channel2,
        peripherals.pins.gpio2,
        &RmtReceiveConfig::new().idle_threshold(700u16),
        4,
    )?;

    rx.start().unwrap();

    let _ = std::thread::Builder::new()
        .stack_size(10000)
        .spawn(move || loop {
            println!("Rx Loop");

            let mut pulses = [(Pulse::zero(), Pulse::zero()); 4];

Program output

I (0) cpu_start: App cpu up.
I (239) cpu_start: Pro cpu start user code
I (239) cpu_start: cpu freq: 160000000
I (239) cpu_start: Application information:
I (243) cpu_start: Project name:     libespidf
I (248) cpu_start: App version:      1
I (253) cpu_start: Compile time:     Nov 13 2022 13:46:47
I (259) cpu_start: ELF file SHA256:  0000000000000000...
I (265) cpu_start: ESP-IDF:          76caa64-dirty
I (270) heap_init: Initializing. RAM available for dynamic allocation:
I (277) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (283) heap_init: At 3FFB2C28 len 0002D3D8 (180 KiB): DRAM
I (290) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (296) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (303) heap_init: At 4008BD70 len 00014290 (80 KiB): IRAM
I (310) spi_flash: detected chip: gd
I (313) spi_flash: flash io: dio
I (318) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Starting APP!
Rx Loop
Tx Loop
E (348) rmt: RMT RX BUFFER FULL
Rx Loop
Tx Loop
Rx Loop
E (1348) rmt: RMT RX BUFFER FULL
Rx Loop
Tx Loop
Rx Loop
E (2348) rmt: RMT RX BUFFER FULL
Rx Loop
Tx Loop
Rx Loop
E (3348) rmt: RMT RX BUFFER FULL
Rx Loop

@enelson1001
Copy link
Contributor Author

Sorry but I am back to this comment again.

Once we get the bigger buffer, we can fill it in with the data preserved in the temporary state and only then return it (i.e. mark it as free) to the ring buffer.

But to provide the bigger buffer won't the user have to do the following.

  1. Drop the RmtRxDriver
  2. Reconfigure the RmtRxDriver with new new buffer size
  3. Create a new pulses buffer with the new buffer size
  4. Restart Rx.

From my point of view I think its better not to add the functionality to fix the users error of providing the wrong size of the buffer and let esp-idf report the buffer overflow at runtime. It seems to me we are trying to fix the user problem - if user increases buffer to some set max size and it still not big enough we will still have an error. I am not sure how easy it would be to create a new RmtRxDriver (getting peripherals) if program is outside main but I am not an expert in rust programming.

Anyway my thoughts

@ivmarkov
Copy link
Collaborator

I'm talking about the pulses buffer that is passed to receive....

@enelson1001
Copy link
Contributor Author

Maybe we are talking apples and oranges. I assumed the user would set the pulses buffer size the same as ringbuffer size in RxRmtDriver. Maybe you are assuming the user would set ringbuffer size in RxRmtDriver to X and then user set pulses buffer size to less than X.

If the user sets ringbuffer size to the same size as pulses buffer size and the pulses buffer is not big enough then he just can't change pulses buffer size to fix. He also needs to change RxRmtDriver ringbuffer size.

I tried this on the rmt example.

Set the ringbuffer size to 4 in the RxRmtDriver (will not hold response)

let mut rx = RxRmtDriver::new(
        peripherals.rmt.channel2,
        peripherals.pins.gpio2,
        &RmtReceiveConfig::new().idle_threshold(700u16),
        4,
    )?;

Set pulses buffer size to 20 which is more than enough to hold response. Say user started with pulses buffer size at 4 and then changed buffer size to 20 in program

let mut pulses = [(Pulse::zero(), Pulse::zero()); 20];

Ran the program.

Starting APP!
Rx Loop
Tx Loop
E (348) rmt: RMT RX BUFFER FULL
Rx Loop
Tx Loop
Rx Loop
E (1348) rmt: RMT RX BUFFER FULL
Rx Loop
Tx Loop
Rx Loop
E (2348) rmt: RMT RX BUFFER FULL
Rx Loop
Tx Loop
Rx Loop
E (3348) rmt: RMT RX BUFFER FULL

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants