?? client.cpp
字號:
case Stopped:
// not connected: just refresh every 500 ms
if (gpsdCounter == 5) {
emit updated(STA);
gpsdCounter = -1;
}
break;
}
gpsdCounter = gpsdCounter + 1;
}
/*void Client::update()
{
bool dataChanged = FALSE;
if (!gpsData->gpsdConnected)
// not connected
return;
if(gpsData->set & ONLINE_SET) {
//clear flags
gpsData->set &= ~ONLINE_SET;
gpsData->gpsOnline = (gpsData->online != 0);
// dataChanged = TRUE; // emit newData
}
// test for fix changed
if(gpsData->set & (STATUS_SET | MODE_SET)) {
//clear flags
gpsData->set &= ~(STATUS_SET | MODE_SET);
// dataChanged = TRUE; // emit newData
}
if (gpsData->gpsOnline && gpsData->fix.mode >= MODE_2D) {
if (gpsData->set & LATLON_SET) {
gpsData->set &= ~LATLON_SET;
gpsData->latitudeGps = gpsData->fix.latitude;
gpsData->longitudeGps = gpsData->fix.longitude;
if (application->ManualPosit==FALSE) {
gpsData->currPos.lat = gpsData->fix.latitude;
gpsData->currPos.lon = gpsData->fix.longitude;;
dataChanged = TRUE;
}
}
if (gpsData->fix.mode >= MODE_3D && gpsData->set & ALTITUDE_SET) {
gpsData->set &= ~ALTITUDE_SET;
gpsData->altitude.val = gpsData->fix.altitude;
// dataChanged = TRUE; never updated without long or lat
}
if (gpsData->set & SPEED_SET) {
gpsData->set &= ~SPEED_SET;
gpsData->speed.val = gpsData->fix.speed;
if(gpsData->speed.val > 0.5) // average speed for travel time calc.
gpsData->avspeed.val = gpsData->avspeed.val * 0.99 + gpsData->speed.val * 0.01;
// dataChanged = TRUE; // emit newData
}
if (gpsData->set & TRACK_SET) {
gpsData->set &= ~TRACK_SET;
gpsData->heading.val = gpsData->fix.track;
// dataChanged = TRUE; // emit newData
}
}
// test for status changed
if(gpsData->set & (TIME_SET | SATELLITE_SET | USED_SET| DEVICE_SET | DEVICEID_SET)) {
if (gpsData->set & TIME_SET && isnan(gpsData->fix.time)==0) {
QDateTime ctime;
ctime.setTime_t((int)rint(gpsData->fix.time));
gpsData->date = ctime.date();
gpsData->time = ctime.time();
gpsData->ts.time = gpsData->time.toString();
gpsData->ts.date = gpsData->date.toString();
}
// status changed
// if (!dataChanged)
// // only if no emit newData
// emit newStatus();
//clear flags
gpsData->set &= ~(TIME_SET | SATELLITE_SET | USED_SET| DEVICE_SET | DEVICEID_SET);
}
if(dataChanged){
gpsData->adjustDatum();
// emit newData();
}
}
*/
void Client::qcopResume(const QCString& msg, const QByteArray& )
{
if ( msg == "resumed()" ) {
qDebug("qCop resumed() received: resuming...");
if (resumeEvent == -1)
resumeEvent = 2;
if (resumeEvent == 2)
resumeFlag = 2;
}
}
void Client::signalResume(int signal)
{
if ( signal ) {
qDebug("SIGCONT received: resuming...");
if (resumeEvent == -1)
resumeEvent = 1;
if (resumeEvent == 1)
resumeFlag = 1;
}
}
// local constants
static const char MagicWord[] = "GPSD"; // gpsd signature
void Client::parseGps( const QString &gpsStr )
{
QString dataStr;
if ( gpsStr.upper().startsWith(MagicWord) ) {
for ( int pos = gpsStr.find('=') - 1;
pos > 0;
pos = gpsStr.find(pos+2, '=') - 1 ) {
QChar type = gpsStr[pos];
dataStr = gpsStr.mid(pos + 2);
switch ( type.latin1() ) {
case 'I':
// GPS identifier
{
if ( dataStr.startsWith("?") ) {
// empty statement
gpsData.gpsName = "---"; // unknown GPS
}
else {
// remove new line from end of data string (unit name)
gpsData.gpsName = dataStr;
gpsData.gpsName.truncate(dataStr.length() - 1);
}
emit updated(STA);
}
break;
case 'O':
// Position information
{
// reset counter
gpsdCounter = 0;
if ( dataStr.startsWith("?") ) {
// GPS does not have fix
if ( gpsData.status != GpsData::NoFix ) {
gpsData.status = GpsData::NoFix;
emit updated(STA);
}
continue;
}
// GPS has fix
/* if ( !hasFix ) {
hasFix = true;
emit fixEstablished(true);
}*/
// if ( parseData == true ) {
// GpsDat gpsData;
bool posChanged = false;
bool update = false;
QStringList sl = QStringList::split(" ", dataStr, false);
if ( sl[1] != "?" ) {
// timestamp
gpsData.timestamp.setTime_t( (int)
rint(sl[1].toDouble()));
}
if ( sl[3] != "?" ) {
// latitude
double d = sl[3].toDouble();
if ( d != gpsData.fix.position.lat ) {
gpsData.fix.position.lat = d;
posChanged = true;
update = true;
}
}
if ( sl[4] != "?" ) {
// longitude
double d = sl[4].toDouble();
if ( d != gpsData.fix.position.lon ) {
gpsData.fix.position.lon = d;
posChanged = true;
update = true;
}
}
if ( sl[5] != "?" ) {
// altitude
double d = sl[5].toDouble();
if ( d != gpsData.fix.altitude.val ) {
gpsData.fix.altitude.val = d;
// NOTE: a change in altitude alone will not
// trigger a position change notice, as
// the altitude value tends to fluctuate
// with some (all?) GPS receivers
update = true;
}
}
if ( sl[8] != "?" ) {
// heading (track)
double d = sl[8].toDouble();
if ( d != gpsData.fix.heading.val ) {
gpsData.fix.heading.val = d;
update = true;
}
}
if ( sl[9] != "?" ) {
// speed
double d = sl[9].toDouble();
if ( d != gpsData.fix.speed.val ) {
gpsData.fix.speed.val = d;
// average speed for travel time calc.
if(gpsData.fix.speed.val > 0.5)
gpsData.avspeed.val =
gpsData.avspeed.val * 0.99 +
gpsData.fix.speed.val * 0.01;
update = true;
}
}
if ( sl[14] != "?" ) {
// mode
sl[14].truncate(1);
int m = sl[14].toInt() - 1;
if ( m != gpsData.status ) {
gpsData.status = m;
if (!update)
emit updated(STA);
}
}
if ( update ) {
if ( posChanged )
application->adjustDatum(gpsData.fix.position,
gpsData.fix.altitude);
emit updated(POS);
}
}
break;
case 'X':
// GPS unit detection
{
if ( dataStr.startsWith("?") ) {
// no GPS unit available
// NOTE: will only get this if directly requesting 'X';
// currently not doing so
continue;
}
double val;
QTextIStream(&dataStr) >> val;
if ( val == 0 ) {
// qDebug("no GPS unit available");
gpsData.online = false;
} else {
// qDebug("GPS detected: " + QString::number(val));
gpsData.online = true;
}
emit updated(STA);
}
break;
case 'Y':
// Satellite information
{
// reset counter
gpsdCounter = 0;
QStringList sl =
QStringList::split(":", dataStr, false);
QStringList::Iterator it = sl.begin();
// get sentence type, timestamp, number of satellites
QStringList sub = QStringList::split(" ", *it, false);
if ( sub.count() == 3 ) {
gpsData.timestamp.setTime_t( (int)
rint(sub[1].toDouble()));
}
gpsData.satellites.clear();
gpsData.satellites.resize(sl.count());
// get individual satellite info
QStringList::Iterator end = sl.end();
int i = 0;
gpsData.satellites_used = 0;
for ( ++it; it != end; ++it, ++i ) {
sub = QStringList::split(" ", *it, false);
if ( sub.count() == 5 ) {
Satellite *s = new Satellite(sub[0].toInt(),
sub[1].toInt(), sub[2].toInt(),
sub[3].toInt(), (bool)sub[4].toInt());
gpsData.satellites.insert(i, s);
if (s->used)
++gpsData.satellites_used;
}
}
emit updated(SAT);
}
break;
}
}
}
}
// end of file
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -