Skip to content

Commit 37cd396

Browse files
Improve workaround for fri3d_2026 expander.version (0,255,15) issue
Re-reading the version number seems to work.
1 parent 16c11e7 commit 37cd396

2 files changed

Lines changed: 39 additions & 43 deletions

File tree

internal_filesystem/lib/drivers/fri3d/expander.py

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def config(self, value: int):
8989
if value >= 0 and value <= 0xFF:
9090
self._write(_EXPANDER_REG_CONFIG, struct.pack("B", value))
9191

92-
def install_firmware(self, filename: str, progress_cb=None):
92+
def install_firmware(self, filename: str, progress_cb):
9393
print("Installing latest CH32 firmware")
9494
time.sleep_ms(10) # make sure writes are spaced out to workaround Fri3dCamp/badge_2026_fw/issues/2
9595
self.config = 0x0B # trigger SWD enable
@@ -115,8 +115,7 @@ def install_firmware(self, filename: str, progress_cb=None):
115115
else:
116116
prog.x03x_program(fw, None) # throws exception if it fails
117117
for pct in range(100 - progress_margin_end, 101):
118-
if progress_cb:
119-
progress_cb("waiting for CH32 boot", pct)
118+
progress_cb("waiting for CH32 boot", pct)
120119
time.sleep(4 / progress_margin_end) # wait 4 seconds total
121120
print("Latest CH32 firmware installed.")
122121

@@ -125,38 +124,32 @@ def wait_for_normal_mode(self, min_uptime_ms: int = 1000, poll_ms: int = 10):
125124
while time.ticks_diff(time.ticks_ms(), start) < min_uptime_ms:
126125
time.sleep_ms(poll_ms)
127126

127+
# Returns True if expander_i2c needs to be re-initialized
128128
def install_firmware_if_needed(
129-
self,
130-
filename: str,
131-
latest_version: tuple[int, int, int],
132-
progress_cb=None,
133-
success_cb=None,
134-
warning_cb=None,
135-
failure_cb=None
136-
) -> bool: # Returns True if expander_i2c needs to be re-initialized
129+
self, filename: str, latest_version: tuple[int, int, int],
130+
progress_cb, success_cb, warning_cb, failure_cb) -> bool:
137131
# Check expander firmware version and if none or too low: install latest
138132
try:
139-
time.sleep_ms(10) # desparate attempt to try avoid sporadic version misreads like (0, 255, 15) maybe Fri3dCamp/badge_2026_fw/issues/2
140133
current_version = self.version
141134
print(f"Current_version of CH32 firmware: {current_version}")
142135
except Exception as e:
143136
print("Could not check CH32 firmware version, assuming 0.0.0")
144137
current_version = (0, 0, 0)
145-
if current_version == (0, 255, 15): # basically 00FFF0
146-
if warning_cb:
147-
warning_cb("CH32 firmware version (0,255,15) bug - assuming latest version!")
148-
return False
138+
if current_version == (0, 255, 15):
139+
warning_cb(msg="CH32 firmware version (0,255,15) bug, trying re-read...")
140+
current_version = self.version # re-read seems to work (often?)
141+
if current_version == (0, 255, 15):
142+
warning_cb(msg="CH32 firmware version (0,255,15) bug after re-read, skipping firmware install/update", sleep_ms=4000, r=96, g=21, b=21)
143+
return False
149144
if latest_version <= current_version:
150145
print(f"CH32 firmware {latest_version} <= {current_version} so not updating it")
151146
return False
152147
print(f"CH32 firmware {latest_version} > {current_version} so updating it")
153148
try:
154149
self.install_firmware(filename, progress_cb)
155-
if success_cb:
156-
success_cb()
150+
success_cb()
157151
except Exception as e:
158-
if failure_cb:
159-
failure_cb(e)
152+
failure_cb(e)
160153
return True # re-initialize expander_i2c, even if the install failed, just in case
161154
print("Firmware installed, checking new version")
162155
try:

