mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-27 06:38:44 -05:00
Logbook:
-changed log to hash table for faster lookup -improved ADIF compatibility mainwindow.ui -fixed typo in menu entry git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@3538 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
436fc96dff
commit
7d198f3d50
123
logbook/adif.cpp
123
logbook/adif.cpp
@ -6,6 +6,7 @@
|
|||||||
/*
|
/*
|
||||||
<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:4>0417<TIME_OFF:4>0424<TX_PWR:1>4<COMMENT:34>1st JT65A QSO. Him: mag loop 20W<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor>
|
<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:4>0417<TIME_OFF:4>0424<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:4>0525<TIME_OFF:4>0533<TX_PWR:1>3<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:4>0525<TIME_OFF:4>0533<TX_PWR:1>3<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor>
|
||||||
|
<CALL:6:S>W4ABC> ...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ADIF::init(QString filename)
|
void ADIF::init(QString filename)
|
||||||
@ -14,25 +15,36 @@ void ADIF::init(QString filename)
|
|||||||
_data.clear();
|
_data.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QString ADIF::_extractField(const QString line, const QString fieldName)
|
QString ADIF::_extractField(const QString line, const QString fieldName)
|
||||||
{
|
{
|
||||||
int s1 = line.indexOf(fieldName,0,Qt::CaseInsensitive);
|
int fieldNameIndex = line.indexOf(fieldName,0,Qt::CaseInsensitive);
|
||||||
if (s1 >=0)
|
if (fieldNameIndex >=0)
|
||||||
{
|
{
|
||||||
int s2 = line.indexOf('>',s1);
|
int closingBracketIndex = line.indexOf('>',fieldNameIndex);
|
||||||
if (s2 >= 0)
|
int fieldLengthIndex = line.indexOf(':',fieldNameIndex); // find the size delimiter
|
||||||
{
|
int dataTypeIndex = -1;
|
||||||
int flsi = s1+fieldName.length();
|
if (fieldLengthIndex >= 0)
|
||||||
int flsl = s2-flsi;
|
{
|
||||||
if (flsl>0)
|
dataTypeIndex = line.indexOf(':',fieldLengthIndex+1); // check for a second : indicating there is a data type
|
||||||
{
|
if (dataTypeIndex > closingBracketIndex)
|
||||||
QString fieldLengthString = line.mid(flsi,flsl);
|
dataTypeIndex = -1; // second : was found but it was beyond the closing >
|
||||||
int fieldLength = fieldLengthString.toInt();
|
}
|
||||||
QString field = line.mid(s2+1,fieldLength);
|
|
||||||
|
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 field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,20 +56,20 @@ void ADIF::load()
|
|||||||
QFile inputFile(_filename);
|
QFile inputFile(_filename);
|
||||||
if (inputFile.open(QIODevice::ReadOnly))
|
if (inputFile.open(QIODevice::ReadOnly))
|
||||||
{
|
{
|
||||||
QTextStream in(&inputFile);
|
QTextStream in(&inputFile);
|
||||||
while ( !in.atEnd() )
|
while ( !in.atEnd() )
|
||||||
{
|
{
|
||||||
QString line = in.readLine();
|
QString line = in.readLine();
|
||||||
QSO q;
|
QSO q;
|
||||||
q.call = _extractField(line,"CALL:");
|
q.call = _extractField(line,"CALL:");
|
||||||
q.band = _extractField(line,"BAND:");
|
q.band = _extractField(line,"BAND:");
|
||||||
q.mode = _extractField(line,"MODE:");
|
q.mode = _extractField(line,"MODE:");
|
||||||
q.date = _extractField(line,"QSO_DATE:");
|
q.date = _extractField(line,"QSO_DATE:");
|
||||||
if (q.call != "")
|
if (q.call != "")
|
||||||
_data << q;
|
_data.insert(q.call,q);
|
||||||
}
|
}
|
||||||
inputFile.close();
|
inputFile.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -68,45 +80,52 @@ void ADIF::add(const QString call)
|
|||||||
q.band = ""; //TODO
|
q.band = ""; //TODO
|
||||||
q.mode = "JT9"; //TODO
|
q.mode = "JT9"; //TODO
|
||||||
q.date = ""; //TODO
|
q.date = ""; //TODO
|
||||||
_data << q;
|
_data.insert(q.call,q);
|
||||||
}
|
}
|
||||||
|
|
||||||
// return true if in the log same band and mode (where JT65 == JT9)
|
// 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)
|
bool ADIF::match(const QString call, const QString band, const QString mode)
|
||||||
{
|
{
|
||||||
QSO q;
|
QList<QSO> qsos = _data.values(call);
|
||||||
foreach(q,_data)
|
if (qsos.size()>0)
|
||||||
{
|
{
|
||||||
if (call.compare(q.call) == 0) //TODO handle multiple log entries from same call, should this be a hash table rather than a list?
|
QSO q;
|
||||||
{
|
foreach(q,qsos)
|
||||||
if ((band.compare(q.band) == 0) || (band=="") || (q.band==""))
|
{
|
||||||
{
|
if ( (band.compare(q.band) == 0)
|
||||||
if (
|
|| (band=="")
|
||||||
(
|
|| (q.band==""))
|
||||||
((mode.compare("JT65",Qt::CaseInsensitive)==0) || (mode.compare("JT9",Qt::CaseInsensitive)==0))
|
{
|
||||||
&&
|
if (
|
||||||
((q.mode.compare("JT65",Qt::CaseInsensitive)==0) || (q.mode.compare("JT9",Qt::CaseInsensitive)==0))
|
(
|
||||||
)
|
((mode.compare("JT65",Qt::CaseInsensitive)==0) || (mode.compare("JT9",Qt::CaseInsensitive)==0))
|
||||||
|| (mode.compare(q.mode)==0)
|
&&
|
||||||
)
|
((q.mode.compare("JT65",Qt::CaseInsensitive)==0) || (q.mode.compare("JT9",Qt::CaseInsensitive)==0))
|
||||||
return true;
|
)
|
||||||
}
|
|| (mode.compare(q.mode)==0)
|
||||||
}
|
|| (mode=="")
|
||||||
}
|
)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QString> ADIF::getCallList()
|
QList<QString> ADIF::getCallList()
|
||||||
{
|
{
|
||||||
QList<QString> p;
|
QList<QString> p;
|
||||||
QSO q;
|
QMultiHash<QString,QSO>::const_iterator i = _data.constBegin();
|
||||||
foreach(q,_data)
|
while (i != _data.constEnd())
|
||||||
p << q.call;
|
{
|
||||||
|
p << i.key();
|
||||||
|
++i;
|
||||||
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ADIF::getCount()
|
int ADIF::getCount()
|
||||||
{
|
{
|
||||||
return _data.length();
|
return _data.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#if defined (QT5)
|
#if defined (QT5)
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#include <QMultiHash>
|
||||||
#else
|
#else
|
||||||
#include <QtGui>
|
#include <QtGui>
|
||||||
#endif
|
#endif
|
||||||
@ -33,7 +34,7 @@ class ADIF
|
|||||||
QString call,band,mode,date;
|
QString call,band,mode,date;
|
||||||
};
|
};
|
||||||
|
|
||||||
QList<QSO> _data;
|
QMultiHash<QString, QSO> _data;
|
||||||
QString _filename;
|
QString _filename;
|
||||||
|
|
||||||
QString _extractField(const QString line, const QString fieldName);
|
QString _extractField(const QString line, const QString fieldName);
|
||||||
|
@ -6,7 +6,10 @@
|
|||||||
#ifndef __COUNTRIESWORKDED_H
|
#ifndef __COUNTRIESWORKDED_H
|
||||||
#define __COUNTRIESWORKDED_H
|
#define __COUNTRIESWORKDED_H
|
||||||
|
|
||||||
#include <QtGui>
|
#include <QList>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
|
|
||||||
class CountriesWorked
|
class CountriesWorked
|
||||||
|
@ -29,8 +29,12 @@ void CountryDat::init(const QString filename)
|
|||||||
QString CountryDat::_extractName(const QString line)
|
QString CountryDat::_extractName(const QString line)
|
||||||
{
|
{
|
||||||
int s1 = line.indexOf(':');
|
int s1 = line.indexOf(':');
|
||||||
QString name = line.mid(0,s1);
|
if (s1>=0)
|
||||||
return name;
|
{
|
||||||
|
QString name = line.mid(0,s1);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void CountryDat::_removeBrackets(QString &line, const QString a, const QString b)
|
void CountryDat::_removeBrackets(QString &line, const QString a, const QString b)
|
||||||
@ -71,7 +75,7 @@ QStringList CountryDat::_extractPrefix(QString &line, bool &more)
|
|||||||
|
|
||||||
void CountryDat::load()
|
void CountryDat::load()
|
||||||
{
|
{
|
||||||
_data.clear(); //dictionary was = {}
|
_data.clear();
|
||||||
_countryNames.clear(); //used by countriesWorked
|
_countryNames.clear(); //used by countriesWorked
|
||||||
|
|
||||||
QFile inputFile(_filename);
|
QFile inputFile(_filename);
|
||||||
@ -86,23 +90,26 @@ void CountryDat::load()
|
|||||||
QString line2 = in.readLine();
|
QString line2 = in.readLine();
|
||||||
|
|
||||||
QString name = _extractName(line1);
|
QString name = _extractName(line1);
|
||||||
_countryNames << name;
|
if (name.length()>0)
|
||||||
bool more = true;
|
|
||||||
QStringList prefixs;
|
|
||||||
while (more)
|
|
||||||
{
|
|
||||||
QStringList p = _extractPrefix(line2,more);
|
|
||||||
prefixs += p;
|
|
||||||
if (more)
|
|
||||||
line2 = in.readLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString p;
|
|
||||||
foreach(p,prefixs)
|
|
||||||
{
|
{
|
||||||
if (p.length() > 0)
|
_countryNames << name;
|
||||||
_data.insert(p,name);
|
bool more = true;
|
||||||
}
|
QStringList prefixs;
|
||||||
|
while (more)
|
||||||
|
{
|
||||||
|
QStringList p = _extractPrefix(line2,more);
|
||||||
|
prefixs += p;
|
||||||
|
if (more)
|
||||||
|
line2 = in.readLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString p;
|
||||||
|
foreach(p,prefixs)
|
||||||
|
{
|
||||||
|
if (p.length() > 0)
|
||||||
|
_data.insert(p,name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inputFile.close();
|
inputFile.close();
|
||||||
|
@ -8,7 +8,10 @@
|
|||||||
#ifndef __COUNTRYDAT_H
|
#ifndef __COUNTRYDAT_H
|
||||||
#define __COUNTRYDAT_H
|
#define __COUNTRYDAT_H
|
||||||
|
|
||||||
#include <QtGui>
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
|
|
||||||
class CountryDat
|
class CountryDat
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#include "logbook.h"
|
#include "logbook.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
void LogBook::init()
|
void LogBook::init()
|
||||||
{
|
{
|
||||||
@ -58,7 +58,7 @@ void LogBook::match(/*in*/const QString call,
|
|||||||
countryWorkedBefore = false;
|
countryWorkedBefore = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qDebug() << "Logbook:" << call << ":" << countryName << "Cty B4:" << countryWorkedBefore << "call B4:" << callWorkedBefore;
|
//qDebug() << "Logbook:" << call << ":" << countryName << "Cty B4:" << countryWorkedBefore << "call B4:" << callWorkedBefore;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogBook::addAsWorked(const QString call)
|
void LogBook::addAsWorked(const QString call)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#define LOGBOOK_H
|
#define LOGBOOK_H
|
||||||
|
|
||||||
|
|
||||||
#include <QtGui>
|
#include <QString>
|
||||||
|
|
||||||
#include "countrydat.h"
|
#include "countrydat.h"
|
||||||
#include "countriesworked.h"
|
#include "countriesworked.h"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//------------------------------------------------------------- MainWindow
|
//-------------------------------------------------------------- MainWindow
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
|
|
||||||
|
@ -2223,7 +2223,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>760</width>
|
<width>760</width>
|
||||||
<height>21</height>
|
<height>20</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
@ -2615,7 +2615,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show DXCC entity and B4 status</string>
|
<string>Show DXCC entity and worked B4 status</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
|
Loading…
Reference in New Issue
Block a user