Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions pio-scripts/conditional_usb_mode.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/usr/bin/env python3
"""
Conditional USB Mode Script for WLED-MM

This script automatically sets ARDUINO_USB_MODE based on the build context:
- For development builds: ARDUINO_USB_MODE=1 (allows USB debugging)
- For release builds (CI): ARDUINO_USB_MODE=0 (allows normal boot without USB debugger)

The script detects release builds by checking for the WLED_RELEASE environment variable
which is set to True in the GitHub Actions CI workflow.
"""

Import('env')
import os

def conditional_usb_mode(env):
"""
Conditionally set ARDUINO_USB_MODE based on build context.

For ESP32-C3, ESP32-S2, and ESP32-S3 variants:
- Development builds: ARDUINO_USB_MODE=1 (default, good for debugging)
- Release builds: ARDUINO_USB_MODE=0 (prevents hanging without USB debugger)
"""

# Check if this is a release build (CI sets WLED_RELEASE=True)
is_release_build = os.environ.get('WLED_RELEASE', '').lower() in ('true', '1', 'yes')

if is_release_build:
print("WLED Release build detected - setting ARDUINO_USB_MODE=0 for production")

# Find and modify ARDUINO_USB_MODE in build flags
build_flags = env.get('BUILD_FLAGS', [])
cpp_defines = env.get('CPPDEFINES', [])

# Look through CPPDEFINES and modify ARDUINO_USB_MODE if found
modified = False
new_defines = []

for define in cpp_defines:
if isinstance(define, (list, tuple)) and len(define) == 2:
if define[0] == 'ARDUINO_USB_MODE' and define[1] == '1':
# Change ARDUINO_USB_MODE from 1 to 0 for release builds
new_defines.append(('ARDUINO_USB_MODE', '0'))
modified = True
print(f" Changed ARDUINO_USB_MODE from 1 to 0")
else:
new_defines.append(define)
else:
new_defines.append(define)

if modified:
env.Replace(CPPDEFINES=new_defines)

# Also check raw build flags for -DARDUINO_USB_MODE=1
new_build_flags = []
for flag in build_flags:
if isinstance(flag, str) and 'ARDUINO_USB_MODE=1' in flag:
# Replace ARDUINO_USB_MODE=1 with ARDUINO_USB_MODE=0
new_flag = flag.replace('ARDUINO_USB_MODE=1', 'ARDUINO_USB_MODE=0')
new_build_flags.append(new_flag)
modified = True
print(f" Modified build flag: {flag} -> {new_flag}")
else:
new_build_flags.append(flag)

if modified:
env.Replace(BUILD_FLAGS=new_build_flags)

else:
print("Development build detected - keeping ARDUINO_USB_MODE=1 for debugging")

# Apply the conditional USB mode logic
conditional_usb_mode(env)
1 change: 1 addition & 0 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ ldscript_16m14m = eagle.flash.16m14m.ld
extra_scripts =
pre:pio-scripts/set_version.py
pre:pio-scripts/build-html.py
pre:pio-scripts/conditional_usb_mode.py
post:pio-scripts/output_bins.py
post:pio-scripts/strip-floats.py
pre:pio-scripts/user_config_copy.py
Expand Down