From 629d174c319e6306ae200bde77db3f333993260b Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Fri, 3 Dec 2021 18:23:14 +0000 Subject: [PATCH 1/2] Add IBP beacons and GRAVES to Map feature --- doc/img/Map_plugin_ibp_beacon_dialog.png | Bin 0 -> 13664 bytes plugins/feature/map/CMakeLists.txt | 5 + plugins/feature/map/ibpbeacon.cpp | 45 ++++++ plugins/feature/map/ibpbeacon.h | 64 +++++++++ plugins/feature/map/icons.qrc | 1 + plugins/feature/map/icons/ibp.png | Bin 0 -> 5572 bytes plugins/feature/map/mapgui.cpp | 44 ++++++ plugins/feature/map/mapgui.h | 5 + plugins/feature/map/mapgui.ui | 14 ++ plugins/feature/map/mapibpbeacondialog.cpp | 106 ++++++++++++++ plugins/feature/map/mapibpbeacondialog.h | 57 ++++++++ plugins/feature/map/mapibpbeacondialog.ui | 160 +++++++++++++++++++++ plugins/feature/map/mapsettings.h | 7 +- plugins/feature/map/mapsettingsdialog.ui | 8 ++ plugins/feature/map/readme.md | 30 ++-- 15 files changed, 535 insertions(+), 11 deletions(-) create mode 100644 doc/img/Map_plugin_ibp_beacon_dialog.png create mode 100644 plugins/feature/map/ibpbeacon.cpp create mode 100644 plugins/feature/map/ibpbeacon.h create mode 100644 plugins/feature/map/icons/ibp.png create mode 100644 plugins/feature/map/mapibpbeacondialog.cpp create mode 100644 plugins/feature/map/mapibpbeacondialog.h create mode 100644 plugins/feature/map/mapibpbeacondialog.ui diff --git a/doc/img/Map_plugin_ibp_beacon_dialog.png b/doc/img/Map_plugin_ibp_beacon_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..bab8287b1c05826acd0e3a1890b9f86ce884b508 GIT binary patch literal 13664 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. // +/////////////////////////////////////////////////////////////////////////////////// + +#include "ibpbeacon.h" + +QList IBPBeacon::m_beacons = { + IBPBeacon("4U1UN", "United Nations NY", "FN30AS", 0), + IBPBeacon("VE8AT", "North Canada", "EQ79AX", 10), + IBPBeacon("W6WX", "USA (CA)", "CM97BD", 20), + IBPBeacon("KH6WO", "Hawaii", "BL10TS", 30), + IBPBeacon("ZL6B", "New Zealand", "RE78TW", 40), + IBPBeacon("VK6RBP", "West Australia", "OF87AV", 50), + IBPBeacon("JA2IGY", "Japan", "PM84JK", 60), + IBPBeacon("RR9O", "Siberia", "NO14KX", 70), + IBPBeacon("VR2HK", "China", "OL72CQ", 80), + IBPBeacon("4S7B", "Sri Lanka", "NJ06CR", 90), + IBPBeacon("ZS6DN", "South Africa", "KG44DC", 100), + IBPBeacon("5Z4B", "Kenya", "KI88MX", 110), + IBPBeacon("4X6TU", "Israel", "KM72JB", 120), + IBPBeacon("OH2B", "Finland", "KP20BM", 130), + IBPBeacon("CS3B", "Madeira", "IM12OR", 140), + IBPBeacon("LU4AA", "Argentina", "GF05TJ", 150), + IBPBeacon("OA4B", "Peru", "FH17MW", 160), + IBPBeacon("YV5B", "Venezuela", "FJ69CC", 170) +}; + +// The frequencies in MHz through which the IBP beacons rotate +QList IBPBeacon::m_frequencies = { + 14.1, 18.11, 21.150, 24.93, 28.2 +}; + diff --git a/plugins/feature/map/ibpbeacon.h b/plugins/feature/map/ibpbeacon.h new file mode 100644 index 000000000..6071f7292 --- /dev/null +++ b/plugins/feature/map/ibpbeacon.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_IBP_BEACON_H +#define INCLUDE_IBP_BEACON_H + +#include +#include + +#include "util/maidenhead.h" + +// International Beacon Project beacons +// https://www.ncdxf.org/beacon/ + +struct IBPBeacon { + + QString m_callsign; + QString m_location; + int m_offset; // Time offset in seconds + float m_latitude; + float m_longitude; + + IBPBeacon(QString callsign, QString location, QString locator, int offset) : + m_callsign(callsign), + m_location(location), + m_offset(offset) + { + Maidenhead::fromMaidenhead(locator, m_latitude, m_longitude); + } + + QString getText() const + { + QStringList list; + list.append("IBP Beacon"); + list.append(QString("Callsign: %1").arg(m_callsign)); + list.append(QString("Frequency: 14.1, 18.11, 21.15, 24.92, 28.2MHz")); + list.append(QString("Power: 100 Watts ERP")); + list.append(QString("Polarization: V")); + list.append(QString("Pattern: Omni")); + list.append(QString("Key: A1")); + list.append(QString("Locator: %1").arg(m_location)); + return list.join("\n"); + } + + static QList m_beacons; + static QList m_frequencies; + static const int m_period = 10; // Beacons rotate every 10 seconds +}; + +#endif // INCLUDE_IBP_BEACON_H diff --git a/plugins/feature/map/icons.qrc b/plugins/feature/map/icons.qrc index ba855ff49..9cfa49cfd 100644 --- a/plugins/feature/map/icons.qrc +++ b/plugins/feature/map/icons.qrc @@ -2,5 +2,6 @@ icons/groundtracks.png icons/clock.png + icons/ibp.png diff --git a/plugins/feature/map/icons/ibp.png b/plugins/feature/map/icons/ibp.png new file mode 100644 index 0000000000000000000000000000000000000000..d023af5155615a84ac51a383a23ca3fa1dd4923b GIT binary patch literal 5572 zcmeHLc~}$I77v>!f>jhzp%?-RNV7~9NMZuAN-PlsYC*6%nG6sinJ}3UaAgx*Xsvuu zp9_dB6r~kKD2kvKg<5y3J}VY@5yb^JQ0uOJcLG9u_1Wk5z5ZvuZ!&Z5{hi-A_jk{^ zHY!;s>9a9ddQ=di;QRc%b!$ zEq_(khK^zBQysdIfG;Zc`wlA}ePqt4Z_b2mS!^|Iq77kHh{VPoRXvK`dfEL{Z=OR> zZqbugkK(TTI&Rty&#R-ZI=edHV|~U_ZgZ-!YC8L-EZ})G(HuVOm#vi&>D-#HTs znyQkvw(JDv`WiicZqqLGlwe(!WO(85V0*&7950&i-TA2P3s3yO%?VpAja_hFRNFS= z8so!9fnn`?AGIAT%?zKAay{fw?i$h2z^&5tDczxGzda>77WDbS%-;i^3VC~HT`oS? zooLUq<~2x8@103NX3!VropnR0rRmTi@i>>fgf;0E*!pZd51r?W%uc2F0P}OiS(Nf_BdGNe!cOj$3}As#Uw`&5D+d22zZtLAn7+P zSt|}XG|jPPUSv7V&LeeX%Fu}7k5;VW&#+rPe@m_194)K2wd^`=(o3dC?TTLgo{4wwi0^cm_-WLTL!r^j*Lqn_U18AodxPrVR4Eo?kO*&HG|OdO(hP)k~CiIdNo;n@Xa zIyIds*^H3qKWkgNyiW$@S(J?TVsA_DWK~DsnqQwCb0mCa#Y&e|m9zGLsg1eR*b=k- zT=dP7=gXTK>k6(4Pr%L9Ipzf;oxjOtPuV%L{1ca!z*P?sr30oBy<` zaNnKYJ0&MOUW(6l-?fb6<0Ug1B0VUS4>l>lb`&iQ6(X3D0n0HN%1BeH!FENVhE@G8xGK@3b~l}DNo9hssqqOMaV)Nja)c03R#$h2;?+hA1hIs5D+L) z0;Z-ZlT{jFnwVzb6@q87n@OV@AViXw7A*~@24FZ!P6?mTp3-!;(62guuSePknva?7&fAks5AtuLQs+lkTVp32Vo)JGB1IQ z&gJv@bS?{q=rW#wLx*4)7nVVCF9BC>L=lE7KqbJ*#!-<}a*_%Z0N)!Bun`VI=L*;| zx(sFU=mMF5FZYsjSn)i_Kt-;D&@Wsfrm-2U!JhDBn25)4B`7b2N{;C?gF{gYB^pV< zq->BEhtK12*pR@BBjE9QgP_?ct^sLIvO+8dn{618Bf?<734?S~DB%Q@sa7Qz2FQgG zg6RNhVX`^^v!Nf%Mi_vjFoEGw7?v!ik48;(Gp#hA_$%^Z*Ie$2T zX=sX=Zv+2{DKZh$ss1;fLFfRBA5Q2nJShwhlPy3I;_W2f#Xm z;xeo=)xAIeJYL7^5>Ya_SZs(6vFR*M6yz=BvV@R;*01d%51r^-c=B z6Zn00y_f5q6nH1_`|SF^$z?V8%8jbP?>-%Pp@xKG>cPwS5ZTAm0}Zd`lqUfV%fQnx zbx4c`+?SJ=N$0IUn!tl4A&~}Ic3GQ^av!~ZVxScK<1#@K=ob}o_;w-mv6ulPm>MO4(=%?v5_-)Vb`Zr40}XTi{lwhM99PQ!G+ zu52Tor8?d3ux>bA+VroyWtUyH&KvUk@rTDB?z_Eoi|>^stxI=_Yl|s?1?Fw0h@?2{ zCHKIZOs#&@p6d2FKgOCo%$Tb;rB?1LFAF{6z%sF&uQkCY-x$HS7*c2V&z-o<1x+w!`CGu6XUVa5Qx*s2rB#e9>u4hyOU- ls*&QN-}B__3C~@gQ_8!G)<2$gd?pZ%A_)*rUDsetupUi(this); @@ -748,8 +750,10 @@ MapGUI::MapGUI(PluginAPI* pluginAPI, FeatureUISet *featureUISet, Feature *featur QList *beacons = Beacon::readIARUCSV(MapGUI::getBeaconFilename()); if (beacons != nullptr) setBeacons(beacons); + addIBPBeacons(); addRadioTimeTransmitters(); + addRadar(); } MapGUI::~MapGUI() @@ -787,6 +791,24 @@ void MapGUI::setBeacons(QList *beacons) } } +void MapGUI::addIBPBeacons() +{ + // Add to Map + for (const auto beacon : IBPBeacon::m_beacons) + { + SWGSDRangel::SWGMapItem beaconMapItem; + beaconMapItem.setName(new QString(beacon.m_callsign)); + beaconMapItem.setLatitude(beacon.m_latitude); + beaconMapItem.setLongitude(beacon.m_longitude); + beaconMapItem.setAltitude(0); + beaconMapItem.setImage(new QString("antenna.png")); + beaconMapItem.setImageRotation(0); + beaconMapItem.setImageMinZoom(8); + beaconMapItem.setText(new QString(beacon.getText())); + m_mapModel.update(m_map, &beaconMapItem, MapSettings::SOURCE_BEACONS); + } +} + const QList MapGUI::m_radioTimeTransmitters = { {"MSF", 60000, 54.9075f, -3.27333f, 17}, {"DCF77", 77500, 50.01611111f, 9.00805556f, 50}, @@ -818,6 +840,23 @@ void MapGUI::addRadioTimeTransmitters() } } +void MapGUI::addRadar() +{ + SWGSDRangel::SWGMapItem radarMapItem; + radarMapItem.setName(new QString("GRAVES")); + radarMapItem.setLatitude(47.3480); + radarMapItem.setLongitude(5.5151); + radarMapItem.setAltitude(0.0); + radarMapItem.setImage(new QString("antenna.png")); + radarMapItem.setImageRotation(0); + radarMapItem.setImageMinZoom(8); + QString text = QString("Radar\nCallsign: %1\nFrequency: %2 MHz") + .arg("GRAVES") + .arg("143.050"); + radarMapItem.setText(new QString(text)); + m_mapModel.update(m_map, &radarMapItem, MapSettings::SOURCE_RADAR); +} + static QString arrayToString(QJsonArray array) { QString s; @@ -1300,6 +1339,11 @@ void MapGUI::on_beacons_clicked() m_beaconDialog.show(); } +void MapGUI::on_ibpBeacons_clicked() +{ + m_ibpBeaconDialog.show(); +} + void MapGUI::on_radiotime_clicked() { m_radioTimeDialog.updateTable(); diff --git a/plugins/feature/map/mapgui.h b/plugins/feature/map/mapgui.h index f88304cec..317a66b40 100644 --- a/plugins/feature/map/mapgui.h +++ b/plugins/feature/map/mapgui.h @@ -31,6 +31,7 @@ #include "mapsettings.h" #include "SWGMapItem.h" #include "mapbeacondialog.h" +#include "mapibpbeacondialog.h" #include "mapradiotimedialog.h" #include "osmtemplateserver.h" @@ -481,8 +482,10 @@ public: static QString getBeaconFilename(); QList *getBeacons() { return m_beacons; } void setBeacons(QList *beacons); + void addIBPBeacons(); QList getRadioTimeTransmitters() { return m_radioTimeTransmitters; } void addRadioTimeTransmitters(); + void addRadar(); void addDAB(); void find(const QString& target); Q_INVOKABLE void supportedMapsChanged(); @@ -501,6 +504,7 @@ private: AzEl m_azEl; // Position of station QList *m_beacons; MapBeaconDialog m_beaconDialog; + MapIBPBeaconDialog m_ibpBeaconDialog; MapRadioTimeDialog m_radioTimeDialog; quint16 m_osmPort; OSMTemplateServer *m_templateServer; @@ -536,6 +540,7 @@ private slots: void on_displaySettings_clicked(); void on_mapTypes_currentIndexChanged(int index); void on_beacons_clicked(); + void on_ibpBeacons_clicked(); void on_radiotime_clicked(); }; diff --git a/plugins/feature/map/mapgui.ui b/plugins/feature/map/mapgui.ui index 8a5a5b39b..36b6256cd 100644 --- a/plugins/feature/map/mapgui.ui +++ b/plugins/feature/map/mapgui.ui @@ -140,6 +140,20 @@ + + + + Display IBP Beacon dialog + + + IBP + + + + :/map/icons/ibp.png:/map/icons/ibp.png + + + diff --git a/plugins/feature/map/mapibpbeacondialog.cpp b/plugins/feature/map/mapibpbeacondialog.cpp new file mode 100644 index 000000000..be2b96ed0 --- /dev/null +++ b/plugins/feature/map/mapibpbeacondialog.cpp @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "mapibpbeacondialog.h" + +#include + +#include "channel/channelwebapiutils.h" +#include "mapgui.h" + +MapIBPBeaconDialog::MapIBPBeaconDialog(MapGUI *gui, QWidget* parent) : + QDialog(parent), + m_gui(gui), + m_timer(this), + ui(new Ui::MapIBPBeaconDialog) +{ + ui->setupUi(this); + connect(&m_timer, &QTimer::timeout, this, &MapIBPBeaconDialog::updateTime); + m_timer.setInterval(1000); + m_timer.start(); + ui->beacons->setRowCount(IBPBeacon::m_frequencies.size()); + for (int row = 0; row < IBPBeacon::m_frequencies.size(); row++) + { + ui->beacons->setItem(row, IBP_BEACON_COL_FREQUENCY, new QTableWidgetItem(QString::number(IBPBeacon::m_frequencies[row], 'f', 3))); + ui->beacons->setItem(row, IBP_BEACON_COL_CALLSIGN, new QTableWidgetItem("")); + ui->beacons->setItem(row, IBP_BEACON_COL_LOCATION, new QTableWidgetItem("")); + ui->beacons->setItem(row, IBP_BEACON_COL_AZIMUTH, new QTableWidgetItem("")); + ui->beacons->setItem(row, IBP_BEACON_COL_DISTANCE, new QTableWidgetItem("")); + } + updateTable(QTime::currentTime()); +} + +MapIBPBeaconDialog::~MapIBPBeaconDialog() +{ + delete ui; +} + +void MapIBPBeaconDialog::updateTable(QTime time) +{ + AzEl azEl = *m_gui->getAzEl(); + + // Repeat from begining every 3 minutes + int index = ((time.minute() * 60 + time.second()) % 180) / IBPBeacon::m_period; + + for (int row = 0; row < IBPBeacon::m_frequencies.size(); row++) + { + ui->beacons->item(row, IBP_BEACON_COL_CALLSIGN)->setText(IBPBeacon::m_beacons[index].m_callsign); + ui->beacons->item(row, IBP_BEACON_COL_LOCATION)->setText(IBPBeacon::m_beacons[index].m_location); + + // Calculate azimuth and distance to beacon + azEl.setTarget(IBPBeacon::m_beacons[index].m_latitude, IBPBeacon::m_beacons[index].m_longitude, 0.0); + azEl.calculate(); + ui->beacons->item(row, IBP_BEACON_COL_AZIMUTH)->setData(Qt::DisplayRole, round(azEl.getAzimuth())); + int km = round(azEl.getDistance()/1000); + ui->beacons->item(row, IBP_BEACON_COL_DISTANCE)->setData(Qt::DisplayRole, km); + + index--; + if (index < 0) { + index = IBPBeacon::m_beacons.size() - 1; + } + } +} + +void MapIBPBeaconDialog::accept() +{ + QDialog::accept(); +} + +void MapIBPBeaconDialog::on_beacons_cellDoubleClicked(int row, int column) +{ + if (column == IBP_BEACON_COL_CALLSIGN) + { + // Find beacon on map + QString location = ui->beacons->item(row, column)->text(); + m_gui->find(location); + } + else if (column == IBP_BEACON_COL_FREQUENCY) + { + // Tune to beacon freq + ChannelWebAPIUtils::setCenterFrequency(0, ui->beacons->item(row, column)->text().toDouble() * 1e6); + } +} + +void MapIBPBeaconDialog::updateTime() +{ + QTime t = QTime::currentTime(); + ui->time->setTime(t); + // Beacons rotate every 10 seconds + if ((t.second() % IBPBeacon::m_period) == 0) { + updateTable(t); + } +} diff --git a/plugins/feature/map/mapibpbeacondialog.h b/plugins/feature/map/mapibpbeacondialog.h new file mode 100644 index 000000000..4496d8d0d --- /dev/null +++ b/plugins/feature/map/mapibpbeacondialog.h @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2021 Jon Beniston, M7RCE // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDE_FEATURE_MAPIBPBEACONDIALOG_H +#define INCLUDE_FEATURE_MAPIBPBEACONDIALOG_H + +#include "ui_mapibpbeacondialog.h" + +#include +#include + +#include "ibpbeacon.h" + +class MapGUI; + +class MapIBPBeaconDialog : public QDialog { + Q_OBJECT + +public: + explicit MapIBPBeaconDialog(MapGUI *gui, QWidget* parent = 0); + ~MapIBPBeaconDialog(); + void updateTable(QTime time); + +private slots: + void accept(); + void on_beacons_cellDoubleClicked(int row, int column); + void updateTime(); + +private: + MapGUI *m_gui; + QTimer m_timer; + Ui::MapIBPBeaconDialog* ui; + + enum BeaconCol { + IBP_BEACON_COL_FREQUENCY, + IBP_BEACON_COL_CALLSIGN, + IBP_BEACON_COL_LOCATION, + IBP_BEACON_COL_AZIMUTH, + IBP_BEACON_COL_DISTANCE + }; +}; + +#endif // INCLUDE_FEATURE_MAPIBPBEACONDIALOG_H diff --git a/plugins/feature/map/mapibpbeacondialog.ui b/plugins/feature/map/mapibpbeacondialog.ui new file mode 100644 index 000000000..038ab63ea --- /dev/null +++ b/plugins/feature/map/mapibpbeacondialog.ui @@ -0,0 +1,160 @@ + + + MapIBPBeaconDialog + + + + 0 + 0 + 584 + 311 + + + + + Liberation Sans + 9 + + + + IBP Beacons + + + + + + + 0 + + + + + + + Time + + + + + + + Current time + + + true + + + QAbstractSpinBox::NoButtons + + + QDateTimeEdit::HourSection + + + HH:mm:ss + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Displays which IBP beacon is transmitting on which frequency + + + + Frequency (MHz) + + + + + Callsign + + + + + Location + + + + + Azimuth (°) + + + + + Distance (km) + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + beacons + time + + + + + + + buttonBox + accepted() + MapIBPBeaconDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + MapIBPBeaconDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/feature/map/mapsettings.h b/plugins/feature/map/mapsettings.h index 31d5e0cc9..0db5886ec 100644 --- a/plugins/feature/map/mapsettings.h +++ b/plugins/feature/map/mapsettings.h @@ -68,9 +68,10 @@ struct MapSettings static const quint32 SOURCE_SATELLITE_TRACKER = 0x10; static const quint32 SOURCE_BEACONS = 0x20; static const quint32 SOURCE_RADIO_TIME = 0x40; - static const quint32 SOURCE_AM = 0x80; - static const quint32 SOURCE_FM = 0x100; - static const quint32 SOURCE_DAB = 0x200; + static const quint32 SOURCE_RADAR = 0x80; + static const quint32 SOURCE_AM = 0x100; + static const quint32 SOURCE_FM = 0x200; + static const quint32 SOURCE_DAB = 0x400; static const quint32 SOURCE_STATION = 0x400; // Antenna at "My Position" }; diff --git a/plugins/feature/map/mapsettingsdialog.ui b/plugins/feature/map/mapsettingsdialog.ui index ec5fb8b9f..b07e64e74 100644 --- a/plugins/feature/map/mapsettingsdialog.ui +++ b/plugins/feature/map/mapsettingsdialog.ui @@ -97,6 +97,14 @@ Checked + + + Radar + + + Checked + + diff --git a/plugins/feature/map/readme.md b/plugins/feature/map/readme.md index 94d1fa860..b41006662 100644 --- a/plugins/feature/map/readme.md +++ b/plugins/feature/map/readme.md @@ -10,8 +10,9 @@ On top of this, it can plot data from other plugins, such as: * Ships from the AIS Demodulator, * Satellites from the Satellite Tracker, * The Sun, Moon and Stars from the Star Tracker, -* Beacons based on the IARU Region 1 beacon database. -* Radio time transmitters. +* Beacons based on the IARU Region 1 beacon database and International Beacon Project, +* Radio time transmitters, +* GRAVES radar. It can also create tracks showing the path aircraft, ships and APRS objects have taken, as well as predicted paths for satellites. @@ -49,7 +50,20 @@ The beacons will then be displayed in the table and on the map. ![Beacon dialog](../../../doc/img/Map_plugin_beacon_dialog.png) -

