From db57e754602d5416d258b8fc26a8c2418a2064e8 Mon Sep 17 00:00:00 2001 From: Anjini Verdia Date: Sun, 18 Jan 2026 16:38:10 -0500 Subject: [PATCH 1/6] Switched to old uplaod script instead of new --- Testing_Library/upload_wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Testing_Library/upload_wrapper.py b/Testing_Library/upload_wrapper.py index d6305d9..f0b0db7 100644 --- a/Testing_Library/upload_wrapper.py +++ b/Testing_Library/upload_wrapper.py @@ -8,7 +8,7 @@ def upload_firmware(board_name: str): # Construct path to Rivanna3/upload.py script_path = os.path.abspath( - os.path.join(os.path.dirname(__file__), "../../Rivanna3/upload.py") + os.path.join(os.path.dirname(__file__), "../../Rivanna3/upload_old.py") ) # Clean up board name (PowerBoard → power) From cfeeede973a321e1b438c8e095cfd7be2fe5bcf7 Mon Sep 17 00:00:00 2001 From: Colby Wise Date: Sun, 18 Jan 2026 17:00:16 -0500 Subject: [PATCH 2/6] Updated reset test --- Testing_Library/gpioPins.py | 24 ++++++++++++------------ Testing_Library/sandbox.py | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 Testing_Library/sandbox.py diff --git a/Testing_Library/gpioPins.py b/Testing_Library/gpioPins.py index 2a59001..7ea29f4 100644 --- a/Testing_Library/gpioPins.py +++ b/Testing_Library/gpioPins.py @@ -47,22 +47,22 @@ def reset_all_pins() -> None: pass #TODO def reset_nucleo() -> None: - print("[RESET] Resetting Nucleo via PC10...") + print("[RESET] Resetting Nucleo via GPIO3...") - # intiialize reset pin as output (active low) - reset_pin = DigitalOutput(14) + # intiialize reset pin as output (active low) + reset_pin = gpiozero.DigitalOutputDevice("GPIO3") - try: - # hold reset low - reset_pin.write(False) - time.sleep(0.1) # 100 ms pulse + try: + # hold reset low + reset_pin.off() + time.sleep(0.1) # 100 ms pulse - # release reset (set high) - reset_pin.write(True) + # release reset (set high) + reset_pin.on() - print("[RESET] Nucleo reset complete.") - finally: - pass + print("[RESET] Nucleo reset complete.") + finally: + pass class DigitalOutput: diff --git a/Testing_Library/sandbox.py b/Testing_Library/sandbox.py new file mode 100644 index 0000000..15bcfe7 --- /dev/null +++ b/Testing_Library/sandbox.py @@ -0,0 +1,23 @@ +import sys +sys.path.append("/home/solarcar/solarcar/HiL_Testing/Server") + +import gpiozero +import time + + +print("[RESET] Resetting Nucleo via GPIO3...") + +# intiialize reset pin as output (active low) +reset_pin = gpiozero.DigitalOutputDevice("GPIO3") + +try: + # hold reset low + reset_pin.off() + time.sleep(0.1) # 100 ms pulse + + # release reset (set high) + reset_pin.on() + + print("[RESET] Nucleo reset complete.") +finally: + pass From c07877c0b4a4d835dd34a9d31d7b6ae75dc3e0d7 Mon Sep 17 00:00:00 2001 From: Anjini Verdia Date: Sun, 15 Mar 2026 15:36:38 -0400 Subject: [PATCH 3/6] Added monitoring for tests --- Server/TestRunner.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/Server/TestRunner.py b/Server/TestRunner.py index fa2aa42..a17dfad 100644 --- a/Server/TestRunner.py +++ b/Server/TestRunner.py @@ -43,6 +43,17 @@ def make_suite(board_folder): return discovered_tests def run_tests() -> None: + + # monitor script + import subprocess, datetime + + ts = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + os.makedirs("logs", exist_ok=True) + serial_log = os.path.abspath(f"logs/{ts}_serial.txt") + + monitor_proc = subprocess.Popen([sys.executable, "monitor.py", "--log", serial_log]) + print(f"[ARTIFACT] serial_log={serial_log}") + board_names = config.REPO_CONFIG["boards"].keys() print("DEBUG: Boards in config:", board_names) @@ -61,7 +72,14 @@ def run_tests() -> None: else: print(f"Warning: Folder for board '{board}' not found at path: {board_folder}") - with open("test-results.xml", "wb") as output: - runner = xmlrunner.XMLTestRunner(output=output, buffer=True) - runner.run(all_suites) + try: + with open("test-results.xml", "wb") as output: + runner = xmlrunner.XMLTestRunner(output=output, buffer=True) + runner.run(all_suites) + finally: + monitor_proc.terminate() + try: + monitor_proc.wait(timeout=2) + except Exception: + monitor_proc.kill() From 888476687061e7d1c3ae6145403e8beafeb087f7 Mon Sep 17 00:00:00 2001 From: Anjini Verdia Date: Sun, 15 Mar 2026 15:43:25 -0400 Subject: [PATCH 4/6] debug statements --- Server/TestRunner.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Server/TestRunner.py b/Server/TestRunner.py index a17dfad..6f5c230 100644 --- a/Server/TestRunner.py +++ b/Server/TestRunner.py @@ -43,7 +43,10 @@ def make_suite(board_folder): return discovered_tests def run_tests() -> None: - + print("=== ENTERED run_tests() ===") + print("CWD:", os.getcwd()) + print("TestRunner file:", __file__) + # monitor script import subprocess, datetime From dd9100d33cdf1ce127ebfaeb296538603e38050c Mon Sep 17 00:00:00 2001 From: Anjini Verdia Date: Sun, 15 Mar 2026 15:52:15 -0400 Subject: [PATCH 5/6] Serial logging fixes --- Server/TestRunner.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Server/TestRunner.py b/Server/TestRunner.py index 6f5c230..24d2ed6 100644 --- a/Server/TestRunner.py +++ b/Server/TestRunner.py @@ -43,19 +43,22 @@ def make_suite(board_folder): return discovered_tests def run_tests() -> None: - print("=== ENTERED run_tests() ===") - print("CWD:", os.getcwd()) - print("TestRunner file:", __file__) - # monitor script - import subprocess, datetime + import subprocess, datetime, time ts = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") os.makedirs("logs", exist_ok=True) serial_log = os.path.abspath(f"logs/{ts}_serial.txt") - monitor_proc = subprocess.Popen([sys.executable, "monitor.py", "--log", serial_log]) + monitor_path = "/absolute/path/to/Rivanna3/monitor.py" # <-- set this once + monitor_proc = subprocess.Popen( + [sys.executable, monitor_path, "--log", serial_log], + cwd=os.path.dirname(monitor_path), # important: run from monitor's folder + stdout=open(os.path.join(serial_log, "monitor_stdout.log"), "ab"), + stderr=open(os.path.join(serial_log, "monitor_stderr.log"), "ab"), + ) print(f"[ARTIFACT] serial_log={serial_log}") + print(f"[DEBUG] monitor_path={monitor_path}") board_names = config.REPO_CONFIG["boards"].keys() print("DEBUG: Boards in config:", board_names) From b06207f44a208a4a4151b4c0a7e156140789ac97 Mon Sep 17 00:00:00 2001 From: Colby Wise Date: Sun, 15 Mar 2026 16:35:18 -0400 Subject: [PATCH 6/6] fixes --- Server/TestRunner.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Server/TestRunner.py b/Server/TestRunner.py index 24d2ed6..588713e 100644 --- a/Server/TestRunner.py +++ b/Server/TestRunner.py @@ -50,12 +50,12 @@ def run_tests() -> None: os.makedirs("logs", exist_ok=True) serial_log = os.path.abspath(f"logs/{ts}_serial.txt") - monitor_path = "/absolute/path/to/Rivanna3/monitor.py" # <-- set this once + monitor_path = "/home/solarcar/solarcar/Rivanna3/monitor.py" monitor_proc = subprocess.Popen( [sys.executable, monitor_path, "--log", serial_log], cwd=os.path.dirname(monitor_path), # important: run from monitor's folder - stdout=open(os.path.join(serial_log, "monitor_stdout.log"), "ab"), - stderr=open(os.path.join(serial_log, "monitor_stderr.log"), "ab"), + stdout=open(os.path.join("logs", "monitor_stdout.log"), "ab"), + stderr=open(os.path.join("logs", "monitor_stderr.log"), "ab"), ) print(f"[ARTIFACT] serial_log={serial_log}") print(f"[DEBUG] monitor_path={monitor_path}")