#include "adif.h" #include #include #include /* W1XT20m14.076DM33JT65-21-14201104220417042441st JT65A QSO. Him: mag loop 20WVK3ACFqf22lb IK1SOW20m14.076JN35JT65-19-1120110422052505333VK3ACFqf22lb W4ABC> ... */ void ADIF::init(QString filename) { _filename = filename; _data.clear(); } QString ADIF::_extractField(const QString line, const QString 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(const QString call, const QString band, const QString mode, const QString 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(const QString call, const QString band, const QString mode) { QList 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)) && ((q.mode.compare("JT65",Qt::CaseInsensitive)==0) || (q.mode.compare("JT9",Qt::CaseInsensitive)==0)) ) || (mode.compare(q.mode,Qt::CaseInsensitive)==0) || (mode=="") || (q.mode=="") ) return true; } } } return false; } QList ADIF::getCallList() { QList p; QMultiHash::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(const QString hisCall, const QString hisGrid, const QString mode, const QString rptSent, const QString rptRcvd, const QString date, const QString time, const QString band, const QString comments, const QString name, const QString strDialFreq, const QString m_myCall, const QString m_myGrid, const QString 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" << endl; // new file QString t; t="" + hisCall; t+=" " + hisGrid; t+=" " + mode; t+=" " + rptSent; t+=" " + rptRcvd; t+=" " + date; t+=" " + time; t+=" " + band; t+=" " + strDialFreq; t+=" " + m_myCall; t+=" " + m_myGrid; if(m_txPower!="") t+= " " + m_txPower; if(comments!="") t+=" " + comments; if(name!="") t+=" " + name; t+=" "; 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; }