libfxlink: add some sync-like transfer functions

This commit is contained in:
Lephenixnoir 2025-03-08 23:25:40 +01:00
parent a98bbff1c9
commit b7803a6aed
No known key found for this signature in database
GPG key ID: 1BBA026E13FC0495
2 changed files with 38 additions and 0 deletions

View file

@ -632,6 +632,29 @@ bool fxlink_device_start_bulk_OUT(struct fxlink_device *fdev,
return true; return true;
} }
bool fxlink_device_has_bulk_OUT(struct fxlink_device *fdev)
{
struct fxlink_comm *comm = fdev->comm;
return comm && comm->claimed && comm->ftransfer_OUT;
}
void fxlink_device_wait_bulk_OUT(
libusb_context *ctx, struct fxlink_device *fdev)
{
while(fxlink_device_has_bulk_OUT(fdev))
libusb_handle_events(ctx);
}
bool fxlink_device_send_bulk_OUT(
libusb_context *ctx, struct fxlink_device *fdev,
char const *app, char const *type, void const *data, int size)
{
if(!fxlink_device_start_bulk_OUT(fdev, app, type, data, size, false))
return false;
fxlink_device_wait_bulk_OUT(ctx, fdev);
return true;
}
//--- //---
// Polled file descriptor tracking // Polled file descriptor tracking
//--- //---

View file

@ -235,6 +235,21 @@ bool fxlink_device_start_bulk_OUT(struct fxlink_device *fdev,
char const *app, char const *type, void const *data, int size, char const *app, char const *type, void const *data, int size,
bool own_data); bool own_data);
/* Check whether a device currently has an ongoing OUT transfer. */
bool fxlink_device_has_bulk_OUT(struct fxlink_device *fdev);
/* Wait for an ongoing OUT transfer to finish. If there is no such transfer
ongoing, this function is a no-op. */
void fxlink_device_wait_bulk_OUT(
libusb_context *ctx, struct fxlink_device *fdev);
/* Run an OUT transfer on the device and wait for its completion. Note that if
the calculator does not properly receive the data for whatever reason, this
function will never return. */
bool fxlink_device_send_bulk_OUT(
libusb_context *ctx, struct fxlink_device *fdev,
char const *app, char const *type, void const *data, int size);
/* Interrupt any active transfers on the device. */ /* Interrupt any active transfers on the device. */
void fxlink_device_interrupt_transfers(struct fxlink_device *fdev); void fxlink_device_interrupt_transfers(struct fxlink_device *fdev);