📄 phonestatuscontrol.cpp
字号:
/*************************************************************************** phonestatuscontrol.cpp - description ------------------- begin : Wed Jan 17 2001 copyright : (C) 2001 by Matthias Welwarsky email : matze@stud.fbi.fh-darmstadt.de ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include <kdebug.h>#include <klocale.h>#include <qregexp.h>#include <qlabel.h>#include <qprogressbar.h>#include "phonestatuscontrol.h"#include "phonectrlcenter.h"#include "messagedispatcher.h"PhoneStatusControl::PhoneStatusControl(QWidget *parent, const char *name ) :PhoneStatusControlDlg(parent,name){ timerCount = 0; controlState = Idle; PhoneCtrlCenter* pcCenter = dynamic_cast<PhoneCtrlCenter*>(parentWidget()); if (!pcCenter) { kdDebug() << "cannot resolve control center\n"; return; } messageDispatcher = pcCenter->getDispatcher(); messageDispatcher->registerControl(this, QRegExp("^\n\\+COPS:")); messageDispatcher->registerControl(this, QRegExp("^\n\\+CPAS:")); messageDispatcher->registerControl(this, QRegExp("^\n\\+CBC:")); messageDispatcher->registerControl(this, QRegExp("^\n\\+CREG:")); messageDispatcher->registerControl(this, QRegExp("^\n\\+CSQ:")); messageDispatcher->registerControl(this, QRegExp("^\n[a-zA-Z0-9.]+$")); kdDebug() << "PhoneStatusControl registered\n";}PhoneStatusControl::~PhoneStatusControl(){}/** starts the status control, reimplemented from PhoneControl */void PhoneStatusControl::startControl(){ startUpdateSequence(); startTimer(10000);}/** stops the status control, reimplemented from PhoneControl */void PhoneStatusControl::stopControl() { controlState = Idle; killTimers();}/** reimplemented from PhoneControl */void PhoneStatusControl::deliverMessage(QString message) { int pos; // position of the match int len; // length of the match if (controlState == Idle) return; if (message.find(QRegExp("\nOK")) != -1) { return; } if (message.find(QRegExp("\nERROR")) != -1) { kdDebug() << "ERROR"; controlState = Idle; return; } if (message.find(QRegExp("\\+COPS:")) != -1) { kdDebug() << "COPS\n"; pos = QRegExp("\\d").match(message); int status = message.mid(pos, 1).toInt(); networkSelection->setText(status?i18n("manual"):i18n("automatic")); pos = QRegExp("\".+\"").match(message, 0, &len); selectedNetwork->setText(message.mid(pos+1, len-2)); // trigger the next command messageDispatcher->sendCommand(QString("AT+CSQ")); return; } if (message.find(QRegExp("\\+CSQ:")) != -1) { kdDebug() << "CSQ\n"; pos = QRegExp("\\d+").match(message, 0, &len); int rssi = message.mid(pos, len).toInt(); // check for "unknown" rssi level if (rssi == 99) rssi = -1; rssiLevel->setProgress(rssi); messageDispatcher->sendCommand(QString("AT+CPAS")); return; } if (message.find(QRegExp("\\+CPAS:")) != -1) { kdDebug() << "CPAS\n"; pos = QRegExp("\\d").match(message, 0, &len); int status = message.mid(pos, len).toInt(); QString statusText; switch (status) { case 0: statusText = "Ready/Idle"; break; case 3: statusText = "Incoming Call"; break; case 4: statusText = "Call active"; break; } callStatus->setText(statusText); messageDispatcher->sendCommand(QString("AT+CBC")); return; } if (message.find(QRegExp("\\+CBC:")) != -1) { kdDebug() << "CBC\n"; pos = QRegExp("\\d").match(message, 0, &len); int status = message.mid(pos, len).toInt(); QString statusText; switch (status) { case 0: statusText = "Battery"; break; case 1: statusText = "external Supply"; break; case 2: statusText = "no Battery"; break; } powerStatus->setText(statusText); pos = QRegExp("\\d+").match(message, pos+len, &len); batteryLevel->setProgress(message.mid(pos, len).toInt()); controlState = ExpectManufacturer; messageDispatcher->sendCommand(QString("AT+CGMI")); return; } if (message.find(QRegExp("^\n[a-zA-Z]+$")) != -1 && controlState == ExpectManufacturer) { pos = QRegExp("[a-zA-Z]+").match(message, 0, &len); manufId->setText(message.mid(pos, len)); controlState = ExpectSoftVersion; messageDispatcher->sendCommand(QString("AT+CGMR")); return; } if (message.find(QRegExp("^\n[a-zA-Z0-9.]+$")) != -1 && controlState == ExpectSoftVersion) { pos = QRegExp("[a-zA-Z0-9.]+").match(message, 0, &len); softVersion->setText(message.mid(pos, len)); controlState = MessageSent; messageDispatcher->sendCommand(QString("AT+CREG?")); return; } if (message.find(QRegExp("\\+CREG:")) != -1) { // skip the first number pos = QRegExp("\\d").match(message, 0, &len); pos = QRegExp("\\d").match(message, pos+len, &len); int status = message.mid(pos, len).toInt(); QString statusText; switch (status) { case 0: statusText = "Not checked in"; break; case 1: statusText = "Checked in"; break; case 2: statusText = "Searching"; break; case 3: statusText = "Access denied"; break; case 4: statusText = "Unknown"; break; case 5: statusText = "Roaming"; break; } networkStatus->setText(statusText); pos = QRegExp("\"[A-Z0-9]+\"").match(message, pos+len, &len); lacView->setText(message.mid(pos+1, len-2)); pos = QRegExp("\"[A-Z0-9]+\"").match(message, pos+len, &len); ciView->setText(message.mid(pos+1, len-2)); messageDispatcher->sendCommand(QString("AT+CIMI")); controlState = ExpectIMSI; return; } if (message.find(QRegExp("^\n[0-9A-Z]+$")) != -1 && controlState == ExpectIMSI) { imsiView->setText(message.mid(1)); controlState = Idle; return; }}/** timer callback for regular status updates. called every 10 seconds * if the control is active */void PhoneStatusControl::timerEvent(QTimerEvent*) { startUpdateSequence();}/** starts an update sequence to gather information from the mobile phone */void PhoneStatusControl::startUpdateSequence() { // if we're just in a sequence, skip this. if (controlState != Idle) return; // start the sequence with a COPS message messageDispatcher->sendCommand(QString("AT+COPS?")); controlState = MessageSent;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -