#!/usr/bin/python3

import time
import argparse

import pyftdi
from pyftdi.ftdi import Ftdi
from pyftdi.gpio import GpioController


parser = argparse.ArgumentParser()
parser.add_argument("--rom", help="reboot into rom",
                    action="store_true", default=False)
parser.add_argument("--fastboot", help="reboot into fastboot",
                    action="store_true", default=False)


class DebugBoard(object):
  """DebugBoard is used to control excelsior reset."""
  GPIO_MASK = 0xc0
  RESET_OUTPINS = 0xc0
  BOOT_NORMAL_OUTPINS = 0x0
  BOOT_ROM_OUTPINS = 0x40

  def __init__(self, url ='ftdi://0x0403:0x6011/2'):
    """Create gpio controller and select device."""
    self._gpio = GpioController()
    self._url = url

  def _write(self, value):
    """Set the direction on the GPIOs

    Since the GPIO to control the Excelsior or pullup,
    simply enabling the GPIO has the result of pulling them low.
    Setting the GPIO to input allows them to be pulled up.
    """
    self._gpio.set_direction(self.GPIO_MASK, value)

  def _reset(self):
    """Set the GPIO to hold the board in reset."""
    self._write(self.RESET_OUTPINS)

  def _boot_normal(self):
    """Set the gpio to boot the board."""
    self._write(self.BOOT_NORMAL_OUTPINS)

  def _boot_rom(self):
    """Set the gpio to boot the board to the ROM."""
    self._write(self.BOOT_ROM_OUTPINS)

  def __enter__(self):
    """Connect to the FTDI interface."""
    self._gpio.open_from_url(self._url, self.BOOT_NORMAL_OUTPINS)
    return self

  def reset(self, boot_rom=False, fastboot=False):
    """Reset the excelsior, and boot normal or to the ROM."""
    self._reset()
    time.sleep(0.1)
    if boot_rom:
      print("Booting ROM")
      self._boot_rom()
      time.sleep(5.0)
    elif fastboot:
      print("Booting fastboot")
      self._boot_rom()
      time.sleep(10.0)
    else:
      print("Booting LK")
      self._boot_normal()
      time.sleep(0.1)

  def __exit__(self, exc_type, value, traceback):
    """On exit close the connection to the FTDI device."""
    self._gpio.close()


if __name__ == "__main__":
  args = parser.parse_args()
  try:
    with DebugBoard() as board:
      board.reset(boot_rom=args.rom, fastboot=args.fastboot)
  except pyftdi.usbtools.UsbToolsError:
    print("*" * 70)
    print("Unable to connect to debug board, check connection or manually toggle GPIO.")
    print("*" * 70)
    time.sleep(5)
