Files
solutions_season_unearthed/utils/combine_runs.py
2025-10-04 00:32:41 +00:00

134 lines
5.0 KiB
Python

# Guys please use the same setup code and put into the imports for consistency
script_names = ["Run1.py", "Run2.py", "Run3.py", "Run5.py", "Run6.py"] # This is a list of the files of the mission runs
content = ""
imports = """
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor
from pybricks.parameters import Port, Stop, Color, Direction
from pybricks.robotics import DriveBase
from pybricks.tools import wait, StopWatch, multitask, run_task
import asyncio
hub = PrimeHub()
left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right_motor = Motor(Port.B)
atarm1 = Motor(Port.E, Direction.COUNTERCLOCKWISE)
atarm2 = Motor(Port.F)
drive_base = DriveBase(left_motor, right_motor, wheel_diameter=56, axle_track=112)
color_sensor = ColorSensor(Port.C)
drive_base.settings(300, 500, 300, 200)
Color.ORANGE = Color(10, 100, 100)
Color.MAGENTA = Color(321, 100, 86)
"""
def extract_main_function(content):
lines = content.split('\n')
main_content = []
in_main_function = False
main_indent = 0
is_async = False
for line in lines:
stripped_line = line.strip()
# Find the start of main function
if stripped_line.startswith('def main') or stripped_line.startswith('async def main'):
in_main_function = True
is_async = stripped_line.startswith('async def main')
continue
if in_main_function:
# If we hit another function or class definition at the same level, we're done
if stripped_line and not line.startswith(' ') and not line.startswith('\t'):
if stripped_line.startswith('def ') or stripped_line.startswith('class '):
break
# Skip the first line after def main() if it's empty
if not stripped_line and not main_content:
continue
# If this is the first content line, determine the indent level
if main_content == [] and stripped_line:
main_indent = len(line) - len(line.lstrip())
# Remove the main function's indentation
if line.strip(): # Don't process empty lines
if len(line) - len(line.lstrip()) >= main_indent:
main_content.append(line[main_indent:])
else:
main_content.append(line)
else:
main_content.append('') # Keep empty lines
return '\n'.join(main_content), is_async
# Clear the main.py file and write the required imports
with open("main.py", 'w') as required_imports:
required_imports.write(imports)
function_calls = []
# Define colors properly - one per script
colors = [
'Color.ORANGE', 'Color.GREEN', 'Color.WHITE',
'Color.YELLOW', 'Color.BLUE', 'Color.MAGENTA', 'Color.RED', 'Color.BROWN'
]
# Process each script file and create individual functions
for i, f_name in enumerate(script_names):
try:
with open(f_name, 'r') as f:
content = f.read()
# Extract only the main function content
main_function_content, is_async = extract_main_function(content)
if main_function_content.strip(): # Only proceed if it found main function content
func_name = f_name.replace('.py', '').replace('-', '_')
func_def = f"\n{'async ' if is_async else ''}def {func_name}():\n"
indented_content = '\n'.join([' ' + line if line.strip() else line for line in main_function_content.split('\n')])
func_def += indented_content + "\n"
with open("main.py", 'a') as m:
m.write(func_def)
# Assign one color per script
color_condition = colors[i]
function_calls.append({
'name': func_name,
'is_async': is_async,
'color': color_condition,
'filename': f_name
})
else:
print(f"Warning: No main() function found in {f_name}")
except FileNotFoundError:
print(f"Warning: File {f_name} not found")
# Write the main function that checks colors and calls appropriate functions
with open("main.py", 'a') as m:
m.write("\nasync def main():\n")
for func_info in function_calls:
m.write(f" if color_sensor.color() == {func_info['color']}:\n")
if func_info['is_async']:
m.write(f" await {func_info['name']}()\n")
else:
m.write(f" {func_info['name']}()\n")
m.write(" \n")
# Add a default case
m.write(" \n")
m.write(" print(f'Detected color: {color_sensor.color()}')\n")
# Write the main loop
with open("main.py", 'a') as m:
m.write("\n# Main execution loop\n")
m.write("while True:\n")
m.write(" run_task(main())\n")
m.write(" wait(100)\n")