ubitx-v5d-xcvr/ubitx_iop/RigMode.h

454 lines
10 KiB
C++

//======================================================================
// RigMode.h
//======================================================================
#ifndef __RigMode_h__
#define __RigMode_h__
#include "audio.h"
// 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:
IMode(IConfig& c, RigAudio& a, IFilter& f):
_config(c), _audio(a), _filter(f), _active(false), _transmitting(false)
{
}
virtual ~IMode() {}
inline IConfig& config() { return _config; }
inline RigAudio& audio() { return _audio; }
inline IFilter& filter() { return _filter; }
virtual const char* rxInfo() = 0;
virtual const char* txInfo() = 0;
// 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;
private:
IConfig& _config;
RigAudio& _audio;
IFilter& _filter;
bool _active;
bool _transmitting;
};
//======================================================================
// SSBMode
//======================================================================
class SSBMode : public IMode
{
public:
SSBMode(IConfig& c, RigAudio& a, IFilter& f, bool default_mic=true):
IMode(c, a, f), _use_mic(default_mic)
{
}
virtual const char* rxInfo() { return _rx_info; };
virtual const char* txInfo() { return _tx_info; };
virtual void onEntry()
{
setWideRxFilter();
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() {
_rx_info = "R:2.8k";
((BPFilter&)filter()).setBand(300.0, 3100.0);
filter().enable();
USBDEBUG("set wide RX SSB filter");
}
virtual void setMediumRxFilter() {
_rx_info = "R:2.4k";
((BPFilter&)filter()).setBand(500.0, 2900.0);
filter().enable();
USBDEBUG("set medium RX SSB filter");
}
virtual void setNarrowRxFilter() {
_rx_info = "R:1.8k";
((BPFilter&)filter()).setBand(700.0, 2500.0);
filter().enable();
USBDEBUG("set narrow RX SSB filter");
}
private:
bool _use_mic;
const char* _rx_info;
const char* _tx_info;
};
//======================================================================
// DGTMode
//======================================================================
class DGTMode : public IMode
{
public:
DGTMode(IConfig& c, RigAudio& a, IFilter& f):
IMode(c, a, f)
{
}
virtual const char* rxInfo() { return _rx_info; };
virtual const char* txInfo() { return _tx_info; };
virtual void onEntry()
{
setWideRxFilter();
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(){
_rx_info = "R:2.8k";
((BPFilter&)filter()).setBand(300.0, 3100.0);
filter().enable();
USBDEBUG("set wide RX DGT filter");
}
virtual void setMediumRxFilter(){
_rx_info = "R:2.4k";
((BPFilter&)filter()).setBand(500.0, 2900.0);
filter().enable();
USBDEBUG("set medium RX DGT filter");
}
virtual void setNarrowRxFilter(){
_rx_info = "R:500 ";
((BPFilter&)filter()).setCenterAndWidth(1500.0, 500.0);
filter().enable();
USBDEBUG("set narrow RX DGT filter");
}
private:
const char* _rx_info;
const char* _tx_info;
};
//======================================================================
// CWMode
//======================================================================
class CWMode : public IMode
{
public:
CWMode(IConfig& c, RigAudio& a, IFilter& f):
IMode(c, a, f)
{
}
virtual const char* rxInfo() { return _rx_info; };
virtual const char* txInfo() { return _tx_info; };
virtual void onEntry()
{
setWideRxFilter();
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(){
float st = float(((CWConfig&)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();
_rx_info = "R:1.0k";
USBDEBUG("set wide RX CW filter");
}
virtual void setMediumRxFilter(){
float st = float(((CWConfig&)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();
_rx_info = "R:500 ";
USBDEBUG("set medium RX CW filter");
}
virtual void setNarrowRxFilter(){
float st = float(((CWConfig&)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();
_rx_info = "R:250 ";
USBDEBUG("set narrow RX CW filter");
}
private:
const char* _rx_info;
const char* _tx_info;
};
//======================================================================
// TTMode
//======================================================================
class TTMode : public IMode
{
public:
TTMode(IConfig& c, RigAudio& a, IFilter& f):
IMode(c, a, f)
{
}
virtual const char* rxInfo() { return _rx_info; };
virtual const char* txInfo() { return _tx_info; };
virtual void onEntry()
{
setWideRxFilter();
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(){
_rx_info = "R:2.8k";
((BPFilter&)filter()).setBand(300.0, 3100.0);
filter().enable();
USBDEBUG("set wide RX TT filter");
}
virtual void setMediumRxFilter(){
_rx_info = "R:2.4k";
((BPFilter&)filter()).setBand(500.0, 2900.0);
filter().enable();
USBDEBUG("set medium RX TT filter");
}
virtual void setNarrowRxFilter(){
_rx_info = "R:1.8k";
((BPFilter&)filter()).setBand(700.0, 2500.0);
filter().enable();
USBDEBUG("set narrow RX TT filter");
}
private:
const char* _rx_info;
const char* _tx_info;
};
#endif
//======================================================================
// EOF
//======================================================================