Hide all modes except for RADE by default. (#1108)

* Hide all modes except for RADE by default.

* Enable legacy modes so fullduplex tests still work.

* Add PR #1108 to changelog.

* FreeDV Reporter: Hide RX Mode column if legacy modes are disabled.

* Remove offset and histogram plots due to low legacy mode use.

* Hide Squelch and Center RX if legacy modes are disabledd.

* macOS: Add additional required entitlements for Python 3.14.

* Move Frequency field up on the right hand side.

* Suppress at-spi2 warning in GH AppImage tests.

* Experiment: Try 'pulsing' level gauge when overdriving.

* Revert "Experiment: Try 'pulsing' level gauge when overdriving."

This reverts commit 527dbe2bb7.

* Use shorter label for clipping indicator.
pull/1119/head
Mooneer Salem 2025-12-10 16:00:47 -08:00 committed by GitHub
parent 4661c26ef4
commit 2622881e61
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 97 additions and 170 deletions

View File

@ -256,17 +256,22 @@ jobs:
sudo sed -i 's/no/yes/g' /usr/share/polkit-1/actions/org.freedesktop.RealtimeKit1.policy
sudo systemctl restart polkit
- name: Install common packages
shell: bash
run: |
sudo apt-get install sox xvfb at-spi2-core
- name: Install required packages for audio/display
shell: bash
if: ${{ matrix.os == 'ubuntu-24.04' || matrix.os == 'ubuntu-24.04-arm' }}
run: |
sudo apt-get install sox xvfb pipewire pulseaudio-utils pipewire-pulse wireplumber metacity
sudo apt-get install pipewire pulseaudio-utils pipewire-pulse wireplumber metacity
- name: Install required packages for audio/display
shell: bash
if: ${{ matrix.os == 'ubuntu-22.04' || matrix.os == 'ubuntu-22.04-arm' }}
run: |
sudo apt-get install sox xvfb pulseaudio pulseaudio-utils metacity
sudo apt-get install pulseaudio pulseaudio-utils metacity
systemctl --user --now enable pulseaudio.service pulseaudio.socket
- name: Create Python venv

View File

@ -855,6 +855,9 @@ LDPC | Low Density Parity Check Codes - a family of powerful FEC codes
2. Enhancements:
* Upgrade Python to 3.14.2. (PR #1109, #1118, #1124)
*Note: Legacy modes (700D, 700E, 1600) are now hidden by default. (PR #1108) You can show them
again by going to Tools->Options->Modem and selecting "Enable Legacy Modes".*
## V2.1.1 TBD 2025
1. Bugfixes:

View File

@ -115,6 +115,7 @@ FreeDVConfiguration::FreeDVConfiguration()
, reportingUserMsgColWidth("/Windows/FreeDVReporter/reportingUserMsgColWidth", 130)
, showDecodeStats("/Debug/showDecodeStats", false)
, enableLegacyModes("/Modem/enableLegacyModes", false)
{
// empty
}
@ -243,6 +244,7 @@ void FreeDVConfiguration::load(wxConfigBase* config)
load_(config, reportingUserMsgColWidth);
load_(config, showDecodeStats);
load_(config, enableLegacyModes);
}
void FreeDVConfiguration::save(wxConfigBase* config)
@ -332,6 +334,7 @@ void FreeDVConfiguration::save(wxConfigBase* config)
save_(config, reportingUserMsgColWidth);
save_(config, showDecodeStats);
save_(config, enableLegacyModes);
config->Flush();
}

View File

@ -122,6 +122,8 @@ public:
ConfigurationDataElement<bool> showDecodeStats;
ConfigurationDataElement<bool> enableLegacyModes;
virtual void load(wxConfigBase* config) override;
virtual void save(wxConfigBase* config) override;
};

View File

@ -6,5 +6,15 @@
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.automation.apple-events</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>

View File

