diff --git a/Server/TestRunner.py b/Server/TestRunner.py index 765ce8a..b891c33 100644 --- a/Server/TestRunner.py +++ b/Server/TestRunner.py @@ -35,6 +35,23 @@ def make_suite(board_folder): return discovered_tests def run_tests() -> None: + # monitor script + 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_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("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}") + board_names = config.REPO_CONFIG["boards"].keys() all_suites = unittest.TestSuite() @@ -50,6 +67,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() + 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 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)