mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	This change also adds seconds resolution to log files and log QSO fields. This change makes the log QSO dialog more layout friendly and uses a QDateTimeEdit for QSO start and end times. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7827 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			214 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "adif.h"
 | |
| 
 | |
| #include <QFile>
 | |
| #include <QTextStream>
 | |
| #include <QDateTime>
 | |
| #include <QDebug>
 | |
| 
 | |
| /*
 | |
| <CALL:4>W1XT<BAND:3>20m<FREQ:6>14.076<GRIDSQUARE:4>DM33<MODE:4>JT65<RST_RCVD:3>-21<RST_SENT:3>-14<QSO_DATE:8>20110422<TIME_ON:6>041712<TIME_OFF:6>042435<TX_PWR:1>4<COMMENT:34>1st JT65A QSO.   Him: mag loop 20W<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor>
 | |
| <CALL:6>IK1SOW<BAND:3>20m<FREQ:6>14.076<GRIDSQUARE:4>JN35<MODE:4>JT65<RST_RCVD:3>-19<RST_SENT:3>-11<QSO_DATE:8>20110422<TIME_ON:6>052501<TIME_OFF:6>053359<TX_PWR:1>3<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor>
 | |
| <CALL:6:S>W4ABC> ...
 | |
| */
 | |
| 
 | |
| void ADIF::init(QString const& filename)
 | |
| {
 | |
|     _filename = filename;
 | |
|     _data.clear(); 
 | |
| }
 | |
| 
 | |
| 
 | |
| QString ADIF::_extractField(QString const& line, QString const& fieldName)
 | |
