code: async def set_pin_mode(self, pin_number, pin_state, callback=None,
                             callback_type=None):
          
  
          # There is a potential start up race condition when running pymata3.
          # This is a workaround for that race condition
          #
          if not len(self.digital_pins):
              await asyncio.sleep(2)
          if callback:
              if pin_state == Constants.INPUT:
                  self.digital_pins[pin_number].cb = callback
                  self.digital_pins[pin_number].cb_type = callback_type
              elif pin_state == Constants.ANALOG:
                  self.analog_pins[pin_number].cb = callback
                  self.analog_pins[pin_number].cb_type = callback_type
              else:
                  if self.log_output:
                      log_string = 'set_pin_mode: callback ignored for ' \
                                   'pin state: ' + pin_state
                      logging.info(log_string)
                  else:
                      print('{} {}'.format('set_pin_mode: callback ignored for '
                                           'pin state:', pin_state))
  
          pin_mode = pin_state
  
          if pin_mode == Constants.ANALOG:
              pin_number = pin_number + self.first_analog_pin
  
          command = [PrivateConstants.SET_PIN_MODE, pin_number, pin_mode]
          await self._send_command(command)
          if pin_state == Constants.ANALOG:
              await self.enable_analog_reporting(pin_number)
          elif pin_state == Constants.INPUT:
              await self.enable_digital_reporting(pin_number)
          else:
              pass
  
          await self.sleep(.05)
docs: This method sets the pin mode for the specified pin.
          For Servo, use servo_config() instead.
  
          :param pin_number: Arduino Pin Number
  
          :param pin_state: INPUT/OUTPUT/ANALOG/PWM/PULLUP - for SERVO use
                            servo_config()
  
          :param callback: Optional: A reference to a call back function to be
                           called when pin data value changes
  
          :param callback_type: Constants.CB_TYPE_DIRECT = direct call or
                          Constants.CB_TYPE_ASYNCIO = asyncio coroutine
  
          :returns: No return value