static int camera_cam_desc_get_value (ValueNameType *val_name_p, CameraWidgetType widge, uint32_t reg_len, void *buff, int mask, CameraWidget *child) { if ((widge == GP_WIDGET_RADIO) || (widge == GP_WIDGET_MENU)) { gp_widget_add_choice (child, _(val_name_p->name)); GP_DEBUG ("get value %15s:\t%lld (0x%04llx)", val_name_p->name, (long long)val_name_p->u.value, (long long unsigned) val_name_p->u.value); /* XXX where is endian handled? */ if ((mask & *(int*) buff) == val_name_p->u.value) { gp_widget_set_value (child, _(val_name_p->name)); } } else if (widge == GP_WIDGET_DATE) { GP_DEBUG ("get value date/time %s", ctime((time_t *) buff)); gp_widget_set_value (child, (int*) buff); } else if (widge == GP_WIDGET_RANGE) { float float_val, increment; increment = val_name_p->u.range[2]; if (increment == 0.0) { /* * Use a default value. */ increment = 1.0; } GP_DEBUG ("get value range:\t%08g:%08g increment %g (via %g)", val_name_p->u.range[0], val_name_p->u.range[1], increment, val_name_p->u.range[2]); gp_widget_set_range (child, val_name_p->u.range[0], val_name_p->u.range[1], increment); /* * Kluge: store the value in buff as a 4 byte int, even * though we might have read 8 bytes or more. */ float_val = (*(int*) buff) * increment; gp_widget_set_value (child, &float_val); } else if (widge == GP_WIDGET_BUTTON) { GP_DEBUG ("get button"); gp_widget_set_value (child, val_name_p->u.callback); } else { GP_DEBUG ("get value bad widget type %d", widge); return (GP_ERROR); } return (GP_OK); }
/* * List all informations about the camera */ static int camera_get_config (Camera* camera, CameraWidget** window, GPContext *context) { unsigned char cmd[2], buf[INFO_BUFFER]; int ret; CameraWidget *widget; CameraWidget *section; time_t timestamp=0; float value_float; GP_DEBUG ("*** ENTER: camera_get_config ***"); /* get informations about camera */ cmd[0] = ESC; cmd[1] = GETCAMINFO; ret = gp_port_write (camera->port, (char*)cmd, sizeof(cmd)); if (ret<GP_OK) return ret; ret = gp_port_read (camera->port, (char*)buf, INFO_BUFFER); if (ret<GP_OK) return ret; /* Informations manipulation */ timestamp = (buf[TIMESTAMP_PTR] << 24) + (buf[TIMESTAMP_PTR+1] << 16) + (buf[TIMESTAMP_PTR+2] << 8) + buf[TIMESTAMP_PTR+3]; /* * This timestamp start the 1 January 1980 at 00:00 * but UNIX timestamp start the 1 January 1970 at 00:00 * so we calculate the UNIX timestamp with the camera's one */ timestamp += (8*365 + 2*366)*24*3600-3600; /* Window creation */ gp_widget_new (GP_WIDGET_WINDOW, _("Konica Configuration"), window); /************************/ /* Persistent Settings */ /************************/ gp_widget_new (GP_WIDGET_SECTION, _("Persistent Settings"), §ion); gp_widget_append (*window, section); /* Date */ gp_widget_new (GP_WIDGET_DATE, _("Date and Time"), &widget); gp_widget_append (section, widget); gp_widget_set_value (widget, ×tamp); /* Auto Off Time */ gp_widget_new (GP_WIDGET_RANGE, _("Auto Off Time"), &widget); gp_widget_append (section, widget); gp_widget_set_range (widget, 1, 255, 1); value_float = ((buf[AUTO_OFF_PTR] << 8) + buf[AUTO_OFF_PTR+1]) / 60; gp_widget_set_value (widget, &value_float); /* Resolution */ gp_widget_new (GP_WIDGET_RADIO, _("Resolution"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Low")); gp_widget_add_choice (widget, _("Medium")); gp_widget_add_choice (widget, _("High")); switch (buf[RESOLUTION_PTR]) { case 1: gp_widget_set_value (widget, _("High")); break; case 2: gp_widget_set_value (widget, _("Low")); break; case 0: gp_widget_set_value (widget, _("Medium")); break; } /* LCD */ gp_widget_new (GP_WIDGET_RADIO, _("LCD"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("On")); gp_widget_add_choice (widget, _("Off")); switch (buf[LCD_STATE_PTR]) { case 0: gp_widget_set_value (widget, _("On")); break; case 1: gp_widget_set_value (widget, _("Off")); break; } /* Icons */ gp_widget_new (GP_WIDGET_RADIO, _("Icons"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("On")); gp_widget_add_choice (widget, _("Off")); switch (buf[ICON_STATE_PTR]) { case 0: gp_widget_set_value (widget, _("On")); break; case 1: gp_widget_set_value (widget, _("Off")); break; } /****************/ /* Localization */ /****************/ gp_widget_new (GP_WIDGET_SECTION, _("Localization"), §ion); gp_widget_append (*window, section); /* Date format */ gp_widget_new (GP_WIDGET_MENU, _("Date Format"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Month/Day/Year")); gp_widget_add_choice (widget, _("Day/Month/Year")); gp_widget_add_choice (widget, _("Year/Month/Day")); switch (buf[DATE_FORMAT_PTR]) { case 0: gp_widget_set_value (widget, _("Month/Day/Year")); break; case 1: gp_widget_set_value (widget, _("Day/Month/Year")); break; case 2: gp_widget_set_value (widget, _("Year/Month/Day")); break; } /********************************/ /* Session-persistent Settings */ /********************************/ gp_widget_new (GP_WIDGET_SECTION, _("Session-persistent Settings"), §ion); gp_widget_append (*window, section); /* Flash */ gp_widget_new (GP_WIDGET_RADIO, _("Flash"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Off")); gp_widget_add_choice (widget, _("On")); gp_widget_add_choice (widget, _("On, red-eye reduction")); gp_widget_add_choice (widget, _("Auto")); gp_widget_add_choice (widget, _("Auto, red-eye reduction")); switch (buf[FLASH_STATE_PTR]) { case 2: gp_widget_set_value (widget, _("Off")); break; case 1: if (buf[RED_EYE_STATE_PTR] == 1) gp_widget_set_value (widget, _("On, red-eye reduction")); else gp_widget_set_value (widget, _("On")); break; case 0: if (buf[RED_EYE_STATE_PTR] == 1) gp_widget_set_value (widget, _("Auto, red-eye reduction")); else gp_widget_set_value (widget, _("Auto")); break; } /* Exposure */ gp_widget_new (GP_WIDGET_RANGE, _("Exposure"), &widget); gp_widget_append (section, widget); gp_widget_set_range (widget, -2, 2, 0.1); switch(buf[EXPOSURE_TIME_PTR]) { case 0: value_float = 0; break; case 1: value_float = 0.3; break; case 2: value_float = 0.5; break; case 3: value_float = 0.8; break; case 4: value_float = 1.0; break; case 5: value_float = 1.3; break; case 6: value_float = 1.5; break; case 7: value_float = 1.8; break; case 8: value_float = 2.0; break; case 0xF8: value_float = -2.0; break; case 0xF9: value_float = -1.8; break; case 0xFA: value_float = -1.5; break; case 0xFB: value_float = -1.3; break; case 0xFC: value_float = -1.0; break; case 0xFD: value_float = -0.8; break; case 0xFE: value_float = -0.5; break; case 0xFF: value_float = -0.3; break; } gp_widget_set_value (widget, &value_float); /* Focus */ gp_widget_new (GP_WIDGET_RADIO, _("Focus"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("2.0 m")); gp_widget_add_choice (widget, _("0.5 m")); gp_widget_add_choice (widget, _("0.1 m")); gp_widget_add_choice (widget, _("Auto")); switch (buf[FOCUS_PTR]) { case 0: gp_widget_set_value (widget, _("Auto")); break; case 1: gp_widget_set_value (widget, _("2.0 m")); break; case 2: gp_widget_set_value (widget, _("0.5 m")); break; case 3: gp_widget_set_value (widget, _("0.1 m")); break; } /* white balance */ gp_widget_new (GP_WIDGET_RADIO, _("White balance"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Office")); gp_widget_add_choice (widget, _("Daylight")); gp_widget_add_choice (widget, _("Auto")); switch (buf[WHITE_BALANCE_PTR]) { case 0: gp_widget_set_value (widget, _("Auto")); break; case 1: gp_widget_set_value (widget, _("Daylight")); break; case 2: gp_widget_set_value (widget, _("Office")); break; } /* Sharpness */ gp_widget_new (GP_WIDGET_RADIO, _("Sharpness"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Sharp")); gp_widget_add_choice (widget, _("Soft")); gp_widget_add_choice (widget, _("Auto")); switch (buf[SHARPNESS_PTR]) { case 0: gp_widget_set_value (widget, _("Auto")); break; case 1: gp_widget_set_value (widget, _("Sharp")); break; case 2: gp_widget_set_value (widget, _("Soft")); break; } /* Color */ gp_widget_new (GP_WIDGET_RADIO, _("Color"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Light")); gp_widget_add_choice (widget, _("Deep")); gp_widget_add_choice (widget, _("Black and White")); gp_widget_add_choice (widget, _("Sepia")); gp_widget_add_choice (widget, _("Auto")); switch (buf[COLOR_PTR]) { case 0: gp_widget_set_value (widget, _("Auto")); break; case 1: gp_widget_set_value (widget, _("Light")); break; case 2: gp_widget_set_value (widget, _("Deep")); break; case 3: gp_widget_set_value (widget, _("Black and White")); break; case 4: gp_widget_set_value (widget, _("Sepia")); break; } /* Macro */ gp_widget_new (GP_WIDGET_RADIO, _("Macro"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("On")); gp_widget_add_choice (widget, _("Off")); switch (buf[MACRO_PTR]) { case 0: gp_widget_set_value (widget, _("Off")); break; case 1: gp_widget_set_value (widget, _("On")); break; } /* Zoom */ gp_widget_new (GP_WIDGET_RADIO, _("Zoom"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("On")); gp_widget_add_choice (widget, _("Off")); switch (buf[ZOOM_PTR]) { case 0: gp_widget_set_value (widget, _("Off")); break; case 1: gp_widget_set_value (widget, _("On")); break; } /* Capture */ gp_widget_new (GP_WIDGET_RADIO, _("Capture"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Single")); gp_widget_add_choice (widget, _("Sequence 9")); switch (buf[CAPTURE_TYPE_PTR]) { case 0: gp_widget_set_value (widget, _("Single")); break; case 1: gp_widget_set_value (widget, _("Sequence 9")); break; } /* Date display */ gp_widget_new (GP_WIDGET_RADIO, _("Date display"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Anywhere")); gp_widget_add_choice (widget, _("Play mode")); gp_widget_add_choice (widget, _("Record mode")); gp_widget_add_choice (widget, _("Everywhere")); switch (buf[REC_DATE_DISP_PTR]) { case 0: if (buf[PLAY_DATE_DISP_PTR] == 0) gp_widget_set_value (widget, _("Play mode")); else gp_widget_set_value (widget, _("Anywhere")); break; case 1: if (buf[PLAY_DATE_DISP_PTR] == 0) gp_widget_set_value (widget, _("Everywhere")); else gp_widget_set_value (widget, _("Record mode")); break; } /************************/ /* Volatile Settings */ /************************/ gp_widget_new (GP_WIDGET_SECTION, _("Volatile Settings"), §ion); gp_widget_append (*window, section); /* Self Timer */ gp_widget_new (GP_WIDGET_RADIO, _("Self Timer"), &widget); gp_widget_append (section, widget); gp_widget_add_choice (widget, _("Self Timer (next picture only)")); gp_widget_add_choice (widget, _("Normal")); switch (buf[TIMER_PTR]) { case 1: gp_widget_set_value (widget, _("Self Timer (" "next picture only)")); break; case 0: gp_widget_set_value (widget, _("Normal")); break; } return (GP_OK); }
/** * Retrieve a single configuration \c widget for the \c camera. * * @param camera a #Camera * @param name the name of a configuration widget * @param widget a #CameraWidget * @param context a #GPContext * @return gphoto2 error code * * This \c widget will then contain the current and the possible values and the type. * */ int gp_camera_get_single_config (Camera *camera, const char *name, CameraWidget **widget, GPContext *context) { CameraWidget *rootwidget, *child; CameraWidgetType type; const char *label; int ret, ro; C_PARAMS (camera); CHECK_INIT (camera, context); if (camera->functions->get_single_config) { CHECK_RESULT_OPEN_CLOSE (camera, camera->functions->get_single_config ( camera, name, widget, context), context); CAMERA_UNUSED (camera, context); return GP_OK; } if (!camera->functions->get_config) { gp_context_error (context, _("This camera does not provide any configuration options.")); CAMERA_UNUSED (camera, context); return GP_ERROR_NOT_SUPPORTED; } /* emulate it ... */ CHECK_OPEN (camera, context); ret = camera->functions->get_config ( camera, &rootwidget, context); if (ret != GP_OK) { CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; } ret = gp_widget_get_child_by_name (rootwidget, name, &child); if (ret != GP_OK) { gp_widget_free (rootwidget); CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; } /* We need to duplicate the widget, as we will free the widgettree */ gp_widget_get_type (child, &type); gp_widget_get_label (child, &label); gp_widget_get_readonly (child, &ro); ret = gp_widget_new (type, label, widget); if (ret != GP_OK) goto out; gp_widget_set_name (*widget, name); gp_widget_set_readonly (*widget, ro); switch (type) { case GP_WIDGET_MENU: case GP_WIDGET_RADIO: { char *value; int i, nrofchoices; nrofchoices = gp_widget_count_choices (child); for (i = 0; i < nrofchoices; i++) { const char *choice; gp_widget_get_choice (child, i, &choice); gp_widget_add_choice (*widget, choice); } gp_widget_get_value (child, &value); gp_widget_set_value (*widget, value); break; } case GP_WIDGET_TEXT: { char *value; gp_widget_get_value (child, &value); gp_widget_set_value (*widget, value); break; } case GP_WIDGET_RANGE: { float value, rmin, rmax, rstep; gp_widget_get_range (child, &rmin, &rmax, &rstep); gp_widget_set_range (*widget, rmin, rmax, rstep); gp_widget_get_value (child, &value); gp_widget_set_value (*widget, &value); break; } case GP_WIDGET_TOGGLE: case GP_WIDGET_DATE: { int value; gp_widget_get_value (child, &value); gp_widget_set_value (*widget, &value); break; } case GP_WIDGET_BUTTON: case GP_WIDGET_SECTION: case GP_WIDGET_WINDOW: default: ret = GP_ERROR_BAD_PARAMETERS; break; } out: gp_widget_free (rootwidget); CHECK_CLOSE (camera, context); CAMERA_UNUSED (camera, context); return ret; }