|
1 | 1 | # Changelog — pymcu-circuitpython |
2 | 2 |
|
| 3 | +## 0.1.0b1 (Unreleased, prepared 2026-09-15) |
| 4 | + |
| 5 | +Beta 1: this layer moves out of alpha alongside the frontend |
| 6 | +(`pymcu-compiler`/`pymcu-stdlib` 0.1.0b1) and the AVR backend |
| 7 | +(`pymcu-avr` 0.1.0b1), since AVR is the only chip family with real |
| 8 | +CircuitPython hardware to compare against. Coverage on RP2040/RP2350 |
| 9 | +tracks the ARM backend, which stays alpha; `keypad.KeyMatrix` (#13) |
| 10 | +and the storage/os modules (#16) are out of beta 1 by decision. |
| 11 | + |
| 12 | +### Added |
| 13 | + |
| 14 | +- **boards**: adafruit_trinket, and pico as an alias of raspberry_pi_pico |
| 15 | +- **microcontroller**: disable_interrupts and enable_interrupts |
| 16 | +- a micropython module, providing const and nothing else |
| 17 | +- a sys module, providing implementation.name and nothing else |
| 18 | +- **boards**: board.I2C(), board.SPI() and board.UART() on the AVR Arduino boards ([#7](https://github.com/PyMCU/pymcu-circuitpython/issues/7)) |
| 19 | +- **pulseio**: PulseIn and PulseOut ([#9](https://github.com/PyMCU/pymcu-circuitpython/issues/9)) |
| 20 | +- **servo**: adafruit_motor.servo, so an angle lands on its pulse width ([#8](https://github.com/PyMCU/pymcu-circuitpython/issues/8)) |
| 21 | +- **bitbangio**: the same buses as busio, driven in software on any pins ([#10](https://github.com/PyMCU/pymcu-circuitpython/issues/10)) |
| 22 | +- **rainbowio**: colorwheel(pos), the colour at a position on the wheel ([#15](https://github.com/PyMCU/pymcu-circuitpython/issues/15)) |
| 23 | +- **countio**: Counter, the edges that arrived on a pin ([#11](https://github.com/PyMCU/pymcu-circuitpython/issues/11)) |
| 24 | +- **keypad**: Keys and Event, which button changed and which way ([#13](https://github.com/PyMCU/pymcu-circuitpython/issues/13)) |
| 25 | +- **boards**: board.I2C(), board.SPI() and board.UART() are back ([#7](https://github.com/PyMCU/pymcu-circuitpython/issues/7)) |
| 26 | +- **rotaryio**: IncrementalEncoder, where a two-track knob has turned to ([#12](https://github.com/PyMCU/pymcu-circuitpython/issues/12)) |
| 27 | +- **boards**: the bare 8-pin ATtinys answer to board.Dn |
| 28 | +- **neopixel_write**: the low-level one-wire write, as CircuitPython spells it |
| 29 | +- **analogio,countio,digitalio,keypad,pwmio,rotaryio**: __exit__ matches upstream's (self, *args) arity |
| 30 | +- **busio**: start/end and configure() become keyword-only, matching upstream |
| 31 | +- **bitbangio**: start/end/configure() become keyword-only; write()'s buffer is spelled buf, and configure()'s baudrate default matches upstream's 100000 |
| 32 | +- **pulseio**: PulseIn.__bool__ answers len(pulses) > 0; __exit__ matches upstream's arity |
| 33 | +- **watchdog**: WatchDogTimer is exported as the type of microcontroller.watchdog |
| 34 | + |
| 35 | +### Fixed |
| 36 | + |
| 37 | +- **microcontroller**: cpu.frequency returns the clock instead of failing to compile |
| 38 | +- remove two MicroPython spellings and move WatchDogMode where upstream keeps it |
| 39 | +- **alarm**: the tail is written as the else it already logically is |
| 40 | +- **net**: refuse on a chip with no radio, and say that is the reason |
| 41 | +- **pwmio**: PWMOut.frequency reprograms the timer, and is refused without variable_frequency ([#5](https://github.com/PyMCU/pymcu-circuitpython/issues/5)) |
| 42 | +- **pwmio**: deinit() releases the pin as an input ([PyMCU#296](https://github.com/PyMCU/PyMCU/issues/296)) |
| 43 | +- **pwmio**: the constructor leaves the start to the HAL ([PyMCU#296](https://github.com/PyMCU/PyMCU/issues/296)) |
| 44 | +- **pwmio**: duty_cycle goes to the HAL as the 16-bit value it is ([#30](https://github.com/PyMCU/pymcu-circuitpython/issues/30)) |
| 45 | +- **digitalio**: deinit() releases the pin without pull, and switch_to_output sets the level first ([PyMCU#309](https://github.com/PyMCU/PyMCU/issues/309)) |
| 46 | +- **analogio**: the value covers the whole range, the reference is the chip's, and AnalogOut is refused where there is no DAC ([#21](https://github.com/PyMCU/pymcu-circuitpython/issues/21)) |
| 47 | +- **busio**: every parameter reaches the hardware or is refused, and a read has a deadline ([#22](https://github.com/PyMCU/pymcu-circuitpython/issues/22), [#23](https://github.com/PyMCU/pymcu-circuitpython/issues/23), [#24](https://github.com/PyMCU/pymcu-circuitpython/issues/24)) |
| 48 | +- **pwmio**: frequency reports what the pin emits, and the first parameter is pin ([#18](https://github.com/PyMCU/pymcu-circuitpython/issues/18)) |
| 49 | +- **time, supervisor, nvm, watchdog**: four values that were not the part's ([#26](https://github.com/PyMCU/pymcu-circuitpython/issues/26), [#25](https://github.com/PyMCU/pymcu-circuitpython/issues/25), [#16](https://github.com/PyMCU/pymcu-circuitpython/issues/16), [#19](https://github.com/PyMCU/pymcu-circuitpython/issues/19)) |
| 50 | +- **microcontroller**: uid refused rather than eight zeros, cpus has a length ([#27](https://github.com/PyMCU/pymcu-circuitpython/issues/27)) |
| 51 | +- **alarm**: wait on several alarms, and say which one fired ([#20](https://github.com/PyMCU/pymcu-circuitpython/issues/20)) |
| 52 | +- **time**: sleep() folds to one calibrated delay for a literal duration ([#26](https://github.com/PyMCU/pymcu-circuitpython/issues/26)) |
| 53 | +- **microcontroller**: len(nvm) is a literal again, because a slice of nvm needs one ([#16](https://github.com/PyMCU/pymcu-circuitpython/issues/16)) |
| 54 | +- **digitalio**: switch_to_output's value default is False, as upstream spells it |
| 55 | +- **micropython**: const()'s parameter is named expr, as upstream spells it |
| 56 | +- **rainbowio**: colorwheel()'s parameter is named n, as upstream spells it |
| 57 | +- **watchdog**: move WatchDogTimer into watchdog.py, breaking the import cycle |
| 58 | + |
| 59 | +### Changed |
| 60 | + |
| 61 | +- **time**: sleep() written with plain locals now that a constant survives one ([PyMCU#327](https://github.com/PyMCU/PyMCU/issues/327)) |
| 62 | + |
| 63 | +### Documentation |
| 64 | + |
| 65 | +- the README describes the modules and the spellings that exist ([#29](https://github.com/PyMCU/pymcu-circuitpython/issues/29)) |
| 66 | +- neopixel_write joins the supported module table |
| 67 | +- **corpus**: triage the refused programs |
| 68 | +- **readme**: document the API surface this class of AVR chip will not provide |
| 69 | +- **parity**: regenerate the parity report |
| 70 | + |
| 71 | +### Tests |
| 72 | + |
| 73 | +- the conftest stubs __CHIP__ as an object, pymcu.hal.irq, __FREQ__ and the layer's own module names ([#6](https://github.com/PyMCU/pymcu-circuitpython/issues/6)) |
| 74 | +- the conftest binds __TIMEBASE__ like __FREQ__ ([PyMCU#295](https://github.com/PyMCU/PyMCU/issues/295)) |
| 75 | +- the analogio mocks follow the HAL's ADC and DAC, and the tests measure what changed ([#21](https://github.com/PyMCU/pymcu-circuitpython/issues/21)) |
| 76 | +- the busio mocks follow the HAL, and the tests measure what reaches the hardware ([#22](https://github.com/PyMCU/pymcu-circuitpython/issues/22), [#23](https://github.com/PyMCU/pymcu-circuitpython/issues/23), [#24](https://github.com/PyMCU/pymcu-circuitpython/issues/24), [#7](https://github.com/PyMCU/pymcu-circuitpython/issues/7)) |
| 77 | +- pulse mocks that behave like the HAL, and refuse like it ([#9](https://github.com/PyMCU/pymcu-circuitpython/issues/9)) |
| 78 | +- the PWM mock reports the frequency the pin emits ([#18](https://github.com/PyMCU/pymcu-circuitpython/issues/18), [#8](https://github.com/PyMCU/pymcu-circuitpython/issues/8)) |
| 79 | +- soft I2C and SPI mocks that log what they clocked out ([#10](https://github.com/PyMCU/pymcu-circuitpython/issues/10)) |
| 80 | +- an edge-counter mock that refuses a single edge where the pin cannot tell ([#11](https://github.com/PyMCU/pymcu-circuitpython/issues/11)) |
| 81 | +- the four values, and an EEPROM mock that has a size ([#26](https://github.com/PyMCU/pymcu-circuitpython/issues/26), [#25](https://github.com/PyMCU/pymcu-circuitpython/issues/25), [#16](https://github.com/PyMCU/pymcu-circuitpython/issues/16), [#19](https://github.com/PyMCU/pymcu-circuitpython/issues/19)) |
| 82 | +- the mock clock advances, because alarm waits on it ([#20](https://github.com/PyMCU/pymcu-circuitpython/issues/20)) |
| 83 | +- add a corpus of user-style programs with expected build outcomes and size gates |
| 84 | +- add CircuitPython API parity suite |
| 85 | +- **parity**: resolve symbolic stub defaults and accept __exit__(self, *args) |
| 86 | +- **parity**: allowlist real gaps tracked as GitHub issues |
| 87 | +- **corpus**: create the template's src directory, which git does not keep empty |
| 88 | + |
| 89 | +### Reverted |
| 90 | + |
| 91 | +- board.I2C(), board.SPI() and board.UART(), which miscompile busio ([#7](https://github.com/PyMCU/pymcu-circuitpython/issues/7)) |
| 92 | + |
| 93 | + |
3 | 94 | ## 0.1.0a2 — 2026-08-18 |
4 | 95 |
|
5 | 96 | Everything the PyPI 0.1.0a1 layer (June) predates. With the 0.1.0a10 |
|
0 commit comments