commit f5144574f563493e46390ce677fb5ab78e4a2000 Author: david rice Date: Thu Mar 26 11:43:36 2026 +0000 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..16f927c --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Introduction +MIPI TEST - PYTHON APP FOR MIPI TESTING diff --git a/mipi_test.py b/mipi_test.py new file mode 100644 index 0000000..12b7ecb --- /dev/null +++ b/mipi_test.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +""" +MIPI TEST APPLICATION - MIPI_TEST.PY +- ENTRY POINT OF APPLICATION + +VERSION: 1.1 (Integrated Menu) +AUTHOR: D. RICE 25/03/2026 +© 2026 ARRIVE +""" +import vxi11 +import time +import sys +import requests +import threading + +url = f"http://192.168.45.8:5000/display" +test_running = False # Global flag to control the background thread + +# --- Hardware Initialisation --- +try: + psu = vxi11.Instrument("192.168.45.3") + scope = vxi11.Instrument("192.168.45.4") + setup_del = 0.2 +except Exception as e: + print(f"ERROR: CANNOT CONNECT TO INSTRUMENTS: {e}") + sys.exit(1) + +def set_display(state): + """ Helper to handle HTTP PUT with error catching """ + try: + r = requests.put(url, json={"state": state}, timeout=2) + return r.status_code == 200 + + except requests.exceptions.RequestException: + return False + +def test_worker(interval): + """ Background loop that toggles the display """ + global test_running + print(f"\n[TEST STARTED] TOGGLING EVERY {interval} SECONDS. USE MENU TO STOP") + + state = "on" + while test_running: + success = set_display(state) + if not success: + print(f"\n[TEST ERROR] FAILED TO REACH FLASK SERVER... STOPPING TEST...") + test_running = False + break + + # Toggle state for next iteration + state = "off" if state == "on" else "on" + + # Sleep in small increments so we can exit the thread quickly + for _ in range(int(interval * 10)): + if not test_running: break + time.sleep(0.1) + +def main_menu(): + global test_running + + """Main Application Loop.""" + while True: + print("\n=== MIPI TEST CONTROL ===") + print("1. RUN IDN CHECK (PSU & SCOPE)") + print("2. CONFIGURE PSU (DEFAULT 24V/1.5A)") + print("3. PSU OUTPUT ON/OFF (CH1)") + print("4. START FLICKER TEST") + print("5. STOP FLICKER TEST") + print("6. EXIT") + + choice = input("\nSELECT OPTION (1-6): ") + + if choice == '1': + print(f"PSU: {psu.ask('*IDN?')}") + print(f"SCOPE: {scope.ask('*IDN?')}") + elif choice == '2': + psu.write('CH1:VOLT 24.0') + psu.write('CH1:CURR 1.5') + print("PSU CONFIGURED...") + elif choice == '3': + state = input("TYPE 'ON' OR 'OFF': ").upper() + psu.write(f'OUTP CH1,{state}') + elif choice == '4': + if not test_running: + try: + sec = float(input("ENTER tOGGLE INTERVAL IN SECONDS: ")) + test_running = True + t = threading.Thread(target=test_worker, args=(sec,), daemon=True) + t.start() + except ValueError: + print("INVALID TIME ENTERED.") + else: + print("TEST IS ALREADY RUNNING!") + elif choice == '5': + print("STOPPING TEST...") + test_running = False + elif choice == '6': + test_running = False # Ensure thread stops + psu.close() + scope.close() + break + else: + print("INVALID ENTRY. PLEASE CHOOSE 1-6") + +if __name__ == "__main__": + # Optional: Run auto-config on startup + main_menu() \ No newline at end of file