.. a fast helper for animations. It is similar to and inspired by the
PixelMap helper in Adafruit LED Animation library, but with an extremely
fast 'paste' method for setting a series of pixels. This is a common
operation for many animations, and can give a substantial speed improvement.
It's named `adafruit_pixelmap` so that we can package a compatible version
in pure Python for systems that can't fit it in C in flash, or for
Blinka.
This is a proof of concept and can make a very fast comet animation:
```python
import time
import adafruit_pixelbuf
import adafruti_pixelmap
import board
import neopixel
from supervisor import ticks_ms
from adafruit_led_animation.animation.solid import Solid
from adafruit_led_animation import color
pixel_pin = board.GP0
pixel_num = 96
pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=1, auto_write=False, pixel_order="RGB")
evens = adafruit_pixelmap.PixelMap(pixels, tuple(range(0, pixel_num, 2)))
odd_indices = tuple((i, i+2) for i in range(1, pixel_num, 4))
print(odd_indices)
odds = adafruit_pixelbuf.PixelMap(pixels, odd_indices)
assert len(odds) == len(odd_indices)
comet_length = 16
comet1 = [color.calculate_intensity(color.GREEN, ((1+i) / comet_length) ** 2.4)
for i in range(comet_length)]
comet2 = [color.calculate_intensity(color.PURPLE, ((1+i) / comet_length) ** 2.4)
for i in range(comet_length)]
pos1 = 0
pos2 = 96//4
while True:
evens.paste(comet1, pos1, wrap=True, reverse=False, others=0)
pos1 = (pos1 + 1) % len(evens)
odds.paste(comet2, pos2, wrap=True, reverse=True, others=0)
pos2 = (pos2 - 1) % len(odds)
pixels.show()
m = ticks_ms()
if m % 2000 > 1000:
time.sleep(.02)
```
supervisor_ticks_ms is ALREADY a small int, so passing it to
MP_OBJ_SMALL_INT again messes things up. I don't know why this passed
muster with the C type system, but oh well.
Python 3.11 started to roll out to github actions, and .. it doesn't work.
This MAY affect just the espressif build, but I'm pinning it back at 3.10
for all builds.
Typical failure, during "Run $IDF_PATH/tools/idf_tools.py --non-interactive install required"
shows a lot of failures building gevent:
```
...
Collecting gevent<2.0,>=1.2.2
Downloading gevent-1.5.0.tar.gz (5.3 MB)
...
Building wheel for gevent (pyproject.toml): finished with status 'error'
...
src/gevent/_greenlet_primitives.c:216:12: fatal error: longintrepr.h: No such file or directory
216 | #include "longintrepr.h"
| ^~~~~~~~~~~~~~~
compilation terminated.
error: command '/usr/bin/gcc' failed with exit code 1
```
I notice that gevent is pinned at <2.0 while the current version is 22.10.2!
This is a dependency of gdbgui==0.13.2.0, which is installed by esp-idf
pinned at that version.