diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | maintain_focus_record_back.c | 191 |
2 files changed, 192 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..71b12d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +capture_focus diff --git a/maintain_focus_record_back.c b/maintain_focus_record_back.c new file mode 100644 index 0000000..1646e3c --- /dev/null +++ b/maintain_focus_record_back.c @@ -0,0 +1,191 @@ +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <gphoto2/gphoto2.h> +#include <time.h> +#include <ncurses.h> + +#define FOCUS_WIDGET_NAME "manualfocusdrive" +#define VIEWFINDER_WIDGET_NAME "viewfinder" + +/** + gp_widget_set_value(CameraWidget*, const void) <-sets value + gp_widget_get_child_by_label(CameraWidget* widget, const char* label, CameraWidget ** child) <- child is widget + gp_camera_get_config(Camera* camera, CameraWidget **window, GpContext* context) <- window is parent + + camera_init(Camera* camera, GPContext *context) + + + Create context: + context = gp_context_new(); + gp_context_set_error_func (context, ctx_error_func, NULL); + gp_context_set_status_func (context, ctx_status_func, NULL); + Create camera: + gp_camera_new(&camera); <- point to return value + +**/ +void user_conf() { + printw("\nPress enter to continue.\n"); + refresh(); + getchar(); +} + +int set_widget_value(CameraWidget *widget, void *widget_value, const char *widget_name, Camera *camera, GPContext *context) { + int err; + if ((err = gp_widget_set_value(widget, widget_value)) != 0) { + printw("Error setting local widget value: %s\nThis is not the hardware\'s fault. Fix your code!\n", gp_result_as_string(err)); + return(1); + } + if((err = gp_camera_set_single_config(camera, widget_name, widget, context)) != 0) { + printw("Error modifying camera widget: %s\n", gp_result_as_string(err)); + return(2); + } + +} + +int main() { + char focus_state[8] = "None"; + int user_focusing = 1; + int toggle = 1; //wish there was a better way to do this... + int key; + int err; + unsigned int focal_near[3] = {0, 0, 0}; + unsigned int focal_far[3] = {0, 0, 0}; + + Camera *cam; + CameraWidget *widget_root; + CameraWidget *focus_widget; + CameraWidget *liveview_widget; + + initscr(); + cbreak(); + noecho(); + + char *key_help_msg = "Press [q] [w] [e] to focus closer, [q] moving the fastest.\nPress [a] [s] [d] to focus further, [a] being the fastest.\nPress [Q] when done.\n"; + + GPContext *context = gp_context_new(); + gp_camera_new(&cam); + + //start up and connect to camera + printw("Initilizing camera...\n"); + refresh(); + if ((err = gp_camera_init(cam, context)) != 0) { + printw("Couldn't connect to camera: %s\n", gp_result_as_string(err)); + refresh(); + return(1); + } + + //get configuration tree + gp_camera_get_config(cam, &widget_root, context); + //get child widgets + gp_widget_get_child_by_name(widget_root, FOCUS_WIDGET_NAME, &focus_widget); + gp_widget_get_child_by_name(widget_root, VIEWFINDER_WIDGET_NAME, &liveview_widget); + + //set to liveview so we can ajust focus + set_widget_value(liveview_widget, &toggle, VIEWFINDER_WIDGET_NAME, cam, context); + + printw("\nCamera now connected.\nOn the camera, manually focus all the way to the left. Turn on autofocus when done.\n"); + user_conf(); + + + /** + * Left: far + * Right: near + * Powerful: 3 + * There's a lot of limitations, such as not knowing when we've hit the limit. We'll just have to depend on the user (me!) for that. + * We also don't know how much "Near/Far 3" is compared to "Near/Far 1". + */ + while(user_focusing) { + clear(); + printw("%s", key_help_msg); + printw("Near 3:\t\t%i\nNear 2:\t\t%i\nNear 1:\t\t%i\nFar 3:\t\t%i\nFar 2:\t\t%i\nFar 1:\t\t%i\n", focal_near[2], focal_near[1], focal_near[0], focal_far[2], focal_far[1], focal_far[0]); + refresh(); + flushinp(); + switch(getch()) { + case 'q': + focal_near[2]++; + set_widget_value(focus_widget, "Near 3", FOCUS_WIDGET_NAME, cam, context); + usleep(500000); + break; + case 'w': + focal_near[1]++; + set_widget_value(focus_widget, "Near 2", FOCUS_WIDGET_NAME, cam, context); + usleep(250000); + break; + case 'e': + focal_near[0]++; + set_widget_value(focus_widget, "Near 1", FOCUS_WIDGET_NAME, cam, context); + usleep(125000); + break; + case 'a': + focal_far[2]++; + set_widget_value(focus_widget, "Far 3", FOCUS_WIDGET_NAME, cam, context); + usleep(500000); + break; + case 's': + focal_far[1]++; + set_widget_value(focus_widget, "Far 2", FOCUS_WIDGET_NAME, cam, context); + usleep(250000); + break; + case 'd': + focal_far[0]++; + set_widget_value(focus_widget, "Far 1", FOCUS_WIDGET_NAME, cam, context); + usleep(125000); + break; + case 'Q': + user_focusing = 0; + break; + default: + break; + } + } + clear(); + printw("Focal length saved, put on the filter now. You can turn off autofocus.\n"); + user_conf(); + + clear(); + printw("Manually focus all the way to left, then turn on autofocus.\n"); + user_conf(); + + clear(); + printw("Restoring focus...\n"); + for(; focal_near[2] >= 1; focal_near[2]--) { + set_widget_value(focus_widget, "Near 3", FOCUS_WIDGET_NAME, cam, context); + usleep(500000); + } + + for(; focal_near[1] >= 1; focal_near[1]--) { + set_widget_value(focus_widget, "Near 2", FOCUS_WIDGET_NAME, cam, context); + usleep(250000); + } + + for(; focal_near[0] >= 1; focal_near[0]--) { + set_widget_value(focus_widget, "Near 1", FOCUS_WIDGET_NAME, cam, context); + usleep(125000); + } + for(; focal_far[2] >= 1; focal_far[2]--) { + set_widget_value(focus_widget, "Far 3", FOCUS_WIDGET_NAME, cam, context); + usleep(500000); + } + + for(; focal_far[1] >= 1; focal_far[1]--) { + set_widget_value(focus_widget, "Far 2", FOCUS_WIDGET_NAME, cam, context); + usleep(250000); + } + + for(; focal_far[0] >= 1; focal_far[0]--) { + set_widget_value(focus_widget, "Far 1", FOCUS_WIDGET_NAME, cam, context); + usleep(125000); + } + + printw("Done!\n"); + user_conf(); + + endwin(); + gp_camera_exit(cam, context); + + + return(0); + +} |