| {
 | |
|     int fieldNameIndex = line.indexOf(fieldName,0,Qt::CaseInsensitive);
 | |
|     if (fieldNameIndex >=0)
 | |
|     {
 | |
|         int closingBracketIndex = line.indexOf('>',fieldNameIndex);
 | |
|         int fieldLengthIndex = line.indexOf(':',fieldNameIndex);  // find the size delimiter
 | |
|         int dataTypeIndex = -1;
 | |
|         if (fieldLengthIndex >= 0)
 | |
|         {
 | |
|           dataTypeIndex = line.indexOf(':',fieldLengthIndex+1);  // check for a second : indicating there is a data type
 | |
|           if (dataTypeIndex > closingBracketIndex)
 | |
|             dataTypeIndex = -1; // second : was found but it was beyond the closing >
 | |
|         }
 | |
| 
 | |
|         if ((closingBracketIndex > fieldNameIndex) && (fieldLengthIndex > fieldNameIndex) && (fieldLengthIndex< closingBracketIndex))
 | |
|         {
 | |
|             int fieldLengthCharCount = closingBracketIndex - fieldLengthIndex -1;
 | |
|             if (dataTypeIndex >= 0)
 | |
|               fieldLengthCharCount -= 2; // data type indicator is always a colon followed by a single character
 | |
|             QString fieldLengthString = line.mid(fieldLengthIndex+1,fieldLengthCharCount);
 | |
|             int fieldLength = fieldLengthString.toInt();
 | |
|             if (fieldLength > 0)
 | |
|             {
 | |
|               QString field = line.mid(closingBracketIndex+1,fieldLength);
 | |
|               return field;
 | |
|             }
 | |
|        }
 | |
|     }
 | |
|     return "";
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void ADIF::load()
 | |
| {
 | |
|     _data.clear();
 | |
|     QFile inputFile(_filename);
 | |
|     if (inputFile.open(QIODevice::ReadOnly))
 | |
|     {
 | |
|         QTextStream in(&inputFile);
 | |
|         while ( !in.atEnd() )
 | |
|         {
 | |
|             QString line = in.readLine();
 | |
|             QSO q;
 | |
|             q.call = _extractField(line,"CALL:");
 | |
|             q.band = _extractField(line,"BAND:");
 | |
|             q.mode = _extractField(line,"MODE:");
 | |
|             q.date = _extractField(line,"QSO_DATE:");
 | |
|             if (q.call != "")
 | |
|             _data.insert(q.call,q);
 | |
|         }
 | |
|         inputFile.close();
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| void ADIF::add(QString const& call, QString const& band, QString const& mode, QString const& date)
 | |
| {
 | |
|     QSO q;
 | |
|     q.call = call;
 | |
|     q.band = band;
 | |
|     q.mode = mode;
 | |
|     q.date = date;
 | |
|     _data.insert(q.call,q);
 | |
|     //qDebug() << "Added as worked:" << call << band << mode << date;
 | |
| }
 | |
| 
 | |
| // return true if in the log same band and mode (where JT65 == JT9)
 | |
| bool ADIF::match(QString const& call, QString const& band, QString const& mode)
 | |
| {
 | |
|     QList<QSO> qsos = _data.values(call);
 | |
|     if (qsos.size()>0)
 | |
|     {
 | |
|         QSO q;
 | |
|         foreach(q,qsos)
 | |
|         {
 | |
|             if (     (band.compare(q.band,Qt::CaseInsensitive) == 0)
 | |
|                   || (band=="")
 | |
|                   || (q.band==""))
 | |
|             {
 | |
|                 if (
 | |
|                      (
 | |
|                        ((mode.compare("JT65",Qt::CaseInsensitive)==0) ||
 | |
|                         (mode.compare("JT9",Qt::CaseInsensitive)==0)  ||
 | |
|                         (mode.compare("FT8",Qt::CaseInsensitive)==0))
 | |
|                        &&
 | |
|                        ((q.mode.compare("JT65",Qt::CaseInsensitive)==0) ||
 | |
|                         (q.mode.compare("JT9",Qt::CaseInsensitive)==0)  ||
 | |
|                         (q.mode.compare("FT8",Qt::CaseInsensitive)==0))
 | |
|                      )
 | |
|                         || (mode.compare(q.mode,Qt::CaseInsensitive)==0)
 | |
|                         || (mode=="")
 | |
|                         || (q.mode=="")
 | |
|                     )
 | |
|                 return true;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }    
 | |
| 
 | |
| QList<QString> ADIF::getCallList()
 | |
| {
 | |
|     QList<QString> p;
 | |
|     QMultiHash<QString,QSO>::const_iterator i = _data.constBegin();
 | |
|      while (i != _data.constEnd())
 | |
|      {
 | |
|          p << i.key();
 | |
|          ++i;
 | |
|      }
 | |
|     return p;
 | |
| }   
 | |
|     
 | |
| int ADIF::getCount()
 | |
| {
 | |
|     return _data.size();
 | |
| }   
 | |
|     
 | |
| 
 | |
| // open ADIF file and append the QSO details. Return true on success
 | |
| bool ADIF::addQSOToFile(QString const& hisCall, QString const& hisGrid, QString const& mode, QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff, QString const& band,
 | |
|                         QString const& comments, QString const& name, QString const& strDialFreq, QString const& m_myCall, QString const& m_myGrid, QString const& m_txPower)
 | |
| {
 | |
|     QFile f2(_filename);
 | |
|     if (!f2.open(QIODevice::Text | QIODevice::Append))
 | |
|         return false;
 | |
|     else
 | |
|     {
 | |
|         QTextStream out(&f2);
 | |
|         if (f2.size()==0)
 | |
|             out << "WSJT-X ADIF Export<eoh>" << endl;  // new file
 | |
| 
 | |
|         QString t;
 | |
|         t="<call:" + QString::number(hisCall.length()) + ">" + hisCall;
 | |
|         t+=" <gridsquare:" + QString::number(hisGrid.length()) + ">" + hisGrid;
 | |
|         t+=" <mode:" + QString::number(mode.length()) + ">" + mode;
 | |
|         t+=" <rst_sent:" + QString::number(rptSent.length()) + ">" + rptSent;
 | |
|         t+=" <rst_rcvd:" + QString::number(rptRcvd.length()) + ">" + rptRcvd;
 | |
|         t+=" <qso_date:8>" + dateTimeOn.date ().toString ("yyyyMMdd");
 | |
|         t+=" <time_on:6>" + dateTimeOn.time ().toString ("hhmmss");
 | |
|         t+=" <qso_date_off:8>" + dateTimeOff.date ().toString ("yyyyMMdd");
 | |
|         t+=" <time_off:6>" + dateTimeOff.time ().toString ("hhmmss");
 | |
|         t+=" <band:" + QString::number(band.length()) + ">" + band;
 | |
|         t+=" <freq:" + QString::number(strDialFreq.length()) + ">" + strDialFreq;
 | |
|         t+=" <station_callsign:" + QString::number(m_myCall.length()) + ">" +
 | |
|                 m_myCall;
 | |
|         t+=" <my_gridsquare:" + QString::number(m_myGrid.length()) + ">" +
 | |
|                 m_myGrid;
 | |
|         if(m_txPower!="") t+= " <tx_pwr:" + QString::number(m_txPower.length()) +
 | |
|                 ">" + m_txPower;
 | |
|         if(comments!="") t+=" <comment:" + QString::number(comments.length()) +
 | |
|                 ">" + comments;
 | |
|         if(name!="") t+=" <name:" + QString::number(name.length()) +
 | |
|                 ">" + name;
 | |
|         t+=" <eor>";
 | |
|         out << t << endl;
 | |
|         f2.close();
 | |
|     }
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| QString ADIF::bandFromFrequency(double dialFreq)
 | |
| {
 | |
|     QString band="";
 | |
|     if(dialFreq>0.135 and dialFreq<0.139) band="2200m";
 | |
|     else if(dialFreq>0.45 and dialFreq<0.55) band="630m";
 | |
|     else if(dialFreq>1.8 and dialFreq<2.0) band="160m";
 | |
|     else if(dialFreq>3.5 and dialFreq<4.0) band="80m";
 | |
|     else if(dialFreq>5.1 and dialFreq<5.45) band="60m";
 | |
|     else if(dialFreq>7.0 and dialFreq<7.3) band="40m";
 | |
|     else if(dialFreq>10.0 and dialFreq<10.15) band="30m";
 | |
|     else if(dialFreq>14.0 and dialFreq<14.35) band="20m";
 | |
|     else if(dialFreq>18.068 and dialFreq<18.168) band="17m";
 | |
|     else if(dialFreq>21.0 and dialFreq<21.45) band="15m";
 | |
|     else if(dialFreq>24.890 and dialFreq<24.990) band="12m";
 | |
|     else if(dialFreq>28.0 and dialFreq<29.7) band="10m";
 | |
|     else if(dialFreq>50.0 and dialFreq<54.0) band="6m";
 | |
|     else if(dialFreq>70.0 and dialFreq<71.0) band="4m";
 | |
|     else if(dialFreq>144.0 and dialFreq<148.0) band="2m";
 | |
|     else if(dialFreq>222.0 and dialFreq<225.0) band="1.25m";
 | |
|     else if(dialFreq>420.0 and dialFreq<450.0) band="70cm";
 | |
|     else if(dialFreq>902.0 and dialFreq<928.0) band="33cm";
 | |
|     else if(dialFreq>1240.0 and dialFreq<1300.0) band="23cm";
 | |
|     else if(dialFreq>2300.0 and dialFreq<2450.0) band="13cm";
 | |
|     else if(dialFreq>3300.0 and dialFreq<3500.0) band="9cm";
 | |
|     else if(dialFreq>5650.0 and dialFreq<5925.0) band="6cm";
 | |
|     else if(dialFreq>10000.0 and dialFreq<10500.0) band="3cm";
 | |
|     else if(dialFreq>24000.0 and dialFreq<24250.0) band="1.25cm";
 | |
|     else if(dialFreq>47000.0 and dialFreq<47200.0) band="6mm";
 | |
|     else if(dialFreq>75500.0 and dialFreq<81000.0) band="4mm";
 | |
|     return band;
 | |
| }
 |