dl-fldigi/src/include/modem.h

368 wiersze
8.9 KiB
C++

// ----------------------------------------------------------------------------
// Copyright (C) 2014
// David 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 this program. If not, see <http://www.gnu.org/licenses/>.
// ----------------------------------------------------------------------------
#ifndef _MODEM_H
#define _MODEM_H
#include <string>
#include "threads.h"
#include "sound.h"
#include "digiscope.h"
#include "globals.h"
#include "morse.h"
#include "ascii.h"
#define OUTBUFSIZE 16384
// Constants for signal searching & s/n threshold
#define SIGSEARCH 5
#define TWOPI (2.0 * M_PI)
class modem {
public:
static double frequency;
static double tx_frequency;
static bool freqlock;
static unsigned long tx_sample_count;
static unsigned int tx_sample_rate;
static bool XMLRPC_CPS_TEST;
protected:
cMorse morse;
trx_mode mode;
SoundBase *scard;
bool stopflag;
int fragmentsize;
int samplerate;
bool reverse;
int sigsearch;
double bandwidth;
double freqerr;
double rx_corr;
double tx_corr;
double PTTphaseacc;
double PTTchannel[OUTBUFSIZE];
// for CW modem use only
bool cwTrack;
bool cwLock;
double cwRcvWPM;
double cwXmtWPM;
double squelch;
double metric;
double syncpos;
int backspaces;
unsigned char *txstr;
unsigned char *txptr;
double outbuf[OUTBUFSIZE];
bool historyON;
Digiscope::scope_mode scopemode;
int scptr;
// extended s/n reporting
double s2n_ncount, s2n_sum, s2n_sum2, s2n_metric;
bool s2n_valid;
unsigned cap;
public:
modem();
virtual ~modem(){};
// these processes must be declared in the derived class
virtual void init();
virtual void tx_init (SoundBase *sc) = 0;
virtual void rx_init () = 0;
virtual void restart () = 0;
virtual void rx_flush() {};
virtual int tx_process () = 0;
virtual int rx_process (const double *, int len) = 0;
virtual void shutdown(){};
virtual void set1(int, int){};
virtual void set2(int, int){};
virtual void makeTxViewer(int W, int H){};
virtual void searchDown() {};
virtual void searchUp() {};
void HistoryON(bool val) {historyON = val;}
bool HistoryON() const { return historyON;}
/// Inlined const getters are faster and smaller.
trx_mode get_mode() const { return mode; };
const char *get_mode_name() const { return mode_info[get_mode()].sname;}
virtual void set_freq(double);
/// Inlining small formulas is still faster and shorter.
int get_freq() const { return (int)( frequency + 0.5 ); }
void init_freqlock();
void set_freqlock(bool);
void set_sigsearch(int n) { sigsearch = n; freqerr = 0.0;};
bool freqlocked() const { return freqlock;}
/// Getters are semantically const.
double get_txfreq() const;
double get_txfreq_woffset() const;
void set_metric(double);
void display_metric(double);
double get_metric() const { return metric;}
void set_reverse(bool on);
bool get_reverse() const { return reverse;}
double get_bandwidth() const { return bandwidth;}
void set_bandwidth(double);
int get_samplerate() const { return samplerate;}
void set_samplerate(int);
void init_queues();
void ModulateXmtr(double *, int);
void ModulateStereo(double *, double *, int);
void videoText();
void pretone();
virtual void send_image(std::string) {}
void set_stopflag(bool b) { stopflag = b;};
bool get_stopflag() const { return stopflag; };
unsigned get_cap(void) const { return cap; }
enum { CAP_AFC = 1 << 0, CAP_AFC_SR = 1 << 1, CAP_REV = 1 << 2,
CAP_IMG = 1 << 3, CAP_BW = 1 << 4, CAP_RX = 1 << 5,
CAP_TX = 1 << 6
};
// for CW modem use only
bool get_cwTrack();
void set_cwTrack(bool);
bool get_cwLock();
void set_cwLock(bool);
double get_cwXmtWPM();
void set_cwXmtWPM(double);
double get_cwRcvWPM();
virtual void incWPM() {};
virtual void decWPM() {};
virtual void toggleWPM() {};
virtual void sync_parameters() {};
virtual void reset_rx_filter(bool) {};
virtual void update_Status() {};
// for waterfall id transmission
private:
static double wfid_w[];
static double wfid_outbuf[];
int vidwidth;
void wfid_make_tones(int numchars);
void wfid_send(int numchars);
void wfid_sendchars(std::string s);
double PTTnco();
public:
void wfid_text(const std::string& s);
// for CW ID transmission
private:
double cwid_keyshape[128];
double cwid_phaseacc;
int RT;
int cwid_symbollen;
int cwid_lastsym;
public:
void cwid_makeshape();
double cwid_nco(double freq);
void cwid_send_symbol(int bits);
void cwid_send_ch(int ch);
void cwid_sendtext (const std::string& s);
void cwid();
// for noise tests
private:
void add_noise(double *, int);
double sigmaN (double es_ovr_n0);
double gauss(double sigma);
protected:
virtual void s2nreport(void);
// JD & DF for multiple carriers
public:
int numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR
int symbols; //JD for multiple carriers
int acc_symbols;
int char_symbols;
int xmt_symbols;
int ovhd_symbols;
int acc_samples;
int char_samples;
int xmt_samples;
int ovhd_samples;
};
extern modem *null_modem;
extern modem *cw_modem;
extern modem *mfsk8_modem;
extern modem *mfsk16_modem;
extern modem *mfsk32_modem;
// experimental modes
extern modem *mfsk4_modem;
extern modem *mfsk11_modem;
extern modem *mfsk22_modem;
extern modem *mfsk31_modem;
extern modem *mfsk64_modem;
extern modem *mfsk128_modem;
extern modem *mfsk64l_modem;
extern modem *mfsk128l_modem;
extern modem *wefax576_modem;
extern modem *wefax288_modem;
extern modem *navtex_modem;
extern modem *sitorb_modem;
extern modem *mt63_500S_modem;
extern modem *mt63_1000S_modem;
extern modem *mt63_2000S_modem;
extern modem *mt63_500L_modem;
extern modem *mt63_1000L_modem;
extern modem *mt63_2000L_modem;
extern modem *feld_modem;
extern modem *feld_slowmodem;
extern modem *feld_x5modem;
extern modem *feld_x9modem;
extern modem *feld_FMmodem;
extern modem *feld_FM105modem;
extern modem *feld_80modem;
extern modem *feld_CMTmodem;
extern modem *psk31_modem;
extern modem *psk63_modem;
extern modem *psk63f_modem;
extern modem *psk125_modem;
extern modem *psk250_modem;
extern modem *psk500_modem;
extern modem *psk1000_modem;
extern modem *qpsk31_modem;
extern modem *qpsk63_modem;
extern modem *qpsk125_modem;
extern modem *qpsk250_modem;
extern modem *qpsk500_modem;
extern modem *psk125r_modem;
extern modem *psk250r_modem;
extern modem *psk500r_modem;
extern modem *psk1000r_modem;
extern modem *psk800_c2_modem;
extern modem *psk800r_c2_modem;
extern modem *psk1000_c2_modem;
extern modem *psk1000r_c2_modem;
extern modem *psk63r_c4_modem;
extern modem *psk63r_c5_modem;
extern modem *psk63r_c10_modem;
extern modem *psk63r_c20_modem;
extern modem *psk63r_c32_modem;
extern modem *psk125r_c4_modem;
extern modem *psk125r_c5_modem;
extern modem *psk125r_c10_modem;
extern modem *psk125_c12_modem;
extern modem *psk125r_c12_modem;
extern modem *psk125r_c16_modem;
extern modem *psk250r_c2_modem;
extern modem *psk250r_c3_modem;
extern modem *psk250r_c5_modem;
extern modem *psk250_c6_modem;
extern modem *psk250r_c6_modem;
extern modem *psk250r_c7_modem;
extern modem *psk500_c2_modem;
extern modem *psk500_c4_modem;
extern modem *psk500r_c2_modem;
extern modem *psk500r_c3_modem;
extern modem *psk500r_c4_modem;
extern modem *rtty_modem;
extern modem *pkt_modem;
extern modem *olivia_modem;
extern modem *olivia_4_250_modem;
extern modem *olivia_8_250_modem;
extern modem *olivia_4_500_modem;
extern modem *olivia_8_500_modem;
extern modem *olivia_16_500_modem;
extern modem *olivia_8_1000_modem;
extern modem *olivia_16_1000_modem;
extern modem *olivia_32_1000_modem;
extern modem *olivia_64_2000_modem;
extern modem *contestia_modem;
extern modem *thor4_modem;
extern modem *thor5_modem;
extern modem *thor8_modem;
extern modem *thor11_modem;
extern modem *thor16_modem;
extern modem *thor22_modem;
extern modem *thor25x4_modem;
extern modem *thor50x1_modem;
extern modem *thor50x2_modem;
extern modem *thor100_modem;
extern modem *dominoex4_modem;
extern modem *dominoex5_modem;
extern modem *dominoex8_modem;
extern modem *dominoex11_modem;
extern modem *dominoex16_modem;
extern modem *dominoex22_modem;
extern modem *dominoex44_modem;
extern modem *dominoex88_modem;
extern modem *throb1_modem;
extern modem *throb2_modem;
extern modem *throb4_modem;
extern modem *throbx1_modem;
extern modem *throbx2_modem;
extern modem *throbx4_modem;
extern modem *wwv_modem;
extern modem *anal_modem;
extern modem *ssb_modem;
#endif