diff --git a/src/Makefile.am b/src/Makefile.am index 06fa0e98..b636cc57 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -364,6 +364,7 @@ fldigi_SOURCES += \ include/sound.h \ include/soundconf.h \ include/spot.h \ + include/ssb.h \ include/stacktrace.h \ include/status.h \ include/strutil.h \ @@ -462,6 +463,7 @@ fldigi_SOURCES += \ spot/notify.cxx \ spot/pskrep.cxx \ spot/spot.cxx \ + ssb/ssb.cxx \ throb/throb.cxx \ trx/modem.cxx \ trx/trx.cxx \ diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index b6151c42..e73e8f78 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -85,6 +85,7 @@ #include "throb.h" #include "wwv.h" #include "analysis.h" +#include "ssb.h" #include "ascii.h" #include "globals.h" @@ -960,6 +961,11 @@ void init_modem(trx_mode mode, int freq) *mode_info[mode].modem = new anal, freq); break; + case MODE_SSB: + startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : + *mode_info[mode].modem = new ssb, freq); + break; + default: LOG_ERROR("Unknown mode: %" PRIdPTR, mode); return init_modem(MODE_PSK31, freq); @@ -2473,7 +2479,7 @@ Fl_Menu_Item menu_[] = { { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, -{"NBEMS modes", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, +{"NBEMS modes", 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, @@ -2482,6 +2488,8 @@ Fl_Menu_Item menu_[] = { { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, +{ mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, + { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, 0, FL_NORMAL_LABEL, 0, 14, 0}, @@ -4018,7 +4026,7 @@ Fl_Menu_Item alt_menu_[] = { { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, -{"NBEMS modes", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, +{"NBEMS modes", 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, @@ -4027,6 +4035,8 @@ Fl_Menu_Item alt_menu_[] = { { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, +{ mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, + { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, 0, FL_NORMAL_LABEL, 0, 14, 0}, diff --git a/src/globals/globals.cxx b/src/globals/globals.cxx index 194a62f6..788ee27e 100644 --- a/src/globals/globals.cxx +++ b/src/globals/globals.cxx @@ -108,8 +108,8 @@ const struct mode_info_t mode_info[NUM_MODES] = { { MODE_THROBX2, &throbx2_modem, "THRBX2", "ThrobX 2", "", "THRBX" }, { MODE_THROBX4, &throbx4_modem, "THRBX4", "ThrobX 4", "", "THRBX" }, + { MODE_SSB, &ssb_modem, "SSB", "SSB", "", "SSB" }, { MODE_WWV, &wwv_modem, "WWV", "WWV", "", "" }, - { MODE_ANALYSIS, &anal_modem, "ANALYSIS", "Freq Analysis", "", "" } }; diff --git a/src/include/globals.h b/src/include/globals.h index ce39235e..bd0f808e 100644 --- a/src/include/globals.h +++ b/src/include/globals.h @@ -130,6 +130,7 @@ enum { MODE_THROB_FIRST = MODE_THROB1, MODE_THROB_LAST = MODE_THROBX4, + MODE_SSB, MODE_WWV, MODE_ANALYSIS, diff --git a/src/include/modem.h b/src/include/modem.h index f221ee91..d3411a64 100644 --- a/src/include/modem.h +++ b/src/include/modem.h @@ -259,6 +259,7 @@ extern modem *throbx4_modem; extern modem *wwv_modem; extern modem *anal_modem; +extern modem *ssb_modem; #endif diff --git a/src/include/ssb.h b/src/include/ssb.h new file mode 100644 index 00000000..677a6e2f --- /dev/null +++ b/src/include/ssb.h @@ -0,0 +1,43 @@ +// ---------------------------------------------------------------------------- +// ssb.h -- ssb modem +// +// Copyright (C) 2010 +// Dave Freese, W1HKJ +// +// This file is part of fldigi. +// +// Fldigi 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, either version 3 of the License, or +// (at your option) any later version. +// +// Fldigi 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 for more details. +// +// You should have received a copy of the GNU General Public License +// along with fldigi. If not, see . +// ---------------------------------------------------------------------------- + +#ifndef _SSB_H +#define _SSB_H + +#include "modem.h" + +#define ssb_SampleRate 8000 + +class ssb : public modem +{ +public: + ssb(); + ~ssb(); + void init(); + void rx_init(); + void tx_init(SoundBase *sc); + void restart(); + int rx_process(const double *buf, int len); + int tx_process(); +}; + +#endif diff --git a/src/ssb/ssb.cxx b/src/ssb/ssb.cxx new file mode 100644 index 00000000..5467c0ca --- /dev/null +++ b/src/ssb/ssb.cxx @@ -0,0 +1,81 @@ +// ---------------------------------------------------------------------------- +// ssb.cxx -- ssb modem +// +// Copyright (C) 2010 +// Dave Freese, W1HKJ +// +// This file is part of fldigi. +// +// Fldigi 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, either version 3 of the License, or +// (at your option) any later version. +// +// Fldigi 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 for more details. +// +// You should have received a copy of the GNU General Public License +// along with fldigi. If not, see . +// ---------------------------------------------------------------------------- + +#include + +#include "ssb.h" +#include "modem.h" +#include "digiscope.h" +#include "fl_digi.h" + +#include "debug.h" + +#define ssb_bw 4 + +void ssb::tx_init(SoundBase *sc) +{ +} + +void ssb::rx_init() +{ + put_MODEstatus(mode); +} + +void ssb::init() +{ + modem::init(); + rx_init(); + set_scope_mode(Digiscope::BLANK); +} + +ssb::~ssb() +{ +} + +void ssb::restart() +{ + set_bandwidth(ssb_bw); +} + +ssb::ssb() +{ + mode = MODE_SSB; + samplerate = 8000; + cap &= ~CAP_TX; + restart(); +} + +// dummy process +int ssb::rx_process(const double *buf, int len) +{ + return 0; +} + +//===================================================================== +// ssb transmit +// dummy process +//===================================================================== + +int ssb::tx_process() +{ + return -1; +} diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index ee85e4bf..27f7038e 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -113,6 +113,7 @@ modem *throbx4_modem = 0; modem *wwv_modem = 0; modem *anal_modem = 0; +modem *ssb_modem = 0; trx_mode modem::get_mode() { @@ -184,7 +185,9 @@ bool modem::freqlocked() double modem::get_txfreq(void) { - if (mailserver && progdefaults.PSKmailSweetSpot) + if (unlikely(!(cap & CAP_TX))) + return 0; + else if (mailserver && progdefaults.PSKmailSweetSpot) return progdefaults.PSKsweetspot; return tx_frequency; }