83 lines
2.6 KiB
Python
Executable File
83 lines
2.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import click
|
|
import serial.tools.list_ports
|
|
|
|
from helpers import CliContext, Logger, EepromProgrammer
|
|
from helpers.click import CategorizedGroup
|
|
|
|
|
|
@click.group(cls=CategorizedGroup)
|
|
@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', category='Test commands', 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', category='Test commands', 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', category='Helper commands', 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)
|