first pass at 700E integration

dr-700e
drowe67 2020-12-18 15:14:01 +10:30 committed by David Rowe
parent 409600d480
commit ca79b5ca33
7 changed files with 239 additions and 264 deletions

View File

@ -16,7 +16,7 @@ cmake_minimum_required(VERSION 2.8)
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
message(FATAL_ERROR "In-source builds in ${CMAKE_BINARY_DIR} are not "
message(FATAL_ERROR "In-source builds in ${CMAKE_BINARY_DIR} are not "
"allowed, please remove ./CMakeCache.txt and ./CMakeFiles/, create a "
"separate build directory and run cmake from there.")
endif("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
@ -48,8 +48,8 @@ message(STATUS "Compilation date = XX${DATE_RESULT}XX")
# Set FreeDV version and generate src/version.h
#
set(FREEDV_VERSION_MAJOR 1)
set(FREEDV_VERSION_MINOR 4)
set(FREEDV_VERSION_PATCH 3)
set(FREEDV_VERSION_MINOR 5)
set(FREEDV_VERSION_PATCH 0)
set(FREEDV_VERSION_SUFFIX "devel")
set(FREEDV_VERSION ${FREEDV_VERSION_MAJOR}.${FREEDV_VERSION_MINOR})
@ -110,9 +110,9 @@ endif(APPLE)
set(CMAKE_VERBOSE_MAKEFILE TRUE CACHE BOOL "Verbose makefile.")
set(USE_INTERNAL_CODEC2 FALSE CACHE BOOL
"Download and build codec2 and lpcnetfreedv instead of using the system library.")
set(USE_STATIC_DEPS FALSE CACHE BOOL
set(USE_STATIC_DEPS FALSE CACHE BOOL
"Download and build static libraries instead of system libraries.")
set(USE_STATIC_PORTAUDIO FALSE CACHE BOOL
set(USE_STATIC_PORTAUDIO FALSE CACHE BOOL
"Download and build static portaudio instead of the system library.")
set(USE_STATIC_SNDFILE FALSE CACHE BOOL
"Download and build static sndfile instead of the system library.")
@ -273,7 +273,7 @@ else(CODEC2_BUILD_DIR)
include_directories(${CODEC2_INCLUDE_DIRS})
else()
message(FATAL_ERROR "codec2 library not found.
Linux:
Linux:
Codec2 may not be in your distribution so build yourself or use the cmake option to build internally.
Windws:
It's easiest to use the cmake option: USE_INTERNAL_CODEC2 or use build trees for codec2 and lpcnetfreedv."
@ -356,7 +356,7 @@ else(NOT USE_STATIC_SAMPLERATE)
include(cmake/BuildSamplerate.cmake)
endif(NOT USE_STATIC_SAMPLERATE)
#
#
# sndfile Library
#
if(NOT USE_STATIC_SNDFILE)
@ -386,7 +386,7 @@ endif(NOT USE_STATIC_SNDFILE)
if(NOT BOOTSTRAP_WXWIDGETS)
set(WXCONFIG "" CACHE FILEPATH "Location of wx-config binary.")
set(WXRC "" CACHE FILEPATH "Location of wxrc binary.")
else(NOT BOOTSTRAP_WXWIDGETS)
else(NOT BOOTSTRAP_WXWIDGETS)
# set(WXCONFIG "${CMAKE_BINARY_DIR}/external/dist/bin/wx-config")
# set(WXRC "${CMAKE_BINARY_DIR}/external/dist/bin/wxrc")
# list(APPEND FREEDV_STATIC_DEPS wxWidgets)
@ -475,7 +475,7 @@ On Linux systems try installing:
endif()
#
#
# Freedv
#
add_subdirectory(src)

View File

@ -123,6 +123,8 @@ nudged. More **is not better** with the FreeDV transmit signal.
Overdriving your transmitter will lead to a distorted transit signal, and
a poor SNR at the receiver. This is a very common problem.
1. FreeDV 700D and 700E can drive your transmitter at an average power of 40% of it's peak power rating. For example 40W RMS for a 100W PEP radio. Make sure your transmitter can handle continuous power output at these levels, and reduce the power if necessary.
1. Adjust the microphone audio so the peaks are not clipping, and the
average is about half the maximum.
@ -198,12 +200,7 @@ As an aid to the above, FreeDV will show the current mode on the bottom of the w
### Overdriving Transmit Level
This is a very common problem for first time FreeDV users. Adjust
your transmit levels so the ALC is just being nudged. For a 100W
PEP radio, your average power should be 20W.
More power is not better with FreeDV. An overdriven signal will have
poor SNR at the receiver.
This is a very common problem for first time FreeDV users. Adjust your transmit levels so the ALC is just being nudged. More power is not better with FreeDV. An overdriven signal will have poor SNR at the receiver. For FreeDV 700D/700E operation with the clipper, make sure your transmitter can sustain high average power levels without damage (e.g. 40W RMS on a 100W PEP radio).
### I can't set up FreeDV, especially the Sound Cards
@ -239,7 +236,7 @@ looks and sounds like.
### Trouble getting Sync with 700D
You need to be within +/- 60 Hz on the transmit signal. It helps if
both the tx and rx stations tune to known, exact frequencies such as
both the Tx and Rx stations tune to known, exact frequencies such as
exactly 7.177MHz. On channels with fast fading sync may take a few
seconds.
@ -344,8 +341,9 @@ Mode | Min SNR | Fading | Latency | Speech Bandwidth | Speech Quality
SSB | 0 | 8/10 | low | 2600 | 5/10
1600 | 4 | 3/10 | low | 4000 | 4/10
700C | 2 | 6/10 | low | 4000 | 3/10
700D | -2 | 7/10 | high | 4000 | 3/10
2020 | 4 | 5/10 | high | 8000 | 7/10
700D | -2 | 4/10 | high | 4000 | 3/10
700E | 1 | 7/10 | medium | 4000 | 3/10
2020 | 4 | 4/10 | high | 8000 | 7/10
Skype | - |- | medium | 8000 | 8/10
The Min SNR is roughly the SNR where you cannot converse without
@ -374,43 +372,11 @@ FreeDV 700D is sensitive to tuning. To obtain sync you must be within
modern radios which are generally accurate to +/-1 Hz, but requires
skill and practice when used with older, VFO based radios.
_The rest of this section describes features and options specific to
FreeDV 700D._
### FreeDV 700E
Main GUI Page:
FreeDV 700E was developed in December 2020 using lessons learned from on air operation of 700C and 700D. A variant of 700D, it uses a shorter frame size (80ms) to reduce latency and sync time. It is optimised for fast fading channels channels with up to 4Hz Doppler spread and 6ms delay spread. FreeDV 7000E uses the same 700 bit/s codec as FreeDV 700C and 700D. It requires about 3dB more power than 700D, but can operate reliably on fast fading channels.
1. Separate indication of Modem and (for 700D) Interleaver Sync. The
number on the Interleaver Sync indicator is the interleaver size in
160ms frames. This is usually set to 1.
1. ReSync button breaks 700D sync and forces it to try again. Useful
if 700D gets a false sync in low SNR channels.
Tools - Options dialog:
1. Clipping: For 700C and 700D reduces the Peak/Average Power Ratio
(PAPR) (also known as Crest Factor) from 12dB to 8dB by clipping the
Tx signal. This will add a little noise to the Tx spectrum and Rx
Scatter diagram, but MAY enable you to drive your Power Amplifier
harder. Use with caution to avoid overloading your Power Amplifier.
1. Tx Band Pass Filter: limits the transmit bandwidth to about 1000
Hz. Usually left on.
1. 700D Interleaver: The interleaver averages out errors over several
frames, which improves performance for fast fading channels and
channels with burst errors. A 16 frame interleaver will improve
performance by 4dB. However interleaving adds delay, and delays sync.
Both the tx and rx must have the same interleaver setting. For
example a setting of 2 means we average errors over 2 160ms frames,
and introduces 2x160=320ms delay in both the Tx and Rx (640ms total).
The interleaver is usually set to 1.
1. 700D Manual Unsync: Sync must be broken manually (ReSync button)
when this option is selected. Disables automatic falling out of
sync. An experimental feature that may be useful for ensuring 700D stays
in sync during long fades, to avoid long resync delays with the
interleaver.
The 700E release also includes optional compression (clipping) of the 700D an 700E transmit waveforms to reduce the Peak to Average Power Ratio to about 4dB. For example a 100W PEP transmitter can be driven to about 40W RMS. This is an improvement of 6dB over previous releases of FreeDV 700D. Before enabling the clipper make sure your transmitter is capable of handling sustained high average power without damage. Clipping can be enabled via Tools-Options.
### FreeDV 2020
@ -466,7 +432,7 @@ This section describes features on Tools-Options. Many of these features are al
Control | Description
--- | --- |
Clipping | Hard clipping of transmit waveform to increase the average power, at the expense of some distortion
Clipping | Increases the average power (700C/700D/700E). Make sure you transmitter can handle high RMS powers before using!
700C Diversity Combine | Combining of two sets of 700C carriers for better fading channel performance
700D Interleaver | How many 700D frames to Interleave, larger leads to better fading channel performance but more latency
700D Tx Band Pass Filter | Reduces 700D TX spectrum bandwidth
@ -647,6 +613,11 @@ LDPC | Low Density Parity Check Codes - a family of powerful FEC codes
## Release Notes
### V1.5.0 December 2020
1. FreeDV 700E, better performance than 700D on fast fading channels
1. FreeDV 700D/700E clipper to increase average transmit power by 6dB
### V1.4.3 August 2020
1. Maintenance Release (no major new features)

View File

@ -3,7 +3,7 @@
// Purpose: Dialog for controlling Codec audio filtering
// Date: Nov 25 2012
// Authors: David Rowe, David Witten
//
//
// License:
//
// This program is free software; you can redistribute it and/or modify
@ -34,7 +34,7 @@
#define MAX_GAIN 20
#define MAX_LOG10_Q 1.0
#define MIN_LOG10_Q -1.0
#define MIN_LOG10_Q -1.0
// DFT parameters
@ -92,9 +92,9 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
sbSizer_speexpp->Add(m_ckboxSpeexpp, wxALIGN_LEFT, 2);
m_ckboxSpeexpp->SetToolTip(_("Enable noise supression, dereverberation, AGC of mic signal"));
m_ckbox700C_EQ = new wxCheckBox(this, wxID_ANY, _("700C/700D Auto EQ"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
m_ckbox700C_EQ = new wxCheckBox(this, wxID_ANY, _("700C/700D/700E Auto EQ"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE);
sbSizer_speexpp->Add(m_ckbox700C_EQ, wxALIGN_LEFT, 2);
m_ckbox700C_EQ->SetToolTip(_("Automatic equalisation for FreeDV 700C and FreeDV 700D Codec input audio"));
m_ckbox700C_EQ->SetToolTip(_("Automatic equalisation for FreeDV 700C/700D/700E Codec input audio"));
bSizer30->Add(sbSizer_speexpp, 0, wxALL, 0);
@ -129,7 +129,7 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
m_SpkOutDefault = new wxButton(this, wxID_ANY, wxT("Default"));
eqSpkOutSizer2->Add(m_SpkOutDefault,0,wxALIGN_CENTRE_VERTICAL|wxLEFT,20);
eqSpkOutSizer->Add(eqSpkOutSizer2);
bSizer30->Add(eqMicInSizer, 0, wxALL, 0);
bSizer30->Add(eqSpkOutSizer, 0, wxALL, 0);
@ -150,7 +150,7 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
m_auiNotebook->SetFont(wxFont(8, 70, 90, 90, false, wxEmptyString));
bSizer30->Add(m_auiNotebook, 0, wxEXPAND|wxALL, 3);
m_MicInFreqRespPlot = new PlotSpectrum((wxFrame*) m_auiNotebook, m_MicInMagdB, F_MAG_N, FILTER_MIN_MAG_DB, FILTER_MAX_MAG_DB);
m_auiNotebook->AddPage(m_MicInFreqRespPlot, _("Microphone In Equaliser"));
@ -173,7 +173,7 @@ FilterDlg::FilterDlg(wxWindow* parent, bool running, bool *newMicInFilter, bool
this->Layout();
this->Centre(wxBOTH);
// Connect Events -------------------------------------------------------
this->Connect(wxEVT_INIT_DIALOG, wxInitDialogEventHandler(FilterDlg::OnInitDialog));
@ -290,8 +290,8 @@ EQ FilterDlg::newEQ(wxSizer *bs, wxString eqName, float maxFreqHz, bool enableQ)
wxStaticBoxSizer *bsEQ = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, eqName), wxHORIZONTAL);
newEQControl(&eq.sliderFreq, &eq.valueFreq, bsEQ, "Freq");
eq.maxFreqHz = maxFreqHz;
newEQControl(&eq.sliderFreq, &eq.valueFreq, bsEQ, "Freq");
eq.maxFreqHz = maxFreqHz;
eq.sliderFreqId = eq.sliderFreq->GetId();
newEQControl(&eq.sliderGain, &eq.valueGain, bsEQ, "Gain");
@ -329,7 +329,7 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
// Mic In Equaliser
m_MicInBass.freqHz = wxGetApp().m_MicInBassFreqHz;
m_MicInBass.freqHz = wxGetApp().m_MicInBassFreqHz;
m_MicInBass.freqHz = limit(m_MicInBass.freqHz, 1.0, MAX_FREQ_BASS);
setFreq(&m_MicInBass);
m_MicInBass.gaindB = wxGetApp().m_MicInBassGaindB;
@ -339,14 +339,14 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
m_MicInTreble.freqHz = wxGetApp().m_MicInTrebleFreqHz;
m_MicInTreble.freqHz = limit(m_MicInTreble.freqHz, 1.0, MAX_FREQ_TREBLE);
setFreq(&m_MicInTreble);
m_MicInTreble.gaindB = wxGetApp().m_MicInTrebleGaindB;
m_MicInTreble.gaindB = wxGetApp().m_MicInTrebleGaindB;
m_MicInTreble.gaindB = limit(m_MicInTreble.gaindB, MIN_GAIN, MAX_GAIN);
setGain(&m_MicInTreble);
m_MicInMid.freqHz = wxGetApp().m_MicInMidFreqHz;
m_MicInMid.freqHz = wxGetApp().m_MicInMidFreqHz;
m_MicInMid.freqHz = limit(m_MicInMid.freqHz, 1.0, MAX_FREQ_TREBLE);
setFreq(&m_MicInMid);
m_MicInMid.gaindB = wxGetApp().m_MicInMidGaindB;
m_MicInMid.gaindB = wxGetApp().m_MicInMidGaindB;
m_MicInMid.gaindB = limit(m_MicInMid.gaindB, MIN_GAIN, MAX_GAIN);
setGain(&m_MicInMid);
m_MicInMid.Q = wxGetApp().m_MicInMidQ;
@ -356,20 +356,20 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
m_MicInEnable->SetValue(wxGetApp().m_MicInEQEnable);
plotMicInFilterSpectrum();
// Spk Out Equaliser
m_SpkOutBass.freqHz = wxGetApp().m_SpkOutBassFreqHz;
m_SpkOutBass.freqHz = limit(m_SpkOutBass.freqHz, 1.0, MAX_FREQ_BASS);
setFreq(&m_SpkOutBass);
m_SpkOutBass.gaindB = wxGetApp().m_SpkOutBassGaindB;
m_SpkOutBass.gaindB = wxGetApp().m_SpkOutBassGaindB;
m_SpkOutBass.gaindB = limit(m_SpkOutBass.gaindB, MIN_GAIN, MAX_GAIN);
setGain(&m_SpkOutBass);
m_SpkOutTreble.freqHz = wxGetApp().m_SpkOutTrebleFreqHz;
m_SpkOutTreble.freqHz = wxGetApp().m_SpkOutTrebleFreqHz;
m_SpkOutTreble.freqHz = limit(m_SpkOutTreble.freqHz, 1.0, MAX_FREQ_TREBLE);
setFreq(&m_SpkOutTreble);
m_SpkOutTreble.gaindB = wxGetApp().m_SpkOutTrebleGaindB;
m_SpkOutTreble.gaindB = wxGetApp().m_SpkOutTrebleGaindB;
m_SpkOutTreble.gaindB = limit(m_SpkOutTreble.gaindB, MIN_GAIN, MAX_GAIN);
setGain(&m_SpkOutTreble);
@ -398,7 +398,7 @@ void FilterDlg::ExchangeData(int inout, bool storePersistent)
// Speex Pre-Processor
wxGetApp().m_speexpp_enable = m_ckboxSpeexpp->GetValue();
// Codec 2 700C EQ
wxGetApp().m_700C_EQ = m_ckbox700C_EQ->GetValue();
@ -488,18 +488,18 @@ void FilterDlg::OnMicInDefault(wxCommandEvent& event)
{
m_MicInBass.freqHz = 100.0;
m_MicInBass.gaindB = 0.0;
setFreq(&m_MicInBass); setGain(&m_MicInBass);
setFreq(&m_MicInBass); setGain(&m_MicInBass);
m_MicInTreble.freqHz = 3000.0;
m_MicInTreble.gaindB = 0.0;
setFreq(&m_MicInTreble); setGain(&m_MicInTreble);
setFreq(&m_MicInTreble); setGain(&m_MicInTreble);
m_MicInMid.freqHz = 1500.0;
m_MicInMid.gaindB = 0.0;
m_MicInMid.Q = 1.0;
setFreq(&m_MicInMid); setGain(&m_MicInMid); setQ(&m_MicInMid);
setFreq(&m_MicInMid); setGain(&m_MicInMid); setQ(&m_MicInMid);
plotMicInFilterSpectrum();
plotMicInFilterSpectrum();
adjRunTimeMicInFilter();
}
@ -507,16 +507,16 @@ void FilterDlg::OnSpkOutDefault(wxCommandEvent& event)
{
m_SpkOutBass.freqHz = 100.0;
m_SpkOutBass.gaindB = 0.0;
setFreq(&m_SpkOutBass); setGain(&m_SpkOutBass);
setFreq(&m_SpkOutBass); setGain(&m_SpkOutBass);
m_SpkOutTreble.freqHz = 3000.0;
m_SpkOutTreble.gaindB = 0.0;
setFreq(&m_SpkOutTreble); setGain(&m_SpkOutTreble);
setFreq(&m_SpkOutTreble); setGain(&m_SpkOutTreble);
m_SpkOutMid.freqHz = 1500.0;
m_SpkOutMid.gaindB = 0.0;
m_SpkOutMid.Q = 1.0;
setFreq(&m_SpkOutMid); setGain(&m_SpkOutMid); setQ(&m_SpkOutMid);
setFreq(&m_SpkOutMid); setGain(&m_SpkOutMid); setQ(&m_SpkOutMid);
plotSpkOutFilterSpectrum();
adjRunTimeSpkOutFilter();
@ -562,9 +562,9 @@ void FilterDlg::setCodec2(void) {
if (m_running) {
struct CODEC2 *c2 = freedv_get_codec2(g_pfreedv);
if (c2 != NULL) {
codec2_set_lpc_post_filter(c2,
m_codec2LPCPostFilterEnable->GetValue(),
m_codec2LPCPostFilterBassBoost->GetValue(),
codec2_set_lpc_post_filter(c2,
m_codec2LPCPostFilterEnable->GetValue(),
m_codec2LPCPostFilterBassBoost->GetValue(),
m_beta, m_gamma);
}
}
@ -579,11 +579,11 @@ void FilterDlg::setGamma(void) {
}
void FilterDlg::OnEnable(wxScrollEvent& event) {
setCodec2();
setCodec2();
}
void FilterDlg::OnBassBoost(wxScrollEvent& event) {
setCodec2();
setCodec2();
}
void FilterDlg::OnBetaScroll(wxScrollEvent& event) {
@ -606,7 +606,7 @@ void FilterDlg::OnSpeexppEnable(wxScrollEvent& event) {
void FilterDlg::On700C_EQ(wxScrollEvent& event) {
wxGetApp().m_700C_EQ = m_ckbox700C_EQ->GetValue();
if (m_running && ((g_mode == FREEDV_MODE_700C) || (g_mode == FREEDV_MODE_700D))) {
if (m_running && ((g_mode == FREEDV_MODE_700C) || (g_mode == FREEDV_MODE_700D) || (g_mode == FREEDV_MODE_700E))) {
freedv_set_eq(g_pfreedv, wxGetApp().m_700C_EQ);
}
}
@ -656,7 +656,7 @@ void FilterDlg::setGain(EQ *eq)
void FilterDlg::sliderToGain(EQ *eq, bool micIn)
{
float range = MAX_GAIN-MIN_GAIN;
eq->gaindB = MIN_GAIN + range*((float)eq->sliderGain->GetValue()/SLIDER_MAX);
//printf("gaindB: %f\n", eq->gaindB);
setGain(eq);
@ -668,7 +668,7 @@ void FilterDlg::sliderToGain(EQ *eq, bool micIn)
plotSpkOutFilterSpectrum();
adjRunTimeSpkOutFilter();
}
}
void FilterDlg::setQ(EQ *eq)
@ -686,7 +686,7 @@ void FilterDlg::setQ(EQ *eq)
void FilterDlg::sliderToQ(EQ *eq, bool micIn)
{
float log10_range = MAX_LOG10_Q - MIN_LOG10_Q;
float sliderNorm = (float)eq->sliderQ->GetValue()/SLIDER_MAX;
float log10Q = MIN_LOG10_Q + sliderNorm*(log10_range);
eq->Q = pow(10.0, log10Q);
@ -718,7 +718,7 @@ void FilterDlg::adjRunTimeMicInFilter(void) {
*m_newMicInFilter = true;
}
}
void FilterDlg::adjRunTimeSpkOutFilter(void) {
// signal an adjustment in running filter coeffs
@ -727,7 +727,7 @@ void FilterDlg::adjRunTimeSpkOutFilter(void) {
*m_newSpkOutFilter = true;
}
}
void FilterDlg::plotFilterSpectrum(EQ *eqBass, EQ *eqMid, EQ *eqTreble, PlotSpectrum* freqRespPlot, float *magdB) {
char *argBass[10];
@ -744,21 +744,21 @@ void FilterDlg::plotFilterSpectrum(EQ *eqBass, EQ *eqMid, EQ *eqTreble, PlotSpec
argTreble[i] = &argstorage[i][0];
argMid[i] = &argstorage[i][0];
}
sprintf(argBass[0], "bass");
sprintf(argBass[0], "bass");
sprintf(argBass[1], "%f", eqBass->gaindB+1E-6);
sprintf(argBass[2], "%f", eqBass->freqHz);
sprintf(argBass[2], "%f", eqBass->freqHz);
calcFilterSpectrum(magBass, 2, argBass);
sprintf(argTreble[0], "treble");
sprintf(argTreble[0], "treble");
sprintf(argTreble[1], "%f", eqTreble->gaindB+1E-6);
sprintf(argTreble[2], "%f", eqTreble->freqHz);
sprintf(argTreble[2], "%f", eqTreble->freqHz);
calcFilterSpectrum(magTreble, 2, argTreble);
sprintf(argTreble[0], "equalizer");
sprintf(argTreble[1], "%f", eqMid->freqHz);
sprintf(argTreble[2], "%f", eqMid->Q);
sprintf(argTreble[0], "equalizer");
sprintf(argTreble[1], "%f", eqMid->freqHz);
sprintf(argTreble[2], "%f", eqMid->Q);
sprintf(argTreble[3], "%f", eqMid->gaindB+1E-6);
calcFilterSpectrum(magMid, 3, argMid);
@ -789,7 +789,7 @@ void FilterDlg::calcFilterSpectrum(float magdB[], int argc, char *argv[]) {
sox_biquad_filter(sbq, out, in, NIMP);
//for(i=0; i<NIMP; i++)
// printf("%d\n", out[i]);
sox_biquad_destroy(sbq);
//for(i=0; i<NIMP; i++)

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
// Purpose: Implements simple wxWidgets application with GUI.
// Created: Apr. 9, 2012
// Authors: David Rowe, David Witten
//
//
// License:
//
// This program is free software; you can redistribute it and/or modify
@ -338,20 +338,12 @@ TopFrame::TopFrame(wxString plugInName, wxWindow* parent, wxWindowID id, const w
wxStaticBoxSizer* sbSizer_mode;
sbSizer_mode = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, _("Mode")), wxVERTICAL);
#ifdef DISABLED_FEATURE
m_rb1400old = new wxRadioButton( this, wxID_ANY, wxT("1400 V0.91"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
sbSizer_mode->Add(m_rb1400old, 0, wxALIGN_LEFT|wxALL, 1);
m_rb1400 = new wxRadioButton( this, wxID_ANY, wxT("1400"), wxDefaultPosition, wxDefaultSize, 0);
sbSizer_mode->Add(m_rb1400, 0, wxALIGN_LEFT|wxALL, 1);
m_rb700 = new wxRadioButton( this, wxID_ANY, wxT("700"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
sbSizer_mode->Add(m_rb700, 0, wxALIGN_LEFT|wxALL, 1);
m_rb700b = new wxRadioButton( this, wxID_ANY, wxT("700B"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
sbSizer_mode->Add(m_rb700b, 0, wxALIGN_LEFT|wxALL, 1);
#endif
m_rb700c = new wxRadioButton( this, wxID_ANY, wxT("700C"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
sbSizer_mode->Add(m_rb700c, 0, wxALIGN_LEFT|wxALL, 1);
m_rb700d = new wxRadioButton( this, wxID_ANY, wxT("700D"), wxDefaultPosition, wxDefaultSize, 0);
sbSizer_mode->Add(m_rb700d, 0, wxALIGN_LEFT|wxALL, 1);
m_rb700e = new wxRadioButton( this, wxID_ANY, wxT("700E"), wxDefaultPosition, wxDefaultSize, 0);
sbSizer_mode->Add(m_rb700e, 0, wxALIGN_LEFT|wxALL, 1);
m_rb800xa = new wxRadioButton( this, wxID_ANY, wxT("800XA"), wxDefaultPosition, wxDefaultSize, 0);
sbSizer_mode->Add(m_rb800xa, 0, wxALIGN_LEFT|wxALL, 1);
m_rb1600 = new wxRadioButton( this, wxID_ANY, wxT("1600"), wxDefaultPosition, wxDefaultSize, 0);
@ -476,7 +468,7 @@ TopFrame::TopFrame(wxString plugInName, wxWindow* parent, wxWindowID id, const w
//------------------------------
m_togBtnVoiceKeyer = new wxToggleButton(this, wxID_ANY, _("Voice Keyer"), wxDefaultPosition, wxDefaultSize, 0);
m_togBtnVoiceKeyer->SetToolTip(_("Toggle Voice Keyer"));
wxBoxSizer* bSizer13a = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* bSizer13a = new wxBoxSizer(wxVERTICAL);
bSizer13a->Add(m_togBtnVoiceKeyer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
sbSizer5->Add(bSizer13a, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
@ -632,4 +624,3 @@ TopFrame::~TopFrame()
m_btnTogPTT->Disconnect(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler(TopFrame::OnTogBtnPTT), NULL, this);
}

View File

@ -112,9 +112,10 @@ class TopFrame : public wxFrame
wxStaticText *m_textSync;
wxStaticText *m_textInterleaverSync;
wxButton *m_BtnReSync;
wxRadioButton *m_rb700c;
wxRadioButton *m_rb700d;
wxRadioButton *m_rb700e;
wxRadioButton *m_rb800xa;
wxRadioButton *m_rb1600;
wxRadioButton *m_rb2400a;

BIN
wav/ve9qrp_700e.wav 100644

Binary file not shown.