00001 #include "gsmtool.h"
00002 #include <qpushbutton.h>
00003 #include <qcombobox.h>
00004 #include <qlineedit.h>
00005 #include <qlabel.h>
00006 #include <qtabwidget.h>
00007 #include <qlistview.h>
00008 #include <qtextbrowser.h>
00009 #include <qmultilineedit.h>
00010
00011 #include <termios.h>
00012
00013 #include <gsmlib/gsm_me_ta.h>
00014 #include <gsmlib/gsm_unix_serial.h>
00015 #include <gsmlib/gsm_sms.h>
00016 #include <gsmlib/gsm_sorted_sms_store.h>
00017
00018 using namespace gsmlib;
00019
00020
00021
00022
00023
00024
00025 GSMTool::GSMTool( QWidget* parent, const char* name, WFlags fl )
00026 : GSMToolBase( parent, name, fl )
00027 {
00028 devicelocked = 0;
00029 me = NULL;
00030 sms_store = NULL;
00031 setConnected(FALSE);
00032
00033 connect(ConnectButton, SIGNAL(clicked()), this, SLOT(doConnectButton()));
00034 connect(SMSDeleteButton, SIGNAL(clicked()), this, SLOT(doSMSDeleteButton()));
00035 connect(SMSSendButton, SIGNAL(clicked()), this, SLOT(doSMSSendButton()));
00036 connect(NewSMSClearButton, SIGNAL(clicked()), this, SLOT(doNewSMSClearButton()));
00037 connect(NewSMSSaveButton, SIGNAL(clicked()), this, SLOT(doNewSMSSaveButton()));
00038 connect(NewSMSSendButton, SIGNAL(clicked()), this, SLOT(doNewSMSSendButton()));
00039 connect(ScanButton, SIGNAL(clicked()), this, SLOT(doScanButton()));
00040 connect(TabWidget2, SIGNAL(currentChanged(QWidget*)), this, SLOT(doTabChanged()));
00041 connect(SMSStoreList, SIGNAL(activated(int)), this, SLOT(doSMSStoreChanged()));
00042 connect(SMSViewType, SIGNAL(activated(int)), this, SLOT(doSMSTypeChanged()));
00043 connect(SMSList, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(doSelectedSMSChanged(QListViewItem*)));
00044 timerid = -1;
00045 }
00046
00047
00048
00049
00050 GSMTool::~GSMTool()
00051 {
00052
00053 if (devicelocked)
00054 unlockDevice();
00055 }
00056 const speed_t GSMTool::baudrates[12] = {
00057 B300, B600, B1200, B2400, B4800, B9600, B19200,
00058 B38400, B57600, B115200, B230400, B460800
00059 };
00060
00061 int GSMTool::lockDevice( )
00062 {
00063 devicelocked = 1;
00064
00065 return 0;
00066 }
00067
00068 void GSMTool::unlockDevice( )
00069 {
00070 devicelocked = 0;
00071 }
00072
00073 void GSMTool::setConnected( bool conn )
00074 {
00075 TabWidget2->setTabEnabled(tab_2, conn);
00076 TabWidget2->setTabEnabled(tab_3, conn);
00077
00078 NewSMSSendButton->setEnabled(conn);
00079 MfrLabel->setEnabled(conn);
00080 MfrText->setEnabled(conn);
00081 ModelLabel->setEnabled(conn);
00082 ModelText->setEnabled(conn);
00083 RevisionLabel->setEnabled(conn);
00084 RevisionText->setEnabled(conn);
00085 SerialLabel->setEnabled(conn);
00086 SerialText->setEnabled(conn);
00087
00088 }
00089 void GSMTool::doTabChanged()
00090 {
00091 int index = TabWidget2->currentPageIndex();
00092 qDebug("tab changed to %d", index);
00093
00094 if (index == 1) {
00095 timerid = startTimer(5000);
00096 timerEvent(NULL);
00097 } else if (timerid != -1) {
00098 killTimer(timerid);
00099 timerid = -1;
00100 }
00101 }
00102
00103 void GSMTool::timerEvent( QTimerEvent * )
00104 {
00105 OPInfo opi;
00106
00107 opi = me->getCurrentOPInfo();
00108
00109 if (opi._numericName == NOT_SET) {
00110 NetStatText->setText("No network");
00111 NetworkLabel->setEnabled(FALSE);
00112 NetworkText->setEnabled(FALSE);
00113 NetworkText->setText("");
00114 SigStrText->setEnabled(FALSE);
00115 SigStrText->setText("");
00116 dB->setEnabled(FALSE);
00117 SigStrLabel->setEnabled(FALSE);
00118 } else {
00119
00120 qDebug("network");
00121 NetStatText->setText("Registered");
00122 NetworkLabel->setEnabled(TRUE);
00123 NetworkText->setEnabled(TRUE);
00124 NetworkText->setText(opi._longName.c_str());
00125 SigStrText->setEnabled(TRUE);
00126
00127 qDebug("get sig str");
00128 int csq = me->getSignalStrength();
00129 if (csq == 0) {
00130 SigStrText->setText("<= -113");
00131 dB->setEnabled(TRUE);
00132 SigStrLabel->setEnabled(TRUE);
00133 } else if (csq == 99) {
00134 SigStrText->setText("Unknown");
00135 dB->setEnabled(FALSE);
00136 SigStrLabel->setEnabled(FALSE);
00137 } else {
00138 char buf[6];
00139 sprintf(buf, "%d", -113 + (2*csq));
00140 SigStrText->setText(buf);
00141 dB->setEnabled(TRUE);
00142 SigStrLabel->setEnabled(TRUE);
00143 }
00144 }
00145 }
00146
00147 void GSMTool::doSMSStoreChanged()
00148 {
00149 const char *storename = SMSStoreList->currentText().ascii();
00150 qDebug("Store Changed to '%s'", storename);
00151 if (!strcmp(storename, "None")) {
00152 sms_store = NULL;
00153 } else try {
00154 sms_store = new SortedSMSStore(me->getSMSStore(storename));
00155 sms_store->setSortOrder(ByIndex);
00156
00157 qDebug("got store of size %d", sms_store->size());
00158 } catch (GsmException) {
00159 sms_store = NULL;
00160 qDebug("get store failed");
00161 }
00162
00163 SMSList->setEnabled(!(sms_store == NULL));
00164 NewSMSSaveButton->setEnabled(!(sms_store == NULL));
00165 doSMSTypeChanged();
00166 }
00167
00168 void GSMTool::doSMSTypeChanged()
00169 {
00170 int direction = SMSViewType->currentItem();
00171 qDebug("direction %s\n", direction?"outgoing":"incoming");
00172 if (direction)
00173 SMSSendButton->setText("Send");
00174 else
00175 SMSSendButton->setText("Reply");
00176
00177 SMSList->clear();
00178 doSelectedSMSChanged(NULL);
00179
00180 if (sms_store == NULL)
00181 return;
00182 for (SortedSMSStore::iterator e = sms_store->begin();
00183 e != sms_store->end(); e++) {
00184
00185 qDebug("Is%sempty", e->empty()?" ":" not ");
00186 if (e->empty())
00187 continue;
00188
00189 qDebug("Status %d", e->status());
00190 SMSMessageRef message = e->message();
00191 qDebug("Got message.");
00192
00193
00194 if (direction == message->messageType()) {
00195 qDebug("yes\n");
00196 char buf[3];
00197 snprintf(buf, 3, "%d", e->index());
00198 new QListViewItem(SMSList, message->address()._number.c_str(), message->serviceCentreTimestamp().toString().c_str(), buf);
00199 }
00200 }
00201 }
00202
00203 void GSMTool::doSelectedSMSChanged(QListViewItem *item)
00204 {
00205 qDebug("message changed\n");
00206
00207 if (!item || sms_store == NULL) {
00208 SMSText->setText("");
00209 SMSText->setEnabled(FALSE);
00210 SMSDeleteButton->setEnabled(FALSE);
00211 SMSSendButton->setEnabled(FALSE);
00212 return;
00213 }
00214
00215
00216
00217
00218
00219 qDebug("item %p\n", item);
00220
00221 qDebug("text(2) is %s\n", item->text(2).ascii());
00222 int index = atoi(item->text(2).ascii());
00223 qDebug("index %d\n", index);
00224 SMSMessageRef message = sms_store->find(index)->message();
00225
00226 SMSText->setText(message->userData().c_str());
00227 SMSText->setEnabled(TRUE);
00228 SMSDeleteButton->setEnabled(TRUE);
00229 SMSSendButton->setEnabled(TRUE);
00230
00231 }
00232
00233 void GSMTool::doSMSSendButton()
00234 {
00235 qDebug("SMSSendButton");
00236
00237 QListViewItem *item = SMSList->currentItem();
00238 if (!item)
00239 return;
00240
00241 int index = atoi(item->text(2).ascii());
00242 qDebug("index %d\n", index);
00243
00244 int direction = SMSViewType->currentItem();
00245 qDebug("direction %s\n", direction?"outgoing":"incoming");
00246
00247 SMSMessageRef message = sms_store->find(index)->message();
00248
00249 if (direction)
00250 NewSMSText->setText(message->userData().c_str());
00251 else
00252 NewSMSText->setText("");
00253 NewSMSToBox->insertItem(message->address()._number.c_str(), 0);
00254 TabWidget2->setCurrentPage(3);
00255
00256 }
00257
00258 void GSMTool::doNewSMSClearButton()
00259 {
00260 NewSMSText->setText("");
00261 }
00262
00263 void GSMTool::doNewSMSSaveButton()
00264 {
00265 qDebug("NewSMSSaveButton");
00266 const char *msgtext = strdup(NewSMSText->text().local8Bit());
00267 const char *dest = NewSMSToBox->currentText().ascii();
00268
00269 NewSMSStatusLabel->setText("Sending...");
00270 me->setMessageService(1);
00271
00272 qDebug("NewSMSSendButton: '%s' to '%s'", msgtext, dest);
00273
00274 SMSMessageRef m = new SMSSubmitMessage (msgtext, dest);
00275 sms_store->insert(m);
00276 free((void *)msgtext);
00277
00278 }
00279 void GSMTool::doNewSMSSendButton()
00280 {
00281 const char *msgtext = strdup(NewSMSText->text().local8Bit());
00282 const char *dest = NewSMSToBox->currentText().ascii();
00283
00284 NewSMSStatusLabel->setText("Sending...");
00285 me->setMessageService(1);
00286
00287 qDebug("NewSMSSendButton: '%s' to '%s'", msgtext, dest);
00288
00289 SMSSubmitMessage m(msgtext, dest);
00290 try {
00291 m.setAt(new GsmAt(*me));
00292 m.send();
00293
00294 NewSMSStatusLabel->setText("Message sent.");
00295 } catch (GsmException &ge) {
00296 NewSMSStatusLabel->setText("Failed.");
00297 qDebug(ge.what());
00298 }
00299 free((void *)msgtext);
00300
00301
00302 }
00303
00304
00305 void GSMTool::doSMSDeleteButton()
00306 {
00307 QListViewItem *item = SMSList->currentItem();
00308 if (!item)
00309 return;
00310
00311 int index = atoi(item->text(2).ascii());
00312 qDebug("delete SMS with index %d\n", index);
00313
00314
00315
00316 SortedSMSStore::iterator e = sms_store->find(index);
00317
00318 if (e != sms_store->end()) {
00319 qDebug("message is %s\n", e->message()->userData().c_str());
00320 sms_store->erase(e);
00321
00322 }
00323 doSMSTypeChanged();
00324 }
00325
00326 void GSMTool::doScanButton()
00327 {
00328 qDebug("ScanButton");
00329
00330 NetworkList->setEnabled(FALSE);
00331 AvailNetsLabel->setEnabled(FALSE);
00332 NetworkList->clear();
00333 new QListViewItem(NetworkList, "Scanning...");
00334
00335 vector<OPInfo> opis;
00336
00337 try {
00338 opis = me->getAvailableOPInfo();
00339 } catch (GsmException) {
00340 NetworkList->clear();
00341 new QListViewItem(NetworkList, "Scan failed...");
00342 return;
00343 }
00344
00345 NetworkList->clear();
00346 for (vector<OPInfo>::iterator i = opis.begin(); i != opis.end(); ++i) {
00347 char *statustext;
00348 switch (i->_status) {
00349
00350 case UnknownOPStatus:
00351 statustext = "unknown";
00352 break;
00353
00354 case CurrentOPStatus:
00355 statustext = "current";
00356 break;
00357
00358 case AvailableOPStatus:
00359 statustext = "available";
00360 break;
00361
00362 case ForbiddenOPStatus:
00363 statustext = "forbidden";
00364 break;
00365
00366 default:
00367 statustext = "(ERROR)";
00368 }
00369 char num[7];
00370 snprintf(num, 6, "%d", i->_numericName);
00371 new QListViewItem(NetworkList, i->_longName.c_str(), statustext, num, i->_shortName.c_str());
00372 }
00373 NetworkList->setEnabled(TRUE);
00374 AvailNetsLabel->setEnabled(TRUE);
00375 }
00376
00377
00378
00379 void GSMTool::doConnectButton()
00380 {
00381 gsmlib::Port *port;
00382
00383 speed_t rate;
00384 devicename = strdup(DeviceName->currentText().local8Bit().data());
00385 rate = baudrates[BaudRate->currentItem()];
00386
00387 qDebug("Connect Button Pressed");
00388 MfrText->setText("Opening...");
00389 ModelText->setText("");
00390 RevisionText->setText("");
00391 SerialText->setText("");
00392
00393 setConnected(FALSE);
00394 if (me) {
00395 me = NULL;
00396 }
00397
00398 if (lockDevice()) {
00399 qDebug("lockDevice() failed\n");
00400 MfrText->setText("Lock port failed");
00401 };
00402
00403 qDebug("Device name is %s\n", devicename);
00404
00405 try {
00406 port = new UnixSerialPort(devicename, rate, DEFAULT_INIT_STRING, 0);
00407 } catch (GsmException) {
00408 qDebug("port failed");
00409 MfrText->setText("Open port failed");
00410 return;
00411 }
00412 MfrText->setText("Initialising...");
00413 qDebug("got port");
00414 try {
00415 me = new MeTa(port);
00416 } catch (GsmException) {
00417 qDebug("meta failed");
00418 MfrText->setText("Initialise GSM unit failed");
00419 me = NULL;
00420 unlockDevice();
00421 return;
00422 }
00423
00424 qDebug("Opened");
00425
00426 MEInfo ifo;
00427
00428 MfrText->setText("Querying...");
00429
00430 try {
00431 ifo = me->getMEInfo();
00432 } catch (GsmException) {
00433 qDebug("getMEInfo failed");
00434 MfrText->setText("Query GSM unit failed");
00435 me = NULL;
00436 unlockDevice();
00437 return;
00438 }
00439
00440 MfrText->setText(ifo._manufacturer.c_str());
00441 ModelText->setText(ifo._model.c_str());
00442 RevisionText->setText(ifo._revision.c_str());
00443 SerialText->setText(ifo._serialNumber.c_str());
00444 setConnected(TRUE);
00445
00446 SMSStoreList->clear();
00447 SMSStoreList->insertItem("None");
00448
00449 vector<string> storenames = me->getSMSStoreNames();
00450
00451 for (vector<string>::iterator i = storenames.begin(); i != storenames.end(); ++i) {
00452 SMSStoreList->insertItem(i->c_str());
00453 }
00454 SMSList->clear();
00455 SMSText->setText("");
00456 sms_store = NULL;
00457 }