summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--maintain_focus.c104
-rw-r--r--makefile5
2 files changed, 96 insertions, 13 deletions
diff --git a/maintain_focus.c b/maintain_focus.c
index 3835e7e..dd90038 100644
--- a/maintain_focus.c
+++ b/maintain_focus.c
@@ -4,6 +4,7 @@
#include <string.h>
#include <gphoto2/gphoto2.h>
#include <time.h>
+#include <ncurses.h>
#define FOCUS_WIDGET_NAME "manualfocusdrive"
#define VIEWFINDER_WIDGET_NAME "viewfinder"
@@ -24,37 +25,53 @@
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) {
- printf("Error setting local widget value: %s\nThis is not the hardware\'s fault. Fix your code!\n", gp_result_as_string(err));
+ 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) {
- printf("Error modifying camera widget: %s\n", gp_result_as_string(err));
+ printw("Error modifying camera widget: %s\n", gp_result_as_string(err));
return(2);
}
}
int main() {
- char *focus_large_temp = "Near 3";
- int viewfinder_state = 1; //wish there was a better way to do this...
+ 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_distance[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
- printf("Initilizing camera...\n");
+ printw("Initilizing camera...\n");
+ refresh();
if ((err = gp_camera_init(cam, context)) != 0) {
- printf("Couldn't connect to camera: %s\n", gp_result_as_string(err));
+ printw("Couldn't connect to camera: %s\n", gp_result_as_string(err));
+ refresh();
return(1);
}
@@ -65,14 +82,79 @@ int main() {
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, &viewfinder_state, VIEWFINDER_WIDGET_NAME, cam, context);
+ 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("Level 3:\t\t%i\nLevel 2:\t\t%i\nLevel 1:\t\t%i\n", focal_distance[2], focal_distance[1], focal_distance[0]);
+ refresh();
+ switch(getch()) {
+ case 'q':
+ focal_distance[2]++;
+ set_widget_value(focus_widget, "Near 3", FOCUS_WIDGET_NAME, cam, context);
+ break;
+ case 'w':
+ focal_distance[1]++;
+ set_widget_value(focus_widget, "Near 2", FOCUS_WIDGET_NAME, cam, context);
+ break;
+ case 'e':
+ focal_distance[0]++;
+ set_widget_value(focus_widget, "Near 1", FOCUS_WIDGET_NAME, cam, context);
+ break;
+ case 'a':
+ if(focal_distance[2] > 0) {
+ focal_distance[2]--;
+ set_widget_value(focus_widget, "Far 3", FOCUS_WIDGET_NAME, cam, context);
+ }
+ break;
+ case 's':
+ if(focal_distance[1] > 0) {
+ focal_distance[1]--;
+ set_widget_value(focus_widget, "Far 2", FOCUS_WIDGET_NAME, cam, context);
+ }
+ break;
+ case 'd':
+ if(focal_distance[0] > 0) {
+ focal_distance[0]--;
+ set_widget_value(focus_widget, "Far 1", FOCUS_WIDGET_NAME, cam, context);
+ }
+ 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");
+ printw("Done!\n");
+ user_conf();
+
+ endwin();
gp_camera_exit(cam, context);
+
-
- return(1);
+ return(0);
}
diff --git a/makefile b/makefile
index c352f29..2dbf5ae 100644
--- a/makefile
+++ b/makefile
@@ -1,8 +1,9 @@
CC=gcc
OUT=capture_focus
+LIBS=-lgphoto2 -lncurses -ltinfo
make: maintain_focus.c
- $(CC) maintain_focus.c -lgphoto2 -o $(OUT)
+ $(CC) maintain_focus.c $(LIBS) -o $(OUT)
debug: maintain_focus.c
- $(CC) maintain_focus.c -lgphoto2 -ggdb -o $(OUT)
+ $(CC) maintain_focus.c $(LIBS) -ggdb -o $(OUT)