code: async def _pixy_data(self, data):
          
          if len(self.digital_pins) < PrivateConstants.PIN_PIXY_MOSI:
              # Pixy data sent before board finished pin discovery.
              # print("Pixy data sent before board finished pin discovery.")
              return
  
          # strip off sysex start and end
          data = data[1:-1]
          num_blocks = data[0]  # First byte is the number of blocks.
          # Prepare the new blocks list and then used it to overwrite the pixy_blocks.
          blocks = []
          # noinspection PyDictCreation
          for i in range(num_blocks):
              block = {}
              block["signature"] = int((data[i * 12 + 2] << 7) + data[i * 12 + 1])
              block["x"] = int((data[i * 12 + 4] << 7) + data[i * 12 + 3])
              block["y"] = int((data[i * 12 + 6] << 7) + data[i * 12 + 5])
              block["width"] = int((data[i * 12 + 8] << 7) + data[i * 12 + 7])
              block["height"] = int((data[i * 12 + 10] << 7) + data[i * 12 + 9])
              block["angle"] = int((data[i * 12 + 12] << 7) + data[i * 12 + 11])
              blocks.append(block)
          self.pixy_blocks = blocks
          if self.digital_pins[PrivateConstants.PIN_PIXY_MOSI].cb:
              if self.digital_pins[PrivateConstants.PIN_PIXY_MOSI].cb_type:
                  await self.digital_pins[PrivateConstants.PIN_PIXY_MOSI].cb(blocks)
              else:
                  loop = self.loop
                  loop.call_soon(self.digital_pins[PrivateConstants.PIN_PIXY_MOSI].cb, blocks)
docs: This is a private message handler method.
          It handles pixy data messages.
  
          :param data: pixy data
  
          :returns: None - but update is saved in the digital pins structure