#!/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.pelican import PelicanSimulator
from source.selex import SelexSimulator
def main():
parser = argparse.ArgumentParser(
description="Device Simulator - Run Pelican, Glory MACH6, or Selex 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
# Get help for specific simulator
python main.py pelican --help
python main.py glory --help
python main.py selex --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)"
)
# Selex simulator subcommand
selex_parser = subparsers.add_parser(
"selex", help="Run Selex coin counter simulator"
)
selex_parser.add_argument(
"--port",
"-p",
default="/dev/ttyUSB0",
help="Serial port (default: /dev/ttyUSB0)",
)
selex_parser.add_argument(
"--baudrate", "-b", type=int, default=9600, help="Baud rate (default: 9600)"
)
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()
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()