mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-05-03 17:09:20 -04:00
CW Keyer: interim state (1)
This commit is contained in:
parent
3ed1f68253
commit
35baa46f3d
@ -102,6 +102,7 @@ set(sdrbase_SOURCES
|
|||||||
sdrbase/dsp/upchannelizer.cpp
|
sdrbase/dsp/upchannelizer.cpp
|
||||||
sdrbase/dsp/channelmarker.cpp
|
sdrbase/dsp/channelmarker.cpp
|
||||||
sdrbase/dsp/ctcssdetector.cpp
|
sdrbase/dsp/ctcssdetector.cpp
|
||||||
|
sdrbase/dsp/cwkeyer.cpp
|
||||||
sdrbase/dsp/dspcommands.cpp
|
sdrbase/dsp/dspcommands.cpp
|
||||||
sdrbase/dsp/dspengine.cpp
|
sdrbase/dsp/dspengine.cpp
|
||||||
sdrbase/dsp/dspdevicesourceengine.cpp
|
sdrbase/dsp/dspdevicesourceengine.cpp
|
||||||
@ -194,6 +195,7 @@ set(sdrbase_HEADERS
|
|||||||
sdrbase/dsp/upchannelizer.h
|
sdrbase/dsp/upchannelizer.h
|
||||||
sdrbase/dsp/channelmarker.h
|
sdrbase/dsp/channelmarker.h
|
||||||
sdrbase/dsp/complex.h
|
sdrbase/dsp/complex.h
|
||||||
|
sdrbase/dsp/cwkeyer.h
|
||||||
sdrbase/dsp/decimators.h
|
sdrbase/dsp/decimators.h
|
||||||
sdrbase/dsp/dspcommands.h
|
sdrbase/dsp/dspcommands.h
|
||||||
sdrbase/dsp/dspengine.h
|
sdrbase/dsp/dspengine.h
|
||||||
|
293
sdrbase/dsp/cwkeyer.cpp
Normal file
293
sdrbase/dsp/cwkeyer.cpp
Normal file
@ -0,0 +1,293 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2016 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// 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 //
|
||||||
|
// //
|
||||||
|
// 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 "cwkeyer.h"
|
||||||
|
|
||||||
|
const char 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
|
||||||
|
{1,0,1,0,1,1,-1}, // 33 !
|
||||||
|
{0,1,0,0,1,0,-1}, // 34 "
|
||||||
|
{-1}, // 35
|
||||||
|
{-1}, // 36
|
||||||
|
{-1}, // 37
|
||||||
|
{-1}, // 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,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,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 >
|
||||||
|
{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
|
||||||
|
{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
|
||||||
|
};
|
||||||
|
|
||||||
|
CWKeyer::CWKeyer() :
|
||||||
|
m_sampleRate(48000),
|
||||||
|
m_textPointer(0),
|
||||||
|
m_elementPointer(0),
|
||||||
|
m_elementSpace(false),
|
||||||
|
m_characterSpace(false),
|
||||||
|
m_key(false),
|
||||||
|
m_dot(false),
|
||||||
|
m_dash(false),
|
||||||
|
m_elementOn(false),
|
||||||
|
m_mode(CWKey),
|
||||||
|
m_keyState(KeySilent)
|
||||||
|
{
|
||||||
|
setWPM(13);
|
||||||
|
}
|
||||||
|
|
||||||
|
CWKeyer::~CWKeyer()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWKeyer::setWPM(int wpm)
|
||||||
|
{
|
||||||
|
if ((wpm > 0) && (wpm < 21))
|
||||||
|
{
|
||||||
|
m_wpm = wpm;
|
||||||
|
m_dotLength = (int) (m_sampleRate / (2.4f * wpm));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWKeyer::setDot(bool dotOn)
|
||||||
|
{
|
||||||
|
if (dotOn)
|
||||||
|
{
|
||||||
|
m_dash = false;
|
||||||
|
m_dot = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_dot = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CWKeyer::setDash(bool dashOn)
|
||||||
|
{
|
||||||
|
if (dashOn)
|
||||||
|
{
|
||||||
|
m_dot = false;
|
||||||
|
m_dash = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_dash = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int CWKeyer::getSample()
|
||||||
|
{
|
||||||
|
if (m_mode == CWKey)
|
||||||
|
{
|
||||||
|
return m_key ? 1 : 0;
|
||||||
|
}
|
||||||
|
else if (m_mode == CWIambic)
|
||||||
|
{
|
||||||
|
switch (m_keyState)
|
||||||
|
{
|
||||||
|
case KeySilent:
|
||||||
|
if (m_dot)
|
||||||
|
{
|
||||||
|
m_keyState = KeyDot;
|
||||||
|
m_elementPointer = 0;
|
||||||
|
}
|
||||||
|
else if (m_dash)
|
||||||
|
{
|
||||||
|
m_keyState = KeyDash;
|
||||||
|
m_elementPointer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_key = false;
|
||||||
|
break;
|
||||||
|
case KeyDot:
|
||||||
|
if (m_elementPointer < m_dotLength) // dot key
|
||||||
|
{
|
||||||
|
m_key = true;
|
||||||
|
m_elementPointer++;
|
||||||
|
}
|
||||||
|
else if (m_elementPointer < 2*m_dotLength) // dot silence
|
||||||
|
{
|
||||||
|
m_key = false;
|
||||||
|
m_elementPointer++;
|
||||||
|
}
|
||||||
|
else // end
|
||||||
|
{
|
||||||
|
if (m_dash)
|
||||||
|
{
|
||||||
|
m_elementPointer = 0;
|
||||||
|
m_keyState = KeyDash;
|
||||||
|
}
|
||||||
|
else if (!m_dot)
|
||||||
|
{
|
||||||
|
m_keyState = KeySilent;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_elementPointer = 0;
|
||||||
|
m_key = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KeyDash:
|
||||||
|
if (m_elementPointer < 3*m_dotLength) // dash key
|
||||||
|
{
|
||||||
|
m_key = true;
|
||||||
|
m_elementPointer++;
|
||||||
|
}
|
||||||
|
else if (m_elementPointer < 4*m_dotLength) // dash silence
|
||||||
|
{
|
||||||
|
m_key = false;
|
||||||
|
m_elementPointer++;
|
||||||
|
}
|
||||||
|
else // end
|
||||||
|
{
|
||||||
|
if (m_dot)
|
||||||
|
{
|
||||||
|
m_elementPointer = 0;
|
||||||
|
m_keyState = KeyDot;
|
||||||
|
}
|
||||||
|
else if (!m_dash)
|
||||||
|
{
|
||||||
|
m_keyState = KeySilent;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_elementPointer = 0;
|
||||||
|
m_key = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
m_elementPointer = 0;
|
||||||
|
m_key = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_key ? 1 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
78
sdrbase/dsp/cwkeyer.h
Normal file
78
sdrbase/dsp/cwkeyer.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2016 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// 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 //
|
||||||
|
// //
|
||||||
|
// 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 SDRBASE_DSP_CWKEYER_H_
|
||||||
|
#define SDRBASE_DSP_CWKEYER_H_
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include "util/export.h"
|
||||||
|
|
||||||
|
class SDRANGEL_API CWKeyer : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
CWText,
|
||||||
|
CWKey,
|
||||||
|
CWIambic
|
||||||
|
} CWMode;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
KeySilent,
|
||||||
|
KeyDot,
|
||||||
|
KeyDash
|
||||||
|
} CWKeyState;
|
||||||
|
|
||||||
|
CWKeyer();
|
||||||
|
~CWKeyer();
|
||||||
|
|
||||||
|
void setSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
|
||||||
|
void setWPM(int wpm);
|
||||||
|
void setText(QString& text) { m_text = text; }
|
||||||
|
void setMode(CWMode mode) { m_mode = mode; }
|
||||||
|
|
||||||
|
void setKey(bool key) { m_key = key; };
|
||||||
|
void setDot(bool dotOn);
|
||||||
|
void setDash(bool dashOn);
|
||||||
|
|
||||||
|
int getSample();
|
||||||
|
bool eom();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_sampleRate;
|
||||||
|
int m_wpm;
|
||||||
|
int m_dotLength; //!< dot length in samples
|
||||||
|
QString m_text;
|
||||||
|
int m_textPointer;
|
||||||
|
int m_elementPointer;
|
||||||
|
bool m_elementSpace;
|
||||||
|
bool m_characterSpace;
|
||||||
|
bool m_key;
|
||||||
|
bool m_dot;
|
||||||
|
bool m_dash;
|
||||||
|
bool m_elementOn;
|
||||||
|
CWMode m_mode;
|
||||||
|
CWKeyState m_keyState;
|
||||||
|
|
||||||
|
static const char m_asciiToMorse[][128];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SDRBASE_DSP_CWKEYER_H_ */
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>GLSpectrumGUI</class>
|
<class>CWKeyerGUI</class>
|
||||||
<widget class="QWidget" name="GLSpectrumGUI">
|
<widget class="QWidget" name="CWKeyerGUI">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
@ -17,19 +17,10 @@
|
|||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Oscilloscope</string>
|
<string>CW Keyer</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout" columnstretch="1,0,0">
|
<layout class="QGridLayout" name="gridLayout" columnstretch="1,0,0">
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
@ -96,6 +87,11 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="cwAudioVolume">
|
<widget class="QLabel" name="cwAudioVolume">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>9</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>1.0</string>
|
<string>1.0</string>
|
||||||
</property>
|
</property>
|
||||||
@ -132,6 +128,11 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label">
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>9</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>CW speed display (WPM)</string>
|
<string>CW speed display (WPM)</string>
|
||||||
</property>
|
</property>
|
||||||
@ -191,10 +192,15 @@
|
|||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>30</width>
|
<width>35</width>
|
||||||
<height>16777215</height>
|
<height>16777215</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>9</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Morse key assignment</string>
|
<string>Morse key assignment</string>
|
||||||
</property>
|
</property>
|
||||||
@ -295,10 +301,15 @@
|
|||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>30</width>
|
<width>35</width>
|
||||||
<height>16777215</height>
|
<height>16777215</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>9</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Iambic key dot assignment</string>
|
<string>Iambic key dot assignment</string>
|
||||||
</property>
|
</property>
|
||||||
@ -364,10 +375,15 @@
|
|||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>30</width>
|
<width>35</width>
|
||||||
<height>16777215</height>
|
<height>16777215</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>9</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Iambic key dash assignment</string>
|
<string>Iambic key dash assignment</string>
|
||||||
</property>
|
</property>
|
||||||
|
Loading…
Reference in New Issue
Block a user