diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2017-03-05 17:44:38 +0100 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2017-03-05 17:44:38 +0100 |
commit | de93f204d54ed4d46a8d23f90105b28448031658 (patch) | |
tree | 11f794def4e4c08c6753177073f6c50b6a0baf73 | |
parent | 3c309a3b8ab4be9da03b0a290a70c3030cbd126c (diff) | |
download | libgphoto2-de93f204d54ed4d46a8d23f90105b28448031658.tar.gz |
add a event queue check function, which should do no USB io
or minimal waits
-rw-r--r-- | camlibs/ptp2/library.c | 2 | ||||
-rw-r--r-- | camlibs/ptp2/ptp.h | 5 | ||||
-rw-r--r-- | camlibs/ptp2/ptpip.c | 6 | ||||
-rw-r--r-- | camlibs/ptp2/usb.c | 13 |
4 files changed, 25 insertions, 1 deletions
diff --git a/camlibs/ptp2/library.c b/camlibs/ptp2/library.c index 95305c03f..397d9a4ca 100644 --- a/camlibs/ptp2/library.c +++ b/camlibs/ptp2/library.c @@ -7738,6 +7738,7 @@ camera_init (Camera *camera, GPContext *context) params->getdata_func = ptp_usb_getdata; params->event_wait = ptp_usb_event_wait; params->event_check = ptp_usb_event_check; + params->event_check_queue = ptp_usb_event_check_queue; params->cancelreq_func = ptp_usb_control_cancel_request; params->maxpacketsize = settings.usb.maxpacketsize; GP_LOG_D ("maxpacketsize %d", settings.usb.maxpacketsize); @@ -7772,6 +7773,7 @@ camera_init (Camera *camera, GPContext *context) params->getdata_func = ptp_ptpip_getdata; params->event_wait = ptp_ptpip_event_wait; params->event_check = ptp_ptpip_event_check; + params->event_check_queue = ptp_ptpip_event_check_queue; break; } default: diff --git a/camlibs/ptp2/ptp.h b/camlibs/ptp2/ptp.h index 6387685d8..3b817fa44 100644 --- a/camlibs/ptp2/ptp.h +++ b/camlibs/ptp2/ptp.h @@ -2455,6 +2455,7 @@ struct _PTPParams { PTPIOGetResp getresp_func; PTPIOGetData getdata_func; PTPIOGetResp event_check; + PTPIOGetResp event_check_queue; PTPIOGetResp event_wait; PTPIOCancelReq cancelreq_func; @@ -2551,8 +2552,9 @@ uint16_t ptp_usb_senddata (PTPParams* params, PTPContainer* ptp, uint16_t ptp_usb_getresp (PTPParams* params, PTPContainer* resp); uint16_t ptp_usb_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler); -uint16_t ptp_usb_event_check (PTPParams* params, PTPContainer* event); uint16_t ptp_usb_event_wait (PTPParams* params, PTPContainer* event); +uint16_t ptp_usb_event_check (PTPParams* params, PTPContainer* event); +uint16_t ptp_usb_event_check_queue (PTPParams* params, PTPContainer* event); uint16_t ptp_usb_control_get_extended_event_data (PTPParams *params, char *buffer, int *size); uint16_t ptp_usb_control_device_reset_request (PTPParams *params); @@ -2569,6 +2571,7 @@ uint16_t ptp_ptpip_getdata (PTPParams* params, PTPContainer* ptp, PTPDataHandler *handler); uint16_t ptp_ptpip_event_wait (PTPParams* params, PTPContainer* event); uint16_t ptp_ptpip_event_check (PTPParams* params, PTPContainer* event); +uint16_t ptp_ptpip_event_check_queue (PTPParams* params, PTPContainer* event); uint16_t ptp_getdeviceinfo (PTPParams* params, PTPDeviceInfo* deviceinfo); diff --git a/camlibs/ptp2/ptpip.c b/camlibs/ptp2/ptpip.c index f09bf57a5..7a6492ccf 100644 --- a/camlibs/ptp2/ptpip.c +++ b/camlibs/ptp2/ptpip.c @@ -630,6 +630,12 @@ ptp_ptpip_event (PTPParams* params, PTPContainer* event, int wait) } uint16_t +ptp_ptpip_event_check_queue (PTPParams* params, PTPContainer* event) { + /* the fast check just takes 1ms, so lets keep it */ + return ptp_ptpip_event (params, event, PTP_EVENT_CHECK_FAST); +} + +uint16_t ptp_ptpip_event_check (PTPParams* params, PTPContainer* event) { return ptp_ptpip_event (params, event, PTP_EVENT_CHECK_FAST); } diff --git a/camlibs/ptp2/usb.c b/camlibs/ptp2/usb.c index 0630ede43..cf85c74ed 100644 --- a/camlibs/ptp2/usb.c +++ b/camlibs/ptp2/usb.c @@ -492,6 +492,7 @@ ptp_usb_getresp (PTPParams* params, PTPContainer* resp) /* PTP Events wait for or check mode */ #define PTP_EVENT_CHECK 0x0000 /* waits for */ #define PTP_EVENT_CHECK_FAST 0x0001 /* checks */ +#define PTP_EVENT_CHECK_QUEUE 0x0002 /* just looks in the queue */ static inline uint16_t ptp_usb_event (PTPParams* params, PTPContainer* event, int wait) @@ -523,6 +524,12 @@ ptp_usb_event (PTPParams* params, PTPContainer* event, int wait) if (result <= 0) result = gp_port_check_int (camera->port, (char*)&usbevent, sizeof(usbevent)); gp_port_set_timeout (camera->port, timeout); break; + case PTP_EVENT_CHECK_QUEUE: + gp_port_get_timeout (camera->port, &timeout); + gp_port_set_timeout (camera->port, 0); /* indicates no waiting at all */ + result = gp_port_check_int (camera->port, (char*)&usbevent, sizeof(usbevent)); + gp_port_set_timeout (camera->port, timeout); + break; default: return PTP_ERROR_BADPARAM; } @@ -572,6 +579,12 @@ ptp_usb_event (PTPParams* params, PTPContainer* event, int wait) } uint16_t +ptp_usb_event_queue_check (PTPParams* params, PTPContainer* event) { + + return ptp_usb_event (params, event, PTP_EVENT_CHECK_QUEUE); +} + +uint16_t ptp_usb_event_check (PTPParams* params, PTPContainer* event) { return ptp_usb_event (params, event, PTP_EVENT_CHECK_FAST); |