ubitx-v5d-xcvr/ubitx_iop/RigMode.h

416 lines
9.2 KiB
C
Raw Normal View History

2020-05-26 04:11:36 +00:00
//======================================================================
// RigMode.h
//======================================================================
#ifndef __RigMode_h__
#define __RigMode_h__
#include "audio.h"
2020-05-26 04:11:36 +00:00
// Exceptions not active (for Arduino, I assume?).
//enum IModeExceptions {
// MODE_ALREADY_ACTIVE = -1,
// MODE_STILL_TRANSMITTING = -2,
// MODE_ALREADY_TRANSMITTING = -3,
// MODE_NOT_TRANSMITTING = -4,
//};
//======================================================================
// IMode
//
// Interface to a rig mode (SSB, CW, etc.).
//======================================================================
class IMode {
public:
2020-06-13 14:59:11 +00:00
IMode(mode_config& c, RigAudio& a, IFilter& f):
_config(c), _audio(a), _filter(f), _active(false), _transmitting(false)
2020-05-26 04:11:36 +00:00
{
}
virtual ~IMode() {}
2020-06-13 14:59:11 +00:00
inline mode_config& config() { return _config; }
2020-05-26 04:11:36 +00:00
inline RigAudio& audio() { return _audio; }
inline IFilter& filter() { return _filter; }
2020-05-26 04:11:36 +00:00
// Called upon mode entry. Should assume that the rig's state is
// "clean", i.e. that it still needs to enable anything it needs for
// use in the mode.
virtual void onEntry() = 0;
// Called upon mode exit. Should clean everything up that it used,
// and not make assumptions about which mode is being entered next.
virtual void onExit() = 0;
// Called when transmitting.
virtual void onTx() = 0;
// Called when receiving.
virtual void onRx() = 0;
inline void enter() {
if (_active) {
// Do nothing. Exceptions not active (for Arduino, I assume?).
//throw MODE_ALREADY_ACTIVE;
USBDEBUG("ERROR - tried to enter mode, but it's already active");
} else {
_active = true;
onEntry();
}
}
inline void exit() {
if (_transmitting) {
// Do nothing. Exceptions not active (for Arduino, I assume?).
//throw MODE_STILL_TRANSMITTING;
USBDEBUG("ERROR - tried to exit mode, but it's transmitting");
} else {
_active = false;
onExit();
}
}
inline bool isActive() { return _active; }
inline bool isInactive() { return !_active; }
inline void tx() {
if (_transmitting) {
// Do nothing. Exceptions not active (for Arduino, I assume?).
//throw MODE_ALREADY_TRANSMITTING;
USBDEBUG("ERROR - tried to start transmitting, but mode already is transmitting");
} else {
_transmitting = true;
onTx();
}
}
inline void rx() {
if (!_transmitting) {
// Do nothing. Exceptions not active (for Arduino, I assume?).
//throw MODE_NOT_TRANSMITTING;
USBDEBUG("ERROR - tried to start receiving, but mode already is receiving");
} else {
_transmitting = false;
onRx();
}
}
inline bool isTx() const { return _transmitting; }
inline bool isRx() const { return !_transmitting; }
virtual void setWideRxFilter() = 0;
virtual void setMediumRxFilter() = 0;
virtual void setNarrowRxFilter() = 0;
2020-05-26 04:11:36 +00:00
private:
2020-06-13 14:59:11 +00:00
mode_config& _config;
2020-05-26 04:11:36 +00:00
RigAudio& _audio;
IFilter& _filter;
2020-05-26 04:11:36 +00:00
bool _active;
bool _transmitting;
};
//======================================================================
// SSBMode
//======================================================================
class SSBMode : public IMode
{
public:
2020-06-13 14:59:11 +00:00
SSBMode(mode_config& c, RigAudio& a, IFilter& f, bool default_mic=true):
IMode(c, a, f), _use_mic(default_mic)
2020-05-26 04:11:36 +00:00
{
}
2020-05-26 04:11:36 +00:00
virtual void onEntry()
{
setWideRxFilter();
2020-05-26 04:11:36 +00:00
audio().unmuteRx();
audio().muteAllTx();
USBDEBUG("SSB mode entered");
}
virtual void onExit() {
audio().muteAllTx();
audio().muteRx();
USBDEBUG("SSB mode exited");
}
virtual void onTx()
{
audio().muteRx();
if (_use_mic) {
audio().unmuteMicIn();
} else {
audio().unmuteLineIn();
}
USBDEBUG("SSB mode transmitting");
}
virtual void onRx()
{
if (_use_mic) {
audio().muteMicIn();
} else {
audio().muteLineIn();
}
audio().unmuteRx();
USBDEBUG("SSB mode receiving");
}
void setMicIn()
{
if (isRx()) {
// can't switch inputs while already transmitting
_use_mic = true;
}
USBDEBUG("SSB mode - Mic In set");
}
void setLineIn()
{
if (isRx()) {
// can't switch inputs while already transmitting
_use_mic = false;
}
USBDEBUG("SSB mode - Line In set");
}
virtual void setWideRxFilter() {
((BPFilter&)filter()).setBand(300.0, 3100.0);
filter().enable();
USBDEBUG("set wide RX SSB filter");
}
virtual void setMediumRxFilter() {
((BPFilter&)filter()).setBand(500.0, 2900.0);
filter().enable();
USBDEBUG("set medium RX SSB filter");
}
virtual void setNarrowRxFilter() {
((BPFilter&)filter()).setBand(700.0, 2500.0);
filter().enable();
USBDEBUG("set narrow RX SSB filter");
}
2020-05-26 04:11:36 +00:00
private:
bool _use_mic;
};
//======================================================================
// DGTMode
//======================================================================
class DGTMode : public IMode
{
public:
2020-06-13 14:59:11 +00:00
DGTMode(mode_config& c, RigAudio& a, IFilter& f):
IMode(c, a, f)
{
2020-05-26 04:11:36 +00:00
}
2020-05-26 04:11:36 +00:00
virtual void onEntry()
{
setWideRxFilter();
2020-05-26 04:11:36 +00:00
audio().unmuteRx();
audio().muteAllTx();
USBDEBUG("DGT mode entered");
}
virtual void onExit() {
audio().muteAllTx();
audio().muteRx();
USBDEBUG("DGT mode exited");
}
virtual void onTx()
{
audio().muteRx();
audio().unmuteUSBIn();
USBDEBUG("DGT mode transmitting");
}
virtual void onRx()
{
audio().muteUSBIn();
audio().unmuteRx();
USBDEBUG("DGT mode receiving");
}
virtual void setWideRxFilter(){
((BPFilter&)filter()).setBand(300.0, 3100.0);
filter().enable();
USBDEBUG("set wide RX DGT filter");
}
virtual void setMediumRxFilter(){
((BPFilter&)filter()).setBand(500.0, 2900.0);
filter().enable();
USBDEBUG("set medium RX DGT filter");
}
virtual void setNarrowRxFilter(){
((BPFilter&)filter()).setCenterAndWidth(1500.0, 500.0);
filter().enable();
USBDEBUG("set narrow RX DGT filter");
}
2020-05-26 04:11:36 +00:00
};
//======================================================================
// CWMode
//======================================================================
class CWMode : public IMode
{
public:
2020-06-13 14:59:11 +00:00
CWMode(mode_config& c, RigAudio& a, IFilter& f):
IMode(c, a, f)
2020-05-26 04:11:36 +00:00
{
}
2020-05-26 04:11:36 +00:00
virtual void onEntry()
{
setWideRxFilter();
2020-05-26 04:11:36 +00:00
audio().unmuteRx();
audio().muteAllTx();
USBDEBUG("CW mode entered");
}
virtual void onExit() {
audio().muteAllTx();
audio().muteRx();
USBDEBUG("CW mode exited");
}
virtual void onTx()
{
// Currently not muting Rx, since the uBITX produces it's own
// sidetone... but I'm probably going to replace that with a S/W-
// generated sidetone.
USBDEBUG("CW mode transmitting");
}
virtual void onRx()
{
USBDEBUG("CW mode receiving");
}
virtual void setWideRxFilter(){
2020-06-13 14:59:11 +00:00
float st = float(((cw_config&)config()).sidetone);
float width = 1000.0;
float low = st - (width * 0.5);
if (low < 300.0) {
low = 300.0;
}
((BPFilter&)filter()).setBand(low, low + width);
filter().enable();
USBDEBUG("set wide RX CW filter");
}
virtual void setMediumRxFilter(){
2020-06-13 14:59:11 +00:00
float st = float(((cw_config&)config()).sidetone);
float width = 500.0;
float low = st - (width * 0.5);
if (low < 300.0) {
low = 300.0;
}
((BPFilter&)filter()).setBand(low, low + width);
filter().enable();
USBDEBUG("set medium RX CW filter");
}
virtual void setNarrowRxFilter(){
2020-06-13 14:59:11 +00:00
float st = float(((cw_config&)config()).sidetone);
float width = 250.0;
float low = st - (width * 0.5);
if (low < 300.0) {
low = 300.0;
}
((BPFilter&)filter()).setBand(low, low + width);
filter().enable();
USBDEBUG("set narrow RX CW filter");
}
2020-05-26 04:11:36 +00:00
};
//======================================================================
// TTMode
//======================================================================
class TTMode : public IMode
{
public:
2020-06-13 14:59:11 +00:00
TTMode(mode_config& c, RigAudio& a, IFilter& f):
IMode(c, a, f)
2020-05-26 04:11:36 +00:00
{
}
2020-05-26 04:11:36 +00:00
virtual void onEntry()
{
setWideRxFilter();
2020-05-26 04:11:36 +00:00
audio().unmuteRx();
audio().muteAllTx();
USBDEBUG("Test (Two-Tone) mode entered");
}
virtual void onExit() {
audio().muteAllTx();
audio().muteRx();
USBDEBUG("Test (Two-Tone) mode exited");
}
virtual void onTx()
{
audio().muteRx();
audio().unmuteTTIn();
USBDEBUG("Test (Two-Tone) mode transmitting");
}
virtual void onRx()
{
audio().muteTTIn();
audio().unmuteRx();
USBDEBUG("Test (Two-Tone) mode receiving");
}
virtual void setWideRxFilter(){
((BPFilter&)filter()).setBand(300.0, 3100.0);
filter().enable();
USBDEBUG("set wide RX TT filter");
}
virtual void setMediumRxFilter(){
((BPFilter&)filter()).setBand(500.0, 2900.0);
filter().enable();
USBDEBUG("set medium RX TT filter");
}
virtual void setNarrowRxFilter(){
((BPFilter&)filter()).setBand(700.0, 2500.0);
filter().enable();
USBDEBUG("set narrow RX TT filter");
}
2020-05-26 04:11:36 +00:00
};
#endif
//======================================================================
// EOF
//======================================================================