Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

gsmtool.cpp

Go to the documentation of this file.
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  *  Constructs a GSMTool which is a child of 'parent', with the 
00023  *  name 'name' and widget flags set to 'f' 
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         /* FIXME: Persistent settings for device/baudrate */
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; // Is this not possible normally? 
00045 }
00046 
00047 /*  
00048  *  Destroys the object and frees any allocated resources
00049  */
00050 GSMTool::~GSMTool()
00051 {
00052     // no need to delete child widgets, Qt does it all for us
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         /* FIXME */
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         //TabWidget2->setTabEnabled(tab_4, conn);
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                 // FIXME: Add 'roaming' info from AT+CFUN
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                 //              qDebug("Message %d", i);
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                 //              qDebug(message->toString().c_str());
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         /* ARGH. This sucks. Surely there's an app-private pointer in the
00215            QListViewItem that I've failed to notice? 
00216 
00217         SMSMessageRef message = *(SMSMessageRef*)item->private;   
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  *  A simple slot... not very interesting.
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 }

Generated on Sat Nov 5 16:18:03 2005 for OPIE by  doxygen 1.4.2