diff --git a/gui.cc b/gui.cc index bad0b56..54feec1 100644 --- a/gui.cc +++ b/gui.cc @@ -91,10 +91,12 @@ void cb_menu_set_rgbenc (GtkCheckMenuItem *checkmenuitem, gpointer user_data) { } -//data + +// // callback from filter thread. Data will point to the output VideoFrame. // Access to this data must be Locked before use. -gboolean cb_thread_filter (gpointer data) { +// +/* gboolean cb_thread_filter (gpointer data) { VideoFrame *vf = (VideoFrame *) data; int pix_h, pix_w; @@ -127,6 +129,7 @@ gboolean cb_thread_filter (gpointer data) { output.UnLockImageMutex(); return false; }; +*/ // diff --git a/gui.h b/gui.h index fc015ac..bea6f07 100644 --- a/gui.h +++ b/gui.h @@ -154,15 +154,13 @@ G_MODULE_EXPORT gboolean cb_thread_video (gpointer data); G_MODULE_EXPORT void cb_input_show_window (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_input_btncapture (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_input_btnsnapshot (GtkWidget *widget, gpointer data); +G_MODULE_EXPORT void cb_input_btnstop (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_input_btnscale (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_input_btnsetdestpath (GtkWidget *widget, gpointer data); // // filter detect or image data G_MODULE_EXPORT void cb_imagetempda_draw(GtkWidget *area, cairo_t *cr, int w, int h, gpointer data); -G_MODULE_EXPORT gboolean cb_thread_filter (gpointer data); -G_MODULE_EXPORT gboolean cb_thread_detect (gpointer data); -G_MODULE_EXPORT gboolean cb_thread_posctl (gpointer data); G_MODULE_EXPORT void cb_image_btnnew (GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cb_image_btnsave (GtkWidget *widget, gpointer data); @@ -212,10 +210,16 @@ G_MODULE_EXPORT void cb_menu_set_histlog (GtkCheckMenuItem *checkmenuitem, gpoi G_MODULE_EXPORT void cb_menu_set_displaycalibdata(GtkCheckMenuItem *checkmenuitem, gpointer user_data); // -// error handling +// error handling and thread handling G_MODULE_EXPORT gboolean errormessage_thread (gpointer data); G_MODULE_EXPORT void errormessage_cb_btnok (GtkWidget *widget, gpointer data); +// G_MODULE_EXPORT gboolean cb_thread_filter (gpointer data); +G_MODULE_EXPORT gboolean cb_thread_detect (gpointer data); +G_MODULE_EXPORT gboolean cb_thread_posctl (gpointer data); +G_MODULE_EXPORT gboolean cb_thread_output (gpointer data); + + #ifdef __cplusplus diff --git a/output.cc b/output.cc index 71d4d4f..fe3536e 100644 --- a/output.cc +++ b/output.cc @@ -6,9 +6,60 @@ #include "config.h" #include "gui.h" #include "output.h" +#include "configuration.h" +#include "error.h" +extern GtkBuilder *_builder_; // work around for threads extern Output output; +/* + * callback from output thread + */ +gboolean cb_thread_output (gpointer data) { + int mode = output.GetStatus(); + GtkWidget *btncapture = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn_inputcapture")); + GtkWidget *btnstop = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn_inputstop")); + GtkWidget *btnsnapshot = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "btn_inputsnapshot")); + GtkWidget *btninputdest = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "input_btn_destpath")); + GtkWidget *inputdest = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "input_entry_destpath")); + + if (mode & OUTPUT_MODE_SER_STARTED) { + gtk_widget_set_sensitive(btnstop, true); + gtk_widget_set_sensitive(btncapture, false); + gtk_widget_set_sensitive(btnsnapshot, false); + gtk_widget_set_sensitive(btninputdest, false); + gtk_widget_set_sensitive(inputdest, false); + } + else { + gtk_widget_set_sensitive(btnstop, false); + gtk_widget_set_sensitive(btncapture, true); + gtk_widget_set_sensitive(btnsnapshot, true); + gtk_widget_set_sensitive(btninputdest, true); + gtk_widget_set_sensitive(inputdest, true); + } + + return false; +} + + +void cb_input_btncapture (GtkWidget *widget, gpointer data) { + printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); + GtkWidget *inputdest = GTK_WIDGET(gtk_builder_get_object (GTK_BUILDER(_builder_), "input_entry_destpath")); + std::string s = gtk_entry_get_text(GTK_ENTRY(inputdest)); + output.SERStart(s); +}; + + +void cb_input_btnsnapshot (GtkWidget *widget, gpointer data) { + printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); +}; + +void cb_input_btnstop (GtkWidget *widget, gpointer data) { + printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); + output.SERStop(); +}; + + // // C / C++ Wrapper for the thread function // @@ -19,6 +70,9 @@ gpointer _OutputThread (gpointer data) { +/* + * + */ Output::Output() { // @suppress("Class members should be properly initialized") printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); @@ -30,9 +84,36 @@ Output::Output() { // @suppress("Class members should be properly initialized") inFrame.Delete(); thread = NULL; thread = g_thread_new("Output", _OutputThread, NULL); + mode = 0; }; +void Output::NotifyGTK () { + gdk_threads_add_idle(cb_thread_output, NULL); +} + + +/* + * open output file and set mode flag + */ +void Output::SERStart (std::string destpath) { + printf ("%s:%d SERStart Destination Folder: %s\n", __FILE__, __LINE__, destpath.c_str()); + + mode |= OUTPUT_MODE_SER_STARTED; + // start SER output + NotifyGTK(); +}; + + +/* + * clode output file + */ +void Output::SERStop () { + mode &= ~(OUTPUT_MODE_SER_STARTED); + // stop SER output + NotifyGTK(); +}; + Output::~Output() { running = 0; @@ -47,7 +128,10 @@ Output::~Output() { int Output::NewFrame(VideoFrameRaw *rawframe) { if (rawframe == NULL) return -1; - printf ("%s:%d Output::NewFrame Frame Raw: %d x %d Type: %s\n", __FILE__, __LINE__, rawframe->w, rawframe->h, convert_from_pixelformat(rawframe->pixfmt).c_str()); +// printf ("%s:%d Output::NewFrame Frame Raw: %d x %d Type: %s\n", __FILE__, __LINE__, rawframe->w, rawframe->h, convert_from_pixelformat(rawframe->pixfmt).c_str()); + if (inFrameNew) { + printf ("%s:%d Output::NewFrame truncating one frame.\n", __FILE__, __LINE__); + } LockInMutex(); inFrame.CopyFrom(rawframe); @@ -57,11 +141,6 @@ int Output::NewFrame(VideoFrameRaw *rawframe) { }; -void Output::NewImage() { -// newimage = 1; -} - - // // NewFrame: will set new frame // Thread: newFrame |------> Find Object --- not found ---> send gui information @@ -69,26 +148,20 @@ void Output::Thread() { while (running) { // check for new frame LockInMutex(); + if (inFrameNew == 1) { + if (mode & OUTPUT_MODE_SER_STARTED) { + // for now display error message + errormessage_display((char*)"windows-main", (char*)"Error", (char*)"Writing SER files is not finished yet."); + SERStop(); + } inFrameNew = 0; - - // - // do some other stuff use if possible only the oldFrame data - ComposeOutput(); - UnLockInMutex(); - - // copy output image for gtk } - else - UnLockInMutex(); + + UnLockInMutex(); usleep (10000); // sleep 10ms } } -void Output::ComposeOutput() { -// printf ("%s:%d inFrame (w:%d h:%d)\n", __FILE__, __LINE__, inFrame.w, inFrame.h); -} - - diff --git a/output.h b/output.h index d38dc5f..00965f9 100644 --- a/output.h +++ b/output.h @@ -14,6 +14,8 @@ #include "videoframe.h" +#define OUTPUT_MODE_SER_STARTED 0x0001 + class Output { private: int running; @@ -24,18 +26,16 @@ private: GMutex mutextmp; // for access the temp image GMutex mutex; // general mutex for changing settings GThread *thread; - -// int newimage; + unsigned int mode; // see OUTPUT_MODE_ flags void ComposeOutput(); - + void NotifyGTK (); public: Output(); ~Output(); int NewFrame (VideoFrameRaw *rawframe); - void NewImage (); - // + // Thread Releated Functions (maybe soon private?) int TryLockInMutex() { return g_mutex_trylock(&mutexin); }; void LockInMutex() { g_mutex_lock(&mutexin);}; @@ -54,6 +54,11 @@ public: void SetObject (VideoFrame objFrame, int newx, int newy); void GetObjectPos (int *x, int *y); + void SERStart(std::string destpath); + void SERStop(); + + int GetStatus() { return mode; }; + void Thread(); }; diff --git a/simpleskycam.ui b/simpleskycam.ui index f4890b8..6c3f921 100644 --- a/simpleskycam.ui +++ b/simpleskycam.ui @@ -2458,6 +2458,21 @@ 1 + + + Stop + True + True + True + + + + + False + True + 2 + + True @@ -2472,19 +2487,11 @@ Flat DarkFlat - - - False - False - 6 - Light - - False True - 2 + 3 diff --git a/video.cc b/video.cc index d776900..a0f4d11 100644 --- a/video.cc +++ b/video.cc @@ -860,16 +860,6 @@ void cb_video_cbox_videodev (GtkWidget *widget, gpointer data) { }; -void cb_input_btncapture (GtkWidget *widget, gpointer data) { - printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); -}; - - -void cb_input_btnsnapshot (GtkWidget *widget, gpointer data) { - printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); -}; - - /* * resize windows depending on the button which was pressed */ @@ -905,3 +895,6 @@ void cb_input_btnscale (GtkWidget *widget, gpointer data) { gtk_window_resize(GTK_WINDOW(win), ww, wh); }; + + +