Add acronym decoder widget

pull/1800/head
srcejon 2023-09-04 13:01:22 +01:00
rodzic 197a22ae85
commit 4c6ee84f48
13 zmienionych plików z 463 dodań i 8 usunięć

Wyświetl plik

@ -106,3 +106,4 @@ Click to specify the name of the .txt file which received characters are logged
The received text area shows characters as they are received.
Holding the cursor over an acronym may show a tooltip with the decoded acronym.

Wyświetl plik

@ -34,6 +34,7 @@
#include "plugin/pluginapi.h"
#include "util/simpleserializer.h"
#include "util/db.h"
#include "util/rtty.h"
#include "gui/basicchannelsettingsdialog.h"
#include "gui/devicestreamselectiondialog.h"
#include "dsp/dspengine.h"
@ -482,6 +483,8 @@ RttyDemodGUI::RttyDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseb
connect(&m_channelMarker, SIGNAL(highlightedByCursor()), this, SLOT(channelMarkerHighlightedByCursor()));
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
ui->text->addAcronyms(Rtty::m_acronyms);
ui->scopeContainer->setVisible(false);
// Hide developer only settings

Wyświetl plik

@ -916,7 +916,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPlainTextEdit" name="text">
<widget class="AcronymView" name="text">
<property name="toolTip">
<string>Received text</string>
</property>
@ -1293,6 +1293,12 @@
<header>gui/glscopegui.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>AcronymView</class>
<extends>QTextEdit</extends>
<header>gui/acronymview.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>deltaFrequency</tabstop>

Wyświetl plik

@ -115,6 +115,12 @@ Predefined text supports the following variable substitutions:
The substitutions are applied when the Transmit Settings dialog is closed.
<h3>21: Transmitted Text</h3>
The trasnmitted text area shows characters as they are transmitted.
Holding the cursor over an acronym may show a tooltip with the decoded acronym.
<h2>API</h2>
Full details of the API can be found in the Swagger documentation. Below are a few examples.

Wyświetl plik

@ -31,6 +31,7 @@
#include "plugin/pluginapi.h"
#include "util/simpleserializer.h"
#include "util/db.h"
#include "util/rtty.h"
#include "util/maidenhead.h"
#include "gui/glspectrum.h"
#include "gui/crightclickenabler.h"
@ -476,6 +477,8 @@ RttyModGUI::RttyModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS
m_settings.setChannelMarker(&m_channelMarker);
m_settings.setRollupState(&m_rollupState);
ui->transmittedText->addAcronyms(Rtty::m_acronyms);
ui->spectrumContainer->setVisible(false);
displaySettings();

Wyświetl plik

@ -751,7 +751,7 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<spacer name="horizontalSpacerSettings">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@ -854,11 +854,7 @@
<number>3</number>
</property>
<item>
<widget class="QPlainTextEdit" name="transmittedText">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<widget class="AcronymView" name="transmittedText"/>
</item>
</layout>
</widget>
@ -960,6 +956,12 @@
<header>gui/levelmeter.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>AcronymView</class>
<extends>QTextEdit</extends>
<header>gui/acronymview.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>deltaFrequency</tabstop>

Wyświetl plik

@ -57,7 +57,7 @@ void RttyModSettings::resetToDefaults()
"UR 599 QTH IS ${location}",
"TU DE ${callsign} CQ"
});
m_rgbColor = QColor(0, 105, 2).rgb();
m_rgbColor = QColor(180, 205, 130).rgb();
m_title = "RTTY Modulator";
m_streamIndex = 0;
m_useReverseAPI = false;

Wyświetl plik

