diff options
-rw-r--r-- | etc/miav.conf | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/cprlisten.cc | 55 | ||||
-rw-r--r-- | src/cprlisten.h | 15 | ||||
-rw-r--r-- | src/cprquerydialog.cc | 37 | ||||
-rw-r--r-- | src/cprquerydialog.h | 7 |
6 files changed, 100 insertions, 18 deletions
diff --git a/etc/miav.conf b/etc/miav.conf index b551d64..40a8e18 100644 --- a/etc/miav.conf +++ b/etc/miav.conf @@ -11,6 +11,8 @@ cpr_host = "cpr.j.auh.dk" cpr_port = 10301 cpr_timeout = 10000 +cprlisten_port = 13183 + # Video source video_width = 720 video_height = 576 diff --git a/src/Makefile.am b/src/Makefile.am index fa10241..37b0f98 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,8 @@ miav_LDADD = $(shell ../tools/MocList o) $(QT_LIBS) $(IEC61883_LIBS) \ $(SDL_LIBS) $(DV_LIBS) miav_SOURCES = \ + aa_socket.cc \ + cprlisten.cc \ aboutwindow.cc \ camera.cc \ cprquerydialog.cc \ diff --git a/src/cprlisten.cc b/src/cprlisten.cc index 9a816d2..4cf8670 100644 --- a/src/cprlisten.cc +++ b/src/cprlisten.cc @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: tab; c-basic-offset: 2 -*- */ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * cprlisten.cc * @@ -26,36 +26,71 @@ */ #include "cprlisten.h" -#include "socket.h" +#include "aa_socket.h" #include <iostream> #include <string> +#include <stdio.h> + using namespace std; +#define MAGIC_STOP_STRING "SHUTTHEFUCKUP" + CPRListen::CPRListen(unsigned short port) { this->port = port; cpr = "N/A"; + cprchanged = false; + running = true; } CPRListen::~CPRListen() { } +void CPRListen::stop() +{ + running = false; + try { + AASocket socket; + socket.connect("localhost", port); + socket.send_string(MAGIC_STOP_STRING); + } catch(Network_error &e) { + //info->error("In stop(): %s.", e.error.c_str()); + } +} + void CPRListen::thread_main() { - while(1) { + //printf("Listening for CPRs.\n"); + while(running) { try { - Socket socket; + string newcpr; + AASocket socket; socket.listen(port); - mutex.lock(); - cpr = socket.receive_string(); - mutex.unlock(); - cerr << "Got CPR: " << cpr << endl; + newcpr = socket.receive_string(); + + if(newcpr == MAGIC_STOP_STRING) { + running = false; + } else { + mutex.lock(); + cprchanged = true; + cpr = newcpr; + mutex.unlock(); + //printf("Got CPR: %s.\n", cpr.c_str()); + } + } catch(Network_error &e) { - cerr << e.error << endl; + //printf("In thread_main(): %s.\n", e.error.c_str()); + running = false; } } + //printf("Stopped listening for CPRs.\n"); +} + +bool CPRListen::cprChanged() +{ + return cprchanged; } string CPRListen::getCpr() @@ -66,5 +101,7 @@ string CPRListen::getCpr() cpr_copy = cpr; mutex.unlock(); + cprchanged = false; + return cpr_copy; } diff --git a/src/cprlisten.h b/src/cprlisten.h index 57551f5..d1862f8 100644 --- a/src/cprlisten.h +++ b/src/cprlisten.h @@ -1,4 +1,4 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: tab; c-basic-offset: 2 -*- */ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * cprlisten.h * @@ -31,20 +31,29 @@ #include <string> #include "thread.h" -#include "mutex.h" +#include <QMutex> + +#include "aa_socket.h" class CPRListen: public Thread { public: CPRListen(unsigned short port); ~CPRListen(); + bool cprChanged(); std::string getCpr(); void thread_main(); + void stop(); // Stops the call to listen + private: + volatile bool running; + AASocket *socket; + + bool cprchanged; unsigned short port; std::string cpr; - Mutex mutex; + QMutex mutex; }; #endif/*__AASIMON_FRAMEWORK_CPRLISTEN_H__*/ diff --git a/src/cprquerydialog.cc b/src/cprquerydialog.cc index 8ea0986..c58a8ed 100644 --- a/src/cprquerydialog.cc +++ b/src/cprquerydialog.cc @@ -60,7 +60,8 @@ CPRQueryDialog::CPRQueryDialog(QLabel *lcpr, cprSocket = new QTcpSocket(this); connect(cprSocket, SIGNAL(readyRead()), SLOT(cprSocket_readyRead())); connect(cprSocket, SIGNAL(connected()), SLOT(cprSocket_connected())); - connect(cprSocket, SIGNAL(error(int)), SLOT(cprSocket_error(int))); + connect(cprSocket, SIGNAL(error(QAbstractSocket::SocketError)), + SLOT(cprSocket_error(QAbstractSocket::SocketError))); lbl_cpr->setText("Indtast CPR"); @@ -113,11 +114,35 @@ CPRQueryDialog::CPRQueryDialog(QLabel *lcpr, connect(bca,SIGNAL(clicked()), SLOT(b_c_clicked())); this->move(175,150); + + listen = new CPRListen(config->readInt("cprlisten_port")); + listen_timer = new QTimer(this); + connect(listen_timer, SIGNAL(timeout()), SLOT(listen_timeout())); + listen->run(); + listen_timer->start(500); // Check every 500 ms + show(); } CPRQueryDialog::~CPRQueryDialog() { + // Cleanup after cpr listen + listen->stop(); + // listen->wait_stop(); + delete listen; +} + +void CPRQueryDialog::listen_timeout() +{ + string newcpr; + if(listen->cprChanged()) { + char newcpr_buf[32]; + newcpr = listen->getCpr(); + sprintf(newcpr_buf, "%s-%s", newcpr.substr(0,6).c_str(), newcpr.substr(6,4).c_str()); + //printf("cprbuf[%s]\n", newcpr_buf); + lbl_cpr->setText(newcpr_buf); + verifycpr(newcpr_buf); + } } /** @@ -159,7 +184,7 @@ void CPRQueryDialog::b_c_clicked() { remove_all();} void CPRQueryDialog::b_clicked(int value) { - printf("%d\n", value); + //printf("%d\n", value); switch(value) { case 10: if (digits>0) digits--; @@ -212,9 +237,9 @@ void CPRQueryDialog::remove_all() */ void CPRQueryDialog::insert_digit(int value) { - printf("insert_digit(%d)\n", value); + //printf("insert_digit(%d)\n", value); char temp[3]; - printf("strlen(cpr) = %d cpr: '%s'\n", strlen(cpr), cpr); + //printf("strlen(cpr) = %d cpr: '%s'\n", strlen(cpr), cpr); switch(strlen(cpr)) { case 5: // Automaticaly add a hyphen after the sixth digit sprintf(temp, "%d-", value); @@ -327,8 +352,10 @@ int CPRQueryDialog::test_cpr(const char *s) * Called if an error occurres in the corsocket connection. * Writes out the appropriate error message. */ -void CPRQueryDialog::cprSocket_error(int errnum) +void CPRQueryDialog::cprSocket_error(QAbstractSocket::SocketError err) { + (void)err; + QString msg = QString("cprSocket encountered an error: "); timer->stop(); diff --git a/src/cprquerydialog.h b/src/cprquerydialog.h index 7a84f5e..da42d09 100644 --- a/src/cprquerydialog.h +++ b/src/cprquerydialog.h @@ -82,6 +82,7 @@ using namespace std; #include <QStatusBar> #include "messagebox.h" +#include "cprlisten.h" class CPRQueryDialog : public QDialog { Q_OBJECT @@ -101,12 +102,16 @@ public slots: void insert_digit(int value); void cprSocket_readyRead(); void cprSocket_connected(); - void cprSocket_error(int errnum); + void cprSocket_error(QAbstractSocket::SocketError err); void cprSocket_timeout(); + void listen_timeout(); private: QStatusBar *statusbar; + CPRListen *listen; + QTimer *listen_timer; + QLabel *lbl_cpr; QLabel *lbl_name; |