#!/usr/bin/env python3 import click import serial.tools.list_ports from helpers import CliContext, Logger, EepromProgrammer @click.group() @click.option('--device', '-d', default='/dev/ttyUSB0', show_default=True, metavar='DEVICE', help="Set the serial device") @click.option('--baud', '-b', default=38400, show_default=True, metavar='BAUDRATE', help="Set the baud rate of the serial device") @click.option('--verbose', '-v', is_flag=True, help='Print debug output') @click.pass_context def eepprog(ctx: click.Context, device: str, baud: int, verbose: bool) -> None: # Create dependencies logger = Logger(verbose=verbose) eeprom_programmer = EepromProgrammer(logger=logger, device=device, baudrate=baud) # Create CLI context logger.debug("Creating CLI context") ctx.obj = CliContext( logger=logger, eeprom_programmer=eeprom_programmer, ) # Define clean up functions ctx.call_on_close(eeprom_programmer.close) @eepprog.command('hello', short_help='Say hello. :)') @click.pass_obj def hello(context: CliContext) -> None: """ Say hello. :) Just a test command that tests the logger. """ context.logger.debug('hello hello', 413, 'hellooo') context.logger.info('hello!') context.logger.info('the same', click.style('but in green!', fg='green')) context.logger.warn('this is fine') context.logger.error('ohno') context.logger.error('error, but a friendly one :)', fg='green') context.logger.success('yay!') @eepprog.command('test', short_help="Send INIT command to the programmer and read answer") @click.pass_obj def test(context: CliContext) -> None: """ Send an 'INIT' command to the programmer and read the answer. Test command for debugging. """ context.eeprom_programmer.test_command() @eepprog.command('list-devices', short_help="List available serial ports") @click.pass_obj def list_devices(context: CliContext) -> None: """ List serial ports that are available on the system. Internally uses 'serial.tools.list_ports' of pySerial. """ context.logger.debug("Getting list of serial ports") ports = serial.tools.list_ports.comports() context.logger.debug() # Print empty line click.echo("Found {} serial ports:".format(len(ports))) for port in ports: click.echo('' + str(port)) # TODO shell: Run an interactive shell if __name__ == '__main__': eepprog(max_content_width=120)