diff --git a/src/cl_backend.h b/src/cl_backend.h index 21a2c0b..5e92397 100644 --- a/src/cl_backend.h +++ b/src/cl_backend.h @@ -86,4 +86,7 @@ int ptpip_close(struct PtpRuntime *r); void ptpusb_free_device_list_entry(void *); +/// @brief Get status of connected device +int ptpusb_get_status(struct PtpRuntime *r); + #endif diff --git a/src/libusb.c b/src/libusb.c index 2fc8f65..2e07c2b 100644 --- a/src/libusb.c +++ b/src/libusb.c @@ -352,6 +352,15 @@ int ptp_read_int(struct PtpRuntime *r, void *to, int length) { return transferred; } +int ptpusb_get_status(struct PtpRuntime *r) { + struct LibUSBBackend *backend = (struct LibUSBBackend *)r->comm_backend; + if (backend == NULL || r->io_kill_switch) return -1; + char buffer[2]; + int rc = libusb_control_transfer(backend->handle, 0x80, 0, 0, 0, buffer, 2, 1000); + if (rc) return -1; + return 0; +} + int reset_int(struct PtpRuntime *r) { return -1; } diff --git a/src/libwpd.c b/src/libwpd.c index f519798..c828b94 100644 --- a/src/libwpd.c +++ b/src/libwpd.c @@ -160,6 +160,12 @@ int ptp_device_close(struct PtpRuntime *r) { return 0; } +int ptpusb_get_status(struct PtpRuntime *r) { + struct WpdStruct *wpd = (struct WpdStruct *)(r->comm_backend); + if (wpd == NULL) return PTP_IO_ERR; + return wpd_check_connected(wpd); +} + int ptp_device_reset(struct PtpRuntime *r) { return 0; }