docs: def _read_response(self):
          """
          After writing a command, read response.
  
          @returns: Result of parse_data()
  
          @raises pyhsm.exception.YHSM_Error: On failure to read a response to the
              command we sent in a timely fashion.
          """
          # // Up- and downlink packet
          # typedef struct {
          #   uint8_t bcnt;                       // Number of bytes (cmd + payload)
          #   uint8_t cmd;                        // YSM_xxx command
          #   uint8_t payload[YSM_MAX_PKT_SIZE];  // Payload
          # } YSM_PKT;
  
          # read YSM_PKT.bcnt and YSM_PKT.cmd
          res = self.stick.read(2, 'response length + response status')
          if len(res) != 2:
              self._handle_invalid_read_response(res, 2)
          response_len, response_status = struct.unpack('BB', res)
          response_len -= 1 # the status byte has been read already
          debug_info = None
          if response_status & pyhsm.defines.YSM_RESPONSE:
              debug_info = "%s response (%i/0x%x bytes)" \
                  % (pyhsm.defines.cmd2str(response_status - pyhsm.defines.YSM_RESPONSE), \
                         response_len, response_len)
          # read YSM_PKT.payload
          res = self.stick.read(response_len, debug_info)
          if res:
              if response_status == self.command | pyhsm.defines.YSM_RESPONSE:
                  self.executed = True
                  self.response_status = response_status
                  return self.parse_result(res)
              else:
                  reset(self.stick)
                  raise pyhsm.exception.YHSM_Error('YubiHSM responded to wrong command')
          else:
              raise pyhsm.exception.YHSM_Error('YubiHSM did not respond')