3     PAYLOAD_MAX_LENGTH = 64
 
   5     def __init__(self, clock):
 
   6         from adafruit_blinka.microcontroller.nova import Connection
 
   7         self._nova = Connection.getInstance()
 
   8         self._nova.setNumericalBase(10)
 
   9         self._nova.setOperationMode(0, 'SPI')
 
  10         self._nova.setClockSPI(0, clock)
 
  11         self._nova.setModeSPI(0, 0)
 
  12         self._nova.setIOpinMode(0, 'DOUT')
 
  13         self._nova.setIOpinMode(1, 'DOUT')
 
  14         self._nova.beginSPI(0)
 
  16         # Cpol and Cpha set by mode
 
  23     def init(self, baudrate=100000, polarity=0, phase=0, bits=8,
 
  24              firstbit=MSB, sck=None, mosi=None, miso=None):
 
  25         #print("baudrate: " + str(baudrate))
 
  26         #print("mode: " + str((polarity<<1) | (phase)))
 
  27         self._nova.setClockSPI(0, baudrate)
 
  28         self._nova.setModeSPI(0, (polarity<<1) | (phase))
 
  31     def get_received_data(lineOutput):
 
  32         return (lineOutput.split('RXD ')[1])
 
  36         return self._nova.getClockSPI(0).split('CLK ')[1]
 
  38     def write(self, buf, start=0, end=None):
 
  39         end = end if end else len(buf)
 
  40         chunks, rest = divmod(end - start, self.PAYLOAD_MAX_LENGTH)
 
  41         for i in range(chunks):
 
  42             chunk_start = start + i * self.PAYLOAD_MAX_LENGTH
 
  43             chunk_end = chunk_start + self.PAYLOAD_MAX_LENGTH
 
  44             buffer_data = buf[chunk_start:chunk_end]
 
  45             self._nova.clearBuffer(0)
 
  46             self._nova.writeToBuffer(0, 0, buffer_data)
 
  47             self._nova.transferBufferSPI(0, chunk_end - chunk_start + 1)
 
  49             buffer_data = buf[-1*rest:]
 
  50             self._nova.clearBuffer(0)
 
  51             self._nova.writeToBuffer(0, 0, buffer_data)
 
  52             self._nova.transferBufferSPI(0, rest)
 
  54     def readinto(self, buf, start=0, end=None, write_value=0):
 
  55         end = end if end else len(buf)
 
  56         for i in range(start, end):
 
  57             buf[start+i] = int(self.get_received_data(self._nova.transferSPI(0, write_value)))
 
  59     def write_readinto(self, buffer_out, buffer_in, out_start=0, out_end=None, in_start=0, in_end=None):
 
  60         out_end = out_end if out_end else len(buffer_out)
 
  61         in_end = in_end if in_end else len(buffer_in)
 
  62         readlen = in_end-in_start
 
  63         writelen = out_end-out_start
 
  64         if readlen > writelen:
 
  65             # resize out and pad with 0's
 
  66             tmp = bytearray(buffer_out)
 
  67             tmp.extend([0] * (readlen - len(buffer_out)))
 
  70         for data_out in buffer_out:
 
  71             data_in = int(self.get_received_data(self._nova.transferSPI(0, data_out)))
 
  73                 buffer_in[in_start+i] = data_in