From 2aae90ed79252ffc60699f1abbe982b7dc1b07cf Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Fri, 28 Jun 2019 15:24:40 +0200 Subject: work on capturing images ... coming close --- camlibs/lumix/lumix.c | 289 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 229 insertions(+), 60 deletions(-) diff --git a/camlibs/lumix/lumix.c b/camlibs/lumix/lumix.c index 582a37ee6..e8591715d 100644 --- a/camlibs/lumix/lumix.c +++ b/camlibs/lumix/lumix.c @@ -82,8 +82,6 @@ # define N_(String) (String) #endif -char* RECMODE = "cam.cgi?mode=camcmd&value=recmode"; -char* PLAYMODE = "cam.cgi?mode=camcmd&value=playmode"; char* SHUTTERSTART = "cam.cgi?mode=camcmd&value=capture"; char* SHUTTERSTOP = "cam.cgi?mode=camcmd&value=capture_cancel"; char* CDS_Control = ":60606/Server0/CDS_control"; @@ -93,6 +91,8 @@ int captureDuration = 10; //placeholder to store the value of the bulb shot this static int NumberPix(Camera *camera); static char* loadCmd (Camera *camera,char* cmd); +static char* switchToRecMode(Camera *camera); +static char* switchToPlayMode(Camera *camera); typedef struct { char *data; @@ -139,7 +139,7 @@ camera_capture_preview (Camera *camera, CameraFile *file, GPContext *context) char *xpath; int i, start, end, tries; - loadCmd (camera, RECMODE); + switchToRecMode (camera); if (!camera->pl->liveview) { loadCmd(camera,"cam.cgi?mode=startstream&value=49199"); @@ -197,8 +197,6 @@ camera_capture_preview (Camera *camera, CameraFile *file, GPContext *context) return GP_ERROR; } -//int camera_capture (Camera *camera, CameraCaptureType type, CameraFilePath *path, GPContext *context); - static int camera_about (Camera *camera, CameraText *about, GPContext *context); @@ -440,10 +438,17 @@ loadCmd (Camera *camera,char* cmd) { return lmb.data; } -static void switchToRecMode(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=recmode"); +static char* +switchToRecMode(Camera *camera) { + return loadCmd(camera,"cam.cgi?mode=camcmd&value=recmode"); } +static char* +switchToPlayMode(Camera *camera) { + return loadCmd(camera,"cam.cgi?mode=camcmd&value=playmode"); +} + + static void Set_ISO(Camera *camera,const char * ISOValue) { char buf[200]; sprintf(buf, "?mode=setsetting&type=iso&value=%s",ISOValue); @@ -463,7 +468,6 @@ Get_ISO(Camera *camera) { static char* Get_ShutterSpeed(Camera *camera) { char *result, *s; - int nom, div; char shutterspeed[20]; result = loadCmd(camera,"cam.cgi?mode=getsetting&type=shtrspeed"); @@ -475,19 +479,13 @@ Get_ShutterSpeed(Camera *camera) { s = strstr(result, "", &nom, &div) != 2) + if (sscanf(s,"", shutterspeed) != 1) return NULL; - - if (0 == (nom*10/div)%10) - sprintf(shutterspeed,"%d", nom/div); - else - sprintf(shutterspeed,"%d/%d", nom, div); return strdup(shutterspeed); } static char* Get_Aperture(Camera *camera) { - int nom, div; char aperture[20]; char *result, *s; @@ -499,12 +497,8 @@ Get_Aperture(Camera *camera) { return NULL; s = strstr(result, "", &nom, &div) != 2) + if (sscanf(s,"", aperture) != 2) return NULL; - if (0 == (nom*10/div)%10) - sprintf(aperture,"%d", nom/div); - else - sprintf(aperture,"%d.%d", nom/div, (nom*10/div)%10); return strdup(aperture); } @@ -573,41 +567,54 @@ Set_quality(Camera *camera,const char* Quality) { } -static void -shotPicture(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=capture"); +static int +startCapture(Camera *camera) { + char *result; + + result = loadCmd(camera,"cam.cgi?mode=camcmd&value=capture"); + + if (strstr(result,"ok")) return GP_OK; + if (strstr(result,"err_busy")) return GP_ERROR_CAMERA_BUSY; + return GP_ERROR; } -static void stopCapture(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=capture_cancel"); +static int +stopCapture(Camera *camera) { + char *result; + + result = loadCmd(camera,"cam.cgi?mode=camcmd&value=capture_cancel"); + + if (strstr(result,"ok")) return GP_OK; + if (strstr(result,"err_busy")) return GP_ERROR_CAMERA_BUSY; + return GP_ERROR; } static void startMovie(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=video_recstart"); + loadCmd(camera,"cam.cgi?mode=camcmd&value=video_recstart"); } static void stopMovie(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=video_recstop"); + loadCmd(camera,"cam.cgi?mode=camcmd&value=video_recstop"); } static void zoomIn(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=tele-fast"); + loadCmd(camera,"cam.cgi?mode=camcmd&value=tele-fast"); } static void zoomOut(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=wide-fast"); + loadCmd(camera,"cam.cgi?mode=camcmd&value=wide-fast"); } static void zoomStop(Camera *camera) { - loadCmd(camera,"?mode=camcmd&value=zoomstop"); + loadCmd(camera,"cam.cgi?mode=camcmd&value=zoomstop"); } static void focusIn(Camera *camera) { - loadCmd(camera,"?mode=camctrl&type=focus&value=tele-fast"); + loadCmd(camera,"cam.cgi?mode=camctrl&type=focus&value=tele-fast"); } static void focusOut(Camera *camera) { - loadCmd(camera,"?mode=camctrl&type=focus&value=wide-fast"); + loadCmd(camera,"cam.cgi?mode=camctrl&type=focus&value=wide-fast"); } /* @@ -643,10 +650,23 @@ NumberPix(Camera *camera) { /*GP_LOG_D("NumberPix Decode current root node is %s \n", doc); */ if (cur == NULL) { - fprintf(stderr,"empty document\n"); + GP_LOG_E("empty xml result document"); xmlFreeDoc(doc); return GP_ERROR; } + /* + * busy mode: + err_busy + + * regular return: + + ok2651651 + */ + if (strstr(temp, "err_busy")) { + xmlFreeDoc(doc); + return GP_ERROR_CAMERA_BUSY; + } + cur = cur->xmlChildrenNode; while (cur != NULL) { /*GP_LOG_D("NumberPix Decode current node is %s \n", (char*)cur);*/ @@ -660,7 +680,7 @@ NumberPix(Camera *camera) { xmlFreeDoc(doc); return GP_ERROR; } - GP_LOG_D("NumberPix Found is %s \n", (char *) keyz); + GP_LOG_D("NumberPix Found is %s", (char *) keyz); numpics = strtol((char*)keyz, NULL, 10); xmlFreeDoc(doc); @@ -725,7 +745,7 @@ GetPixRange(Camera *camera, int start, int num) { LumixMemoryBuffer lmb; char URL[1000]; - loadCmd(camera,PLAYMODE); + switchToPlayMode (camera); NumPix = NumberPix(camera); //GP_LOG_D("NumPix is %d \n", NumPix); if (NumPix < GP_OK) return NULL; @@ -983,21 +1003,103 @@ Raw: return strdup((char*)xchar); } -/** -* Get the full configuration tree of the camera. -* -* This function is a method of the Camera object. -* TO DO - - i started to include some items to set the quality (raw and raw+jpg) as well as dictionary for ISO and shutter speed -* mostly every thing is still to do -*/ +static struct shuttermap { + char *speed; + char *cameraspeed; +} shutterspeeds[] = { + {"3072/256","4000"}, + {"2987/256","3200"}, + {"2902/256","2500"}, + {"2816/256","2000"}, + {"2731/256","1600"}, + {"2646/256","1300"}, + {"2560/256","1000"}, + {"2475/256","800"}, + {"2390/256","640"}, + {"2304/256","500"}, + {"2219/256","400"}, + {"2134/256","320"}, + {"2048/256","250"}, + {"1963/256","200"}, + {"1878/256","160"}, + {"1792/256","125"}, + {"1707/256","100"}, + {"1622/256","80"}, + {"1536/256","60"}, + {"1451/256","50"}, + {"1366/256","40"}, + {"1280/256","30"}, + {"1195/256","25"}, + {"1110/256","20"}, + {"1024/256","15"}, + {"939/256","13"}, + {"854/256","10"}, + {"768/256","8"}, + {"683/256","6"}, + {"598/256","5"}, + {"512/256","4"}, + {"427/256","3.2"}, + {"342/256","2.5"}, + {"256/256","2"}, + {"171/256","1.6"}, + {"86/256","1.3"}, + {"0/256","1"}, + {"-85/256","1.3s"}, + {"-170/256","1.6s"}, + {"-256/256","2s"}, + {"-341/256","2.5s"}, + {"-426/256","3.2s"}, + {"-512/256","4s"}, + {"-682/256","5s"}, + {"-768/256","6s"}, + {"-853/256","8s"}, + {"-938/256","10s"}, + {"-1024/256","13s"}, + {"-1109/256","15s"}, + {"-1194/256","20s"}, + {"-1280/256","25s"}, + {"-1365/256","30s"}, + {"-1450/256","40s"}, + {"-1536/256","50s"}, + {"16384/256","60s"}, + {"256/256","B"}, +}; + +static struct aperturemap { + char *aperture; + char *cameraaperture; +} apertures[] = { + {"392/256","1.7"}, + {"427/256","1.8"}, + {"512/256","2"}, + {"598/256","2.2"}, + {"683/256","2.5"}, + {"768/256","2.8"}, + {"854/256","3.2"}, + {"938/256","3.5"}, + {"1024/256","4"}, + {"1110/256","4.5"}, + {"1195/256","5"}, + {"1280/256","5.6"}, + {"1366/256","6.3"}, + {"1451/256","7.1"}, + {"1536/256","8"}, + {"1622/256","9"}, + {"1707/256","10"}, + {"1792/256","11"}, + {"1878/256","13"}, + {"1963/256","14"}, + {"2048/256","16"}, +}; + static int camera_config_get (Camera *camera, CameraWidget **window, GPContext *context) { - CameraWidget *widget,*section; - int ret; - char *val; + CameraWidget *widget,*section; + int ret, i, valset; + char *val, *curval; - loadCmd (camera, RECMODE); + switchToRecMode (camera); gp_widget_new (GP_WIDGET_WINDOW, _("Lumix Configuration"), window); gp_widget_set_name (*window, "config"); @@ -1011,10 +1113,20 @@ camera_config_get (Camera *camera, CameraWidget **window, GPContext *context) gp_widget_set_value (widget, Get_Clock(camera)); gp_widget_append (section, widget); + val = Get_ShutterSpeed(camera); - gp_widget_new (GP_WIDGET_TEXT, _("Shutterspeed"), &widget); + if (!val) val = "unknown"; + gp_widget_new (GP_WIDGET_RADIO, _("Shutterspeed"), &widget); gp_widget_set_name (widget, "shutterspeed"); - gp_widget_set_value (widget, val?val:"unknown"); + valset = 0; + for (i=0;i before) + GetPixRange(camera,before,after-before); + /* handle case where we have more than one picture, otherwise we just take one */ + url = "unknown"; + if (camera->pl->pics[after].url_large) url = camera->pl->pics[after].url_large; + if (camera->pl->pics[after].url_raw) url = camera->pl->pics[after].url_raw; + s = strrchr(url,'/')+1; + strcpy(path->name, s); + strcpy(path->folder, "/"); + return GP_OK; } /** @@ -1494,7 +1664,7 @@ get_file_func (CameraFilesystem *fs, const char *folder, const char *filename, C break; } - loadCmd(camera,PLAYMODE); + switchToPlayMode (camera); imageUrl = curl_easy_init(); @@ -1614,16 +1784,15 @@ camera_init (Camera *camera, GPContext *context) gp_filesystem_set_funcs (camera->fs, &fsfuncs, camera); - if (loadCmd(camera,RECMODE) != NULL) { + if (switchToRecMode (camera) != NULL) { int numpix; Set_quality(camera,"raw_fine"); - loadCmd(camera,PLAYMODE); // 'making sure the camera is in Playmode + switchToPlayMode (camera); numpix = NumberPix(camera); GetPixRange(camera,0,numpix); - return GP_OK; } else return GP_ERROR_IO; -- cgit v1.2.1