diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cprquerydialog.cc | 191 | ||||
| -rw-r--r-- | src/cprquerydialog.h | 24 | ||||
| -rw-r--r-- | src/miav.conf | 1 | ||||
| -rw-r--r-- | src/player.cc | 8 | 
4 files changed, 153 insertions, 71 deletions
| diff --git a/src/cprquerydialog.cc b/src/cprquerydialog.cc index 8ae2c60..e5a722f 100644 --- a/src/cprquerydialog.cc +++ b/src/cprquerydialog.cc @@ -45,6 +45,7 @@ CPRQueryDialog::CPRQueryDialog(QLabel *lcpr,    //Read configuration    CPR_HOST = cfg.readString("cpr_host");    CPR_PORT = cfg.readInt("cpr_port"); +  CPR_TIMEOUT = cfg.readInt("cpr_timeout");    cpr[0] = '\0';    internalCpr[0] = '\0';	 @@ -52,9 +53,14 @@ CPRQueryDialog::CPRQueryDialog(QLabel *lcpr,    cprSocket = new QSocket(this);    connect(cprSocket, SIGNAL(readyRead()), SLOT(cprSocket_readyRead()));    connect(cprSocket, SIGNAL(connected()), SLOT(cprSocket_connected())); +  connect(cprSocket, SIGNAL(error(int)), SLOT(cprSocket_error(int)));    lbl_cpr->setText("Indtast CPR"); +  // Setup connection timer +  timer = new QTimer(this); +  connect(timer, SIGNAL(timeout()), SLOT(cprSocket_timeout())); +    // Generate input buttons  	QGridLayout *gl = new QGridLayout(this, 4, 3, 10, 2); @@ -106,8 +112,11 @@ CPRQueryDialog::~CPRQueryDialog()  {  } +/** + * createButton: + * A genric button-creater  + */  QPushButton *CPRQueryDialog::createButton(QWidget *parent, const char *text, int value)  -/* A genric button-creater */  {    char buf[32];    sprintf(buf, "%d", value); @@ -120,7 +129,8 @@ QPushButton *CPRQueryDialog::createButton(QWidget *parent, const char *text, int  	return q;  } -/* Event function for handling buttonclicks. +/** + * Event functions for handling buttonclicks.   * For button 0-9 the values is sent back.   * Backspace and clear are handled via special   * signals. @@ -161,31 +171,13 @@ void CPRQueryDialog::b_clicked(int value)  	}  } -void CPRQueryDialog::run(int pos)  -/* This is where the mgui thread starts. - * Open a inputwindow and prepare to receive a cpr - */  -{ - -  //  iw = new CPRQueryDialog(this, "Input", true, pos); -   - -  // TODO : Reconnect -  /* -  if (this->exec() == QDialog::Accepted) { -#ifdef WITH_DV -    camera->setCpr(cpr); -#endif -    verifycpr(cpr); -  } -  */ -} - -void CPRQueryDialog::remove_digit()  -/* Remove one digit from the selected cpr +/** + * remove_digit: + * Remove one digit from the selected cpr   * Used when the user pushes backspace in   * the inputwindow   */ +void CPRQueryDialog::remove_digit()   {    int temp;    temp = strlen(cpr); @@ -196,15 +188,21 @@ void CPRQueryDialog::remove_digit()    lbl_cpr->setText(cpr);  } +/** + * remove_all: + * Clear the selected cpr  + */  void CPRQueryDialog::remove_all()  -/* Clear the selected cpr */  {    strcpy(cpr, "");    lbl_cpr->setText(cpr);  } +/** + * insert_digit: + * Respond to what the user types in the inputWindow  + */  void CPRQueryDialog::insert_digit(int value) -/* Respond to what the user types in the inputWindow */  {    char temp[2];    switch(strlen(cpr)) { @@ -227,18 +225,20 @@ void CPRQueryDialog::insert_digit(int value)    }  } -void CPRQueryDialog::verifycpr(char *cpr)  -/* Test a cpr via test_cpr(). +/** + * verifycpr: + * Test a cpr via test_cpr().   * If cpr is invalid, then ask user what - * to do via confirmCprWindow + * to do via MessageBox   */ +void CPRQueryDialog::verifycpr(char *cpr)   {    strncpy(internalCpr, cpr, 6);    strncpy(internalCpr+6, cpr+7, 4);    internalCpr[10] = 0;    if (!(test_cpr(internalCpr))) { -    MessageBox ccw(this, "Bekræft", "Ugyldigt CPR nummer, brug det alligevel?", TYPE_YES_NO_CANCEL); +    MessageBox ccw(this, CONFIRM_INVALID_CPR_TITLE, CONFIRM_INVALID_CPR, TYPE_YES_NO_CANCEL);      switch(ccw.exec()) {      case MSG_CANCEL:        bedit_clicked(); @@ -252,47 +252,48 @@ void CPRQueryDialog::verifycpr(char *cpr)      }    } else {      cprSocket->connectToHost(CPR_HOST->c_str(), CPR_PORT); -    accept(); +    timer->start(CPR_TIMEOUT); +    //    accept();    }  } -void CPRQueryDialog::bcancel_clicked()  /* Clears all data - alerts user if measurements are not stored */ +void CPRQueryDialog::bcancel_clicked()  {    cpr[0]= '\0';    lbl_cpr->setText("Indtast CPR");    lbl_name->setText(""); -  run(0);  } -void CPRQueryDialog::bedit_clicked()   /* This is used when the user enters a cpr that is not valid and wishes to edit   * the cpr.   */ +void CPRQueryDialog::bedit_clicked()   {    cpr[10]= '\0';    lbl_cpr->setText(cpr);    lbl_name->setText(""); -  run(9);  } +/** + * test_cpr: + * Checks that a cpr i valid via a modulo 11 test  + */  int CPRQueryDialog::test_cpr(const char *s) -/* Checks that a cpr i valid via a modulo11 test */  {    int sum = 0;    int ctl;    const char *cptr; -  if(strlen(s) != 10) -    return 0; +  // Is the string to short to be a cpr? +  if(strlen(s) != 10) return 0; -  for(cptr = s; *cptr; cptr++) -    { -      if(!isdigit(*cptr)) -	return 0; -    } +  // Are all characters digits? +  for(cptr = s; *cptr; cptr++) if(!isdigit(*cptr)) return 0; + +  // Calculate modulo 11 checksum    sum += (s[0] - '0') * 4;    sum += (s[1] - '0') * 3;    sum += (s[2] - '0') * 2; @@ -303,32 +304,63 @@ int CPRQueryDialog::test_cpr(const char *s)    sum += (s[7] - '0') * 3;    sum += (s[8] - '0') * 2;    ctl = 11 - (sum % 11); -  if(ctl == 11) -    ctl = 0; + +  // Is the checksum correct? +  if(ctl == 11) ctl = 0;    return s[9] - '0' == ctl;  } -void CPRQueryDialog::cprSocket_readyRead()  -/* Uses a patients cpr to look up his or hers name +/** + * cprSocket_error + * Called if an error occurres in the corsocket connection. + * Writes out the appropriate error message. + */ +void CPRQueryDialog::cprSocket_error(int errnum) +{ +  timer->stop(); +   +  lbl_name->setText(NAME_NOT_AVAILABLE); + +  // Print error message +  switch(errnum) { +  case QSocket::ErrConnectionRefused: // if the connection was refused +    printf("ErrConnectionRefused\n"); +    break; +  case QSocket::ErrHostNotFound: // if the host was not found +    printf("ErrHostNotFound\n"); +    break; +  case QSocket::ErrSocketRead: // if a read from the socket failed  +    printf("ErrSocketRead\n"); +    break; +  } + +  accept(); +} + +/** + * cprSocket_readyRead: + * Uses a patients cpr to look up his or hers name   * via the departments cpr-server.   * This is called by the cprSocket when the socket is ready   */ +void CPRQueryDialog::cprSocket_readyRead()   {    QString name;    QString firstname;    QString lastname;    int timeout = 0; -  if (!cprSocket->canReadLine()) -    return; + +  timer->stop(); + +  if (!cprSocket->canReadLine()) return; +    while(cprSocket->canReadLine()) {      QString s = cprSocket->readLine();      if (s.startsWith("0001")) {        name.append(s.right(s.length()-4));        lastname.append(s.right(s.length()-4));        name.setLength(name.length()-1); -      if (name.length()) -	name += QString(", "); -       +      if (name.length()) name += QString(", ");      }      if (s.startsWith("0002")) {        name.append(s.right(s.length()-4)); @@ -336,25 +368,66 @@ void CPRQueryDialog::cprSocket_readyRead()        name.setLength(name.length()-1);        cprSocket->close();        lbl_name->setText(name); +      accept(); +      return; +    } +    if (timeout>1000) { +      lbl_name->setText(NAME_NOT_AVAILABLE); +      MessageBox(this, NAME_NOT_AVAILABLE_TITLE, NAME_NOT_AVAILABLE, TYPE_OK, ICON_ERROR).exec(); +      accept();        return;      } -    if (timeout>1000) -      { -	lbl_name->setText(NAME_NOT_AVAILABLE); -	return; -      }      timeout++;    } +   +  accept();  } -void CPRQueryDialog::cprSocket_connected()  -/* Writes the selected cpr to the cpr-server +/** + * cprSocket_connected: + * Writes the selected cpr to the cpr-server   * when the cprSocket is connected.   */ +void CPRQueryDialog::cprSocket_connected()   {	 +  timer->stop();    cprSocket->writeBlock(internalCpr, 10);    cprSocket->writeBlock("\n", 1);  } +/** + * cprSocket_timeout: + * Called when the connection has not emitted a signal in CPR_TIMEOUT miliseconds. + */ +void CPRQueryDialog::cprSocket_timeout() +{ +  timer->stop(); + +  lbl_name->setText(NAME_NOT_AVAILABLE); + +  printf("cprSocket timed out tryning to:\n"); + +  // Print connection status +  switch(cprSocket->state()) { +  case QSocket::Idle:       // if there is no connection +    printf("Idle\n"); +    break; +  case QSocket::HostLookup: // during a DNS lookup +    printf("HostLookup\n"); +    break; +  case QSocket::Connecting: // during TCP connection establishment +    printf("Connecting\n"); +    break; +  case QSocket::Connected:  // when there is an operational connection +    printf("Conected\n"); +    break; +  case QSocket::Closing:    // if the socket is closing down, but is not yet closed. +    printf("Closing\n"); +    break; +  } +   +  accept(); +} +  #endif /* USE_GUI */ diff --git a/src/cprquerydialog.h b/src/cprquerydialog.h index 992e66a..2f492f1 100644 --- a/src/cprquerydialog.h +++ b/src/cprquerydialog.h @@ -26,13 +26,17 @@  #ifndef __MIAV_CPRQUERYDIALOG_H__  #define __MIAV_CPRQUERYDIALOG_H__ -#define CPR_EDIT        8 -#define CPR_CLEAR       9 -#define NAME_NOT_AVAILABLE      "Kunne ikke slå navn op i cpr-database" -  #include <config.h>  #ifdef USE_GUI +// Text +#define NAME_NOT_AVAILABLE_TITLE "Databasefejl" +#define NAME_NOT_AVAILABLE "Kunne ikke slå navn op i cpr-database." + +#define CONFIRM_INVALID_CPR_TITLE "Bekræft" +#define CONFIRM_INVALID_CPR "Ugyldigt CPR nummer, brug det alligevel?" + +  #include <qdialog.h>  #include <qpushbutton.h>  #include <qlayout.h> @@ -64,11 +68,10 @@ using namespace std;  #include <qdialog.h>  #include <qlabel.h>  #include <qsocket.h> +#include <qtimer.h>  #include "messagebox.h" - -  class CPRQueryDialog : public QDialog {    Q_OBJECT  public: @@ -86,7 +89,9 @@ public slots:    void insert_digit(int value);	    void cprSocket_readyRead();    void cprSocket_connected(); -		 +  void cprSocket_error(int errnum); +  void cprSocket_timeout(); +  private:    QLabel *lbl_cpr;    QLabel *lbl_name; @@ -96,12 +101,13 @@ private:    char internalCpr[11];    void verifycpr(char *cpr); -  void run(int pos); +  //  void run(int pos);    int test_cpr(const char *s);    /*Configuration*/    string *CPR_HOST;    int CPR_PORT; +  int CPR_TIMEOUT;  signals:    void bbs_clicked(); @@ -126,6 +132,8 @@ private:    void b_clicked(int value);    QPushButton *createButton(QWidget *parent, const char *text, int value);    int digits; + +  QTimer *timer;  };  #endif/*__MIAV_CPRQUERYDIALOG_H__*/ diff --git a/src/miav.conf b/src/miav.conf index f1e36b5..3fab263 100644 --- a/src/miav.conf +++ b/src/miav.conf @@ -5,6 +5,7 @@  # Cpr Database configuration  cpr_host	= "cpr.j.auh.dk"  cpr_port	= 10301 +cpr_timeout	= 10000  # Size of the screen in inches  screensize	= 19.0 diff --git a/src/player.cc b/src/player.cc index 1cc0dce..85a961a 100644 --- a/src/player.cc +++ b/src/player.cc @@ -47,12 +47,12 @@ Player::Player(Error *err,      return;    }    screen = SDL_SetVideoMode(DISPLAYWIDTH,  -			    DISPLAYHEIGHT,  -			    16,  -			    SDL_HWSURFACE|SDL_ANYFORMAT|SDL_HWACCEL); +                            DISPLAYHEIGHT,  +                            16,  +                            SDL_HWSURFACE|SDL_ANYFORMAT|SDL_HWACCEL);    if(!screen) {      sprintf(errbuf, "Unable to set %dx%d video: %s\n",  -	    DISPLAYWIDTH, DISPLAYHEIGHT, SDL_GetError()); +            DISPLAYWIDTH, DISPLAYHEIGHT, SDL_GetError());      errobj->pushError(errbuf);      return;    } | 
