#!/usr/bin/env python3

import struct

from pyftdi.spi import SpiController


class BoardControlBase(object):

	def __init__(self, addr='ftdi://ftdi:2232h/1', spi_frequency=30e6, spi_cs=None):
		# SPI link
		self.spi_frequency = spi_frequency
		self.spi = SpiController(cs_count=3)
		self.spi.configure(addr)

		if spi_cs is not None:
			self.slave = self.spi.get_port(cs=spi_cs, freq=self.spi_frequency, mode=0)
		else:
			self.slave = self._spi_probe()

	def _spi_probe(self):
		for cs in [0, 2]:
			port = self.spi.get_port(cs=cs, freq=self.spi_frequency, mode=0)
			r = port.exchange(b'\x00', duplex=True)[0]
			if r != 0xff:
				return port
		raise RuntimeError('Automatic SPI CS probe failed')

	def reg_w16(self, reg, v):
		self.slave.exchange(struct.pack('>BH', reg, v))

	def reg_w8(self, reg, v):
		self.slave.exchange(struct.pack('>BB', reg, v))

	def reg_burst(self, reg, data):
		self.slave.exchange(bytearray([reg]) + data)

	def read_status(self):
		rv = self.slave.exchange(bytearray(2), duplex=True)
		return rv[0] | rv[1]


def arg_group_setup(group):
	group.add_argument('--spi-freq',  type=float, help='SPI frequency in MHz', default=30.0)
	group.add_argument('--spi-cs',    type=int,   help='SPI slave select id (-1 = probe)', default=-1)
	group.add_argument('--ftdi-addr', type=str,   help='FTDI address', default='ftdi://ftdi:2232h/1')


def arg_to_kwargs(args):
	return {
		'spi_frequency': args.spi_freq * 1e6,
		'spi_cs': args.spi_cs if (args.spi_cs >= 0) else None,
		'addr': args.ftdi_addr,
	}