From 35770cfa3d055b55234c7e08e04af0e1566ea429 Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Wed, 16 Sep 2020 19:50:46 +0200 Subject: [PATCH] Added end-user errors --- camera.css | 7 +++++- camera.glade | 64 ++++++++++++++++++++++++++++++++++++++++++++++++---- main.c | 51 ++++++++++++++++++++++++++++++++--------- 3 files changed, 105 insertions(+), 17 deletions(-) diff --git a/camera.css b/camera.css index 224d68f..7968bf7 100644 --- a/camera.css +++ b/camera.css @@ -1,3 +1,8 @@ .black { background: #000000; -} \ No newline at end of file +} + +.errorbox { + background: #dd0000; + color: #ffffff; +} diff --git a/camera.glade b/camera.glade index 8e4f041..d1db2fc 100644 --- a/camera.glade +++ b/camera.glade @@ -55,11 +55,7 @@ True True - - True - False - gtk-cdrom - + + + + False + True + 2 + + page0 diff --git a/main.c b/main.c index 63be2a6..75b4b4e 100644 --- a/main.c +++ b/main.c @@ -75,6 +75,8 @@ static int preview_height = -1; // Widgets GtkWidget *preview; +GtkWidget *error_box; +GtkWidget *error_message; static int xioctl(int fd, int request, void *arg) @@ -93,6 +95,13 @@ errno_exit(const char *s) exit(EXIT_FAILURE); } +static void +show_error(const char *s) +{ + gtk_label_set_text(GTK_LABEL(error_message), s); + gtk_widget_show(error_box); +} + static void start_capturing(int fd) { @@ -248,7 +257,7 @@ init_sensor(char *fn, int width, int height, int mbus, int rate) current_fd = fd; } -static void +static int init_device(int fd) { struct v4l2_capability cap; @@ -311,9 +320,11 @@ init_device(int fd) fmt.fmt.pix.field = V4L2_FIELD_ANY; if (xioctl(fd, VIDIOC_S_FMT, &fmt) == -1) { - errno_exit("VIDIOC_S_FMT"); + g_printerr("VIDIOC_S_FMT failed"); + show_error("Could not set camera mode"); + return -1; } - + g_printerr("Driver returned %dx%d fmt %d\n", fmt.fmt.pix.width, fmt.fmt.pix.height, fmt.fmt.pix.pixelformat); @@ -345,6 +356,7 @@ init_device(int fd) } init_mmap(fd); + return 0; } static void @@ -803,6 +815,12 @@ on_shutter_clicked(GtkWidget *widget, gpointer user_data) capture = 1; } +void +on_error_close_clicked(GtkWidget *widget, gpointer user_data) +{ + gtk_widget_hide(error_box); +} + void on_camera_switch_clicked(GtkWidget *widget, gpointer user_data) { @@ -815,8 +833,7 @@ on_camera_switch_clicked(GtkWidget *widget, gpointer user_data) setup_rear(); current_is_rear = 1; } - printf("close() = %d\n", close(video_fd)); - printf("Opening %s again\n", dev_name); + close(video_fd); video_fd = open(dev_name, O_RDWR); if (video_fd == -1) { g_printerr("Error opening video device: %s\n", dev_name); @@ -853,9 +870,13 @@ main(int argc, char *argv[]) GtkWidget *shutter = GTK_WIDGET(gtk_builder_get_object(builder, "shutter")); GtkWidget *switch_btn = GTK_WIDGET(gtk_builder_get_object(builder, "switch_camera")); GtkWidget *settings_btn = GTK_WIDGET(gtk_builder_get_object(builder, "settings")); + GtkWidget *error_close = GTK_WIDGET(gtk_builder_get_object(builder, "error_close")); preview = GTK_WIDGET(gtk_builder_get_object(builder, "preview")); + error_box = GTK_WIDGET(gtk_builder_get_object(builder, "error_box")); + error_message = GTK_WIDGET(gtk_builder_get_object(builder, "error_message")); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(shutter, "clicked", G_CALLBACK(on_shutter_clicked), NULL); + g_signal_connect(error_close, "clicked", G_CALLBACK(on_error_close_clicked), NULL); g_signal_connect(switch_btn, "clicked", G_CALLBACK(on_camera_switch_clicked), NULL); g_signal_connect(preview, "draw", G_CALLBACK(preview_draw), NULL); g_signal_connect(preview, "configure-event", G_CALLBACK(preview_configure), NULL); @@ -867,6 +888,10 @@ main(int argc, char *argv[]) gtk_css_provider_load_from_path(provider, "/usr/share/megapixels/ui/camera.css", NULL); } GtkStyleContext *context = gtk_widget_get_style_context(preview_box); + gtk_style_context_add_provider(context, + GTK_STYLE_PROVIDER(provider), + GTK_STYLE_PROVIDER_PRIORITY_USER); + context = gtk_widget_get_style_context(error_box); gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER); @@ -882,29 +907,33 @@ main(int argc, char *argv[]) g_printerr("Could not parse config file\n"); return 1; } - if (find_media_fd() == -1) { g_printerr("Could not find the media node\n"); - return 1; + show_error("Could not find the media node"); + goto failed; } if (find_cameras() == -1) { g_printerr("Could not find the cameras\n"); - return 1; + show_error("Could not find the cameras"); + goto failed; } setup_rear(); int fd = open(dev_name, O_RDWR); if (fd == -1) { g_printerr("Error opening video device: %s\n", dev_name); - return 1; + show_error("Error opening the video device"); + goto failed; } video_fd = fd; - init_device(fd); + if(init_device(fd) < 0){ + goto failed; + } start_capturing(fd); - // Get a new frame every 34ms ~30fps +failed: printf("window show\n"); gtk_widget_show(window); g_idle_add((GSourceFunc)get_frame, NULL);