Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsgpsconnection.cpp - description 3 : : -------------------- 4 : : begin : November 30th, 2009 5 : : copyright : (C) 2009 by Marco Hugentobler 6 : : email : marco at hugis dot net 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsgpsconnection.h" 19 : : 20 : : #include <QCoreApplication> 21 : : #include <QTime> 22 : : #include <QIODevice> 23 : : #include <QStringList> 24 : : #include <QFileInfo> 25 : : 26 : : #include "qgsnmeaconnection.h" 27 : : #include "qgslogger.h" 28 : : #include "info.h" 29 : : 30 : : 31 : 0 : bool QgsGpsInformation::isValid() const 32 : : { 33 : 0 : bool valid = false; 34 : 0 : if ( status == 'V' || fixType == NMEA_FIX_BAD || quality == 0 ) // some sources say that 'V' indicates position fix, but is below acceptable quality 35 : : { 36 : 0 : valid = false; 37 : 0 : } 38 : 0 : else if ( fixType == NMEA_FIX_2D ) 39 : : { 40 : 0 : valid = true; 41 : 0 : } 42 : 0 : else if ( status == 'A' || fixType == NMEA_FIX_3D || quality > 0 ) // good 43 : : { 44 : 0 : valid = true; 45 : 0 : } 46 : : 47 : 0 : return valid; 48 : : } 49 : : 50 : 0 : QgsGpsInformation::FixStatus QgsGpsInformation::fixStatus() const 51 : : { 52 : 0 : FixStatus fixStatus = NoData; 53 : : 54 : : // no fix if any of the three report bad; default values are invalid values and won't be changed if the corresponding NMEA msg is not received 55 : 0 : if ( status == 'V' || fixType == NMEA_FIX_BAD || quality == 0 ) // some sources say that 'V' indicates position fix, but is below acceptable quality 56 : : { 57 : 0 : fixStatus = NoFix; 58 : 0 : } 59 : 0 : else if ( fixType == NMEA_FIX_2D ) // 2D indication (from GGA) 60 : : { 61 : 0 : fixStatus = Fix2D; 62 : 0 : } 63 : 0 : else if ( status == 'A' || fixType == NMEA_FIX_3D || quality > 0 ) // good 64 : : { 65 : 0 : fixStatus = Fix3D; 66 : 0 : } 67 : 0 : return fixStatus; 68 : : } 69 : : 70 : 0 : QString QgsGpsInformation::qualityDescription() const 71 : : { 72 : 0 : switch ( quality ) 73 : : { 74 : : case 8: 75 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Simulation mode" ); 76 : : 77 : : case 7: 78 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Manual input mode" ); 79 : : 80 : : case 6: 81 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Estimated" ); 82 : : 83 : : case 5: 84 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Float RTK" ); 85 : : 86 : : case 4: 87 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Fixed RTK" ); 88 : : 89 : : case 3: 90 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "PPS" ); 91 : : 92 : : case 2: 93 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "DGPS" ); 94 : : 95 : : case 1: 96 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Autonomous" ); 97 : : 98 : : case 0: 99 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Invalid" ); 100 : : 101 : : default: 102 : 0 : return QCoreApplication::translate( "QgsGpsInformation", "Unknown (%1)" ).arg( QString::number( quality ) ); 103 : : } 104 : 0 : } 105 : : 106 : 0 : QgsGpsConnection::QgsGpsConnection( QIODevice *dev ) 107 : 0 : : QObject( nullptr ) 108 : 0 : , mSource( dev ) 109 : 0 : { 110 : 0 : clearLastGPSInformation(); 111 : 0 : QObject::connect( dev, &QIODevice::readyRead, this, &QgsGpsConnection::parseData ); 112 : 0 : } 113 : : 114 : 0 : QgsGpsConnection::~QgsGpsConnection() 115 : 0 : { 116 : 0 : cleanupSource(); 117 : 0 : } 118 : : 119 : 0 : bool QgsGpsConnection::connect() 120 : : { 121 : 0 : if ( !mSource ) 122 : : { 123 : 0 : return false; 124 : : } 125 : : 126 : 0 : bool connected = mSource->open( QIODevice::ReadWrite | QIODevice::Unbuffered ); 127 : 0 : if ( connected ) 128 : : { 129 : 0 : mStatus = Connected; 130 : 0 : } 131 : 0 : return connected; 132 : 0 : } 133 : : 134 : 0 : bool QgsGpsConnection::close() 135 : : { 136 : 0 : if ( !mSource ) 137 : : { 138 : 0 : return false; 139 : : } 140 : : 141 : 0 : mSource->close(); 142 : 0 : return true; 143 : 0 : } 144 : : 145 : 0 : void QgsGpsConnection::cleanupSource() 146 : : { 147 : 0 : if ( mSource ) 148 : : { 149 : 0 : mSource->close(); 150 : 0 : } 151 : 0 : mSource.reset(); 152 : 0 : } 153 : : 154 : 0 : void QgsGpsConnection::setSource( QIODevice *source ) 155 : : { 156 : 0 : cleanupSource(); 157 : 0 : mSource.reset( source ); 158 : 0 : clearLastGPSInformation(); 159 : 0 : } 160 : : 161 : 0 : void QgsGpsConnection::clearLastGPSInformation() 162 : : { 163 : 0 : mLastGPSInformation = QgsGpsInformation(); 164 : 0 : }