diff options
author | Marcus Meissner <marcus@jet.franken.de> | 2012-12-09 19:20:49 +0000 |
---|---|---|
committer | Marcus Meissner <marcus@jet.franken.de> | 2012-12-09 19:20:49 +0000 |
commit | c260c8138eeeb3950e31abda480bfd2374119d97 (patch) | |
tree | 88d4879480192cb1d9a319e4542dbf7dd00df0a9 | |
parent | f74aaca7599c34361aefe2cf8b6fe5a71978efdc (diff) | |
download | libgphoto2-c260c8138eeeb3950e31abda480bfd2374119d97.tar.gz |
use CANON_USB_CONTROL_GET_ZOOM_POS to get and set zoom levels
from "Daniel P. Berrange" <dan@berrange.com>
git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@14148 67ed7778-7388-44ab-90cf-0a291f65f57c
-rw-r--r-- | camlibs/canon/canon.c | 59 | ||||
-rw-r--r-- | camlibs/canon/canon.h | 1 | ||||
-rw-r--r-- | camlibs/canon/library.c | 6 |
3 files changed, 63 insertions, 3 deletions
diff --git a/camlibs/canon/canon.c b/camlibs/canon/canon.c index aa99e3636..72819d9e6 100644 --- a/camlibs/canon/canon.c +++ b/camlibs/canon/canon.c @@ -2027,6 +2027,65 @@ canon_int_set_zoom (Camera *camera, unsigned char zoom_level, /** + * canon_int_get_zoom + * @camera: camera to work with + * @zoom_level: pointer to hold returned zoom level - A40: 1..10; G1: 0..40 (pMaxOpticalZoomPos*4) + * @context: context for error reporting + * + * Gets the camera's zoom. Only tested for G1 via USB. + * + * Returns: gphoto2 error code + * + */ +int +canon_int_get_zoom (Camera *camera, unsigned char *zoom_level, + GPContext *context) +{ + unsigned char *msg = NULL; + unsigned int datalen = 0; + unsigned char payload[0x4c]; + int payloadlen; + char desc[128]; + + *zoom_level = 0; + GP_DEBUG ("canon_int_get_zoom() called"); + + payloadlen = canon_int_pack_control_subcmd( payload, + CANON_USB_CONTROL_GET_ZOOM_POS, + 0, 0, desc ); + + if ( camera->pl->md->model == CANON_CLASS_6 ) { + /* Newer protocol uses a different code, but with same + * response. It also needs an extra zero byte at the + * end. */ + payload[payloadlen++] = 0; + msg = canon_usb_dialogue ( camera, + CANON_USB_FUNCTION_CONTROL_CAMERA_2, + &datalen, payload, payloadlen ); + } + else + msg = canon_usb_dialogue ( camera, + CANON_USB_FUNCTION_CONTROL_CAMERA, + &datalen, payload, payloadlen ); + if ( msg == NULL && datalen != 0x1c) { + /* ERROR */ + GP_DEBUG ("%s datalen=%x", + desc, datalen); + return GP_ERROR_CORRUPTED_DATA; + } + + *zoom_level = msg[12]; + + msg = NULL; + datalen = 0; + + GP_DEBUG ("canon_int_get_zoom() finished successfully level=%d", *zoom_level); + + return GP_OK; +} + + +/** * canon_int_set_image_format * @camera: camera to work with * @res_byte1: byte 1 of the 3-byte image format code diff --git a/camlibs/canon/canon.h b/camlibs/canon/canon.h index d3e6d4422..4905c7db4 100644 --- a/camlibs/canon/canon.h +++ b/camlibs/canon/canon.h @@ -713,6 +713,7 @@ int canon_int_end_remote_control(Camera *camera, GPContext *context); int canon_int_set_beep(Camera *camera, canonBeepMode beep_mode, GPContext *context); int canon_int_set_flash(Camera *camera, canonFlashMode flash_mode, GPContext *context); int canon_int_set_zoom(Camera *camera, unsigned char zoom_level, GPContext *context); +int canon_int_get_zoom(Camera *camera, unsigned char *zoom_level, GPContext *context); /* * introduced for capturing diff --git a/camlibs/canon/library.c b/camlibs/canon/library.c index 14eee9b55..6edc641d2 100644 --- a/camlibs/canon/library.c +++ b/camlibs/canon/library.c @@ -1577,6 +1577,7 @@ camera_get_config (Camera *camera, CameraWidget **window, GPContext *context) time_t camtime; char formatted_camera_time[30]; float zoom; + unsigned char zoomVal; GP_DEBUG ("camera_get_config()"); @@ -1734,9 +1735,8 @@ camera_get_config (Camera *camera, CameraWidget **window, GPContext *context) gp_widget_new (GP_WIDGET_RANGE, _("Zoom"), &t); gp_widget_set_name (t, "zoom"); gp_widget_set_range (t, 0, 255, 1); - /* Set an unknown zoom level (at the moment we don't read the - * zoom level */ - zoom = -1; + canon_int_get_zoom(camera, &zoomVal, context); + zoom = zoomVal; gp_widget_set_value (t, &zoom); gp_widget_append (section, t); |