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
+
+
+
+ False
+ True
+ 2
+
+
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);
};
+
+
+