mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-27 20:52:25 -04:00
CW Keyer: test with AM modulator and fixes
This commit is contained in:
parent
d6c9b2f707
commit
2defcc7cec
@ -66,6 +66,13 @@ AMMod::AMMod() :
|
||||
|
||||
m_toneNco.setFreq(1000.0, m_config.m_audioSampleRate);
|
||||
DSPEngine::instance()->addAudioSource(&m_audioFifo);
|
||||
|
||||
// test CW keyer
|
||||
// TODO: link to CW keyer GUI
|
||||
m_cwKeyer.setSampleRate(m_config.m_audioSampleRate);
|
||||
m_cwKeyer.setWPM(5);
|
||||
m_cwKeyer.setText("PARIS PARIS PARIS PARIS PARIS");
|
||||
m_cwKeyer.setMode(CWKeyer::CWText);
|
||||
}
|
||||
|
||||
AMMod::~AMMod()
|
||||
@ -176,6 +183,20 @@ void AMMod::pullAF(Real& sample)
|
||||
m_audioFifo.read(reinterpret_cast<quint8*>(audioSample), 1, 10);
|
||||
sample = ((audioSample[0] + audioSample[1]) / 65536.0f) * m_running.m_volumeFactor;
|
||||
break;
|
||||
case AMModInputCWTone:
|
||||
if (m_cwKeyer.getSample())
|
||||
{
|
||||
sample = m_toneNco.next();
|
||||
}
|
||||
else
|
||||
{
|
||||
sample = 0.0f;
|
||||
m_toneNco.setPhase(0);
|
||||
// if (m_cwKeyer.eom()) {
|
||||
// m_cwKeyer.resetText();
|
||||
// }
|
||||
}
|
||||
break;
|
||||
case AMModInputNone:
|
||||
default:
|
||||
sample = 0.0f;
|
||||
@ -331,6 +352,11 @@ void AMMod::apply()
|
||||
m_settingsMutex.unlock();
|
||||
}
|
||||
|
||||
if (m_config.m_audioSampleRate != m_running.m_audioSampleRate)
|
||||
{
|
||||
m_cwKeyer.setSampleRate(m_config.m_audioSampleRate);
|
||||
}
|
||||
|
||||
m_running.m_outputSampleRate = m_config.m_outputSampleRate;
|
||||
m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset;
|
||||
m_running.m_rfBandwidth = m_config.m_rfBandwidth;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "dsp/interpolator.h"
|
||||
#include "dsp/movingaverage.h"
|
||||
#include "dsp/agc.h"
|
||||
#include "dsp/cwkeyer.h"
|
||||
#include "audio/audiofifo.h"
|
||||
#include "util/message.h"
|
||||
|
||||
@ -39,7 +40,8 @@ public:
|
||||
AMModInputNone,
|
||||
AMModInputTone,
|
||||
AMModInputFile,
|
||||
AMModInputAudio
|
||||
AMModInputAudio,
|
||||
AMModInputCWTone
|
||||
} AMModInputAF;
|
||||
|
||||
class MsgConfigureFileSourceName : public Message
|
||||
@ -306,6 +308,8 @@ private:
|
||||
quint32 m_levelCalcCount;
|
||||
Real m_peakLevel;
|
||||
Real m_levelSum;
|
||||
CWKeyer m_cwKeyer;
|
||||
|
||||
static const int m_levelNbSamples;
|
||||
|
||||
void apply();
|
||||
|
@ -242,6 +242,7 @@ void AMModGUI::on_playLoop_toggled(bool checked)
|
||||
void AMModGUI::on_play_toggled(bool checked)
|
||||
{
|
||||
ui->tone->setEnabled(!checked); // release other source inputs
|
||||
ui->morseKeyer->setEnabled(!checked);
|
||||
ui->mic->setEnabled(!checked);
|
||||
m_modAFInput = checked ? AMMod::AMModInputFile : AMMod::AMModInputNone;
|
||||
AMMod::MsgConfigureAFInput* message = AMMod::MsgConfigureAFInput::create(m_modAFInput);
|
||||
@ -253,15 +254,27 @@ void AMModGUI::on_play_toggled(bool checked)
|
||||
void AMModGUI::on_tone_toggled(bool checked)
|
||||
{
|
||||
ui->play->setEnabled(!checked); // release other source inputs
|
||||
ui->morseKeyer->setEnabled(!checked);
|
||||
ui->mic->setEnabled(!checked);
|
||||
m_modAFInput = checked ? AMMod::AMModInputTone : AMMod::AMModInputNone;
|
||||
AMMod::MsgConfigureAFInput* message = AMMod::MsgConfigureAFInput::create(m_modAFInput);
|
||||
m_amMod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
|
||||
void AMModGUI::on_morseKeyer_toggled(bool checked)
|
||||
{
|
||||
ui->play->setEnabled(!checked); // release other source inputs
|
||||
ui->tone->setEnabled(!checked); // release other source inputs
|
||||
ui->mic->setEnabled(!checked);
|
||||
m_modAFInput = checked ? AMMod::AMModInputCWTone : AMMod::AMModInputNone;
|
||||
AMMod::MsgConfigureAFInput* message = AMMod::MsgConfigureAFInput::create(m_modAFInput);
|
||||
m_amMod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
|
||||
void AMModGUI::on_mic_toggled(bool checked)
|
||||
{
|
||||
ui->play->setEnabled(!checked); // release other source inputs
|
||||
ui->morseKeyer->setEnabled(!checked);
|
||||
ui->tone->setEnabled(!checked); // release other source inputs
|
||||
m_modAFInput = checked ? AMMod::AMModInputAudio : AMMod::AMModInputNone;
|
||||
AMMod::MsgConfigureAFInput* message = AMMod::MsgConfigureAFInput::create(m_modAFInput);
|
||||
|
@ -68,6 +68,7 @@ private slots:
|
||||
void on_toneFrequency_valueChanged(int value);
|
||||
void on_mic_toggled(bool checked);
|
||||
void on_play_toggled(bool checked);
|
||||
void on_morseKeyer_toggled(bool checked);
|
||||
|
||||
void on_playLoop_toggled(bool checked);
|
||||
void on_navTimeSlider_valueChanged(int value);
|
||||
|
@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>342</width>
|
||||
<height>195</height>
|
||||
<height>249</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@ -40,7 +40,7 @@
|
||||
<x>10</x>
|
||||
<y>10</y>
|
||||
<width>320</width>
|
||||
<height>161</height>
|
||||
<height>211</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
@ -377,6 +377,20 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="ButtonSwitch" name="morseKeyer">
|
||||
<property name="toolTip">
|
||||
<string>Morse keyer at tone frequency</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../sdrbase/resources/res.qrc">
|
||||
<normaloff>:/morsekey.png</normaloff>:/morsekey.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDial" name="toneFrequency">
|
||||
<property name="maximumSize">
|
||||
@ -634,6 +648,11 @@
|
||||
</widget>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>ButtonSwitch</class>
|
||||
<extends>QToolButton</extends>
|
||||
<header>gui/buttonswitch.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>RollupWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
@ -646,11 +665,6 @@
|
||||
<header>gui/valuedial.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>ButtonSwitch</class>
|
||||
<extends>QToolButton</extends>
|
||||
<header>gui/buttonswitch.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>LevelMeterVU</class>
|
||||
<extends>QWidget</extends>
|
||||
|
@ -16,6 +16,7 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <QChar>
|
||||
#include <QDebug>
|
||||
#include "cwkeyer.h"
|
||||
|
||||
/**
|
||||
@ -23,135 +24,135 @@
|
||||
* 1: dash
|
||||
* -1: end of sequence
|
||||
*/
|
||||
const char CWKeyer::m_asciiToMorse[][128] = {
|
||||
{-1}, // 0
|
||||
{-1}, // 1
|
||||
{-1}, // 2
|
||||
{-1}, // 3
|
||||
{-1}, // 4
|
||||
{-1}, // 5
|
||||
{-1}, // 6
|
||||
{-1}, // 7
|
||||
{-1}, // 8
|
||||
{-1}, // 9
|
||||
{-1}, // 10
|
||||
{-1}, // 11
|
||||
{-1}, // 12
|
||||
{-1}, // 13
|
||||
{-1}, // 14
|
||||
{-1}, // 15
|
||||
{-1}, // 16
|
||||
{-1}, // 17
|
||||
{-1}, // 18
|
||||
{-1}, // 19
|
||||
{-1}, // 20
|
||||
{-1}, // 21
|
||||
{-1}, // 22
|
||||
{-1}, // 23
|
||||
{-1}, // 24
|
||||
{-1}, // 25
|
||||
{-1}, // 26
|
||||
{-1}, // 27
|
||||
{-1}, // 28
|
||||
{-1}, // 29
|
||||
{-1}, // 30
|
||||
{-1}, // 31
|
||||
{-1}, // 32 space is treated as word separator
|
||||
const char CWKeyer::m_asciiToMorse[128][7] = {
|
||||
{-1,0,0,0,0,0,0}, // 0
|
||||
{-1,0,0,0,0,0,0}, // 1
|
||||
{-1,0,0,0,0,0,0}, // 2
|
||||
{-1,0,0,0,0,0,0}, // 3
|
||||
{-1,0,0,0,0,0,0}, // 4
|
||||
{-1,0,0,0,0,0,0}, // 5
|
||||
{-1,0,0,0,0,0,0}, // 6
|
||||
{-1,0,0,0,0,0,0}, // 7
|
||||
{-1,0,0,0,0,0,0}, // 8
|
||||
{-1,0,0,0,0,0,0}, // 9
|
||||
{-1,0,0,0,0,0,0}, // 10
|
||||
{-1,0,0,0,0,0,0}, // 11
|
||||
{-1,0,0,0,0,0,0}, // 12
|
||||
{-1,0,0,0,0,0,0}, // 13
|
||||
{-1,0,0,0,0,0,0}, // 14
|
||||
{-1,0,0,0,0,0,0}, // 15
|
||||
{-1,0,0,0,0,0,0}, // 16
|
||||
{-1,0,0,0,0,0,0}, // 17
|
||||
{-1,0,0,0,0,0,0}, // 18
|
||||
{-1,0,0,0,0,0,0}, // 19
|
||||
{-1,0,0,0,0,0,0}, // 20
|
||||
{-1,0,0,0,0,0,0}, // 21
|
||||
{-1,0,0,0,0,0,0}, // 22
|
||||
{-1,0,0,0,0,0,0}, // 23
|
||||
{-1,0,0,0,0,0,0}, // 24
|
||||
{-1,0,0,0,0,0,0}, // 25
|
||||
{-1,0,0,0,0,0,0}, // 26
|
||||
{-1,0,0,0,0,0,0}, // 27
|
||||
{-1,0,0,0,0,0,0}, // 28
|
||||
{-1,0,0,0,0,0,0}, // 29
|
||||
{-1,0,0,0,0,0,0}, // 30
|
||||
{-1,0,0,0,0,0,0}, // 31
|
||||
{-1,0,0,0,0,0,0}, // 32 space is treated as word separator
|
||||
{1,0,1,0,1,1,-1}, // 33 !
|
||||
{0,1,0,0,1,0,-1}, // 34 "
|
||||
{-1}, // 35
|
||||
{-1}, // 36
|
||||
{-1}, // 37
|
||||
{-1}, // 38
|
||||
{-1,0,0,0,0,0,0}, // 35
|
||||
{-1,0,0,0,0,0,0}, // 36
|
||||
{-1,0,0,0,0,0,0}, // 37
|
||||
{-1,0,0,0,0,0,0}, // 38
|
||||
{0,1,1,1,1,0,-1}, // 39 '
|
||||
{1,0,1,1,0,1,-1}, // 40 (
|
||||
{1,0,1,1,0,1,-1}, // 41 )
|
||||
{-1}, // 42
|
||||
{0,1,0,1,0,-1}, // 43 +
|
||||
{-1,0,0,0,0,0,0}, // 42
|
||||
{0,1,0,1,0,-1,0}, // 43 +
|
||||
{1,1,0,0,1,1,-1}, // 44 ,
|
||||
{1,0,0,0,0,1,-1}, // 45 -
|
||||
{0,1,0,1,0,1,-1}, // 46 .
|
||||
{1,0,0,1,0,-1}, // 47 /
|
||||
{1,1,1,1,1,-1}, // 48 0
|
||||
{0,1,1,1,1,-1}, // 49 1
|
||||
{0,0,1,1,1,-1}, // 50 2
|
||||
{0,0,0,1,1,-1}, // 51 3
|
||||
{0,0,0,0,1,-1}, // 52 4
|
||||
{0,0,0,0,0,-1}, // 53 5
|
||||
{1,0,0,0,0,-1}, // 54 6
|
||||
{1,1,0,0,0,-1}, // 55 7
|
||||
{1,1,1,0,0,-1}, // 56 8
|
||||
{1,1,1,1,0,-1}, // 57 9
|
||||
{1,0,0,1,0,-1,0}, // 47 /
|
||||
{1,1,1,1,1,-1,0}, // 48 0
|
||||
{0,1,1,1,1,-1,0}, // 49 1
|
||||
{0,0,1,1,1,-1,0}, // 50 2
|
||||
{0,0,0,1,1,-1,0}, // 51 3
|
||||
{0,0,0,0,1,-1,0}, // 52 4
|
||||
{0,0,0,0,0,-1,0}, // 53 5
|
||||
{1,0,0,0,0,-1,0}, // 54 6
|
||||
{1,1,0,0,0,-1,0}, // 55 7
|
||||
{1,1,1,0,0,-1,0}, // 56 8
|
||||
{1,1,1,1,0,-1,0}, // 57 9
|
||||
{1,1,1,0,0,0,-1}, // 58 :
|
||||
{1,0,1,0,1,0,-1}, // 59 ;
|
||||
{-1}, // 60 <
|
||||
{1,0,0,0,1,-1}, // 61 =
|
||||
{-1}, // 62 >
|
||||
{-1,0,0,0,0,0,0}, // 60 <
|
||||
{1,0,0,0,1,-1,0}, // 61 =
|
||||
{-1,0,0,0,0,0,0}, // 62 >
|
||||
{0,0,1,1,0,0,-1}, // 63 ?
|
||||
{0,1,1,0,1,0,-1}, // 64 @
|
||||
{0,1,-1}, // 65 A
|
||||
{1,0,0,0,-1}, // 66 B
|
||||
{1,0,1,0,-1}, // 67 C
|
||||
{1,0,0,-1}, // 68 D
|
||||
{0,-1}, // 69 E
|
||||
{0,0,1,0,-1}, // 70 F
|
||||
{1,1,0,-1}, // 71 G
|
||||
{0,0,0,0,-1}, // 72 H
|
||||
{0,0,-1}, // 73 I
|
||||
{0,1,1,1,-1}, // 74 J
|
||||
{1,0,1,-1}, // 75 K
|
||||
{0,1,0,0,-1}, // 76 L
|
||||
{1,1,-1}, // 77 M
|
||||
{1,0,-1}, // 78 N
|
||||
{1,1,1,-1}, // 79 O
|
||||
{0,1,1,0,-1}, // 80 P
|
||||
{1,1,0,1,-1}, // 81 Q
|
||||
{0,1,0,-1}, // 82 R
|
||||
{0,0,0,-1}, // 83 S
|
||||
{1,-1}, // 84 T
|
||||
{0,0,1,-1}, // 85 U
|
||||
{0,0,0,1,-1}, // 86 V
|
||||
{0,1,1,-1}, // 87 W
|
||||
{1,0,0,1,-1}, // 88 X
|
||||
{1,0,1,1,-1}, // 89 Y
|
||||
{1,1,0,0,-1}, // 90 Z
|
||||
{-1}, // 91 [
|
||||
{-1}, // 92 \
|
||||
{-1}, // 93 ]
|
||||
{-1}, // 94 ^
|
||||
{-1}, // 95 _
|
||||
{-1}, // 96 `
|
||||
{0,1,-1}, // 97 A lowercase same as uppercase
|
||||
{1,0,0,0,-1}, // 98 B
|
||||
{1,0,1,0,-1}, // 99 C
|
||||
{1,0,0,-1}, // 100 D
|
||||
{0,-1}, // 101 E
|
||||
{0,0,1,0,-1}, // 102 F
|
||||
{1,1,0,-1}, // 103 G
|
||||
{0,0,0,0,-1}, // 104 H
|
||||
{0,0,-1}, // 105 I
|
||||
{0,1,1,1,-1}, // 106 J
|
||||
{1,0,1,-1}, // 107 K
|
||||
{0,1,0,0,-1}, // 108 L
|
||||
{1,1,-1}, // 109 M
|
||||
{1,0,-1}, // 110 N
|
||||
{1,1,1,-1}, // 111 O
|
||||
{0,1,1,0,-1}, // 112 P
|
||||
{1,1,0,1,-1}, // 113 Q
|
||||
{0,1,0,-1}, // 114 R
|
||||
{0,0,0,-1}, // 115 S
|
||||
{1,-1}, // 116 T
|
||||
{0,0,1,-1}, // 117 U
|
||||
{0,0,0,1,-1}, // 118 V
|
||||
{0,1,1,-1}, // 119 W
|
||||
{1,0,0,1,-1}, // 120 X
|
||||
{1,0,1,1,-1}, // 121 Y
|
||||
{1,1,0,0,-1}, // 122 Z
|
||||
{-1}, // 123 {
|
||||
{-1}, // 124 |
|
||||
{-1}, // 125 }
|
||||
{-1}, // 126 ~
|
||||
{-1}, // 127 DEL
|
||||
{0,1,-1,0,0,0,0}, // 65 A
|
||||
{1,0,0,0,-1,0,0}, // 66 B
|
||||
{1,0,1,0,-1,0,0}, // 67 C
|
||||
{1,0,0,-1,0,0,0}, // 68 D
|
||||
{0,-1,0,0,0,0,0}, // 69 E
|
||||
{0,0,1,0,-1,0,0}, // 70 F
|
||||
{1,1,0,-1,0,0,0}, // 71 G
|
||||
{0,0,0,0,-1,0,0}, // 72 H
|
||||
{0,0,-1,0,0,0,0}, // 73 I
|
||||
{0,1,1,1,-1,0,0}, // 74 J
|
||||
{1,0,1,-1,0,0,0}, // 75 K
|
||||
{0,1,0,0,-1,0,0}, // 76 L
|
||||
{1,1,-1,0,0,0,0}, // 77 M
|
||||
{1,0,-1,0,0,0,0}, // 78 N
|
||||
{1,1,1,-1,0,0,0}, // 79 O
|
||||
{0,1,1,0,-1,0,0}, // 80 P
|
||||
{1,1,0,1,-1,0,0}, // 81 Q
|
||||
{0,1,0,-1,0,0,0}, // 82 R
|
||||
{0,0,0,-1,0,0,0}, // 83 S
|
||||
{1,-1,0,0,0,0,0}, // 84 T
|
||||
{0,0,1,-1,0,0,0}, // 85 U
|
||||
{0,0,0,1,-1,0,0}, // 86 V
|
||||
{0,1,1,-1,0,0,0}, // 87 W
|
||||
{1,0,0,1,-1,0,0}, // 88 X
|
||||
{1,0,1,1,-1,0,0}, // 89 Y
|
||||
{1,1,0,0,-1,0,0}, // 90 Z
|
||||
{-1,0,0,0,0,0,0}, // 91 [
|
||||
{-1,0,0,0,0,0,0}, // 92 back /
|
||||
{-1,0,0,0,0,0,0}, // 93 ]
|
||||
{-1,0,0,0,0,0,0}, // 94 ^
|
||||
{-1,0,0,0,0,0,0}, // 95 _
|
||||
{-1,0,0,0,0,0,0}, // 96 `
|
||||
{0,1,-1,0,0,0,0}, // 97 A lowercase same as uppercase
|
||||
{1,0,0,0,-1,0,0}, // 98 B
|
||||
{1,0,1,0,-1,0,0}, // 99 C
|
||||
{1,0,0,-1,0,0,0}, // 100 D
|
||||
{0,-1,0,0,0,0,0}, // 101 E
|
||||
{0,0,1,0,-1,0,0}, // 102 F
|
||||
{1,1,0,-1,0,0,0}, // 103 G
|
||||
{0,0,0,0,-1,0,0}, // 104 H
|
||||
{0,0,-1,0,0,0,0}, // 105 I
|
||||
{0,1,1,1,-1,0,0}, // 106 J
|
||||
{1,0,1,-1,0,0,0}, // 107 K
|
||||
{0,1,0,0,-1,0,0}, // 108 L
|
||||
{1,1,-1,0,0,0,0}, // 109 M
|
||||
{1,0,-1,0,0,0,0}, // 110 N
|
||||
{1,1,1,-1,0,0,0}, // 111 O
|
||||
{0,1,1,0,-1,0,0}, // 112 P
|
||||
{1,1,0,1,-1,0,0}, // 113 Q
|
||||
{0,1,0,-1,0,0,0}, // 114 R
|
||||
{0,0,0,-1,0,0,0}, // 115 S
|
||||
{1,-1,0,0,0,0,0}, // 116 T
|
||||
{0,0,1,-1,0,0,0}, // 117 U
|
||||
{0,0,0,1,-1,0,0}, // 118 V
|
||||
{0,1,1,-1,0,0,0}, // 119 W
|
||||
{1,0,0,1,-1,0,0}, // 120 X
|
||||
{1,0,1,1,-1,0,0}, // 121 Y
|
||||
{1,1,0,0,-1,0,0}, // 122 Z
|
||||
{-1,0,0,0,0,0,0}, // 123 {
|
||||
{-1,0,0,0,0,0,0}, // 124 |
|
||||
{-1,0,0,0,0,0,0}, // 125 }
|
||||
{-1,0,0,0,0,0,0}, // 126 ~
|
||||
{-1,0,0,0,0,0,0}, // 127 DEL
|
||||
};
|
||||
|
||||
CWKeyer::CWKeyer() :
|
||||
@ -182,7 +183,7 @@ void CWKeyer::setWPM(int wpm)
|
||||
if ((wpm > 0) && (wpm < 21))
|
||||
{
|
||||
m_wpm = wpm;
|
||||
m_dotLength = (int) (m_sampleRate / (2.4f * wpm));
|
||||
m_dotLength = (int) (0.24f * m_sampleRate * (wpm / 5.0f));
|
||||
}
|
||||
}
|
||||
|
||||
@ -330,6 +331,7 @@ void CWKeyer::nextStateText()
|
||||
if (m_textPointer < m_text.length())
|
||||
{
|
||||
m_asciiChar = (m_text.at(m_textPointer)).toLatin1();
|
||||
// qDebug() << "CWKeyer::nextStateText: TextStartChar: " << m_asciiChar;
|
||||
|
||||
if (m_asciiChar < 0) { // non ASCII
|
||||
m_asciiChar = 0;
|
||||
@ -352,14 +354,15 @@ void CWKeyer::nextStateText()
|
||||
break;
|
||||
case TextStartElement:
|
||||
m_samplePointer = 0;
|
||||
if (m_asciiToMorse[m_elementPointer][m_asciiChar] == -1) // end of morse character
|
||||
// qDebug() << "CWKeyer::nextStateText: TextStartElement: " << (int) m_asciiToMorse[m_asciiChar][m_elementPointer];
|
||||
if (m_asciiToMorse[m_asciiChar][m_elementPointer] == -1) // end of morse character
|
||||
{
|
||||
m_elementPointer = 0;
|
||||
m_textState = TextCharSpace;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_asciiToMorse[m_elementPointer][m_asciiChar] == 0) // dot
|
||||
if (m_asciiToMorse[m_asciiChar][m_elementPointer] == 0) // dot
|
||||
{
|
||||
m_dot = true;
|
||||
m_dash = false;
|
||||
@ -369,19 +372,23 @@ void CWKeyer::nextStateText()
|
||||
m_dot = false;
|
||||
m_dash = true;
|
||||
}
|
||||
m_textState = TextElement;
|
||||
m_keyIambicState = KeySilent; // reset iambic state
|
||||
nextStateIambic(); // init dash or dot
|
||||
m_dot = false; // release keys
|
||||
m_dash = false;
|
||||
m_textState = TextElement;
|
||||
m_elementPointer++;
|
||||
}
|
||||
break;
|
||||
case TextElement:
|
||||
nextStateIambic(); // dash or dot
|
||||
if (m_samplePointer == 0) // done
|
||||
if (m_keyIambicState == KeySilent) // done
|
||||
{
|
||||
m_textState = TextStartElement; // next element
|
||||
}
|
||||
break;
|
||||
case TextCharSpace:
|
||||
if (m_samplePointer < 2*m_dotLength) // 1 dot length space from element
|
||||
if (m_samplePointer < 2*m_dotLength) // - 1 dot length space from element
|
||||
{
|
||||
m_samplePointer++;
|
||||
m_key = false;
|
||||
@ -392,7 +399,7 @@ void CWKeyer::nextStateText()
|
||||
}
|
||||
break;
|
||||
case TextWordSpace:
|
||||
if (m_samplePointer < 7*m_dotLength)
|
||||
if (m_samplePointer < 4*m_dotLength) // - 3 dot length space from character
|
||||
{
|
||||
m_samplePointer++;
|
||||
m_key = false;
|
||||
|
@ -55,7 +55,7 @@ public:
|
||||
|
||||
void setSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
|
||||
void setWPM(int wpm);
|
||||
void setText(QString& text) { m_text = text; }
|
||||
void setText(const QString& text) { m_text = text; }
|
||||
void setMode(CWMode mode) { m_mode = mode; }
|
||||
|
||||
void setKey(bool key) { m_key = key; };
|
||||
@ -64,6 +64,7 @@ public:
|
||||
|
||||
int getSample();
|
||||
bool eom();
|
||||
void resetText() { m_textState = TextStart; }
|
||||
|
||||
private:
|
||||
int m_sampleRate;
|
||||
@ -84,7 +85,7 @@ private:
|
||||
CWKeyIambicState m_keyIambicState;
|
||||
CWTextState m_textState;
|
||||
|
||||
static const char m_asciiToMorse[][128];
|
||||
static const char m_asciiToMorse[128][7];
|
||||
|
||||
void nextStateIambic();
|
||||
void nextStateText();
|
||||
|
@ -38,6 +38,7 @@ public:
|
||||
NCO();
|
||||
|
||||
void setFreq(Real freq, Real sampleRate);
|
||||
void setPhase(int phase) { m_phase = phase; }
|
||||
|
||||
void nextPhase() //!< Increment phase
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user