code: async def _digital_message(self, data):
          
          port = data[0]
          port_data = (data[PrivateConstants.MSB] << 7) + \
                      data[PrivateConstants.LSB]
          pin = port * 8
          for pin in range(pin, min(pin + 8, len(self.digital_pins))):
              # get pin value
              value = port_data & 0x01
  
              # set the current value in the pin structure
              self.digital_pins[pin].current_value = value
  
              # append pin number, pin value, and pin type to return value and return as a list
              message = [pin, value, Constants.INPUT]
  
              if self.digital_pins[pin].cb:
                  if self.digital_pins[pin].cb_type:
                      await self.digital_pins[pin].cb(message)
                  else:
                      # self.digital_pins[pin].cb(data)
                      loop = self.loop
                      loop.call_soon(self.digital_pins[pin].cb, message)
  
                  # is there a latch entry for this pin?
                  key = 'D' + str(pin)
                  if key in self.latch_map:
                      await self._check_latch_data(key, port_data & 0x01)
              port_data >>= 1
docs: This is a private message handler method.
          It is a message handler for Digital Messages.
  
          :param data: digital message
  
          :returns: None - but update is saved in pins structure