@ -259,6 +259,7 @@ set(sdrbase_SOURCES
util/simpleserializer.cpp
util/serialutil.cpp
#util/spinlock.cpp
util/rtty.cpp
util/uid.cpp
util/units.cpp
util/timeutil.cpp
@ -491,6 +492,7 @@ set(sdrbase_HEADERS
util/profiler.h
util/radiosonde.h
util/rtpsink.h
util/rtty.h
util/syncmessenger.h
util/samplesourceserializer.h
util/simpleserializer.h

Wyświetl plik

@ -0,0 +1,290 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2023 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "util/rtty.h"
// From http://www.ct2fzi.net/abreviations/abreviations.html
const QHash<QString, QString> Rtty::m_acronyms = {
{"AA", "After All"},
{"AB", "All Before"},
{"ABT", "About"},
{"ACK", "Acknowledgement"},
{"ADEE", "Addressee"},
{"ADR", "Address"},
{"AF", "Audio Frequency"},
{"AGN", "Again"},
{"AM", "Amplitude Modulation"},
{"AMU", "Antenna Matching Unit"},
{"ANS", "Answer"},
{"ANT", "Antenna"},
{"ARQ", "Automatic Repeat Request"},
{"ATU", "Antenna Tuning Unit"},
{"B4", "Before"},
{"BCN", "Beacon"},
{"BCNU", "Be Seeing You"},
{"BD", "Bad"},
{"BK", "Break"},
{"BN", "Been"},
{"BTH", "Both"},
{"BTR", "Better"},
{"BTW", "By The Way"},
{"BTU", "Back To You"},
{"C", "Correct"},
{"CBA", "Callbook Address"},
{"CFM", "Confirm"},
{"CK", "Check"},
{"CKT", "Circuit"},
{"CL", "Closing Down"},
{"CLBK", "Callbook"},
{"CLD", "Called"},
{"CLG", "Calling"},
{"CMG", "Coming"},
{"CNT", "Can't"},
{"COMP", "Computer"},
{"CONDX", "Conditions"},
{"COZ", "Because"},
{"CPI", "Copy"},
{"CQ", "General Call"},
{"CRD", "Card"},
{"CS", "Callsign"},
{"CTCSS", "Continuous Tone Coded Squelch System"},
{"CU", "See You"},
{"CUAGN", "See You Again"},
{"CUD", "Could"},
{"CUL", "See You Later"},
{"CUM", "Come"},
{"CUZ", "Because"},
{"CW", "Continuous Wave / Morse"},
{"DA", "Day"},
{"DE", "From"},
{"DF", "Direction Finding"},
{"DIFF", "Difference"},
{"DLD", "Delivered"},
{"DLVD", "Delivered"},
{"DN", "Down"},
{"DR", "Dear"},
{"DSB", "Double Side Band"},
{"DSP", "Digital Signal Processing"},
{"DSW", "Goodbye (Russian)"},
{"DWN", "Down"},
{"DX", "Distance"},
{"EL", "Element"},
{"EME", "Earth-Moon-Earth"},
{"ENUF", "Enough"},
{"ES", "And"},
{"EU", "Europe"},
{"EVE", "Evening"},
{"FB", "Fine Business"},
{"FER", "For"},
{"FIO", "For Information Only"},
{"FM", "Frequency Modulation"},
{"FQ", "Frequency"},
{"FREQ", "Frequency"},
{"FSD", "Full Scale Deflection"},
{"FSK", "Frequency Shift Keying"},
{"FWD", "Forward"},
{"FWIW", "For What It's Worth"},
{"FYI", "For Your Information"},
{"GA", "Good Afternoon"},
{"GB", "Good Bye"},
{"GD", "Good Day"},
{"GE", "Good Evening"},
{"GESS", "Guess"},
{"GG", "Going"},
{"GLD", "Glad"},
{"GM", "Good Morning"},
{"GMT", "Greenwich Mean Time"},
{"GN", "Good Night"},
{"GND", "Ground"},
{"GP", "Ground Plane"},
{"GPS", "Global Positioning System"},
{"GS", "Green Stamp"},
{"GUD", "Good"},
{"GV", "Give"},
{"GVG", "Giving"},
{"HAGD", "Have A Good Day"},
{"HAGWE", "Have A Good Weekend"},
{"HF", "High Frequency"},
{"HI", "High"},
{"HPE", "Hope"},
{"HQ", "Headquarters"},
{"HR", "Here / Hour"},
{"HRD", "Heard"},
{"HV", "Have"},
{"HVG", "Having"},
{"HVY", "Heavy"},
{"HW", "How"},
{"IMHO", "In My Humble Opinion"},
{"IMI", "Say again"},
{"K", "Over"},
{"KN", "Over"},
{"LF", "Low Frequency"},
{"LNG", "Long"},
{"LP", "Long Path"},
{"LSB", "Lower Sideband"},
{"LSN", "Listen"},
{"LTR", "Later"},
{"LV", "Leave"},
{"LVG", "Leaving"},
{"LW", "Long Wire"},
{"MGR", "Manager"},
{"MI", "My"},
{"MNI", "Many"},
{"MOM", "Moment"},
{"MS", "Meteor Scatter"},
{"MSG", "Message"},
{"N", "No"},
{"NCS", "Net Control Station"},
{"ND", "Nothing Doing"},
{"NM", "No More"},
{"NR", "Near / Number"},
{"NW", "Now"},
{"OB", "Old Boy"},
{"OC", "Old Chap"},
{"OM", "Old Man"},
{"OP", "Operator"},
{"OPR", "Operator"},
{"OT", "Old Timer"},
{"OW", "Old Woman"},
{"PA", "Power Amplifier"},
{"PBL", "Preamble"},
{"PKG", "Package"},
{"POV", "Point Of View"},
{"PSE", "Please"},
{"PSK", "Phase Shift Keying"},
{"PT", "Point"},
{"PTT", "Push To Talk"},
{"PWR", "Power"},
{"PX", "Prefix"},
{"QRA", "Address"},
{"QRG", "Frequency"},
{"QRK", "Readability"},
{"QRL", "Busy"},
{"QRM", "Interference"},
{"QRN", "Noise"},
{"QRO", "High Power"},
{"QRP", "Low Power"},
{"QRQ", "Send Faster"},
{"QRS", "Send Slower"},
{"QRSS", "Send Very Slowly"},
{"QRT", "Stop Sending"},
{"QRU", "Nothing Further To Say"},
{"QRV", "Ready"},
{"QRX", "Wait"},
{"QRZ", "Who Is Calling Me"},
{"QSA", "Signal Strength"},
{"QSB", "Fading"},
{"QSK", "Break-in"},
{"QSL", "All Received OK"},
{"QSLL", "I Will Send A QSL Card"},
{"QSO", "Contact"},
{"QSP", "Relay A Message"},
{"QSX", "Listening On Frequency"},
{"QSY", "Change Frequency"},
{"QTH", "Location"},
{"R", "Received OK"},
{"RC", "Ragchew"},
{"RCD", "Recieved"},
{"RCVR", "Receiver"},
{"RE", "Regarding"},
{"REF", "Reference"},
{"RF", "Radio Frequency"},
{"RFI", "Radio Frequency Interference"},
{"RPT", "Repeat / Report"},
{"RST", "Signal Report"},
{"RTTY", "Radio Teletype"},
{"RX", "Receive"},
{"SA", "Say"},
{"SDR", "Software Defined Radio"},
{"SEZ", "Says"},
{"SGD", "Signed"},
{"SHUD", "Should"},
{"SIG", "Signal"},
{"SK", "End Of Work"},
{"SKED", "Schedule"},
{"SN", "Soon"},
{"SP", "Short Path"},
{"SRI", "Sorry"},
{"SSB", "Single Sideband"},
{"STN", "Station"},
{"SUM", "Some"},
{"SVC", "Service"},
{"SWR", "Standing Wave Ratio"},
{"TFC", "Traffic"},
{"TIA", "Thanks In Advance"},
{"TKS", "Thanks"},
{"TMW", "Tomorrow"},
{"TNC", "Terminal Node Controller"},
{"TNX", "Thanks"},
{"TR", "Transmit"},
{"T/R", "Transmit/Receive"},
{"TRBL", "Trouble"},
{"TRF", "Tuned Radio Frequency"},
{"TRIX", "Tricks"},
{"TRX", "Transceiver"},
{"TT", "That"},
{"TTS", "That Is"},
{"TU", "Thank You"},
{"TVI", "Television Interference"},
{"TX", "Transmit"},
{"TXT", "Text"},
{"U", "You"},
{"UHF", "Ultra High Frequency"},
{"UNLIS", "Unlicensed"},
{"UR", "Your"},
{"URS", "Yours"},
{"UTC", "Coordinated Universal Time"},
{"V", "Volts"},
{"VHF", "Very High Frequency"},
{"VE", "Understood"},
{"VERT", "Vertical"},
{"VFB", "Very Fine Business"},
{"VFO", "Variable Frequency Oscillator"},
{"VLF", "Very Low Frequency"},
{"VOX", "Voice Operated"},
{"VSB", "Vestigial Sideband"},
{"VSWR", "Voltage Standing Wave Ratio"},
{"VY", "Very"},
{"W", "Watts"},
{"WA", "Word After"},
{"WAT", "What"},
{"WATSA", "What Say"},
{"WB", "Word Before"},
{"WD", "Word"},
{"WDS", "Words"},
{"WID", "With"},
{"WKD", "Worked"},
{"WKG", "Working"},
{"WL", "Will"},
{"WPM", "Words Per Minute"},
{"WRD", "Word"},
{"WRK", "Work"},
{"WUD", "Would"},
{"WX", "Weather"},
{"XCVR", "Transceiver"},
{"XMTR", "Transmitter"},
{"XTAL", "Crystal"},
{"YF", "Wife"},
{"YL", "Young Lady"},
{"YR", "Year"},
{"Z", "Zulu Time"},
{"30", "I Have Nothing More to Send"},
{"33", "Fondest Regards"},
{"55", "Best Success"},
{"73", "Best Wishes"},
{"88", "Love And Kisses"},
};

Wyświetl plik

@ -0,0 +1,31 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2023 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_UTIL_RTTY_H
#define INCLUDE_UTIL_RTTY_H
#include <QHash>
#include "export.h"
class SDRBASE_API Rtty
{
public:
static const QHash<QString, QString> m_acronyms;
};
#endif /* INCLUDE_UTIL_RTTY_H */

Wyświetl plik

@ -7,6 +7,7 @@ set(CMAKE_AUTOUIC OFF)
set(sdrgui_SOURCES
mainwindow.cpp
gui/aboutdialog.cpp
gui/acronymview.cpp
gui/addpresetdialog.cpp
gui/audiodialog.cpp
gui/audioselectdialog.cpp
@ -127,6 +128,7 @@ set(sdrgui_HEADERS
gui/aboutdialog.h
gui/accessiblevaluedial.h
gui/accessiblevaluedialz.h
gui/acronymview.h
gui/addpresetdialog.h
gui/audiodialog.h
gui/audioselectdialog.h

Wyświetl plik

@ -0,0 +1,68 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2023 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <QEvent>
#include <QHelpEvent>
#include <QToolTip>
#include <QDebug>
#include "acronymview.h"
AcronymView::AcronymView(QWidget* parent) :
QPlainTextEdit(parent)
{
setMouseTracking(true);
setReadOnly(true);
}
bool AcronymView::event(QEvent* event)
{
if (event->type() == QEvent::ToolTip)
{
QHelpEvent* helpEvent = static_cast<QHelpEvent*>(event);
QTextCursor cursor = cursorForPosition(helpEvent->pos());
cursor.select(QTextCursor::WordUnderCursor);
QString text = cursor.selectedText();
// Remove trailing digits from METAR
while (text.size() > 0 && text.right(1)[0].isDigit()) {
text = text.left(text.size() - 1);
}
if (!text.isEmpty() && m_acronym.contains(text))
{
QToolTip::showText(helpEvent->globalPos(), QString("%1 - %2").arg(text).arg(m_acronym.value(text)));
}
else
{
if (!text.isEmpty()) {
qDebug() << "AcronymView::event: No tooltip for " << text;
}
QToolTip::hideText();
}
return true;
}
return QPlainTextEdit::event(event);
}
void AcronymView::addAcronym(const QString& acronym, const QString& explanation)
{
m_acronym.insert(acronym, explanation);
}
void AcronymView::addAcronyms(const QHash<QString, QString>& acronyms)
{
m_acronym.insert(acronyms);
}

Wyświetl plik

@ -0,0 +1,41 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2023 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_GUI_ACRONYMVIEW_H
#define INCLUDE_GUI_ACRONYMVIEW_H
#include <QHash>
#include <QPlainTextEdit>
#include "export.h"
// Displays text like a QPlainTextEdit, but adds tooltips for acronyms in the text
class SDRGUI_API AcronymView : public QPlainTextEdit {
Q_OBJECT
QHash<QString, QString> m_acronym;
public:
AcronymView(QWidget* parent = nullptr);
bool event(QEvent* event);
void addAcronym(const QString& acronym, const QString& explanation);
void addAcronyms(const QHash<QString, QString>& acronyms);
};
#endif // INCLUDE_GUI_ACRONYMVIEW_H