5: Display Radio Time Transmitters dialog

+

5: Display IBP Beacon Project Dialog

+ +When clicked, opens the International Beacon Project dialog. The IBP consists of 18 HF beacons around the world, +that each transmit once on each of the frequencies 14.100, 18.110, 21.150, 24.930 and 28.200MHz every 3 minutes, for 10 seconds. +The IBP dialog shows which of the beacons should currently be transmitting. + +![IBP beacon dialog](../../../doc/img/Map_plugin_ibp_beacon_dialog.png) + +* Double clicking in a cell in the Callsign column will centre the map on that beacon. +* Double clicking in a cell in the Frequency column will set the Device center frequency. + +More details of the IBP can be found at: https://www.ncdxf.org/beacon/beaconfaq.html + +

6: Display Radio Time Transmitters dialog

When clicked, opens the Radio Time Transmitters dialog. @@ -58,23 +72,23 @@ When clicked, opens the Radio Time Transmitters dialog. ![Radio Time transmitters dialog](../../../doc/img/Map_plugin_radiotime_dialog.png) -

6: Display Names

+

7: Display Names

When checked, names of objects are displayed in a bubble next to each object. -

7: Display tracks for selected object

+

8: Display tracks for selected object

When checked, displays the track (taken or predicted) for the selected object. -

