ESP32 RMT: two enhancement suggestions
These stem from my use of RMT for its original purpose. My "blaster" libraries for 433Mhz and IR remote controls support Pyboard, RP2 and ESP32. In each case ESP32 RAM use was larger than on Pyboard and RP2. This could be fixed with two non-breaking changes.
- RMT.write_pulses(pulses, start) Allow pulses to be any object supporting the buffer protocol. This would allow half-word arrays or bytearrays, saving RAM. This behaviour would be similar to that of other MicroPython interface classes.
- Provide a mechanism for looping N times. 433MHz remotes typically send the same set of pulses N times in quick succession, where N is 5-10. Currently I do this (on ESP32 only) by copying. Ugly and wasteful.
I can see two alternatives for doing N times looping.
- Add a count=None arg to .write_pulses() or even .loop().
- More flexibly, provide a callback to .write_pulses(). The callback would take a single arg being the RMT instance, and would run on completion of the output. This would enable the user to implement a count (typically by passing a method as the callback). This would be my preferred solution because of its flexibility. Complex modulation schemes could be implemented efficiently in a nonblocking fashion.
My first thought was a callback=None arg to .write_pulses() but this poses a recursion issue. A new .done_callback(cb=None) method would be better, with the default removing any current callback.
RMT receive
Description
I just found out that microphthon can send RMT but not receive. That's a shame which forces me to use nodemcu while I prefer microphthon by a long shot. RMT receive is very important and without it, receiving pulses is way more inaccurate.
In my project I need to determine the pulse length accurately. Please implement RMT receive!
Code Size
Should not be so big. But honestly I don't know.
Implementation
I hope the MicroPython maintainers or community will implement this feature
Code of Conduct
Yes, I agree