Skip to content

Timeout error is retryable #4

@CTurt

Description

@CTurt

do_raw_read and do_write fail after a timeout, but it will often succeed if retried once more:

Changing these functions to loop on LIBUSB_ERROR_TIMEOUT makes the library much more stable:

uint8_t do_raw_read(gscomms * g) {
  unsigned char data;

  int rc;

  do {
    rc = libusb_control_transfer(
          g->dev,
          REQTYPE_READ,
          REQ_MOS_READ,
          MOS_PORT_BASE,
          MOS_PP_STATUS_REG,
          &data,
          1,
          TIMEOUT);

    if (rc != 1) {
        fprintf(stderr, "read failed: %s\n", libusb_error_name(rc));
    }
  } while(rc == LIBUSB_ERROR_TIMEOUT);

  return data;
}

void do_write(gscomms * g, uint8_t data,int flagged) {
  uint8_t flagged_data = (flagged ? 0x10 : 0) | (data & 0xf);
  
  int rc;

  do {
    rc = libusb_control_transfer(
          g->dev,
          REQTYPE_WRITE,
          REQ_MOS_WRITE,
          MOS_PORT_BASE | flagged_data,
          MOS_PP_DATA_REG,
          NULL,
          0,
          TIMEOUT);

      if(rc != 0) {
       fprintf(stderr, "write failed: %s\n", libusb_error_name(rc));
      }
  } while (rc == LIBUSB_ERROR_TIMEOUT); 
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions