mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-23 01:55:48 -05:00
FT8 demod: implemented DXCC country decoding. Fixes #2008
This commit is contained in:
parent
788190872b
commit
76e8c70716
@ -57,6 +57,13 @@ void FT8DemodFilterProxy::setFilterLoc(const QString& locString)
|
|||||||
invalidateFilter();
|
invalidateFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FT8DemodFilterProxy::setFilterCountry(const QString& countryString)
|
||||||
|
{
|
||||||
|
m_filterActive = FILTER_COUNTRY;
|
||||||
|
m_country = countryString;
|
||||||
|
invalidateFilter();
|
||||||
|
}
|
||||||
|
|
||||||
void FT8DemodFilterProxy::setFilterInfo(const QString& infoString)
|
void FT8DemodFilterProxy::setFilterInfo(const QString& infoString)
|
||||||
{
|
{
|
||||||
m_filterActive = FILTER_INFO;
|
m_filterActive = FILTER_INFO;
|
||||||
@ -97,6 +104,12 @@ bool FT8DemodFilterProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sou
|
|||||||
return sourceModel()->data(index).toString() == m_loc;
|
return sourceModel()->data(index).toString() == m_loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_filterActive == FILTER_COUNTRY)
|
||||||
|
{
|
||||||
|
QModelIndex index = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_COUNTRY, sourceParent);
|
||||||
|
return sourceModel()->data(index).toString() == m_country;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_filterActive == FILTER_INFO)
|
if (m_filterActive == FILTER_INFO)
|
||||||
{
|
{
|
||||||
QModelIndex index = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_INFO, sourceParent);
|
QModelIndex index = sourceModel()->index(sourceRow, FT8DemodSettings::MESSAGE_COL_INFO, sourceParent);
|
||||||
|
@ -32,6 +32,7 @@ public:
|
|||||||
void setFilterDf(int df);
|
void setFilterDf(int df);
|
||||||
void setFilterCall(const QString& utcString);
|
void setFilterCall(const QString& utcString);
|
||||||
void setFilterLoc(const QString& utcString);
|
void setFilterLoc(const QString& utcString);
|
||||||
|
void setFilterCountry(const QString& countryString);
|
||||||
void setFilterInfo(const QString& infoString);
|
void setFilterInfo(const QString& infoString);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -45,6 +46,7 @@ private:
|
|||||||
FILTER_DF,
|
FILTER_DF,
|
||||||
FILTER_CALL,
|
FILTER_CALL,
|
||||||
FILTER_LOC,
|
FILTER_LOC,
|
||||||
|
FILTER_COUNTRY,
|
||||||
FILTER_INFO
|
FILTER_INFO
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -54,6 +56,7 @@ private:
|
|||||||
int m_df;
|
int m_df;
|
||||||
QString m_call;
|
QString m_call;
|
||||||
QString m_loc;
|
QString m_loc;
|
||||||
|
QString m_country;
|
||||||
QString m_info;
|
QString m_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "gui/dialpopup.h"
|
#include "gui/dialpopup.h"
|
||||||
#include "gui/dialogpositioner.h"
|
#include "gui/dialogpositioner.h"
|
||||||
#include "util/db.h"
|
#include "util/db.h"
|
||||||
|
#include "util/callsign.h"
|
||||||
#include "maincore.h"
|
#include "maincore.h"
|
||||||
|
|
||||||
#include "ui_ft8demodgui.h"
|
#include "ui_ft8demodgui.h"
|
||||||
@ -89,6 +90,8 @@ QVariant FT8MessagesTableModel::data(const QModelIndex &index, int role) const
|
|||||||
return ft8Message.m_call2;
|
return ft8Message.m_call2;
|
||||||
case FT8DemodSettings::MESSAGE_COL_LOC:
|
case FT8DemodSettings::MESSAGE_COL_LOC:
|
||||||
return ft8Message.m_loc;
|
return ft8Message.m_loc;
|
||||||
|
case FT8DemodSettings::MESSAGE_COL_COUNTRY:
|
||||||
|
return ft8Message.m_country;
|
||||||
case FT8DemodSettings::MESSAGE_COL_INFO:
|
case FT8DemodSettings::MESSAGE_COL_INFO:
|
||||||
return ft8Message.m_info;
|
return ft8Message.m_info;
|
||||||
default:
|
default:
|
||||||
@ -137,6 +140,8 @@ QVariant FT8MessagesTableModel::headerData(int section, Qt::Orientation orientat
|
|||||||
return tr("Call2");
|
return tr("Call2");
|
||||||
case FT8DemodSettings::MESSAGE_COL_LOC:
|
case FT8DemodSettings::MESSAGE_COL_LOC:
|
||||||
return tr("Loc");
|
return tr("Loc");
|
||||||
|
case FT8DemodSettings::MESSAGE_COL_COUNTRY:
|
||||||
|
return tr("Country");
|
||||||
case FT8DemodSettings::MESSAGE_COL_INFO:
|
case FT8DemodSettings::MESSAGE_COL_INFO:
|
||||||
return tr("Info");
|
return tr("Info");
|
||||||
default:
|
default:
|
||||||
@ -167,6 +172,8 @@ QVariant FT8MessagesTableModel::headerData(int section, Qt::Orientation orientat
|
|||||||
return tr("Second call area");
|
return tr("Second call area");
|
||||||
case FT8DemodSettings::MESSAGE_COL_LOC:
|
case FT8DemodSettings::MESSAGE_COL_LOC:
|
||||||
return tr("Locator area");
|
return tr("Locator area");
|
||||||
|
case FT8DemodSettings::MESSAGE_COL_COUNTRY:
|
||||||
|
return tr("DXCC country name");
|
||||||
case FT8DemodSettings::MESSAGE_COL_INFO:
|
case FT8DemodSettings::MESSAGE_COL_INFO:
|
||||||
return tr("Decoder information");
|
return tr("Decoder information");
|
||||||
default:
|
default:
|
||||||
@ -190,6 +197,7 @@ void FT8MessagesTableModel::messagesReceived(const QList<FT8Message>& messages)
|
|||||||
|
|
||||||
for (const auto& message : messages)
|
for (const auto& message : messages)
|
||||||
{
|
{
|
||||||
|
CountryDat::CountryInfo countryInfo = Callsign::instance()->getCountryInfo(getCaller(message.call1, message.call2));
|
||||||
m_ft8Messages.push_back(FT8MesssageData{
|
m_ft8Messages.push_back(FT8MesssageData{
|
||||||
message.ts.toString("HHmmss"),
|
message.ts.toString("HHmmss"),
|
||||||
message.type,
|
message.type,
|
||||||
@ -201,6 +209,7 @@ void FT8MessagesTableModel::messagesReceived(const QList<FT8Message>& messages)
|
|||||||
message.call1,
|
message.call1,
|
||||||
message.call2,
|
message.call2,
|
||||||
message.loc,
|
message.loc,
|
||||||
|
countryInfo.country,
|
||||||
message.decoderInfo
|
message.decoderInfo
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -208,6 +217,17 @@ void FT8MessagesTableModel::messagesReceived(const QList<FT8Message>& messages)
|
|||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString FT8MessagesTableModel::getCaller(const QString& call1, const QString& call2)
|
||||||
|
{
|
||||||
|
if (!call2.isEmpty()) {
|
||||||
|
return call2;
|
||||||
|
}
|
||||||
|
if (call1.startsWith("CQ ")) {
|
||||||
|
return call1.mid(3);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
void FT8MessagesTableModel::setDefaultMessage()
|
void FT8MessagesTableModel::setDefaultMessage()
|
||||||
{
|
{
|
||||||
if (m_ft8Messages.size() != 0) {
|
if (m_ft8Messages.size() != 0) {
|
||||||
@ -226,6 +246,7 @@ void FT8MessagesTableModel::setDefaultMessage()
|
|||||||
"CQ PA900RAALTE",
|
"CQ PA900RAALTE",
|
||||||
"PA900RAALTE",
|
"PA900RAALTE",
|
||||||
"JN000",
|
"JN000",
|
||||||
|
"Bosnia-Herzegovina",
|
||||||
"OSD-0-73"
|
"OSD-0-73"
|
||||||
});
|
});
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
@ -950,6 +971,8 @@ void FT8DemodGUI::filterMessages()
|
|||||||
m_messagesFilterProxy.setFilterUTC(m_selectedData.toString());
|
m_messagesFilterProxy.setFilterUTC(m_selectedData.toString());
|
||||||
} else if (m_selectedColumn == FT8DemodSettings::MESSAGE_COL_DF) {
|
} else if (m_selectedColumn == FT8DemodSettings::MESSAGE_COL_DF) {
|
||||||
m_messagesFilterProxy.setFilterDf(m_selectedData.toInt());
|
m_messagesFilterProxy.setFilterDf(m_selectedData.toInt());
|
||||||
|
} else if (m_selectedColumn == FT8DemodSettings::MESSAGE_COL_COUNTRY) {
|
||||||
|
m_messagesFilterProxy.setFilterCountry(m_selectedData.toString());
|
||||||
} else if (m_selectedColumn == FT8DemodSettings::MESSAGE_COL_INFO) {
|
} else if (m_selectedColumn == FT8DemodSettings::MESSAGE_COL_INFO) {
|
||||||
m_messagesFilterProxy.setFilterInfo(m_selectedData.toString());
|
m_messagesFilterProxy.setFilterInfo(m_selectedData.toString());
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ struct FT8MesssageData
|
|||||||
QString m_call1;
|
QString m_call1;
|
||||||
QString m_call2;
|
QString m_call2;
|
||||||
QString m_loc;
|
QString m_loc;
|
||||||
|
QString m_country;
|
||||||
QString m_info;
|
QString m_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -77,7 +78,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QVector<FT8MesssageData> m_ft8Messages;
|
QVector<FT8MesssageData> m_ft8Messages;
|
||||||
static const int m_columnCount = 11;
|
static const int m_columnCount = 12;
|
||||||
|
static QString getCaller(const QString& call1, const QString& call2);
|
||||||
};
|
};
|
||||||
|
|
||||||
class FT8DemodGUI : public ChannelGUI {
|
class FT8DemodGUI : public ChannelGUI {
|
||||||
|
@ -64,6 +64,7 @@ struct FT8DemodSettings
|
|||||||
MESSAGE_COL_CALL1,
|
MESSAGE_COL_CALL1,
|
||||||
MESSAGE_COL_CALL2,
|
MESSAGE_COL_CALL2,
|
||||||
MESSAGE_COL_LOC,
|
MESSAGE_COL_LOC,
|
||||||
|
MESSAGE_COL_COUNTRY,
|
||||||
MESSAGE_COL_INFO,
|
MESSAGE_COL_INFO,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -124,6 +124,7 @@ Toggles the filtering of messages. Messages are filtered based on the selected c
|
|||||||
- **Call1**: will filter messages matching the call1 area value either in the call1 or call2 areas
|
- **Call1**: will filter messages matching the call1 area value either in the call1 or call2 areas
|
||||||
- **Call2**: same as above but taking the call2 value
|
- **Call2**: same as above but taking the call2 value
|
||||||
- **Loc**: will filter messages matching the value in the locator (loc) area
|
- **Loc**: will filter messages matching the value in the locator (loc) area
|
||||||
|
- **Country**: will filter messages matching the value in the country area
|
||||||
- **Info**: will filter values starting with "OSD" or not starting with "OSD" thus filter messages decoded via OSD or not
|
- **Info**: will filter values starting with "OSD" or not starting with "OSD" thus filter messages decoded via OSD or not
|
||||||
|
|
||||||
<h3>C.5: Band preset selection</h3>
|
<h3>C.5: Band preset selection</h3>
|
||||||
@ -201,6 +202,7 @@ Displays the received messages in a table which columns are the following:
|
|||||||
- **Call1**: This is the first call area and may contain the caller callsign, a CQ or a custom 13 character message in which case the second call and locator areas are empty. It may be slightly different from the standard for message type 5 (see above).
|
- **Call1**: This is the first call area and may contain the caller callsign, a CQ or a custom 13 character message in which case the second call and locator areas are empty. It may be slightly different from the standard for message type 5 (see above).
|
||||||
- **Call2**: This is the second call area and will contain the callsign of the responding station. This is always a callsign and this may differ slightly from the standard for messages type 5 (see above).
|
- **Call2**: This is the second call area and will contain the callsign of the responding station. This is always a callsign and this may differ slightly from the standard for messages type 5 (see above).
|
||||||
- **Loc**: Locator area which contains the 4 character Maidenhead locator, a report, an acknowledgement (RRR) or a greetings (73 or RR73)
|
- **Loc**: Locator area which contains the 4 character Maidenhead locator, a report, an acknowledgement (RRR) or a greetings (73 or RR73)
|
||||||
|
- **Country**: DXCC country name derived from the caller callsign
|
||||||
- **Info**: FT8 decoder information if any. If OSD is active (see C.1.3) and OSD was activated it reports the OSD decoder status as `OSD-N-MM` where N is the OSD depth reached and MM is the number of correct LDPC bits.
|
- **Info**: FT8 decoder information if any. If OSD is active (see C.1.3) and OSD was activated it reports the OSD decoder status as `OSD-N-MM` where N is the OSD depth reached and MM is the number of correct LDPC bits.
|
||||||
|
|
||||||
<h3>C.1: More FT8 decoder settings</h2>
|
<h3>C.1: More FT8 decoder settings</h2>
|
||||||
|
Loading…
Reference in New Issue
Block a user