#!/usr/bin/env python3 """ Unified Device Simulator Entry point for running Pelican or Glory device simulators. """ import argparse import logging import sys from glory import GlorySimulator # Import simulators from pelican import PelicanSimulator LOG_LEVEL = logging.DEBUG def main(): parser = argparse.ArgumentParser( description="Device Simulator - Run Pelican or Glory MACH6 simulator", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: # Run Pelican simulator python main.py pelican --port /dev/ttyUSB0 # Run Glory simulator python main.py glory --port /dev/ttyUSB1 --baudrate 9600 # Get help for specific simulator python main.py pelican --help python main.py glory --help """, ) # Add subparsers for each simulator type subparsers = parser.add_subparsers( dest="simulator", help="Simulator type to run", required=True ) # Pelican simulator subcommand pelican_parser = subparsers.add_parser( "pelican", help="Run Pelican coin counter simulator" ) pelican_parser.add_argument( "--port", "-p", default="/dev/ttyUSB0", help="Serial port (default: /dev/ttyUSB0)", ) pelican_parser.add_argument( "--baudrate", "-b", type=int, default=115200, help="Baud rate (default: 115200)" ) # Glory simulator subcommand glory_parser = subparsers.add_parser( "glory", help="Run Glory MACH6 coin counter simulator" ) glory_parser.add_argument( "--port", "-p", default="/dev/ttyUSB0", help="Serial port (default: /dev/ttyUSB0)", ) glory_parser.add_argument( "--baudrate", "-b", type=int, default=115200, help="Baud rate (default: 115200)" ) args = parser.parse_args() # Setup centralized logger logging.basicConfig( level=LOG_LEVEL, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", ) logger = logging.getLogger(f"{args.simulator}_simulator") # Run the appropriate simulator try: if args.simulator == "pelican": simulator = PelicanSimulator( logger=logger, port=args.port, baudrate=args.baudrate ) simulator.run() elif args.simulator == "glory": simulator = GlorySimulator( logger=logger, port=args.port, baudrate=args.baudrate ) simulator.run() except KeyboardInterrupt: logger.info("Simulator stopped by user") sys.exit(0) except Exception as e: logger.error(f"Error: {e}", exc_info=True) sys.exit(1) if __name__ == "__main__": main()