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 }