qscan345controller.cpp

Go to the documentation of this file.
00001 #include "qscan345controller.h"
00002 #include "scan345.h"
00003 #include "marcmd.h"
00004 #include "qscan345mainwindow.h"
00005 #include "qscan345server.h"
00006 #include "qscan345settings.h"
00007 #include "qscan345selectaction.h"
00008 
00009 #include <QTimer>
00010 #include <QFile>
00011 #include <QDir>
00012 #include <QList>
00013 
00014 #include <syslog.h>
00015 #include <stdio.h>
00016 
00017 extern "C" {
00018 #include "marglobals.h"
00019 }
00020 
00021 QScan345Controller::QScan345Controller
00022 (QScan345MainWindow *win, QScan345Server *srv, QObject *parent)
00023   : inherited(parent),
00024     m_MainWindow(win),
00025     m_Server(srv)
00026 {
00027   openlog("qscan354", 0, LOG_LOCAL0);
00028   log_spy_message("starting");
00029 
00030   m_MainWindow -> setScanController(this);
00031 
00032   connect (this,         SIGNAL(scanner_number_changed(int)),
00033            m_MainWindow, SLOT(update_scanner_menu()));
00034 
00035   check_scanner_number();
00036 
00037   setWorkingDirectory(".");
00038   setFileRoot("junk");
00039   
00040   m_Timer = new QTimer(this);
00041 
00042   connect(m_Timer, SIGNAL(timeout()), this, SLOT(poll_status()));
00043 
00044   connect (m_MainWindow->actionInitialize, SIGNAL(triggered()), this, SLOT(initialize()));
00045   connect (m_MainWindow->actionErase, SIGNAL(triggered()), this, SLOT(erase()));
00046   connect (m_MainWindow->actionScan, SIGNAL(triggered()), this, SLOT(scan()));
00047   connect (m_MainWindow->actionMode2300, SIGNAL(triggered()), this, SLOT(changeMode2300()));
00048   connect (m_MainWindow->actionMode2000, SIGNAL(triggered()), this, SLOT(changeMode2000()));
00049   connect (m_MainWindow->actionMode1600, SIGNAL(triggered()), this, SLOT(changeMode1600()));
00050   connect (m_MainWindow->actionMode1200, SIGNAL(triggered()), this, SLOT(changeMode1200()));
00051   connect (m_MainWindow->actionMode3450, SIGNAL(triggered()), this, SLOT(changeMode3450()));
00052   connect (m_MainWindow->actionMode3000, SIGNAL(triggered()), this, SLOT(changeMode3000()));
00053   connect (m_MainWindow->actionMode2400, SIGNAL(triggered()), this, SLOT(changeMode2400()));
00054   connect (m_MainWindow->actionMode1800, SIGNAL(triggered()), this, SLOT(changeMode1800()));
00055 
00056   connect (this, SIGNAL(print_message(QString)), 
00057            m_MainWindow, SLOT(display_message(QString)));
00058 
00059   connect (this, SIGNAL(spy_message(QString)), 
00060            m_MainWindow, SLOT(display_spy_message(QString)));
00061 
00062   connect (this, SIGNAL(spy_message(QString)),
00063            this, SLOT(log_spy_message(QString)));
00064 
00065   connect (m_Server, SIGNAL(execute_command(QString)),
00066            this,     SLOT(execute_command(QString)));
00067 
00068   connect (this,     SIGNAL(scan_finished()),
00069            m_Server, SLOT(scan_finished()));
00070 
00071   connect (this,     SIGNAL(erase_finished()),
00072            m_Server, SLOT(erase_finished()));
00073 
00074   connect (m_MainWindow, SIGNAL(scanner_changed()),
00075            this,         SLOT(restart_scanner()));
00076 
00077   scan345_main(0, NULL);
00078 
00079   m_Timer->start(10);
00080   
00081   updateActions();
00082 }
00083 
00084 QScan345Controller::~QScan345Controller()
00085 {
00086   log_spy_message("shutting down");
00087   closelog();
00088 }
00089 
00090 void
00091 QScan345Controller::updateScannerMenu()
00092 {
00093   QMutexLocker lock(&m_Mutex);
00094   int n;
00095 
00096   m_MainWindow -> menuScanner_Number -> clear();
00097 
00098   foreach(n,m_SerialNumbers) {
00099     QScan345SelectAction *a = new QScan345SelectAction(n, this);
00100 
00101     m_MainWindow -> menuScanner_Number->addAction(a);
00102 
00103     connect(a,    SIGNAL(triggered()),
00104             a,    SLOT(select_scanner()));
00105   }
00106 }
00107 
00108 void
00109 QScan345Controller::change_scanner_number(int n)
00110 {
00111   QScan345Settings s;
00112 
00113   s.setMarscannernumber(n);
00114 
00115   restart_scanner();
00116 
00117   emit scanner_number_changed(n);
00118 }
00119 
00120 void
00121 QScan345Controller::check_scanner_number()
00122 {
00123   QMutexLocker lock(&m_Mutex);
00124 
00125   QScan345Settings s;
00126   QDir    d(s.martabledir());
00127 
00128   m_SerialNumbers.clear();
00129 
00130   QStringList l = d.entryList(QStringList("config.[0-9][0-9][0-9]"));
00131   printf("NFiles: %d\n", l.count());
00132 
00133   QString nm;
00134 
00135   foreach(nm,l) {
00136     QRegExp rr("config.([0-9]+)");
00137     if (rr.exactMatch(nm)) {
00138       printf("Scanner %s\n", qPrintable(rr.cap(1)));
00139       bool ok;
00140       int n = rr.cap(1).toInt(&ok);
00141 
00142       if (ok) {
00143         m_SerialNumbers.append(n);
00144       }
00145     } else {
00146       printf("%s\n", qPrintable(nm));
00147     }
00148   }
00149 
00150   int     n = s.marscannernumber();
00151   QFile   f0(d.filePath(tr("config.%1").arg(n,3,10,QLatin1Char('0'))));
00152   QFile   f1(d.filePath(tr("mar2300.%1").arg(n,3,10,QLatin1Char('0'))));
00153   QFile   f2(d.filePath(tr("mar3450.%1").arg(n,3,10,QLatin1Char('0'))));
00154 
00155   printf("f0 : %s\n", qPrintable(f0.fileName()));
00156   printf("f1 : %s\n", qPrintable(f1.fileName()));
00157   printf("f2 : %s\n", qPrintable(f2.fileName()));
00158 
00159   if (f0.exists() && f1.exists() && f2.exists()) {
00160     printf("Scanner %d is valid\n", n);
00161   } else {
00162     printf("Calibration Tables for Scanner %d not available\n", n);
00163 
00164     if (m_SerialNumbers.count()>0) {
00165       n = m_SerialNumbers.at(0);
00166       s.setMarscannernumber(n);
00167       printf("Scanner %d used instead\n", n);
00168     } else {
00169       printf("No scanner calibration tables available\n");
00170     }
00171   }
00172 
00173   emit scanner_number_changed(n);
00174 }
00175 
00176 void
00177 QScan345Controller::initialize()
00178 {
00179   QScan345Settings s;
00180 
00181   changeMode(s.marscannermode());
00182 }
00183 
00184 void
00185 QScan345Controller::restart_scanner()
00186 {
00187   restart();
00188   marStartup();
00189 }
00190 
00191 void
00192 QScan345Controller::updateActions()
00193 {
00194   QScan345Settings s;
00195   int m = s.marscannermode();
00196 
00197   m_MainWindow->actionMode2300->setChecked(m==0);
00198   m_MainWindow->actionMode2000->setChecked(m==1);
00199   m_MainWindow->actionMode1600->setChecked(m==2);
00200   m_MainWindow->actionMode1200->setChecked(m==3);
00201   m_MainWindow->actionMode3450->setChecked(m==4);
00202   m_MainWindow->actionMode3000->setChecked(m==5);
00203   m_MainWindow->actionMode2400->setChecked(m==6);
00204   m_MainWindow->actionMode1800->setChecked(m==7);
00205 
00206 }
00207 
00208 void
00209 QScan345Controller::erase()
00210 {
00211   exec_command("comm erase");
00212 }
00213 
00214 void
00215 QScan345Controller::scan()
00216 {
00217   exec_command("root testscan");
00218   exec_command("comm scan");
00219 }
00220 
00221 void
00222 QScan345Controller::changeMode(int n)
00223 {
00224   QScan345Settings s;
00225   s.setMarscannermode(n);
00226 
00227   exec_command(qPrintable(tr("MODE %1").arg(n)));
00228 
00229   updateActions();
00230 }
00231 
00232 void
00233 QScan345Controller::changeMode2300()
00234 {
00235   changeMode(0);
00236 }
00237 
00238 void
00239 QScan345Controller::changeMode2000()
00240 {
00241   changeMode(1);
00242 }
00243 
00244 void
00245 QScan345Controller::changeMode1600()
00246 {
00247   changeMode(2);
00248 }
00249 
00250 void
00251 QScan345Controller::changeMode1200()
00252 {
00253   changeMode(3);
00254 }
00255 
00256 void
00257 QScan345Controller::changeMode3450()
00258 {
00259   changeMode(4);
00260 }
00261 
00262 void
00263 QScan345Controller::changeMode3000()
00264 {
00265   changeMode(5);
00266 }
00267 
00268 void
00269 QScan345Controller::changeMode2400()
00270 {
00271   changeMode(6);
00272 }
00273 
00274 void
00275 QScan345Controller::changeMode1800()
00276 {
00277   changeMode(7);
00278 }
00279 
00280 int
00281 QScan345Controller::poll_status()
00282 {
00283   int i, status=0;
00284 
00285   if (netcontrol) {
00286     i = net_data();
00287 
00288     while (1) {
00289       status = net_stat();
00290 
00291       if (status < 200) break;
00292     }
00293 
00294     i = net_msg();
00295   }
00296 
00297   return status;
00298 }
00299 
00300 void
00301 QScan345Controller::setWorkingDirectory(QString d)
00302 {
00303   strncpy(com_dir, qPrintable(d), sizeof(com_dir));
00304 }
00305 
00306 void 
00307 QScan345Controller::setFileRoot(QString root)
00308 {
00309   strncpy(com_root, qPrintable(root), sizeof(com_root));
00310 }
00311 
00312 void
00313 QScan345Controller::execute_command(QString cmd)
00314 {
00315   exec_command(qPrintable(cmd));
00316 }
00317 
00318 void
00319 QScan345Controller::log_spy_message(QString msg)
00320 {
00321   syslog(LOG_LOCAL0 + LOG_INFO, "%s", qPrintable(msg.trimmed()));
00322 }