SVN r8568
This commit is contained in:
@@ -1,99 +0,0 @@
|
||||
#include "LiveFrequencyValidator.hpp"
|
||||
|
||||
#include <QLocale>
|
||||
#include <QString>
|
||||
#include <QComboBox>
|
||||
#include <QLineEdit>
|
||||
|
||||
#include "Bands.hpp"
|
||||
#include "FrequencyList.hpp"
|
||||
|
||||
#include "moc_LiveFrequencyValidator.cpp"
|
||||
|
||||
LiveFrequencyValidator::LiveFrequencyValidator (QComboBox * combo_box
|
||||
, Bands const * bands
|
||||
, FrequencyList const * frequencies
|
||||
, Frequency const * nominal_frequency
|
||||
, QWidget * parent)
|
||||
: QRegExpValidator {
|
||||
QRegExp { // frequency in MHz or band
|
||||
bands->data (QModelIndex {}).toString () // out of band string
|
||||
+ QString {R"(|((\d{0,6}(\)"} // or up to 6 digits
|
||||
+ QLocale {}.decimalPoint () // (followed by decimal separator
|
||||
+ R"(\d{0,2})?)([Mm]{1,2}|([Cc][Mm])))|(\d{0,6}(\)" // followed by up to 2 digits and either 'm' or 'cm' or 'mm' (case insensitive))
|
||||
+ QLocale {}.decimalPoint () // or a decimal separator
|
||||
+ R"(\d{0,6})?)|(\d{0,3}(\)" // followed by up to 6
|
||||
// digits or a decimal number
|
||||
+ QLocale {}.decimalPoint () // or a decimal separator
|
||||
+ R"(\d{0,6})?[Kk]))" // followed by a 'k' or 'K'
|
||||
}
|
||||
, parent
|
||||
}
|
||||
, bands_ {bands}
|
||||
, frequencies_ {frequencies}
|
||||
, nominal_frequency_ {nominal_frequency}
|
||||
, combo_box_ {combo_box}
|
||||
{
|
||||
}
|
||||
|
||||
auto LiveFrequencyValidator::validate (QString& input, int& pos) const -> State
|
||||
{
|
||||
auto state = QRegExpValidator::validate (input, pos);
|
||||
// by never being Acceptable we force fixup calls on ENTER or
|
||||
// losing focus
|
||||
return Acceptable == state ? Intermediate : state;
|
||||
}
|
||||
|
||||
void LiveFrequencyValidator::fixup (QString& input) const
|
||||
{
|
||||
QRegExpValidator::fixup (input);
|
||||
if (!bands_->oob ().startsWith (input))
|
||||
{
|
||||
if (input.contains ('m', Qt::CaseInsensitive))
|
||||
{
|
||||
input = input.toLower ();
|
||||
|
||||
QVector<QVariant> frequencies;
|
||||
for (auto const& item : frequencies_->frequency_list ())
|
||||
{
|
||||
if (bands_->find (item.frequency_) == input)
|
||||
{
|
||||
frequencies << item.frequency_;
|
||||
}
|
||||
}
|
||||
if (!frequencies.isEmpty ())
|
||||
{
|
||||
Q_EMIT valid (frequencies.first ().value<Frequency> ());
|
||||
}
|
||||
else
|
||||
{
|
||||
input = QString {};
|
||||
}
|
||||
}
|
||||
else if (input.contains (QChar {'k'}, Qt::CaseInsensitive))
|
||||
{
|
||||
// kHz in current MHz input
|
||||
auto f = Radio::frequency (input.remove (QChar {'k'}, Qt::CaseInsensitive), 3);
|
||||
f += *nominal_frequency_ / 1000000u * 1000000u;
|
||||
input = bands_->find (f);
|
||||
Q_EMIT valid (f);
|
||||
}
|
||||
else
|
||||
{
|
||||
// frequency input
|
||||
auto f = Radio::frequency (input, 6);
|
||||
input = bands_->find (f);
|
||||
Q_EMIT valid (f);
|
||||
}
|
||||
|
||||
if (bands_->oob () == input)
|
||||
{
|
||||
combo_box_->lineEdit ()->setStyleSheet ("QLineEdit {color: yellow; background-color : red;}");
|
||||
}
|
||||
else
|
||||
{
|
||||
combo_box_->lineEdit ()->setStyleSheet ({});
|
||||
}
|
||||
combo_box_->setCurrentText (input);
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.2 KiB |
@@ -1,212 +0,0 @@
|
||||
#include "adif.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
#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: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:S>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<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(const QString hisCall, const QString hisGrid, const QString mode, const QString rptSent, const QString rptRcvd, const QString dateOn, const QString timeOn, QString dateOff, const QString timeOff, 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<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>" + dateOn;
|
||||
t+=" <time_on:4>" + timeOn;
|
||||
t+=" <qso_date_off:8>" + dateOff;
|
||||
t+=" <time_off:4>" + timeOff;
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user