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 }