summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Meissner <marcus@jet.franken.de>2017-03-05 17:44:38 +0100
committerMarcus Meissner <marcus@jet.franken.de>2017-03-05 17:44:38 +0100
commitde93f204d54ed4d46a8d23f90105b28448031658 (patch)
tree11f794def4e4c08c6753177073f6c50b6a0baf73
parent3c309a3b8ab4be9da03b0a290a70c3030cbd126c (diff)
downloadlibgphoto2-de93f204d54ed4d46a8d23f90105b28448031658.tar.gz
add a event queue check function, which should do no USB io
or minimal waits
-rw-r--r--camlibs/ptp2/library.c2
-rw-r--r--camlibs/ptp2/ptp.h5
-rw-r--r--camlibs/ptp2/ptpip.c6
-rw-r--r--camlibs/ptp2/usb.c13
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);