From: Francis Guevarra Date: Fri, 22 Nov 2019 00:23:37 +0000 (-0800) Subject: Add a singleton Connection class to get the same object instance of the binho nova... X-Git-Tag: 3.1.0^2~11 X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/commitdiff_plain/990be458b9a4ee22dcffc871acdd5af9869d4722 Add a singleton Connection class to get the same object instance of the binho nova adapter --- diff --git a/src/adafruit_blinka/microcontroller/nova/__init__.py b/src/adafruit_blinka/microcontroller/nova/__init__.py index e69de29..c3aec31 100644 --- a/src/adafruit_blinka/microcontroller/nova/__init__.py +++ b/src/adafruit_blinka/microcontroller/nova/__init__.py @@ -0,0 +1,24 @@ +class Connection: + __instance = None + @staticmethod + def getInstance(): + """ Static access method. """ + if Connection.__instance == None: + Connection() + return Connection.__instance + + def __init__(self): + """ Virtually private constructor. """ + if Connection.__instance != None: + raise Exception("This class is a singleton!") + else: + from binhoHostAdapter import binhoHostAdapter + from binhoHostAdapter import binhoUtilities + + utilities = binhoUtilities.binhoUtilities() + devices = utilities.listAvailableDevices() + + if len(devices) > 0: + Connection.__instance = binhoHostAdapter.binhoHostAdapter(devices[0]) + else: + raise RuntimeError('No Binho host adapter found!') \ No newline at end of file diff --git a/src/adafruit_blinka/microcontroller/nova/i2c.py b/src/adafruit_blinka/microcontroller/nova/i2c.py index bf36e2a..f5ee718 100644 --- a/src/adafruit_blinka/microcontroller/nova/i2c.py +++ b/src/adafruit_blinka/microcontroller/nova/i2c.py @@ -1,25 +1,12 @@ -#from adafruit_blinka.microcontroller.nova.pin import Pin - class I2C: def __init__(self): - # change GPIO controller to I2C - from binhoHostAdapter import binhoHostAdapter - from binhoHostAdapter import binhoUtilities - - utilities = binhoUtilities.binhoUtilities() - devices = utilities.listAvailableDevices() - - if len(devices) > 0: - - self._nova = binhoHostAdapter.binhoHostAdapter(devices[0]) - self._nova.setNumericalBase(10) - self._nova.setOperationMode(0, "I2C") - self._nova.setPullUpStateI2C(0, "EN") - self._nova.setClockI2C(0, 400000) - - else: - raise RuntimeError('No Binho host adapter found!') + from adafruit_blinka.microcontroller.nova import Connection + self._nova = Connection.getInstance() + self._nova.setNumericalBase(10) + self._nova.setOperationMode(0, "I2C") + self._nova.setPullUpStateI2C(0, "EN") + self._nova.setClockI2C(0, 400000) def scan(self): diff --git a/src/adafruit_blinka/microcontroller/nova/pin.py b/src/adafruit_blinka/microcontroller/nova/pin.py index 320e67b..5a58372 100644 --- a/src/adafruit_blinka/microcontroller/nova/pin.py +++ b/src/adafruit_blinka/microcontroller/nova/pin.py @@ -13,14 +13,8 @@ class Pin: def __init__(self, pin_id=None): if not Pin._nova: - from binhoHostAdapter import binhoHostAdapter - from binhoHostAdapter import binhoUtilities - - utilities = binhoUtilities.binhoUtilities() - devices = utilities.listAvailableDevices() - - if len(devices) > 0: - Pin._nova = binhoHostAdapter.binhoHostAdapter(devices[0]) + from adafruit_blinka.microcontroller.nova import Connection + Pin._nova = Connection.getInstance() # check if pin is valid if pin_id > 4: raise ValueError("Invalid pin {}.".format(pin_id)) @@ -55,9 +49,9 @@ IO3 = Pin(3) IO4 = Pin(4) PWM0 = IO0 -PWM1 = IO1 +# No PWM support on IO1 PWM2 = IO2 -# No PWM support on IO3 +PWM3 = IO3 PWM4 = IO4 -pwmOuts = ( ((1, 0), PWM0), ((1, 1), PWM1), ((1, 2), PWM2), ((1, 4), PWM4) ) \ No newline at end of file +pwmOuts = ( ((1, 0), PWM0), ((1, 2), PWM2), ((1, 3), PWM3), ((1, 4), PWM4) ) \ No newline at end of file diff --git a/src/adafruit_blinka/microcontroller/nova/pwmout.py b/src/adafruit_blinka/microcontroller/nova/pwmout.py index 57aa0e5..2f4e4b5 100644 --- a/src/adafruit_blinka/microcontroller/nova/pwmout.py +++ b/src/adafruit_blinka/microcontroller/nova/pwmout.py @@ -38,20 +38,8 @@ class PWMOut(object): """ if PWMOut._nova is None: - if Pin._nova is not None: - # check if Pin already connected to Binho Nova - PWMOut._nova = Pin._nova - else: - from binhoHostAdapter import binhoHostAdapter - from binhoHostAdapter import binhoUtilities - - utilities = binhoUtilities.binhoUtilities() - devices = utilities.listAvailableDevices() - - if len(devices) > 0: - PWMOut._nova = binhoHostAdapter.binhoHostAdapter(devices[0]) - else: - raise RuntimeError('No Binho Host Adapter found!') + from adafruit_blinka.microcontroller.nova import Connection + PWMOut._nova = Connection.getInstance() self._pwmpin = None self._open(pin, duty_cycle, frequency, variable_frequency) @@ -80,7 +68,6 @@ class PWMOut(object): # set frequency self.frequency = freq - PWMOut._nova.setIOpinPWMFreq(self._pwmpin, self.frequency) # set period self._period = self._get_period() @@ -95,14 +82,7 @@ class PWMOut(object): if self._channel is not None: #self.duty_cycle = 0 self._set_enabled(False) # make to disable before unexport - """ - try: - #unexport_path = os.path.join(channel_path, self._unexport_path) - with open(os.path.join(channel_path, self._unexport_path), "w") as f_unexport: - f_unexport.write("%d\n" % self._pwmpin) - except IOError as e: - raise PWMError(e.errno, "Unexporting PWM pin: " + e.strerror) - """ + except Exception as e: # due to a race condition for which I have not yet been # able to find the root cause, deinit() often fails diff --git a/src/adafruit_blinka/microcontroller/nova/spi.py b/src/adafruit_blinka/microcontroller/nova/spi.py index d92d2d7..0088ef2 100644 --- a/src/adafruit_blinka/microcontroller/nova/spi.py +++ b/src/adafruit_blinka/microcontroller/nova/spi.py @@ -1,32 +1,21 @@ -#from adafruit_blinka.microcontroller.nova.pin import Pin - class SPI: PAYLOAD_MAX_LENGTH = 64 def __init__(self, clock): - from binhoHostAdapter import binhoHostAdapter - from binhoHostAdapter import binhoUtilities - - utilities = binhoUtilities.binhoUtilities() - devices = utilities.listAvailableDevices() - - if len(devices) > 0: - self._nova = binhoHostAdapter.binhoHostAdapter(devices[0]) - self._nova.setOperationMode(0, 'SPI') - self._nova.setClockSPI(0, clock) - self._nova.setModeSPI(0, 0) - self._nova.setIOpinMode(0, 'DOUT') - self._nova.setIOpinValue(0, 'HIGH') - self._nova.beginSPI(0) - # Cpol and Cpha set by mode - # Mode Cpol Cpha - # 0 0 0 - # 1 0 1 - # 2 1 0 - # 3 1 1 - - else: - raise RuntimeError('No Binho host adapter found!') + from adafruit_blinka.microcontroller.nova import Connection + self._nova = Connection.getInstance() + self._nova.setOperationMode(0, 'SPI') + self._nova.setClockSPI(0, clock) + self._nova.setModeSPI(0, 0) + self._nova.setIOpinMode(0, 'DOUT') + self._nova.setIOpinValue(0, 'HIGH') + self._nova.beginSPI(0) + # Cpol and Cpha set by mode + # Mode Cpol Cpha + # 0 0 0 + # 1 0 1 + # 2 1 0 + # 3 1 1 def init(self, baudrate=100000, polarity=0, phase=0, bits=8, firstbit=MSB, sck=None, mosi=None, miso=None):