@ -453,6 +453,9 @@ OptionsDlg::OptionsDlg(wxWindow* parent, wxWindowID id, const wxString& title, c
m_ckboxFreeDV700txBPF = new wxCheckBox(sb_freedv700, wxID_ANY, _("TX Band Pass Filter"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
sbSizer_freedv700->Add(m_ckboxFreeDV700txBPF, 0, wxALL | wxALIGN_LEFT, 5);
m_ckboxEnableLegacyModes = new wxCheckBox(sb_freedv700, wxID_ANY, _("Enable Legacy Modes"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
sbSizer_freedv700->Add(m_ckboxEnableLegacyModes, 0, wxALL | wxALIGN_LEFT, 5);
sizerModem->Add(sbSizer_freedv700, 0, wxALL|wxEXPAND, 5);
//------------------------------
@ -915,7 +918,8 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
m_ckboxFreeDV700txClip->SetValue(wxGetApp().appConfiguration.freedv700Clip);
m_ckboxFreeDV700txBPF->SetValue(wxGetApp().appConfiguration.freedv700TxBPF);
m_ckboxEnableLegacyModes->SetValue(wxGetApp().appConfiguration.enableLegacyModes);
#ifdef __WXMSW__
m_ckboxDebugConsole->SetValue(wxGetApp().appConfiguration.debugConsoleEnabled);
#endif
@ -1097,7 +1101,8 @@ void OptionsDlg::ExchangeData(int inout, bool storePersistent)
wxGetApp().appConfiguration.showDecodeStats = m_showDecodeStats->GetValue();
wxGetApp().appConfiguration.freedv700Clip = m_ckboxFreeDV700txClip->GetValue();
wxGetApp().appConfiguration.freedv700TxBPF = m_ckboxFreeDV700txBPF->GetValue();
wxGetApp().appConfiguration.enableLegacyModes = m_ckboxEnableLegacyModes->GetValue();
#ifdef __WXMSW__
wxGetApp().appConfiguration.debugConsoleEnabled = m_ckboxDebugConsole->GetValue();
#endif

View File

@ -136,6 +136,7 @@ class OptionsDlg : public wxDialog
wxCheckBox *m_ckboxFreeDV700txClip;
wxCheckBox *m_ckboxFreeDV700txBPF;
wxCheckBox *m_ckboxEnableLegacyModes;
wxRadioButton *m_rb_textEncoding1;
wxRadioButton *m_rb_textEncoding2;

View File

@ -561,6 +561,10 @@ void FreeDVReporterDialog::refreshLayout()
item->SetTitle("Hdg");
item->SetAlignment(wxALIGN_RIGHT);
}
// Hide RX Mode column if legacy modes aren't enabled
auto rxModeColumn = m_listSpots->GetColumn(LAST_RX_MODE_COL);
rxModeColumn->SetHidden(!wxGetApp().appConfiguration.enableLegacyModes);
// Refresh all data based on current settings and filters.
FreeDVReporterDataModel* model = (FreeDVReporterDataModel*)spotsDataModel_.get();

View File

@ -852,11 +852,13 @@ setDefaultMode:
}
// Disable controls not supported by RADE.
bool isEnabled = mode != FREEDV_MODE_RADE;
bool isEnabled = wxGetApp().appConfiguration.enableLegacyModes && mode != FREEDV_MODE_RADE;
squelchBox->Show(wxGetApp().appConfiguration.enableLegacyModes);
m_sliderSQ->Enable(isEnabled);
m_ckboxSQ->Enable(isEnabled);
m_textSQ->Enable(isEnabled);
m_btnCenterRx->Enable(isEnabled);
m_btnCenterRx->Show(wxGetApp().appConfiguration.enableLegacyModes);
if (!isEnabled)
{
@ -948,6 +950,7 @@ setDefaultMode:
}
statsBox->Show(wxGetApp().appConfiguration.showDecodeStats);
modeBox->Show(wxGetApp().appConfiguration.enableLegacyModes);
// Initialize FreeDV Reporter as required
CallAfter(&MainFrame::initializeFreeDVReporter_);
@ -985,7 +988,7 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent, wxID_ANY, _("FreeDV ")
SYNC_UNK_LABEL("Sync: unk"),
VAR_UNK_LABEL("Var: unk"),
CLK_OFF_UNK_LABEL("ClkOff: unk"),
TOO_HIGH_LABEL("Too High"),
TOO_HIGH_LABEL("Clip"),
MIC_SPKR_LEVEL_FORMAT_STR("%s%s"),
DECIBEL_STR("dB"),
CURRENT_TIME_FORMAT_STR("%s %s"),
@ -1059,28 +1062,6 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent, wxID_ANY, _("FreeDV ")
// Add Speech Output window
m_panelSpeechOut = new PlotScalar(m_auiNbookCtrl, 1, WAVEFORM_PLOT_TIME, 1.0/WAVEFORM_PLOT_FS, -1, 1, 1, 0.2, "%2.1f", 0);
m_auiNbookCtrl->AddPage(m_panelSpeechOut, _("Frm Decoder"), false, wxNullBitmap);
// Add Scatter Plot window
m_panelScatter = new PlotScatter(m_auiNbookCtrl);
m_auiNbookCtrl->AddPage(m_panelScatter, _("Scatter"), false, wxNullBitmap);
// Add Timing Offset window
m_panelTimeOffset = new PlotScalar(m_auiNbookCtrl, 1, 5.0, DT, -0.5, 0.5, 1, 0.1, "%2.1f", 0);
m_auiNbookCtrl->AddPage(m_panelTimeOffset, L"Timing \u0394", false, wxNullBitmap);
// Add Frequency Offset window
m_panelFreqOffset = new PlotScalar(m_auiNbookCtrl, 1, 5.0, DT, -200, 200, 1, 50, "%3.0fHz", 0);
m_auiNbookCtrl->AddPage(m_panelFreqOffset, L"Frequency \u0394", false, wxNullBitmap);
// Add Test Frame Errors window
m_panelTestFrameErrors = new PlotScalar(m_auiNbookCtrl, 2*MODEM_STATS_NC_MAX, 30.0, DT, 0, 2*MODEM_STATS_NC_MAX+2, 1, 1, "", 1);
m_auiNbookCtrl->AddPage(m_panelTestFrameErrors, L"Test Frame Errors", false, wxNullBitmap);
// Add Test Frame Histogram window. 1 column for every bit, 2 bits per carrier
m_panelTestFrameErrorsHist = new PlotScalar(m_auiNbookCtrl, 1, 1.0, 1.0/(2*MODEM_STATS_NC_MAX), 0.001, 0.1, 1.0/MODEM_STATS_NC_MAX, 0.1, "%0.0E", 0);
m_auiNbookCtrl->AddPage(m_panelTestFrameErrorsHist, L"Test Frame Histogram", false, wxNullBitmap);
m_panelTestFrameErrorsHist->setBarGraph(1);
m_panelTestFrameErrorsHist->setLogY(1);
// this->Connect(m_menuItemHelpUpdates->GetId(), wxEVT_UPDATE_UI, wxUpdateUIEventHandler(TopFrame::OnHelpCheckUpdatesUI));
m_togBtnOnOff->Connect(wxEVT_UPDATE_UI, wxUpdateUIEventHandler(MainFrame::OnTogBtnOnOffUI), NULL, this);
@ -1093,12 +1074,9 @@ MainFrame::MainFrame(wxWindow *parent) : TopFrame(parent, wxID_ANY, _("FreeDV ")
Bind(wxEVT_TIMER, &MainFrame::OnTimer, this); // ID_MY_WINDOW);
m_plotWaterfallTimer.SetOwner(this, ID_TIMER_WATERFALL);
m_plotSpectrumTimer.SetOwner(this, ID_TIMER_SPECTRUM);
m_plotScatterTimer.SetOwner(this, ID_TIMER_SCATTER);
m_plotSpeechInTimer.SetOwner(this, ID_TIMER_SPEECH_IN);
m_plotSpeechOutTimer.SetOwner(this, ID_TIMER_SPEECH_OUT);
m_plotDemodInTimer.SetOwner(this, ID_TIMER_DEMOD_IN);
m_plotTimeOffsetTimer.SetOwner(this, ID_TIMER_TIME_OFFSET);
m_plotFreqOffsetTimer.SetOwner(this, ID_TIMER_FREQ_OFFSET);
m_plotTimer.SetOwner(this, ID_TIMER_UPDATE_OTHER);
m_pskReporterTimer.SetOwner(this, ID_TIMER_PSKREPORTER);
@ -1388,12 +1366,9 @@ MainFrame::~MainFrame()
m_plotTimer.Stop();
m_plotWaterfallTimer.Stop();
m_plotSpectrumTimer.Stop();
m_plotScatterTimer.Stop();
m_plotSpeechInTimer.Stop();
m_plotSpeechOutTimer.Stop();
m_plotDemodInTimer.Stop();
m_plotTimeOffsetTimer.Stop();
m_plotFreqOffsetTimer.Stop();
Unbind(wxEVT_TIMER, &MainFrame::OnTimer, this);
}
#endif //_USE_TIMER
@ -1510,49 +1485,6 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
m_panelSpectrum->m_newdata = true;
m_panelSpectrum->refreshData();
}
else if (timerId == ID_TIMER_SCATTER)
{
if (freedvInterface.isRunning()) {
int currentMode = freedvInterface.getCurrentMode();
if (currentMode != wxGetApp().m_prevMode)
{
// Force recreation of EQ filters.
m_newMicInFilter = true;
m_newSpkOutFilter = true;
// The receive mode changed, so the previous samples are no longer valid.
m_panelScatter->clearCurrentSamples();
}
wxGetApp().m_prevMode = currentMode;
// Reset g_Nc accordingly.
switch(currentMode)
{
case FREEDV_MODE_1600:
g_Nc = 16;
m_panelScatter->setNc(g_Nc+1); /* +1 for BPSK pilot */
break;
case FREEDV_MODE_700D:
case FREEDV_MODE_700E:
g_Nc = 17;
m_panelScatter->setNc(g_Nc);
break;
}
/* PSK Modes - scatter plot -------------------------------------------------------*/
for (int r=0; r<freedvInterface.getCurrentRxModemStats()->nr; r++) {
if ((currentMode == FREEDV_MODE_1600) ||
(currentMode == FREEDV_MODE_700D) ||
(currentMode == FREEDV_MODE_700E)
) {
m_panelScatter->add_new_samples_scatter(&freedvInterface.getCurrentRxModemStats()->rx_symbols[r][0]);
}
}
}
m_panelScatter->refreshData();
}
else if (timerId == ID_TIMER_SPEECH_IN)
{
if (g_plotSpeechInFifo.read(speechInPlotSamples, WAVEFORM_PLOT_BUF)) {
@ -1576,18 +1508,8 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
m_panelDemodIn->add_new_short_samples(0,demodInPlotSamples, WAVEFORM_PLOT_BUF, 32767);
m_panelDemodIn->refreshData();
}
else if (timerId == ID_TIMER_TIME_OFFSET)
else
{
m_panelTimeOffset->add_new_sample(0, (float)freedvInterface.getCurrentRxModemStats()->rx_timing/FDMDV_NOM_SAMPLES_PER_FRAME);
m_panelTimeOffset->refreshData();
}
else if (timerId == ID_TIMER_FREQ_OFFSET)
{
m_panelFreqOffset->add_new_sample(0, freedvInterface.getCurrentRxModemStats()->foff);
m_panelFreqOffset->refreshData();
}
else
{
// Update average magnitudes
float rxSpectrum[MODEM_STATS_NSPEC];
memset(rxSpectrum, 0, sizeof(float) * MODEM_STATS_NSPEC);
@ -2011,44 +1933,6 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
wxString clockOffset = wxString::Format(CLK_OFF_FMT, (int)round(freedvInterface.getCurrentRxModemStats()->clock_offset*1E6) % 10000);
m_textClockOffset->SetLabel(clockOffset);
}
// update error pattern plots if supported
short* error_pattern = nullptr;
int sz_error_pattern = freedvInterface.getErrorPattern(&error_pattern);
if (sz_error_pattern) {
int i,b;
/* both modes map IQ to alternate bits, but on same carrier */
if (freedvInterface.getCurrentMode() == FREEDV_MODE_1600) {
/* FreeDV 1600 mapping from error pattern to two bits on each carrier */
for(b=0; b<g_Nc*2; b++) {
for(i=b; i<sz_error_pattern; i+= 2*g_Nc) {
m_panelTestFrameErrors->add_new_sample(b, b + 0.8*error_pattern[i]);
g_error_hist[b] += error_pattern[i];
g_error_histn[b]++;
}
}
/* calculate BERs and send to plot */
float ber[2*MODEM_STATS_NC_MAX];
for(b=0; b<2*MODEM_STATS_NC_MAX; b++) {
ber[b] = 0.0;
}
for(b=0; b<g_Nc*2; b++) {
ber[b+1] = (float)g_error_hist[b]/g_error_histn[b];
}
assert(g_Nc*2 <= 2*MODEM_STATS_NC_MAX);
m_panelTestFrameErrorsHist->add_new_samples(0, ber, 2*MODEM_STATS_NC_MAX);
}
m_panelTestFrameErrors->Refresh();
m_panelTestFrameErrorsHist->Refresh();
delete[] error_pattern;
}
}
/* FIFO and PortAudio under/overflow debug counters */
@ -2283,12 +2167,18 @@ void MainFrame::performFreeDVOn_()
wxCommandEvent tmpEvent;
OnChangeTxMode(tmpEvent);
if (!wxGetApp().appConfiguration.multipleReceiveEnabled || m_rbRADE->GetValue())
if (!wxGetApp().appConfiguration.enableLegacyModes || !wxGetApp().appConfiguration.multipleReceiveEnabled || m_rbRADE->GetValue())
{
m_rb1600->Disable();
m_rbRADE->Disable();
m_rb700d->Disable();
m_rb700e->Disable();
if (!wxGetApp().appConfiguration.enableLegacyModes)
{
// If legacy modes are not enabled, RADE is the only option.
g_mode = FREEDV_MODE_RADE;
}
freedvInterface.addRxMode(g_mode);
}
else
@ -2371,8 +2261,6 @@ void MainFrame::performFreeDVOn_()
// Init text msg decoding
if (!wxGetApp().appConfiguration.reportingConfiguration.reportingEnabled)
freedvInterface.setTextVaricodeNum(1);
m_panelScatter->setEyeScatter(PLOT_SCATTER_MODE_SCATTER);
});
g_State.store(0, std::memory_order_release);
@ -2511,12 +2399,9 @@ void MainFrame::performFreeDVOn_()
m_plotTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotWaterfallTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotSpectrumTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotScatterTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotSpeechInTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotSpeechOutTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotDemodInTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotTimeOffsetTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_plotFreqOffsetTimer.Start(_REFRESH_TIMER_PERIOD, wxTIMER_CONTINUOUS);
m_updFreqStatusTimer.Start(1000); // every 1 second[UP]
#endif // _USE_TIMER
});
@ -2552,12 +2437,9 @@ void MainFrame::performFreeDVOff_()
m_plotTimer.Stop();
m_plotWaterfallTimer.Stop();
m_plotSpectrumTimer.Stop();
m_plotScatterTimer.Stop();
m_plotSpeechInTimer.Stop();
m_plotSpeechOutTimer.Stop();
m_plotDemodInTimer.Stop();
m_plotTimeOffsetTimer.Stop();
m_plotFreqOffsetTimer.Stop();
m_pskReporterTimer.Stop();
m_updFreqStatusTimer.Stop(); // [UP]
});