8: Display tracks for all objects

+

9: Display tracks for all objects

When checked, displays the track (taken or predicted) for the all objects. -

9: Delete

+

10: Delete

When clicked, all items will be deleted from the map. -

10: Display settings

+

11: Display settings

When clicked, opens the Map Display Settings dialog, which allows setting: From 7b418cb20e428d212fa164b79f0f370a0393e3f3 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Fri, 3 Dec 2021 18:37:10 +0000 Subject: [PATCH 2/2] Display locator not location --- plugins/feature/map/ibpbeacon.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/feature/map/ibpbeacon.h b/plugins/feature/map/ibpbeacon.h index 6071f7292..7fe6a3140 100644 --- a/plugins/feature/map/ibpbeacon.h +++ b/plugins/feature/map/ibpbeacon.h @@ -30,13 +30,15 @@ struct IBPBeacon { QString m_callsign; QString m_location; + QString m_locator; int m_offset; // Time offset in seconds float m_latitude; float m_longitude; - IBPBeacon(QString callsign, QString location, QString locator, int offset) : + IBPBeacon(const QString& callsign, const QString& location, const QString& locator, int offset) : m_callsign(callsign), m_location(location), + m_locator(locator), m_offset(offset) { Maidenhead::fromMaidenhead(locator, m_latitude, m_longitude); @@ -52,7 +54,7 @@ struct IBPBeacon { list.append(QString("Polarization: V")); list.append(QString("Pattern: Omni")); list.append(QString("Key: A1")); - list.append(QString("Locator: %1").arg(m_location)); + list.append(QString("Locator: %1").arg(m_locator)); return list.join("\n"); }