diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2016-12-20 08:43:11 +0100 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2016-12-20 08:43:11 +0100 |
commit | 3afe07dbfdc4f7b29c7830e43a09fb58ae20861d (patch) | |
tree | 6049822607b40b3df4ec479d41326f17d2925d28 | |
parent | eae8a13ac25851dbe1e1b2f2f043866a9bfeac64 (diff) | |
download | libgphoto2-3afe07dbfdc4f7b29c7830e43a09fb58ae20861d.tar.gz |
wait_for_Event needs to be run multiple times to drain
the event queue better. otherwise e.g. Nikon DSLR will
never get to the fileadded event.
-rw-r--r-- | examples/sample-trigger-capture.c | 73 |
1 files changed, 43 insertions, 30 deletions
diff --git a/examples/sample-trigger-capture.c b/examples/sample-trigger-capture.c index 0c563318a..7b61b9df7 100644 --- a/examples/sample-trigger-capture.c +++ b/examples/sample-trigger-capture.c @@ -33,41 +33,54 @@ wait_event_and_download (Camera *camera, int waittime, GPContext *context) { CameraFilePath *path; void *data; int retval; + struct timeval start, curtime; + gettimeofday (&start, NULL); data = NULL; if (nrofqueue) waittime = 10; /* just drain the event queue */ - retval = gp_camera_wait_for_event(camera, waittime, &evtype, &data, context); - if (retval != GP_OK) { - fprintf (stderr, "return from waitevent in trigger sample with %d\n", retval); - return retval; - } - path = data; - switch (evtype) { - case GP_EVENT_CAPTURE_COMPLETE: - fprintf (stderr, "wait for event CAPTURE_COMPLETE\n"); - break; - case GP_EVENT_UNKNOWN: - case GP_EVENT_TIMEOUT: - break; - case GP_EVENT_FOLDER_ADDED: - fprintf (stderr, "wait for event FOLDER_ADDED\n"); - break; - case GP_EVENT_FILE_ADDED: - fprintf (stderr, "File %s / %s added to queue.\n", path->folder, path->name); - if (nrofqueue) { - struct queue_entry *q; - q = realloc(queue, sizeof(struct queue_entry)*(nrofqueue+1)); - if (!q) return GP_ERROR_NO_MEMORY; - queue = q; - } else { - queue = malloc (sizeof(struct queue_entry)); - if (!queue) return GP_ERROR_NO_MEMORY; + + while (1) { + unsigned int timediff; + + gettimeofday (&curtime, NULL); + + timediff = ((curtime.tv_sec - start.tv_sec)*1000)+((curtime.tv_usec - start.tv_usec)/1000); + if (timediff >= waittime) + break; + + retval = gp_camera_wait_for_event(camera, waittime - timediff, &evtype, &data, context); + if (retval != GP_OK) { + fprintf (stderr, "return from waitevent in trigger sample with %d\n", retval); + return retval; + } + path = data; + switch (evtype) { + case GP_EVENT_CAPTURE_COMPLETE: + fprintf (stderr, "wait for event CAPTURE_COMPLETE\n"); + break; + case GP_EVENT_UNKNOWN: + case GP_EVENT_TIMEOUT: + break; + case GP_EVENT_FOLDER_ADDED: + fprintf (stderr, "wait for event FOLDER_ADDED\n"); + break; + case GP_EVENT_FILE_ADDED: + fprintf (stderr, "File %s / %s added to queue.\n", path->folder, path->name); + if (nrofqueue) { + struct queue_entry *q; + q = realloc(queue, sizeof(struct queue_entry)*(nrofqueue+1)); + if (!q) return GP_ERROR_NO_MEMORY; + queue = q; + } else { + queue = malloc (sizeof(struct queue_entry)); + if (!queue) return GP_ERROR_NO_MEMORY; + } + memcpy (&queue[nrofqueue].path, path, sizeof(CameraFilePath)); + queue[nrofqueue].offset = 0; + nrofqueue++; + break; } - memcpy (&queue[nrofqueue].path, path, sizeof(CameraFilePath)); - queue[nrofqueue].offset = 0; - nrofqueue++; - break; } if (nrofqueue) { unsigned long size; |