* Author(s): cefn
  """
  
+ import threading
+ 
  from adafruit_blinka import Enum, Lockable, agnostic
  from adafruit_blinka.agnostic import board_id, detector
  import adafruit_platformdetect.board as ap_board
                  self._i2c = _I2C(portId, mode=_I2C.MASTER, baudrate=frequency)
                  break
          else:
 -            raise NotImplementedError(
 +            raise ValueError(
                  "No Hardware I2C on (scl,sda)={}\nValid I2C ports: {}".format((scl, sda), i2cPorts)
              )
  
+         self._lock = threading.RLock()
+ 
      def deinit(self):
          try:
              del self._i2c
              pass
  
      def __enter__(self):
+         self._lock.acquire()
          return self
  
      def __exit__(self, exc_type, exc_value, traceback):
+         self._lock.release()
          self.deinit()
  
      def scan(self):
                  self._pins = (portSck, portMosi, portMiso)
                  break
          else:
 -            raise NotImplementedError(
 +            raise ValueError(
                  "No Hardware SPI on (SCLK, MOSI, MISO)={}\nValid SPI ports:{}".
                  format((clock, MOSI, MISO), spiPorts))
  
                  )
                  break
          else:
 -            raise NotImplementedError(
 +            raise ValueError(
                  "No Hardware UART on (tx,rx)={}\nValid UART ports: {}".format((tx, rx), uartPorts)
              )