From 9ed1c4ba4ef86175a8eaefbe1a4e440423ea8160 Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Sun, 13 Sep 2015 09:12:04 +0200 Subject: [PATCH] the theta has a slight delay in starting up the event socket. if we get a connrefused, wait a small bit --- camlibs/ptp2/ptpip.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/camlibs/ptp2/ptpip.c b/camlibs/ptp2/ptpip.c index f46fe0ae6..45c496d94 100644 --- a/camlibs/ptp2/ptpip.c +++ b/camlibs/ptp2/ptpip.c @@ -682,7 +682,7 @@ ptp_nikon_getptpipguid (unsigned char* guid) { int ptp_ptpip_connect (PTPParams* params, const char *address) { char *addr, *s, *p; - int port; + int port, tries; struct sockaddr_in saddr; uint16_t ret; @@ -748,16 +748,24 @@ ptp_ptpip_connect (PTPParams* params, const char *address) { close (params->evtfd); return translate_ptp_result (ret); } - if (-1 == connect (params->evtfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr_in))) { + /* seen on Ricoh Theta, camera is not immediately ready. try again two times. */ + tries = 2; + do { + if (-1 != connect (params->evtfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr_in))) + break; + if ((errno == ECONNREFUSED) && (tries--)) { + GP_LOG_D ("event connect failed, retrying after short wait"); + usleep(100*1000); + continue; + } GP_LOG_E ("could not connect event"); close (params->cmdfd); close (params->evtfd); return GP_ERROR_IO; - } + } while (1); ret = ptp_ptpip_init_event_request (params); - if (ret != PTP_RC_OK) { + if (ret != PTP_RC_OK) return translate_ptp_result (ret); - } ret = ptp_ptpip_init_event_ack (params); if (ret != PTP_RC_OK) return translate_ptp_result (ret);