Files
coin-counter-simulators/main.py
2025-11-05 09:21:59 +01:00

131 lines
3.7 KiB
Python

#!/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
""",
)
def add_common_arguments(subparser: argparse.ArgumentParser):
subparser.add_argument(
"--port",
"-p",
default=DEFAULT_PORT,
help=f"Serial port (default: {DEFAULT_PORT})",
)
subparser.add_argument(
"--baudrate",
"-b",
type=int,
default=DEFAULT_BAUDRATE,
help=f"Baud rate (default: {DEFAULT_BAUDRATE})",
)
# 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"
)
add_common_arguments(pelican_parser)
# Glory simulator subcommand
glory_parser = subparsers.add_parser(
"glory", help="Run Glory MACH6 coin counter simulator"
)
add_common_arguments(glory_parser)
# Selex simulator subcommand
selex_parser = subparsers.add_parser(
"selex", help="Run Selex coin counter simulator"
)
add_common_arguments(selex_parser)
# JetSort simulator subcommand
jetsort_parser = subparsers.add_parser(
"jetsort", help="Run JetSort coin/bill counter simulator"
)
add_common_arguments(jetsort_parser)
args = parser.parse_args()
# Configure loguru logger
logger.remove() # Remove default handler
logger.add(
sys.stderr,
format=(
"<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
"<level>{level: <8}</level> | "
"<level>{message}</level> "
"<cyan>({name}</cyan>:<cyan>{function}</cyan>:<cyan>{line})</cyan>"
),
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()