#!/usr/bin/env python3 """ Unified Device Simulator Entry point for running Pelican or Glory device simulators. """ import argparse import sys from loguru import logger # Import simulators from source.glory import GlorySimulator from source.jetsort import JetSortSimulator from source.pelican import PelicanSimulator from source.selex import SelexSimulator DEFAULT_BAUDRATE = 115200 DEFAULT_PORT = "/dev/ttyUSB0" def main(): parser = argparse.ArgumentParser( description="Device Simulator - Run Pelican, Glory MACH6, Selex, or JetSort 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 # Run Selex simulator python main.py selex --port /dev/ttyUSB2 --baudrate 9600 # Run JetSort simulator python main.py jetsort --port /dev/ttyUSB3 --baudrate 9600 # Get help for specific simulator python main.py pelican --help python main.py glory --help python main.py selex --help python main.py jetsort --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=DEFAULT_PORT, help=f"Serial port (default: {DEFAULT_PORT})", ) pelican_parser.add_argument( "--baudrate", "-b", type=int, default=DEFAULT_BAUDRATE, help=f"Baud rate (default: {DEFAULT_BAUDRATE})", ) # Glory simulator subcommand glory_parser = subparsers.add_parser( "glory", help="Run Glory MACH6 coin counter simulator" ) glory_parser.add_argument( "--port", "-p", default=DEFAULT_PORT, help=f"Serial port (default: {DEFAULT_PORT})", ) glory_parser.add_argument( "--baudrate", "-b", type=int, default=DEFAULT_BAUDRATE, help=f"Baud rate (default: {DEFAULT_BAUDRATE})", ) # Selex simulator subcommand selex_parser = subparsers.add_parser( "selex", help="Run Selex coin counter simulator" ) selex_parser.add_argument( "--port", "-p", default=DEFAULT_PORT, help=f"Serial port (default: {DEFAULT_PORT})", ) selex_parser.add_argument( "--baudrate", "-b", type=int, default=DEFAULT_BAUDRATE, help=f"Baud rate (default: {DEFAULT_BAUDRATE})", ) # JetSort simulator subcommand jetsort_parser = subparsers.add_parser( "jetsort", help="Run JetSort coin/bill counter simulator" ) jetsort_parser.add_argument( "--port", "-p", default=DEFAULT_PORT, help=f"Serial port (default: {DEFAULT_PORT})", ) jetsort_parser.add_argument( "--baudrate", "-b", type=int, default=DEFAULT_BAUDRATE, help=f"Baud rate (default: {DEFAULT_BAUDRATE})", ) args = parser.parse_args() # Configure loguru logger logger.remove() # Remove default handler logger.add( sys.stderr, format=( "{time:YYYY-MM-DD HH:mm:ss.SSS} | " "{level: <8} | " "{message} " "({name}:{function}:{line})" ), level="DEBUG", ) # Run the appropriate simulator try: if args.simulator == "pelican": simulator = PelicanSimulator(port=args.port, baudrate=args.baudrate) simulator.run() elif args.simulator == "glory": simulator = GlorySimulator(port=args.port, baudrate=args.baudrate) simulator.run() elif args.simulator == "selex": simulator = SelexSimulator(port=args.port, baudrate=args.baudrate) simulator.run() elif args.simulator == "jetsort": simulator = JetSortSimulator(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()