View File

@ -106,12 +106,9 @@ enum {
ID_START = wxID_HIGHEST,
ID_TIMER_WATERFALL,
ID_TIMER_SPECTRUM,
ID_TIMER_SCATTER,
ID_TIMER_SPEECH_IN,
ID_TIMER_SPEECH_OUT,
ID_TIMER_DEMOD_IN,
ID_TIMER_TIME_OFFSET,
ID_TIMER_FREQ_OFFSET,
ID_TIMER_UPDATE_OTHER,
ID_TIMER_PSKREPORTER,
ID_TIMER_UPD_FREQ,
@ -296,14 +293,9 @@ class MainFrame : public TopFrame
FreeDVReporterDialog* m_reporterDialog;
PlotSpectrum* m_panelSpectrum;
PlotWaterfall* m_panelWaterfall;
PlotScatter* m_panelScatter;
PlotScalar* m_panelTimeOffset;
PlotScalar* m_panelFreqOffset;
PlotScalar* m_panelSpeechIn;
PlotScalar* m_panelSpeechOut;
PlotScalar* m_panelDemodIn;
PlotScalar* m_panelTestFrameErrors;
PlotScalar* m_panelTestFrameErrorsHist;
bool m_RxRunning;
@ -333,8 +325,6 @@ class MainFrame : public TopFrame
wxTimer m_plotSpeechInTimer;
wxTimer m_plotSpeechOutTimer;
wxTimer m_plotDemodInTimer;
wxTimer m_plotTimeOffsetTimer;
wxTimer m_plotFreqOffsetTimer;
#endif
void destroy_fifos(void);

View File

@ -212,6 +212,17 @@ void MainFrame::OnToolsOptions(wxCommandEvent& event)
// Show/hide stats box
statsBox->Show(wxGetApp().appConfiguration.showDecodeStats);
// Show/hide legacy modes
modeBox->Show(wxGetApp().appConfiguration.enableLegacyModes);
bool isEnabled = wxGetApp().appConfiguration.enableLegacyModes && !m_rbRADE->GetValue();
squelchBox->Show(wxGetApp().appConfiguration.enableLegacyModes);
m_sliderSQ->Enable(isEnabled);
m_ckboxSQ->Enable(isEnabled);
m_textSQ->Enable(isEnabled);
m_btnCenterRx->Enable(isEnabled);
m_btnCenterRx->Show(wxGetApp().appConfiguration.enableLegacyModes);
// XXX - with really short windows, wxWidgets sometimes doesn't size
// the components properly until the user resizes the window (even if only

View File

@ -462,15 +462,15 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
//------------------------------
wxStaticBoxSizer* levelSizer;
wxStaticBox* levelBox = new wxStaticBox(m_panel, wxID_ANY, _("Level"), wxDefaultPosition, wxSize(100,-1));
levelSizer = new wxStaticBoxSizer(levelBox, wxVERTICAL);
m_textLevel = new wxStaticText(levelBox, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
m_textLevel->SetForegroundColour(wxColour(255,0,0));
levelSizer->Add(m_textLevel, 0, wxALIGN_CENTER_HORIZONTAL, 1);
levelSizer = new wxStaticBoxSizer(levelBox, wxHORIZONTAL);
m_gaugeLevel = new wxGauge(levelBox, wxID_ANY, 100, wxDefaultPosition, wxSize(135,15), wxGA_SMOOTH);
m_gaugeLevel = new wxGauge(levelBox, wxID_ANY, 100, wxDefaultPosition, wxSize(100,15), wxGA_SMOOTH);
m_gaugeLevel->SetToolTip(_("Peak of From Radio in Rx, or peak of From Mic in Tx mode. If Red you should reduce your levels"));
levelSizer->Add(m_gaugeLevel, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 10);
levelSizer->Add(m_gaugeLevel, 1, wxALIGN_CENTER_VERTICAL|wxALL, 10);
m_textLevel = new wxStaticText(levelBox, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(35,-1), wxALIGN_CENTRE);
m_textLevel->SetForegroundColour(wxColour(255,0,0));
levelSizer->Add(m_textLevel, 0, wxALIGN_CENTER_VERTICAL, 1);
leftSizer->Add(levelSizer, 0, wxALL|wxEXPAND, 2);
@ -629,7 +629,7 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
// Squelch Slider Control
//=====================================================
wxStaticBoxSizer* sbSizer3;
wxStaticBox* squelchBox = new wxStaticBox(m_panel, wxID_ANY, _("S&quelch"), wxDefaultPosition, wxSize(100,-1));
squelchBox = new wxStaticBox(m_panel, wxID_ANY, _("S&quelch"), wxDefaultPosition, wxSize(100,-1));
sbSizer3 = new wxStaticBoxSizer(squelchBox, wxVERTICAL);
m_sliderSQ = new wxSlider(squelchBox, wxID_ANY, 0, 0, 40, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS);
@ -711,6 +711,23 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
rightSizer->Add(micSpeakerLevelSizer, 0, wxALL | wxEXPAND, 2);
// Frequency text field (PSK Reporter)
m_freqBox = new wxStaticBox(m_panel, wxID_ANY, _("Radio Freq. (MHz)"), wxDefaultPosition, wxSize(100,-1));
wxBoxSizer* reportFrequencySizer = new wxStaticBoxSizer(m_freqBox, wxHORIZONTAL);
//wxStaticText* reportFrequencyUnits = new wxStaticText(m_freqBox, wxID_ANY, wxT(" MHz"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
wxBoxSizer* txtReportFreqSizer = new wxBoxSizer(wxVERTICAL);
m_cboReportFrequency = new wxComboBox(m_freqBox, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN | wxTE_PROCESS_ENTER);
m_cboReportFrequency->SetMinSize(wxSize(150,-1));
txtReportFreqSizer->Add(m_cboReportFrequency, 1, wxALL, 5);
reportFrequencySizer->Add(txtReportFreqSizer, 1, wxEXPAND, 1);
//reportFrequencySizer->Add(reportFrequencyUnits, 0, wxALIGN_CENTER_VERTICAL, 1);
rightSizer->Add(reportFrequencySizer, 0, wxALL, 2);
/* new --- */
//------------------------------
@ -766,23 +783,6 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
sbSizer5->Add(m_btnTogPTT, 0, wxALL | wxEXPAND, 5);
rightSizer->Add(sbSizer5, 0, wxALL|wxEXPAND, 2);
// Frequency text field (PSK Reporter)
m_freqBox = new wxStaticBox(m_panel, wxID_ANY, _("Radio Freq. (MHz)"), wxDefaultPosition, wxSize(100,-1));
wxBoxSizer* reportFrequencySizer = new wxStaticBoxSizer(m_freqBox, wxHORIZONTAL);
//wxStaticText* reportFrequencyUnits = new wxStaticText(m_freqBox, wxID_ANY, wxT(" MHz"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
wxBoxSizer* txtReportFreqSizer = new wxBoxSizer(wxVERTICAL);
m_cboReportFrequency = new wxComboBox(m_freqBox, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN | wxTE_PROCESS_ENTER);
m_cboReportFrequency->SetMinSize(wxSize(150,-1));
txtReportFreqSizer->Add(m_cboReportFrequency, 1, wxALL, 5);
reportFrequencySizer->Add(txtReportFreqSizer, 1, wxEXPAND, 1);
//reportFrequencySizer->Add(reportFrequencyUnits, 0, wxALIGN_CENTER_VERTICAL, 1);
rightSizer->Add(reportFrequencySizer, 0, wxALL, 2);
bSizer1->Add(rightSizer, 0, wxALL|wxEXPAND, 3);

View File

@ -232,6 +232,7 @@ class TopFrame : public wxFrame
wxAuiNotebook* m_auiNbookCtrl;
wxComboBox* m_cboReportFrequency;
wxStaticBox* m_freqBox;
wxStaticBox* squelchBox;
TopFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeDV "), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(561,300 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER );

View File

@ -187,3 +187,5 @@ VoiceKeyerAudioVol=0
TransmitAudioVol=0
[QuickRecord]
SavePath=/home/mooneer/Documents
[Modem]
enableLegacyModes=1

View File

@ -188,3 +188,5 @@ VoiceKeyerAudioVol=0
TransmitAudioVol=0
[QuickRecord]
SavePath=/home/mooneer/Documents
[Modem]
enableLegacyModes=1

View File

@ -187,3 +187,5 @@ VoiceKeyerAudioVol=0
TransmitAudioVol=0
[QuickRecord]
SavePath=/home/mooneer/Documents
[Modem]
enableLegacyModes=1

View File

@ -188,3 +188,5 @@ VoiceKeyerAudioVol=0
TransmitAudioVol=0
[QuickRecord]
SavePath=/home/mooneer/Documents
[Modem]
enableLegacyModes=1

View File

@ -187,3 +187,5 @@ VoiceKeyerAudioVol=0
TransmitAudioVol=0
[QuickRecord]
SavePath=/home/mooneer/Documents
[Modem]
enableLegacyModes=1