You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SimpleSkyCam/output.cc

168 lines
4.0 KiB

#include <unistd.h>
#include "convert.h"
#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
//
gpointer _OutputThread (gpointer data) {
output.Thread ();
return NULL;
};
/*
*
*/
Output::Output() { // @suppress("Class members should be properly initialized")
printf ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
g_mutex_init (&mutexin);
g_mutex_init (&muteximage);
g_mutex_init (&mutextmp);
g_mutex_init (&mutex);
running = 1;
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;
if (thread) {
g_thread_join (thread);
thread = NULL;
}
};
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());
if (inFrameNew) {
printf ("%s:%d Output::NewFrame truncating one frame.\n", __FILE__, __LINE__);
}
LockInMutex();
inFrame.CopyFrom(rawframe);
inFrameNew = 1;
UnLockInMutex();
return 0;
};
//
// NewFrame: will set new frame
// Thread: newFrame |------> Find Object --- not found ---> send gui information
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;
}
UnLockInMutex();
usleep (10000); // sleep 10ms
}
}