internal_filesystem/lib/mpos/board/fri3d_2026.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@
1111
# - analog joystick
1212
# - digital buttons (X,Y,A,B, MENU)
1313

14+
# Multicolor LEDs are used for feedback. Counting from left:
15+
#
16+
# 1: board detected, earliest startup (green)
17+
# 2: coprocessor firmware version read warning (orange) or error (red)
18+
# 3: coprocessor firmware install failure (red)
19+
#
20+
# During coprocessor firmware install progress: 1 to 5 (rainbow colors)
21+
#
22+
# After board initialization: 5 to 1 (rainbow colors)
23+
1424
from machine import ADC, I2C, Pin, SPI, SDCard
1525
import lcd_bus
1626
import i2c
@@ -24,6 +34,15 @@
2434
import mpos.ui.focus_direction
2535
from mpos import InputManager, IRManager, DeviceManager
2636

37+
# === LED HARDWARE ===
38+
import mpos.lights as LightsManager
39+
# Initialize 5 NeoPixel LEDs (GPIO 12)
40+
LightsManager.init(neopixel_pin=12)
41+
LightsManager.set_led_num(5)
42+
# Set left LED red
43+
LightsManager.set_led(4, 21, 96, 67)
44+
LightsManager.write()
45+
2746
spi_bus = SPI.Bus(
2847
host=2,
2948
mosi=6,
@@ -64,15 +83,6 @@
6483
fb1 = display_bus.allocate_framebuffer(buffersize, lcd_bus.MEMORY_INTERNAL | lcd_bus.MEMORY_DMA)
6584
fb2 = display_bus.allocate_framebuffer(buffersize, lcd_bus.MEMORY_INTERNAL | lcd_bus.MEMORY_DMA)
6685

67-
# === LED HARDWARE ===
68-
import mpos.lights as LightsManager
69-
# Initialize 5 NeoPixel LEDs (GPIO 12)
70-
LightsManager.init(neopixel_pin=12)
71-
LightsManager.set_led_num(5)
72-
# Set left LED red
73-
LightsManager.set_led(4, 21, 96, 67)
74-
LightsManager.write()
75-
7686
# Avoid excessive prints here because it slows down if the serial connects during printing?!
7787
def progress(msg, pct):
7888
#print(f"{msg}: {pct}%")
@@ -85,21 +95,19 @@ def progress(msg, pct):
8595
LightsManager.set_led(lednr, *color)
8696
LightsManager.write()
8797

88-
def warning(msg):
89-
LightsManager.set_led(3, 96, 58, 21)
98+
def warning(msg="", sleep_ms=0, r=96, g=58, b=21): # default rgb: orange warning
99+
LightsManager.set_led(3, r, g, b)
90100
LightsManager.write()
91-
time.sleep(2)
92-
if msg:
93-
print(msg)
101+
time.sleep_ms(sleep_ms)
102+
print(msg)
94103

95104
def failure(e):
96105
LightsManager.set_led(2, 96, 21, 21)
97106
LightsManager.write()
98107
time.sleep(5)
99-
if e:
100-
print(f"CH32 firmware install failed because exception: {e}")
101-
import sys
102-
sys.print_exception(e)
108+
print(f"CH32 firmware install failed because exception: {e}")
109+
import sys
110+
sys.print_exception(e)
103111

104112
# CH32 coprocessor / IO expander
105113
from drivers.fri3d.expander import Expander
@@ -367,11 +375,6 @@ def startup_wow_effect():
367375
LightsManager.write()
368376
time.sleep_ms(500)
369377

370-
# Hold white, then fade out over 4 seconds
371-
LightsManager.set_all(255, 255, 255)
372-
LightsManager.write()
373-
time.sleep_ms(500)
374-
375378
fade_steps = 80
376379
max_brightness = 128 # instead of 255 because that's too bright
377380
for step in range(fade_steps):

0 commit comments

Comments
 (0)