kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Upstream version 2.04 (rc)
rodzic
c222a66005
commit
2dab69f7a0
1
Makefile
1
Makefile
|
|
@ -88,7 +88,6 @@ SRC = \
|
|||
$(SRC_DIR)/filters/filters.cxx \
|
||||
$(SRC_DIR)/filters/viterbi.cxx \
|
||||
$(SRC_DIR)/globals/globals.cxx \
|
||||
$(SRC_DIR)/ider/id.cxx \
|
||||
$(SRC_DIR)/irrxml/irrXML.cpp \
|
||||
$(SRC_DIR)/logger/logger.cxx \
|
||||
$(SRC_DIR)/main.cxx \
|
||||
|
|
|
|||
|
|
@ -43,12 +43,7 @@ void rtty::tx_init(cSound *sc)
|
|||
scard = sc;
|
||||
phaseacc = 0;
|
||||
preamble = 20;
|
||||
if (trx_state != STATE_TUNE && progdefaults.sendid == true)
|
||||
wfid->transmit(mode);
|
||||
else if (trx_state != STATE_TUNE && progdefaults.macroid == true) {
|
||||
wfid->transmit(mode);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
videoText();
|
||||
}
|
||||
|
||||
void rtty::rx_init()
|
||||
|
|
@ -83,7 +78,7 @@ void rtty::init()
|
|||
rtty::~rtty()
|
||||
{
|
||||
if (hilbert) delete hilbert;
|
||||
if (wfid) delete wfid;
|
||||
// if (wfid) delete wfid;
|
||||
if (bitfilt) delete bitfilt;
|
||||
}
|
||||
|
||||
|
|
@ -160,7 +155,7 @@ rtty::rtty(trx_mode tty_mode)
|
|||
|
||||
hilbert = new C_FIR_filter();
|
||||
hilbert->init_hilbert(37, 1);
|
||||
wfid = new id(this);
|
||||
// wfid = new id(this);
|
||||
|
||||
restart();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -615,13 +615,6 @@ static void cb_btnStartAtSweetSpot(Fl_Check_Button* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnsendid=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnsendid(Fl_Check_Button* o, void*) {
|
||||
progdefaults.sendid=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btntextwidgets=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btntextwidgets(Fl_Check_Button* o, void*) {
|
||||
|
|
@ -636,6 +629,27 @@ static void cb_btnViewXmtSignal(Fl_Check_Button* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnsendid=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnsendid(Fl_Check_Button* o, void*) {
|
||||
progdefaults.sendid=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnsendvideotext=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnsendvideotext(Fl_Check_Button* o, void*) {
|
||||
progdefaults.sendtextid=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Input *valVideotext=(Fl_Input *)0;
|
||||
|
||||
static void cb_valVideotext(Fl_Input* o, void*) {
|
||||
progdefaults.strTextid = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabModems=(Fl_Group *)0;
|
||||
|
||||
Fl_Tabs *tabsModems=(Fl_Tabs *)0;
|
||||
|
|
@ -1012,6 +1026,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
o->selection_color((Fl_Color)51);
|
||||
o->callback((Fl_Callback*)cb_tabOperator);
|
||||
o->when(FL_WHEN_CHANGED);
|
||||
o->hide();
|
||||
inpMyCallsign = new Fl_Input(78, 36, 85, 24, "Callsign:");
|
||||
{ Fl_Input* o = inpMyName = new Fl_Input(78, 62, 120, 24, "Name:");
|
||||
o->callback((Fl_Callback*)cb_inpMyName);
|
||||
|
|
@ -1437,8 +1452,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
{ Fl_Group* o = new Fl_Group(0, 25, 400, 195, "Misc");
|
||||
o->color((Fl_Color)51);
|
||||
o->selection_color((Fl_Color)51);
|
||||
o->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 30, 390, 90, "Sweet Spot");
|
||||
{ Fl_Group* o = new Fl_Group(5, 35, 390, 90, "Sweet Spot");
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
{ Fl_Value_Input* o = valCWsweetspot = new Fl_Value_Input(50, 59, 65, 20, "CW");
|
||||
|
|
@ -1473,10 +1487,6 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
}
|
||||
o->end();
|
||||
}
|
||||
{ Fl_Check_Button* o = btnsendid = new Fl_Check_Button(50, 130, 115, 20, "Xmt Mode ID");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnsendid);
|
||||
}
|
||||
{ Fl_Check_Button* o = btntextwidgets = new Fl_Check_Button(50, 155, 180, 20, "Alternative text widgets");
|
||||
o->tooltip("These widgets have full editing support but are slower.\nThis option takes ef\
|
||||
fect after a restart.");
|
||||
|
|
@ -1485,11 +1495,30 @@ fect after a restart.");
|
|||
o->callback((Fl_Callback*)cb_btntextwidgets);
|
||||
o->hide();
|
||||
}
|
||||
{ Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(50, 150, 135, 20, "View Xmt Signal");
|
||||
{ Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(15, 194, 135, 20, "View Xmt Signal");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnViewXmtSignal);
|
||||
o->value(progdefaults.viewXmtSignal);
|
||||
}
|
||||
{ Fl_Group* o = new Fl_Group(5, 125, 390, 60);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
{ Fl_Check_Button* o = btnsendid = new Fl_Check_Button(15, 133, 115, 20, "Xmt Mode ID");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnsendid);
|
||||
}
|
||||
{ Fl_Check_Button* o = btnsendvideotext = new Fl_Check_Button(15, 158, 115, 20, "Xmt Video Text");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnsendvideotext);
|
||||
o->value(progdefaults.sendtextid);
|
||||
}
|
||||
{ Fl_Input* o = valVideotext = new Fl_Input(162, 158, 94, 20, "Video Text:");
|
||||
o->tooltip("Limit to a few characters as in CQEM or IOTA etc.");
|
||||
o->callback((Fl_Callback*)cb_valVideotext);
|
||||
o->align(FL_ALIGN_TOP_LEFT);
|
||||
o->value(progdefaults.strTextid.c_str());
|
||||
}
|
||||
o->end();
|
||||
}
|
||||
o->end();
|
||||
}
|
||||
{ Fl_Group* o = tabModems = new Fl_Group(0, 25, 401, 195, "Modems");
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
} {
|
||||
Fl_Group tabOperator {
|
||||
label Oper
|
||||
callback {progdefaults.changed = true;} open selected
|
||||
xywh {0 25 400 195} color 51 selection_color 51 when 1
|
||||
callback {progdefaults.changed = true;} open
|
||||
xywh {0 25 400 195} color 51 selection_color 51 when 1 hide
|
||||
} {
|
||||
Fl_Input inpMyCallsign {
|
||||
label {Callsign:}
|
||||
|
|
@ -701,11 +701,11 @@ progdefaults.changed = true;}
|
|||
}
|
||||
Fl_Group {} {
|
||||
label Misc open
|
||||
xywh {0 25 400 195} color 51 selection_color 51 hide
|
||||
xywh {0 25 400 195} color 51 selection_color 51
|
||||
} {
|
||||
Fl_Group {} {
|
||||
label {Sweet Spot} open
|
||||
xywh {5 30 390 90} box ENGRAVED_FRAME align 21
|
||||
xywh {5 35 390 90} box ENGRAVED_FRAME align 21
|
||||
} {
|
||||
Fl_Value_Input valCWsweetspot {
|
||||
label CW
|
||||
|
|
@ -736,12 +736,6 @@ progdefaults.changed = true;}
|
|||
code0 {o->value(progdefaults.StartAtSweetSpot);}
|
||||
}
|
||||
}
|
||||
Fl_Check_Button btnsendid {
|
||||
label {Xmt Mode ID}
|
||||
callback {progdefaults.sendid=o->value();
|
||||
progdefaults.changed = true;}
|
||||
xywh {50 130 115 20} down_box DOWN_BOX
|
||||
}
|
||||
Fl_Check_Button btntextwidgets {
|
||||
label {Alternative text widgets}
|
||||
callback {progdefaults.alt_text_widgets = o->value();
|
||||
|
|
@ -753,9 +747,33 @@ This option takes effect after a restart.} xywh {50 155 180 20} down_box DOWN_BO
|
|||
label {View Xmt Signal}
|
||||
callback {progdefaults.viewXmtSignal=o->value();
|
||||
progdefaults.changed = true;}
|
||||
xywh {50 150 135 20} down_box DOWN_BOX
|
||||
xywh {15 194 135 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.viewXmtSignal);}
|
||||
}
|
||||
Fl_Group {} {open
|
||||
xywh {5 125 390 60} box ENGRAVED_FRAME
|
||||
} {
|
||||
Fl_Check_Button btnsendid {
|
||||
label {Xmt Mode ID}
|
||||
callback {progdefaults.sendid=o->value();
|
||||
progdefaults.changed = true;}
|
||||
xywh {15 133 115 20} down_box DOWN_BOX
|
||||
}
|
||||
Fl_Check_Button btnsendvideotext {
|
||||
label {Xmt Video Text}
|
||||
callback {progdefaults.sendtextid=o->value();
|
||||
progdefaults.changed = true;} selected
|
||||
xywh {15 158 115 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.sendtextid);}
|
||||
}
|
||||
Fl_Input valVideotext {
|
||||
label {Video Text:}
|
||||
callback {progdefaults.strTextid = o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Limit to a few characters as in CQEM or IOTA etc.} xywh {162 158 94 20} align 5
|
||||
code0 {o->value(progdefaults.strTextid.c_str());}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabModems {
|
||||
label Modems open
|
||||
|
|
|
|||
|
|
@ -49,12 +49,7 @@ void dominoex::tx_init(cSound *sc)
|
|||
txprevtone = 0;
|
||||
counter = 0;
|
||||
phaseacc = 0.0;
|
||||
if (trx_state != STATE_TUNE && progdefaults.sendid == true)
|
||||
wfid->transmit(mode);
|
||||
else if (trx_state != STATE_TUNE && progdefaults.macroid == true) {
|
||||
wfid->transmit(mode);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
videoText();
|
||||
}
|
||||
|
||||
void dominoex::rx_init()
|
||||
|
|
@ -107,7 +102,7 @@ dominoex::~dominoex()
|
|||
if (hilbert) delete hilbert;
|
||||
if (pipe) delete [] pipe;
|
||||
if (filt) delete filt;
|
||||
if (wfid) delete wfid;
|
||||
// if (wfid) delete wfid;
|
||||
}
|
||||
|
||||
dominoex::dominoex(trx_mode md)
|
||||
|
|
@ -201,7 +196,7 @@ dominoex::dominoex(trx_mode md)
|
|||
fragmentsize = symlen;
|
||||
|
||||
s2n = 0.0;
|
||||
wfid = new id(this);
|
||||
// wfid = new id(this);
|
||||
|
||||
prev1symbol = prev2symbol = 0;
|
||||
prev1vector = prev2vector = complex(0.0, 0.0);
|
||||
|
|
|
|||
|
|
@ -49,12 +49,7 @@ void feld::tx_init(cSound *sc)
|
|||
tx_state = PREAMBLE;
|
||||
preamble = 3;
|
||||
prevsymb = false;
|
||||
if (trx_state != STATE_TUNE && progdefaults.sendid == true)
|
||||
wfid->transmit(mode);
|
||||
else if (trx_state != STATE_TUNE && progdefaults.macroid == true) {
|
||||
wfid->transmit(mode);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
videoText();
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -84,7 +79,7 @@ feld::~feld()
|
|||
if (hilbert) delete hilbert;
|
||||
if (bpfilt) delete bpfilt;
|
||||
if (bbfilt) delete bbfilt;
|
||||
if (wfid) delete wfid;
|
||||
// if (wfid) delete wfid;
|
||||
}
|
||||
|
||||
feld::feld(trx_mode m)
|
||||
|
|
@ -124,7 +119,7 @@ feld::feld(trx_mode m)
|
|||
|
||||
blackboard = false;
|
||||
hardkeying = false;
|
||||
wfid = new id(this);
|
||||
// wfid = new id(this);
|
||||
|
||||
rxphacc = 0.0;
|
||||
txphacc = 0.0;
|
||||
|
|
|
|||
|
|
@ -29,27 +29,22 @@
|
|||
#undef CLAMP
|
||||
#define CLAMP(x,low,high) (((x)>(high))?(high):(((x)<(low))?(low):(x)))
|
||||
|
||||
using namespace std;
|
||||
|
||||
id::~id()
|
||||
{
|
||||
// if (txpulse) delete [] txpulse;
|
||||
// if (outbuf) delete[] outbuf;
|
||||
}
|
||||
|
||||
id::id(modem *md)
|
||||
id::id()
|
||||
{
|
||||
mode = md;
|
||||
make_pulse();
|
||||
}
|
||||
|
||||
//=====================================================================
|
||||
// transmit processing
|
||||
//=====================================================================
|
||||
|
||||
void id::make_pulse()
|
||||
void id::make_pulse(double samplerate)
|
||||
{
|
||||
int risetime = mode->get_samplerate() / 50;
|
||||
// nominal 5 msec rise time at 8000 samples per second
|
||||
double risetime = samplerate / 50;
|
||||
for (int i = 0; i < IDSYMLEN; i++)
|
||||
txpulse[i] = 1.0;
|
||||
for (int i = 0; i < risetime; i++)
|
||||
|
|
@ -57,15 +52,13 @@ void id::make_pulse()
|
|||
0.5 * (1 - cos(M_PI * i / risetime));
|
||||
}
|
||||
|
||||
void id::make_tones()
|
||||
void id::make_tones(double frequency, double samplerate)
|
||||
{
|
||||
double f;
|
||||
double frequency = mode->get_txfreq_woffset();
|
||||
double sr = mode->get_samplerate();
|
||||
for (int j = 0; j < NUMCHARS; j++)
|
||||
for (int i = 0; i < NUMTONES; i++) {
|
||||
f = frequency + TONESPACING *(NUMTONES - i - j*(NUMTONES + 1));
|
||||
w[i + NUMTONES * j] = 2 * M_PI * f / sr;
|
||||
w[i + NUMTONES * j] = 2 * M_PI * f / samplerate;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -133,19 +126,19 @@ void id::sendchars(string s)
|
|||
send (0);
|
||||
}
|
||||
|
||||
void id::transmit(trx_mode m)
|
||||
void id::text(string s, double frequency, double samplerate)
|
||||
{
|
||||
int numlines = 0;
|
||||
int len;
|
||||
string s;
|
||||
int len = s.length();
|
||||
string tosend;
|
||||
|
||||
s = mode_names[m];
|
||||
len = s.length();
|
||||
|
||||
make_tones();
|
||||
string video = "Video text: ";
|
||||
video += s;
|
||||
|
||||
put_status("Sending ID");
|
||||
make_pulse(samplerate);
|
||||
make_tones(frequency, samplerate);
|
||||
|
||||
put_status(video.c_str());
|
||||
|
||||
while (numlines < len) numlines += NUMCHARS;
|
||||
numlines -= NUMCHARS;
|
||||
while (numlines >= 0) {
|
||||
|
|
@ -153,6 +146,7 @@ void id::transmit(trx_mode m)
|
|||
sendchars(tosend);
|
||||
numlines -= NUMCHARS;
|
||||
}
|
||||
|
||||
put_status("");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -91,9 +91,11 @@ extern Fl_Value_Input *valCWsweetspot;
|
|||
extern Fl_Value_Input *valRTTYsweetspot;
|
||||
extern Fl_Value_Input *valPSKsweetspot;
|
||||
extern Fl_Check_Button *btnStartAtSweetSpot;
|
||||
extern Fl_Check_Button *btnsendid;
|
||||
extern Fl_Check_Button *btntextwidgets;
|
||||
extern Fl_Check_Button *btnViewXmtSignal;
|
||||
extern Fl_Check_Button *btnsendid;
|
||||
extern Fl_Check_Button *btnsendvideotext;
|
||||
extern Fl_Input *valVideotext;
|
||||
extern Fl_Group *tabModems;
|
||||
extern Fl_Tabs *tabsModems;
|
||||
extern Fl_Group *tabCW;
|
||||
|
|
|
|||
|
|
@ -91,6 +91,9 @@ struct configuration {
|
|||
bool viewXmtSignal;
|
||||
bool sendid;
|
||||
bool macroid;
|
||||
bool sendtextid;
|
||||
string strTextid;
|
||||
bool macrotextid;
|
||||
int QRZ;
|
||||
string QRZusername;
|
||||
string QRZuserpassword;
|
||||
|
|
|
|||
|
|
@ -4,10 +4,10 @@
|
|||
// Copyright (C) 2001, 2002, 2003
|
||||
// Tomi Manninen (oh2bns@sral.fi)
|
||||
// Copyright (C) 2006
|
||||
// Hamish Moffatt (hamish@debian.org)
|
||||
// Copyright (C) 2006
|
||||
// Hamish Moffatt (hamish@debian.org)
|
||||
// Copyright (C) 2006
|
||||
// David Freese (w1hkj@w1hkj.com)
|
||||
//
|
||||
//
|
||||
// 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 2 of the License, or
|
||||
|
|
@ -52,9 +52,7 @@ public:
|
|||
TX_STATE_END,
|
||||
TX_STATE_FLUSH
|
||||
};
|
||||
protected:
|
||||
// waterfall ID
|
||||
id *wfid;
|
||||
protected:
|
||||
// common variables
|
||||
double phaseacc;
|
||||
int symlen;
|
||||
|
|
@ -64,14 +62,14 @@ protected:
|
|||
double tonespacing;
|
||||
int counter;
|
||||
// rx variables
|
||||
C_FIR_filter *hilbert;
|
||||
C_FIR_filter *hilbert;
|
||||
C_FIR_filter *filt;
|
||||
sfft *binsfft;
|
||||
Cmovavg *afcfilt;
|
||||
|
||||
domrxpipe *pipe;
|
||||
unsigned int pipeptr;
|
||||
unsigned int datashreg;
|
||||
unsigned int datashreg;
|
||||
mbuffer<double, 0, 2> scopedata;
|
||||
mbuffer<double, 0, 2> videodata;
|
||||
|
||||
|
|
@ -96,27 +94,27 @@ protected:
|
|||
|
||||
int symbolbit;
|
||||
|
||||
// tx variables
|
||||
// tx variables
|
||||
int txstate;
|
||||
int txprevtone;
|
||||
unsigned int bitshreg;
|
||||
string strSecXmtText;
|
||||
string strSecXmtText;
|
||||
|
||||
private:
|
||||
complex mixer(complex in, double f);
|
||||
void recvchar(int c);
|
||||
void decodesymbol(unsigned char curtone, unsigned char prevtone);
|
||||
private:
|
||||
complex mixer(complex in, double f);
|
||||
void recvchar(int c);
|
||||
void decodesymbol(unsigned char curtone, unsigned char prevtone);
|
||||
int harddecode(complex *in);
|
||||
void update_syncscope(complex *);
|
||||
void synchronize();
|
||||
void update_syncscope(complex *);
|
||||
void synchronize();
|
||||
void afc();
|
||||
void reset_afc();
|
||||
void eval_s2n(complex, complex);
|
||||
void sendsymbol(int sym);
|
||||
void eval_s2n(complex, complex);
|
||||
void sendsymbol(int sym);
|
||||
void sendchar(unsigned char c, int secondary);
|
||||
void sendidle();
|
||||
void sendidle();
|
||||
void sendsecondary();
|
||||
void flushtx();
|
||||
void flushtx();
|
||||
int get_secondary_char();
|
||||
public:
|
||||
dominoex (trx_mode md);
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
#define _FELD_H
|
||||
|
||||
#include "modem.h"
|
||||
#include "id.h"
|
||||
#include "filters.h"
|
||||
#include "fftfilt.h"
|
||||
#include "mbuffer.h"
|
||||
|
|
@ -56,8 +55,6 @@
|
|||
class feld : public modem {
|
||||
enum FELD_STATE {PREAMBLE, POSTAMBLE, DATA};
|
||||
protected:
|
||||
// waterfall ID
|
||||
id *wfid;
|
||||
//rx
|
||||
double rxphacc;
|
||||
double rxcounter;
|
||||
|
|
|
|||
|
|
@ -24,9 +24,11 @@
|
|||
#ifndef _ID_H
|
||||
#define _ID_H
|
||||
|
||||
#include "trx.h"
|
||||
#include <string>
|
||||
#include "complex.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct idfntchr { char c; int byte[5]; };
|
||||
|
||||
class id {
|
||||
|
|
@ -38,7 +40,6 @@ public:
|
|||
#define IDSYMLEN 3072
|
||||
|
||||
private:
|
||||
modem *mode;
|
||||
|
||||
static idfntchr idch[];
|
||||
static int mask[];
|
||||
|
|
@ -46,15 +47,15 @@ private:
|
|||
static double txpulse[];
|
||||
static double outbuf[];
|
||||
|
||||
void make_pulse();
|
||||
void make_tones();
|
||||
void make_pulse(double samplerate);
|
||||
void make_tones(double frequency, double samplerate);
|
||||
void send(long int);
|
||||
void sendchars(std::string);
|
||||
|
||||
public:
|
||||
id(modem *md);
|
||||
id();
|
||||
~id();
|
||||
void transmit(trx_mode mode);
|
||||
void text(string s, double frequency, int samplerate);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
#include "interleave.h"
|
||||
#include "viterbi.h"
|
||||
#include "complex.h"
|
||||
#include "id.h"
|
||||
#include "mfskvaricode.h"
|
||||
#include "mbuffer.h"
|
||||
|
||||
|
|
@ -66,8 +65,6 @@ enum {
|
|||
};
|
||||
|
||||
protected:
|
||||
// waterfall ID
|
||||
id *wfid;
|
||||
// general
|
||||
double phaseacc;
|
||||
int symlen;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
#ifndef _MODEM_H
|
||||
#define _MODEM_H
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "threads.h"
|
||||
|
||||
#include "misc.h"
|
||||
|
|
@ -13,6 +15,7 @@
|
|||
#include "fl_digi.h"
|
||||
#include "globals.h"
|
||||
#include "fl_digi.h"
|
||||
//#include "id.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
|
@ -20,6 +23,7 @@
|
|||
// Constants for signal searching & s/n threshold
|
||||
#define SIGSEARCH 5
|
||||
|
||||
struct idfntchr { char c; int byte[5]; };
|
||||
|
||||
class modem {
|
||||
protected:
|
||||
|
|
@ -118,6 +122,8 @@ public:
|
|||
void ModulateXmtr(double *, int);
|
||||
void ModulateStereo(double *, double *, int);
|
||||
|
||||
void videoText();
|
||||
|
||||
void set_stopflag(bool b) { stopflag = b;};
|
||||
|
||||
// for CW modem use only
|
||||
|
|
@ -131,6 +137,31 @@ public:
|
|||
virtual void incWPM() {};
|
||||
virtual void decWPM() {};
|
||||
virtual void toggleWPM() {};
|
||||
|
||||
// for waterfall id transmission
|
||||
public:
|
||||
#define NUMROWS 5
|
||||
#define NUMCHARS 2
|
||||
#define NUMTONES 5
|
||||
#define TONESPACING 6
|
||||
#define IDSYMLEN 3072
|
||||
|
||||
private:
|
||||
|
||||
static idfntchr wfid_idch[];
|
||||
static int wfid_mask[];
|
||||
static double wfid_w[];
|
||||
static double wfid_txpulse[];
|
||||
static double wfid_outbuf[];
|
||||
|
||||
void wfid_make_pulse();
|
||||
void wfid_make_tones();
|
||||
void wfid_send(long int);
|
||||
void wfid_sendchars(std::string);
|
||||
|
||||
public:
|
||||
void wfid_text(string s);
|
||||
|
||||
};
|
||||
|
||||
extern modem *cw_modem;
|
||||
|
|
|
|||
|
|
@ -29,13 +29,10 @@
|
|||
#define _OLIVIA_H
|
||||
|
||||
#include "trx.h"
|
||||
#include "id.h"
|
||||
#include "jalocha/pj_mfsk.h"
|
||||
|
||||
class olivia : public modem {
|
||||
private:
|
||||
// waterfall ID
|
||||
id *wfid;
|
||||
|
||||
MFSK_Transmitter < float >*Tx;
|
||||
MFSK_Receiver < float >*Rx;
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
#include "filters.h"
|
||||
#include "pskcoeff.h"
|
||||
#include "pskvaricode.h"
|
||||
#include "id.h"
|
||||
|
||||
//=====================================================================
|
||||
#define PskSampleRate (8000)
|
||||
|
|
@ -43,8 +42,6 @@
|
|||
|
||||
class psk : public modem {
|
||||
private:
|
||||
// waterfall ID
|
||||
id *wfid;
|
||||
// tx & rx
|
||||
int symbollen;
|
||||
bool _qpsk;
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
#include "filters.h"
|
||||
#include "fftfilt.h"
|
||||
#include "digiscope.h"
|
||||
#include "id.h"
|
||||
//#include "id.h"
|
||||
#include "mbuffer.h"
|
||||
|
||||
//#define RTTY_SampleRate 8000
|
||||
|
|
@ -72,8 +72,6 @@ extern int _BITS[];
|
|||
|
||||
class rtty : public modem {
|
||||
private:
|
||||
// waterfall ID
|
||||
id *wfid;
|
||||
|
||||
double shift;
|
||||
int symbollen;
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@
|
|||
#include "fftfilt.h"
|
||||
#include "filters.h"
|
||||
#include "complex.h"
|
||||
#include "id.h"
|
||||
|
||||
#include "mbuffer.h"
|
||||
|
||||
|
|
@ -62,8 +61,6 @@ static int ThrobTonePairs[][2];
|
|||
static int ThrobXTonePairs[][2];
|
||||
|
||||
protected:
|
||||
// waterfall ID
|
||||
id *wfid;
|
||||
|
||||
int num_tones;
|
||||
int num_chars;
|
||||
|
|
|
|||
|
|
@ -35,8 +35,6 @@
|
|||
#include "globals.h"
|
||||
#include "fl_digi.h"
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
extern void trx_start_modem(modem *);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,6 @@
|
|||
#define _VERSION_H
|
||||
|
||||
#define FLDIGI_NAME "fldigi"
|
||||
#define FLDIGI_VERSION "2.03"
|
||||
#define FLDIGI_VERSION "2.04"
|
||||
|
||||
#endif
|
||||
|
|
|
|||
61
src/main.cxx
61
src/main.cxx
|
|
@ -137,8 +137,10 @@ int main(int argc, char ** argv)
|
|||
logfile = new cLogfile(lfname);
|
||||
logfile->log_to_file_start();
|
||||
|
||||
arqchecks();
|
||||
|
||||
txmsgid = msgget( (key_t) progdefaults.tx_msgid, 0666 );
|
||||
fl_filename_expand(szPskMailDir, 119, "$HOME/pskmail.files/");
|
||||
PskMailDir = szPskMailDir;
|
||||
|
||||
FL_LOCK_E(); // start the gui thread!!
|
||||
Fl::visual(FL_RGB); // insure 24 bit color operation
|
||||
|
||||
|
|
@ -237,61 +239,6 @@ int main(int argc, char ** argv)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void arqchecks()
|
||||
{
|
||||
txmsgid = msgget( (key_t) progdefaults.tx_msgid, 0666 );
|
||||
|
||||
fl_filename_expand(szPskMailDir, 119, "$HOME/pskmail.files/");
|
||||
PskMailDir = szPskMailDir;
|
||||
PskMailFile = PskMailDir;
|
||||
PskMailFile += "PSKmailserver";
|
||||
ifstream testFile;
|
||||
testFile.open(PskMailFile.c_str());
|
||||
if (testFile.is_open()) {
|
||||
mailserver = true;
|
||||
testFile.close();
|
||||
} else {
|
||||
PskMailFile = PskMailDir;
|
||||
PskMailFile += "PSKmailclient";
|
||||
testFile.open(PskMailFile.c_str());
|
||||
if (testFile.is_open()) {
|
||||
mailclient = true;
|
||||
testFile.close();
|
||||
} else {
|
||||
PskMailDir = "./";
|
||||
PskMailFile = PskMailDir;
|
||||
PskMailFile += "PSKmailserver";
|
||||
testFile.open(PskMailFile.c_str());
|
||||
if (testFile.is_open()) {
|
||||
mailserver = true;
|
||||
testFile.close();
|
||||
gmfskmail = true;
|
||||
} else {
|
||||
PskMailFile = PskMailDir;
|
||||
PskMailFile += "PSKmailclient";
|
||||
testFile.open(PskMailFile.c_str());
|
||||
if (testFile.is_open()) {
|
||||
mailclient = true;
|
||||
testFile.close();
|
||||
gmfskmail = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mailserver || mailclient) {
|
||||
std::cout << "Starting pskmail transport layer" << std::endl; fflush(stdout);
|
||||
string PskMailLogName = PskMailDir;
|
||||
|
||||
if (gmfskmail == true)
|
||||
PskMailLogName += "gMFSK.log";
|
||||
else
|
||||
PskMailLogName += "mail-io.log";
|
||||
|
||||
Maillogfile = new cLogfile(PskMailLogName.c_str());
|
||||
Maillogfile->log_to_file_start();
|
||||
}
|
||||
}
|
||||
|
||||
void generate_option_help(void) {
|
||||
// is there a better way of enumerating schemes?
|
||||
string schemes = "none";
|
||||
|
|
|
|||
|
|
@ -56,12 +56,7 @@ void mfsk::tx_init(cSound *sc)
|
|||
txstate = TX_STATE_PREAMBLE;
|
||||
bitstate = 0;
|
||||
counter = 0;
|
||||
if (trx_state != STATE_TUNE && progdefaults.sendid == true)
|
||||
wfid->transmit(mode);
|
||||
else if (trx_state != STATE_TUNE && progdefaults.macroid == true) {
|
||||
wfid->transmit(mode);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
videoText();
|
||||
}
|
||||
|
||||
void mfsk::rx_init()
|
||||
|
|
@ -98,7 +93,7 @@ mfsk::~mfsk()
|
|||
if (pipe) delete [] pipe;
|
||||
if (hbfilt) delete hbfilt;
|
||||
if (binsfft) delete binsfft;
|
||||
if (wfid) delete wfid;
|
||||
// if (wfid) delete wfid;
|
||||
}
|
||||
|
||||
mfsk::mfsk(trx_mode mfsk_mode) : modem()
|
||||
|
|
@ -157,7 +152,7 @@ mfsk::mfsk(trx_mode mfsk_mode) : modem()
|
|||
samplerate = MFSKSampleRate;
|
||||
fragmentsize = symlen;
|
||||
bandwidth = (numtones - 1) * tonespacing;
|
||||
wfid = new id(this);
|
||||
// wfid = new id(this);
|
||||
|
||||
picRxWin = 0;
|
||||
picRxBox = 0;
|
||||
|
|
|
|||
|
|
@ -95,6 +95,9 @@ configuration progdefaults = {
|
|||
false, // bool viewXmtSignal;
|
||||
false, // bool sendid;
|
||||
false, // bool macroid;
|
||||
false, // bool sendtextid;
|
||||
"CQEM", // string strTextid;
|
||||
false, // bool macrotextid;
|
||||
0, // int QRZ;
|
||||
"", // string QRZusername;
|
||||
"", // string QRZuserpassword;
|
||||
|
|
@ -198,7 +201,7 @@ enum TAG { \
|
|||
CLCOLORS,
|
||||
CCCOLORS,
|
||||
BWTCOLORS,
|
||||
VIEWXMTSIGNAL, SENDID, MACROID,
|
||||
VIEWXMTSIGNAL, SENDID, MACROID, SENDTEXTID,
|
||||
QRZTYPE, QRZUSER, QRZPASSWORD,
|
||||
BTNUSB, BTNPTTIS, BTNRTSDTRIS, BTNPTTREVIS,
|
||||
RTSPTT, DTRPTT, RTSPLUS, DTRPLUS,
|
||||
|
|
@ -343,6 +346,7 @@ void configuration::writeDefaultsXML()
|
|||
writeXMLbool(f, "VIEWXMTSIGNAL", viewXmtSignal);
|
||||
writeXMLbool(f, "SENDID", sendid);
|
||||
writeXMLbool(f, "MACROID", macroid);
|
||||
writeXMLbool(f, "SENDTEXTID", sendtextid);
|
||||
writeXMLint(f, "QRZTYPE", QRZ);
|
||||
writeXMLstr(f, "QRZUSER", QRZusername);
|
||||
writeXMLstr(f, "QRZPASSWORD", QRZuserpassword);
|
||||
|
|
@ -619,6 +623,9 @@ bool configuration::readDefaultsXML()
|
|||
case MACROID :
|
||||
macroid = atoi(xml->getNodeData());
|
||||
break;
|
||||
case SENDTEXTID :
|
||||
sendtextid = atoi(xml->getNodeData());
|
||||
break;
|
||||
case QRZTYPE :
|
||||
QRZ = atoi(xml->getNodeData());
|
||||
break;
|
||||
|
|
@ -852,6 +859,7 @@ bool configuration::readDefaultsXML()
|
|||
else if (!strcmp("VIEWXMTSIGNAL", nodeName)) tag = VIEWXMTSIGNAL;
|
||||
else if (!strcmp("SENDID", nodeName)) tag = SENDID;
|
||||
else if (!strcmp("MACROID", nodeName)) tag = MACROID;
|
||||
else if (!strcmp("SENDTEXTID", nodeName)) tag = SENDTEXTID;
|
||||
else if (!strcmp("QRZUSER", nodeName)) tag = QRZUSER;
|
||||
else if (!strcmp("QRZPASSWORD", nodeName)) tag = QRZPASSWORD;
|
||||
else if (!strcmp("QRZTYPE", nodeName)) tag = QRZTYPE;
|
||||
|
|
@ -1171,6 +1179,7 @@ int configuration::openDefaults() {
|
|||
|
||||
btnRTTY_USB->value(RTTY_USB);
|
||||
btnsendid->value(sendid);
|
||||
btnsendvideotext->value(sendtextid);
|
||||
|
||||
valRcvMixer->value(RcvMixer);
|
||||
valXmtMixer->value(XmtMixer);
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ void loadBrowser(Fl_Widget *widget) {
|
|||
w->add("<LDT>\tLocal datetime");
|
||||
w->add("<ZDT>\tZulu datetime");
|
||||
w->add("<ID>\tMode ID'r");
|
||||
w->add("<TEXT>\tVideo text");
|
||||
w->add("<RX>\treceive");
|
||||
w->add("<TX>\ttransmit");
|
||||
w->add("<VER>\tFldigi + version");
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ void pMYRST(string &, size_t &);
|
|||
void pLDT(string &, size_t &);
|
||||
void pZDT(string &, size_t &);
|
||||
void pID(string &, size_t &);
|
||||
void pTEXT(string &, size_t &);
|
||||
void pRX(string &, size_t &);
|
||||
void pTX(string &, size_t &);
|
||||
void pVER(string &, size_t &);
|
||||
|
|
@ -64,6 +65,7 @@ MTAGS mtags[] = {
|
|||
{"<LDT>", pLDT},
|
||||
{"<ZDT>", pZDT},
|
||||
{"<ID>", pID},
|
||||
{"<TEXT>", pTEXT},
|
||||
{"<RX>", pRX},
|
||||
{"<TX>", pTX},
|
||||
{"<VER>", pVER},
|
||||
|
|
@ -168,6 +170,12 @@ void pID(string &s, size_t &i)
|
|||
s.replace( i, 4, "");
|
||||
}
|
||||
|
||||
void pTEXT(string &s, size_t &i)
|
||||
{
|
||||
progdefaults.macrotextid = true;
|
||||
s.replace( i, 6, "");
|
||||
}
|
||||
|
||||
void pRX(string &s, size_t &i)
|
||||
{
|
||||
s.replace (i, 4, "^r");
|
||||
|
|
@ -388,6 +396,7 @@ string mtext =
|
|||
// format : %x %H:%M %Z\n\
|
||||
// <FREQ> my frequency\n\
|
||||
// <ID> send Mode Idenfier - waterfall script\n\
|
||||
// <TEXT> send video text - waterfall script\n\
|
||||
// <LOC> remote locator\n\
|
||||
// <LOG> submit QSO data to logbook program & clear the QSO data fields\n\
|
||||
// Not constrained to a particular position in the macro.\n\
|
||||
|
|
|
|||
|
|
@ -79,13 +79,39 @@ void parse_mailtext()
|
|||
if ( idxCmd != string::npos && idxCmdEnd != string::npos && idxCmdEnd > idxCmd ) {
|
||||
|
||||
strCmdText = mailtext.substr(idxCmd + 5, idxCmdEnd - idxCmd - 5);
|
||||
while ((idxSubCmd = strCmdText.find("<mode>")) != string::npos) {
|
||||
idxSubCmdEnd = strCmdText.find("</mode>");
|
||||
if ( idxSubCmdEnd != string::npos &&
|
||||
idxSubCmdEnd > idxSubCmd ) {
|
||||
strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6);
|
||||
ParseMode(strSubCmd);
|
||||
strCmdText.erase(idxSubCmd, idxSubCmdEnd - idxSubCmd + 7);
|
||||
if (strCmdText == "server" && mailserver == false && mailclient == false) {
|
||||
mailserver = true;
|
||||
mailclient = false;
|
||||
std::cout << "Starting pskmail server transport layer" << std::endl; std::cout.flush();
|
||||
string PskMailLogName = PskMailDir;
|
||||
PskMailLogName += "gMFSK.log";
|
||||
Maillogfile = new cLogfile(PskMailLogName.c_str());
|
||||
Maillogfile->log_to_file_start();
|
||||
} else if (strCmdText == "client" && mailclient == false && mailserver == false) {
|
||||
mailclient = true;
|
||||
mailserver = false;
|
||||
std::cout << "Starting pskmail client transport layer" << std::endl; std::cout.flush();
|
||||
string PskMailLogName = PskMailDir;
|
||||
PskMailLogName += "gMFSK.log";
|
||||
Maillogfile = new cLogfile(PskMailLogName.c_str());
|
||||
Maillogfile->log_to_file_start();
|
||||
} else if (strCmdText == "normal") {
|
||||
std::cout << "Closing pskmail transport layer" << std::endl; std::cout.flush();
|
||||
mailserver = false;
|
||||
mailclient = false;
|
||||
if (Maillogfile) {
|
||||
delete Maillogfile;
|
||||
Maillogfile = 0;
|
||||
}
|
||||
} else {
|
||||
while ((idxSubCmd = strCmdText.find("<mode>")) != string::npos) {
|
||||
idxSubCmdEnd = strCmdText.find("</mode>");
|
||||
if ( idxSubCmdEnd != string::npos &&
|
||||
idxSubCmdEnd > idxSubCmd ) {
|
||||
strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6);
|
||||
ParseMode(strSubCmd);
|
||||
strCmdText.erase(idxSubCmd, idxSubCmdEnd - idxSubCmd + 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
mailtext.erase(idxCmd, idxCmdEnd - idxCmd + 8);
|
||||
|
|
|
|||
|
|
@ -73,12 +73,7 @@ void olivia::tx_init(cSound *sc)
|
|||
Tx->Reverse = 0;
|
||||
}
|
||||
|
||||
if (trx_state != STATE_TUNE && progdefaults.sendid == true)
|
||||
wfid->transmit(mode);
|
||||
else if (trx_state != STATE_TUNE && progdefaults.macroid == true) {
|
||||
wfid->transmit(mode);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
videoText();
|
||||
|
||||
Tx->Preset();
|
||||
Tx->Start();
|
||||
|
|
@ -356,7 +351,7 @@ olivia::olivia()
|
|||
FL_UNLOCK();
|
||||
|
||||
mode = MODE_OLIVIA;
|
||||
wfid = new id(this);
|
||||
// wfid = new id(this);
|
||||
init();
|
||||
}
|
||||
|
||||
|
|
@ -367,6 +362,6 @@ olivia::~olivia()
|
|||
if (txbuffer) delete [] txbuffer;
|
||||
if (txfbuffer) delete [] txfbuffer;
|
||||
if (rxbuffer) delete [] rxbuffer;
|
||||
if (wfid) delete wfid;
|
||||
// if (wfid) delete wfid;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -57,12 +57,7 @@ void psk::tx_init(cSound *sc)
|
|||
prevsymbol = complex (1.0, 0.0);
|
||||
preamble = dcdbits;
|
||||
shreg = 0;
|
||||
if (trx_state != STATE_TUNE && progdefaults.sendid == true)
|
||||
wfid->transmit(mode);
|
||||
else if (trx_state != STATE_TUNE && progdefaults.macroid == true) {
|
||||
wfid->transmit(mode);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
videoText();
|
||||
}
|
||||
|
||||
void psk::rx_init()
|
||||
|
|
@ -99,7 +94,7 @@ psk::~psk()
|
|||
if (dec) delete dec;
|
||||
if (fir1) delete fir1;
|
||||
if (fir2) delete fir2;
|
||||
if (wfid) delete wfid;
|
||||
// if (wfid) delete wfid;
|
||||
}
|
||||
|
||||
psk::psk(trx_mode pskmode) : modem()
|
||||
|
|
@ -197,7 +192,7 @@ psk::psk(trx_mode pskmode) : modem()
|
|||
samplerate = PskSampleRate;
|
||||
fragmentsize = symbollen;
|
||||
bandwidth = samplerate / symbollen;
|
||||
wfid = new id(this);
|
||||
// wfid = new id(this);
|
||||
|
||||
// pipeptr = 0;
|
||||
if (mailserver && progdefaults.PSKmailSweetSpot)
|
||||
|
|
|
|||
|
|
@ -42,12 +42,7 @@ void throb::tx_init(cSound *sc)
|
|||
scard = sc;
|
||||
preamble = 4;
|
||||
reset_syms();
|
||||
if (trx_state != STATE_TUNE && progdefaults.sendid == true)
|
||||
wfid->transmit(mode);
|
||||
else if (trx_state != STATE_TUNE && progdefaults.macroid == true) {
|
||||
wfid->transmit(mode);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
videoText();
|
||||
}
|
||||
|
||||
void throb::rx_init()
|
||||
|
|
@ -79,7 +74,7 @@ throb::~throb()
|
|||
if (outbuf) delete[] outbuf;
|
||||
for (int i = 0; i < num_tones; i++)
|
||||
if (rxtone[i]) delete [] rxtone[i];
|
||||
if (wfid) delete wfid;
|
||||
// if (wfid) delete wfid;
|
||||
}
|
||||
|
||||
void throb::flip_syms() //call this whenever a space or idle is sent or received
|
||||
|
|
@ -233,7 +228,7 @@ throb::throb(trx_mode throb_mode) : modem()
|
|||
syncpos = 0.5;
|
||||
|
||||
scope_data = new double [SCOPE_DATA_LEN];
|
||||
wfid = new id(this);
|
||||
// wfid = new id(this);
|
||||
|
||||
phaseacc = 0.0;
|
||||
metric = 0.0;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
#include "Config.h"
|
||||
#include "modem.h"
|
||||
#include "id.h"
|
||||
#include "configuration.h"
|
||||
|
||||
#include "qrunner.h"
|
||||
|
|
@ -229,3 +228,268 @@ void modem::ModulateStereo(double *left, double *right, int len)
|
|||
}
|
||||
|
||||
|
||||
void modem::videoText()
|
||||
{
|
||||
if (trx_state == STATE_TUNE)
|
||||
return;
|
||||
if (progdefaults.sendtextid == true) {
|
||||
wfid_text(progdefaults.strTextid);
|
||||
} else if (progdefaults.macrotextid == true) {
|
||||
wfid_text(progdefaults.strTextid);
|
||||
progdefaults.macrotextid = false;
|
||||
}
|
||||
if (progdefaults.sendid == true) {
|
||||
wfid_text(mode_names[mode]);
|
||||
} else if (progdefaults.macroid == true) {
|
||||
wfid_text(mode_names[mode]);
|
||||
progdefaults.macroid = false;
|
||||
}
|
||||
}
|
||||
|
||||
//=====================================================================
|
||||
// transmit processing of waterfall video id
|
||||
//=====================================================================
|
||||
|
||||
void modem::wfid_make_pulse()
|
||||
{
|
||||
// nominal 5 msec rise time at 8000 samples per second
|
||||
double risetime = samplerate / 50;
|
||||
for (int i = 0; i < IDSYMLEN; i++)
|
||||
wfid_txpulse[i] = 1.0;
|
||||
for (int i = 0; i < risetime; i++)
|
||||
wfid_txpulse[i] = wfid_txpulse[IDSYMLEN - 1 - i] =
|
||||
0.5 * (1 - cos(M_PI * i / risetime));
|
||||
}
|
||||
|
||||
void modem::wfid_make_tones()
|
||||
{
|
||||
double f;
|
||||
for (int j = 0; j < NUMCHARS; j++)
|
||||
for (int i = 0; i < NUMTONES; i++) {
|
||||
f = frequency + TONESPACING *(NUMTONES - i - j*(NUMTONES + 1));
|
||||
wfid_w[i + NUMTONES * j] = 2 * M_PI * f / samplerate;
|
||||
}
|
||||
}
|
||||
|
||||
// symbol is the binary representation of the entire multitone array
|
||||
// a 1 indicates a signal output and a 0 indicates no signal at that freq bin
|
||||
// mask 1 = 180 phase reversal of tone, 0 = no phase reversal
|
||||
|
||||
void modem::wfid_send(long int symbol)
|
||||
{
|
||||
int i, j;
|
||||
int sym;
|
||||
int msk;
|
||||
double maximum = 0.0;
|
||||
for (i = 0; i < IDSYMLEN; i++) {
|
||||
outbuf[i] = 0.0;
|
||||
sym = symbol;
|
||||
msk = wfid_mask[symbol];
|
||||
for (j = 0; j < NUMTONES * NUMCHARS; j++) {
|
||||
if (sym & 1 == 1)
|
||||
outbuf[i] += (msk & 1 == 1 ? -1 : 1 ) * sin(wfid_w[j] * i);
|
||||
sym = sym >> 1;
|
||||
msk = msk >> 1;
|
||||
}
|
||||
if (fabs(outbuf[i]) > maximum)
|
||||
maximum = fabs(outbuf[i]);
|
||||
}
|
||||
if (maximum > 0.0)
|
||||
for (i = 0; i < IDSYMLEN; i++)
|
||||
wfid_outbuf[i] = wfid_outbuf[i] * wfid_txpulse[i] / maximum;
|
||||
|
||||
ModulateXmtr(outbuf, IDSYMLEN);
|
||||
}
|
||||
|
||||
void modem::wfid_sendchars(string s)
|
||||
{
|
||||
long int symbol;
|
||||
int len = s.length();
|
||||
int n[NUMCHARS];
|
||||
int c;
|
||||
while (len++ < NUMCHARS) s.insert(0," ");
|
||||
|
||||
for (int i = 0; i < NUMCHARS; i++) {
|
||||
c = s[i];
|
||||
if (c > 'z' || c < ' ') c = ' ';
|
||||
c = toupper(c) - ' ';
|
||||
n[i] = c;
|
||||
}
|
||||
// send rows from bottom to top so they appear to scroll down the waterfall correctly
|
||||
// each character formed from 5 rows of 5 columns - uses a modifed 7x7 feldhell font
|
||||
// after the symbol is or'd and shifted it contains the bit values associated with
|
||||
// each frequency bin:
|
||||
// For example, the bottom rows of S K are 0xF0 and 0X88
|
||||
// for this row and characters the symbol is:
|
||||
// 0111110001
|
||||
for (int row = 0; row < NUMROWS; row++) {
|
||||
symbol = 0;
|
||||
for (int i = 0; i < NUMCHARS; i++) {
|
||||
symbol |= (wfid_idch[n[i]].byte[NUMROWS - 1 -row] >> 3);
|
||||
if (i != (NUMCHARS - 1) )
|
||||
symbol = symbol << 5;
|
||||
}
|
||||
wfid_send (symbol);
|
||||
}
|
||||
wfid_send (0); // row of no tones
|
||||
wfid_send (0);
|
||||
}
|
||||
|
||||
void modem::wfid_text(string s)
|
||||
{
|
||||
int numlines = 0;
|
||||
int len = s.length();
|
||||
string tosend;
|
||||
string video = "Video text: ";
|
||||
video += s;
|
||||
|
||||
wfid_make_pulse();
|
||||
wfid_make_tones();
|
||||
|
||||
put_status(video.c_str());
|
||||
|
||||
while (numlines < len) numlines += NUMCHARS;
|
||||
numlines -= NUMCHARS;
|
||||
while (numlines >= 0) {
|
||||
tosend = s.substr(numlines, NUMCHARS);
|
||||
wfid_sendchars(tosend);
|
||||
numlines -= NUMCHARS;
|
||||
}
|
||||
|
||||
put_status("");
|
||||
}
|
||||
|
||||
double modem::wfid_txpulse[IDSYMLEN];
|
||||
double modem::wfid_outbuf[IDSYMLEN];
|
||||
double modem::wfid_w[NUMTONES * NUMCHARS];
|
||||
|
||||
idfntchr modem::wfid_idch[] = {
|
||||
{' ', { 0x00, 0x00, 0x00, 0x00, 0x00 }, },
|
||||
{'!', { 0x80, 0x80, 0x80, 0x00, 0x80 }, },
|
||||
{'"', { 0xA0, 0x00, 0x00, 0x00, 0x00 }, },
|
||||
{'#', { 0x50, 0xF8, 0x50, 0xF8, 0x50 }, },
|
||||
{'$', { 0x78, 0xA0, 0x70, 0x28, 0xF0 }, },
|
||||
{'%', { 0xC8, 0x10, 0x20, 0x40, 0x98 }, },
|
||||
{'&', { 0x40, 0xE0, 0x68, 0x90, 0x78 }, },
|
||||
{ 39, { 0xC0, 0x40, 0x80, 0x00, 0x00 }, },
|
||||
{'(', { 0x60, 0x80, 0x80, 0x80, 0x60 }, },
|
||||
{')', { 0xC0, 0x20, 0x20, 0x20, 0xC0 }, },
|
||||
{'*', { 0xA8, 0x70, 0xF8, 0x70, 0xA8 }, },
|
||||
{'+', { 0x00, 0x20, 0xF8, 0x20, 0x00 }, },
|
||||
{',', { 0x00, 0x00, 0x00, 0xC0, 0x40 }, },
|
||||
{'-', { 0x00, 0x00, 0xF8, 0x00, 0x00 }, },
|
||||
{'.', { 0x00, 0x00, 0x00, 0x00, 0xC0 }, },
|
||||
{'/', { 0x08, 0x10, 0x20, 0x40, 0x80 }, },
|
||||
{'0', { 0x70, 0x98, 0xA8, 0xC8, 0x70 }, },
|
||||
{'1', { 0x60, 0xA0, 0x20, 0x20, 0x20 }, },
|
||||
{'2', { 0xE0, 0x10, 0x20, 0x40, 0xF8 }, },
|
||||
{'3', { 0xF0, 0x08, 0x30, 0x08, 0xF0 }, },
|
||||
{'4', { 0x90, 0x90, 0xF8, 0x10, 0x10 }, },
|
||||
{'5', { 0xF8, 0x80, 0xF0, 0x08, 0xF0 }, },
|
||||
{'6', { 0x70, 0x80, 0xF0, 0x88, 0x70 }, },
|
||||
{'7', { 0xF8, 0x08, 0x10, 0x20, 0x40 }, },
|
||||
{'8', { 0x70, 0x88, 0x70, 0x88, 0x70 }, },
|
||||
{'9', { 0x70, 0x88, 0x78, 0x08, 0x70 }, },
|
||||
{':', { 0x00, 0xC0, 0x00, 0xC0, 0x00 }, },
|
||||
{';', { 0xC0, 0x00, 0xC0, 0x40, 0x80 }, },
|
||||
{'<', { 0x08, 0x30, 0xC0, 0x30, 0x08 }, },
|
||||
{'=', { 0x00, 0xF8, 0x00, 0xF8, 0x00 }, },
|
||||
{'>', { 0x80, 0x60, 0x18, 0x60, 0x80 }, },
|
||||
{'?', { 0xE0, 0x10, 0x20, 0x00, 0x20 }, },
|
||||
{'@', { 0x70, 0x88, 0xB0, 0x80, 0x78 }, },
|
||||
{'A', { 0x70, 0x88, 0xF8, 0x88, 0x88 }, },
|
||||
{'B', { 0xF0, 0x48, 0x70, 0x48, 0xF0 }, },
|
||||
{'C', { 0x78, 0x80, 0x80, 0x80, 0x78 }, },
|
||||
{'D', { 0xF0, 0x88, 0x88, 0x88, 0xF0 }, },
|
||||
{'E', { 0xF8, 0x80, 0xE0, 0x80, 0xF8 }, },
|
||||
{'F', { 0xF8, 0x80, 0xE0, 0x80, 0x80 }, },
|
||||
{'G', { 0x78, 0x80, 0x98, 0x88, 0x78 }, },
|
||||
{'H', { 0x88, 0x88, 0xF8, 0x88, 0x88 }, },
|
||||
{'I', { 0xE0, 0x40, 0x40, 0x40, 0xE0 }, },
|
||||
{'J', { 0x08, 0x08, 0x08, 0x88, 0x70 }, },
|
||||
{'K', { 0x88, 0x90, 0xE0, 0x90, 0x88 }, },
|
||||
{'L', { 0x80, 0x80, 0x80, 0x80, 0xF8 }, },
|
||||
{'M', { 0x88, 0xD8, 0xA8, 0x88, 0x88 }, },
|
||||
{'N', { 0x88, 0xC8, 0xA8, 0x98, 0x88 }, },
|
||||
{'O', { 0x70, 0x88, 0x88, 0x88, 0x70 }, },
|
||||
{'P', { 0xF0, 0x88, 0xF0, 0x80, 0x80 }, },
|
||||
{'Q', { 0x70, 0x88, 0x88, 0xA8, 0x70 }, },
|
||||
{'R', { 0xF0, 0x88, 0xF0, 0x90, 0x88 }, },
|
||||
{'S', { 0x78, 0x80, 0x70, 0x08, 0xF0 }, },
|
||||
{'T', { 0xF8, 0x20, 0x20, 0x20, 0x20 }, },
|
||||
{'U', { 0x88, 0x88, 0x88, 0x88, 0x70 }, },
|
||||
{'V', { 0x88, 0x90, 0xA0, 0xC0, 0x80 }, },
|
||||
{'W', { 0x88, 0x88, 0xA8, 0xA8, 0x50 }, },
|
||||
{'X', { 0x88, 0x50, 0x20, 0x50, 0x88 }, },
|
||||
{'Y', { 0x88, 0x50, 0x20, 0x20, 0x20 }, },
|
||||
{'Z', { 0xF8, 0x10, 0x20, 0x40, 0xF8 }, }
|
||||
};
|
||||
|
||||
// MASK for optimizing power in Waterfall ID signal
|
||||
|
||||
int modem::wfid_mask[1024] = {
|
||||
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, 0x02, 0x02, 0x04, 0x04, 0x06, 0x04,
|
||||
0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x06, 0x03, 0x00, 0x01, 0x02, 0x01, 0x04, 0x05, 0x0e, 0x02,
|
||||
0x00, 0x00, 0x02, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x09, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x01,
|
||||
0x00, 0x10, 0x12, 0x13, 0x04, 0x04, 0x14, 0x04, 0x18, 0x01, 0x1a, 0x02, 0x0c, 0x05, 0x08, 0x1d,
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x06, 0x04, 0x00, 0x08, 0x0a, 0x03, 0x08, 0x0d, 0x08, 0x02,
|
||||
0x10, 0x01, 0x12, 0x02, 0x04, 0x05, 0x06, 0x16, 0x18, 0x10, 0x1a, 0x01, 0x18, 0x05, 0x02, 0x1b,
|
||||
0x20, 0x20, 0x02, 0x02, 0x04, 0x04, 0x04, 0x05, 0x28, 0x20, 0x02, 0x20, 0x08, 0x09, 0x04, 0x0d,
|
||||
0x10, 0x11, 0x22, 0x02, 0x04, 0x34, 0x02, 0x27, 0x38, 0x39, 0x20, 0x21, 0x14, 0x09, 0x2e, 0x28,
|
||||
0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x04, 0x01, 0x08, 0x01, 0x08, 0x08, 0x0c, 0x04, 0x02, 0x0d,
|
||||
0x10, 0x11, 0x12, 0x01, 0x10, 0x01, 0x04, 0x01, 0x10, 0x11, 0x1a, 0x01, 0x10, 0x05, 0x0e, 0x1d,
|
||||
0x00, 0x21, 0x20, 0x22, 0x20, 0x25, 0x22, 0x01, 0x20, 0x09, 0x2a, 0x2a, 0x24, 0x20, 0x08, 0x09,
|
||||
0x10, 0x11, 0x10, 0x33, 0x04, 0x04, 0x34, 0x13, 0x38, 0x11, 0x20, 0x19, 0x18, 0x19, 0x06, 0x0c,
|
||||
0x40, 0x01, 0x40, 0x43, 0x04, 0x04, 0x40, 0x05, 0x40, 0x41, 0x42, 0x4b, 0x40, 0x4d, 0x0a, 0x41,
|
||||
0x50, 0x11, 0x02, 0x12, 0x44, 0x41, 0x40, 0x41, 0x08, 0x10, 0x12, 0x53, 0x40, 0x5c, 0x16, 0x4f,
|
||||
0x20, 0x61, 0x20, 0x01, 0x60, 0x25, 0x46, 0x05, 0x28, 0x28, 0x6a, 0x43, 0x40, 0x09, 0x42, 0x4c,
|
||||
0x70, 0x31, 0x70, 0x33, 0x60, 0x25, 0x12, 0x50, 0x58, 0x39, 0x2a, 0x09, 0x5c, 0x60, 0x0c, 0x0d,
|
||||
0x00, 0x01, 0x02, 0x02, 0x04, 0x01, 0x02, 0x06, 0x00, 0x09, 0x02, 0x08, 0x08, 0x09, 0x02, 0x0e,
|
||||
0x10, 0x10, 0x12, 0x02, 0x04, 0x01, 0x04, 0x14, 0x08, 0x19, 0x08, 0x13, 0x10, 0x10, 0x0e, 0x1d,
|
||||
0x20, 0x01, 0x02, 0x22, 0x20, 0x20, 0x22, 0x02, 0x28, 0x08, 0x2a, 0x29, 0x08, 0x0c, 0x0c, 0x0e,
|
||||
0x10, 0x30, 0x32, 0x10, 0x14, 0x34, 0x06, 0x36, 0x28, 0x01, 0x02, 0x1a, 0x0c, 0x2d, 0x1c, 0x1d,
|
||||
0x00, 0x41, 0x42, 0x41, 0x44, 0x04, 0x44, 0x06, 0x08, 0x09, 0x02, 0x41, 0x44, 0x48, 0x02, 0x06,
|
||||
0x40, 0x01, 0x12, 0x12, 0x10, 0x11, 0x54, 0x13, 0x58, 0x01, 0x50, 0x5a, 0x04, 0x19, 0x12, 0x57,
|
||||
0x60, 0x41, 0x40, 0x02, 0x20, 0x24, 0x02, 0x47, 0x08, 0x41, 0x08, 0x6a, 0x4c, 0x68, 0x6a, 0x47,
|
||||
0x10, 0x71, 0x42, 0x43, 0x10, 0x55, 0x26, 0x50, 0x10, 0x58, 0x72, 0x28, 0x2c, 0x39, 0x1a, 0x4f,
|
||||
0x80, 0x80, 0x82, 0x02, 0x04, 0x84, 0x02, 0x02, 0x88, 0x88, 0x08, 0x01, 0x08, 0x05, 0x04, 0x0d,
|
||||
0x10, 0x01, 0x12, 0x90, 0x84, 0x94, 0x02, 0x90, 0x10, 0x98, 0x9a, 0x98, 0x14, 0x9c, 0x16, 0x0b,
|
||||
0x20, 0x20, 0x80, 0xa3, 0x80, 0xa1, 0xa6, 0x87, 0x28, 0x29, 0xa8, 0xa8, 0x08, 0x09, 0x2a, 0x87,
|
||||
0x10, 0x80, 0x82, 0x11, 0xb0, 0xa5, 0x32, 0x32, 0xb8, 0xa0, 0x2a, 0x11, 0x9c, 0x81, 0x8e, 0xa4,
|
||||
0x40, 0xc0, 0xc2, 0x01, 0x40, 0xc5, 0x80, 0x05, 0xc0, 0x80, 0x4a, 0x09, 0x8c, 0x09, 0x0a, 0x09,
|
||||
0x50, 0x41, 0xc0, 0x41, 0x40, 0xc0, 0x12, 0x87, 0x80, 0xc0, 0x82, 0x83, 0x9c, 0xd8, 0x98, 0x16,
|
||||
0x20, 0x41, 0x82, 0x83, 0x80, 0xc0, 0x46, 0xc7, 0x48, 0xe0, 0x6a, 0x29, 0x4c, 0x29, 0xc0, 0x8e,
|
||||
0x40, 0xc0, 0x50, 0x21, 0x74, 0xf4, 0x32, 0x25, 0x28, 0x98, 0x9a, 0x32, 0x74, 0x58, 0x8e, 0x83,
|
||||
0x00, 0x00, 0x02, 0x01, 0x04, 0x05, 0x04, 0x06, 0x00, 0x09, 0x02, 0x02, 0x0c, 0x01, 0x06, 0x04,
|
||||
0x00, 0x10, 0x12, 0x13, 0x14, 0x14, 0x12, 0x16, 0x10, 0x19, 0x12, 0x01, 0x04, 0x18, 0x16, 0x17,
|
||||
0x20, 0x20, 0x22, 0x03, 0x04, 0x24, 0x24, 0x26, 0x20, 0x20, 0x20, 0x21, 0x0c, 0x2c, 0x2c, 0x24,
|
||||
0x20, 0x10, 0x30, 0x20, 0x04, 0x10, 0x04, 0x31, 0x10, 0x28, 0x08, 0x33, 0x0c, 0x05, 0x0c, 0x3d,
|
||||
0x40, 0x01, 0x40, 0x02, 0x04, 0x01, 0x44, 0x03, 0x40, 0x08, 0x0a, 0x08, 0x0c, 0x44, 0x4e, 0x44,
|
||||
0x10, 0x50, 0x40, 0x11, 0x54, 0x14, 0x06, 0x56, 0x58, 0x49, 0x52, 0x49, 0x18, 0x4d, 0x56, 0x49,
|
||||
0x20, 0x41, 0x02, 0x01, 0x44, 0x65, 0x64, 0x05, 0x20, 0x69, 0x6a, 0x23, 0x68, 0x0c, 0x0c, 0x27,
|
||||
0x70, 0x50, 0x72, 0x71, 0x54, 0x54, 0x14, 0x56, 0x40, 0x21, 0x22, 0x33, 0x44, 0x79, 0x2e, 0x57,
|
||||
0x00, 0x01, 0x80, 0x81, 0x84, 0x85, 0x84, 0x01, 0x88, 0x81, 0x8a, 0x8b, 0x80, 0x80, 0x02, 0x06,
|
||||
0x10, 0x90, 0x12, 0x80, 0x94, 0x80, 0x80, 0x11, 0x88, 0x09, 0x90, 0x19, 0x0c, 0x11, 0x06, 0x13,
|
||||
0xa0, 0x21, 0xa2, 0x21, 0xa4, 0x04, 0xa6, 0x24, 0x20, 0xa8, 0x8a, 0xa8, 0xa4, 0x85, 0x06, 0x06,
|
||||
0x10, 0x20, 0xb2, 0xa0, 0x10, 0xb4, 0x12, 0xb6, 0xb8, 0xa0, 0x18, 0x81, 0x24, 0x85, 0xb6, 0x0c,
|
||||
0xc0, 0xc1, 0xc0, 0x01, 0xc0, 0x44, 0x04, 0xc5, 0x08, 0xc0, 0x02, 0x0a, 0x4c, 0xc4, 0x8e, 0x03,
|
||||
0x10, 0xd0, 0x82, 0x90, 0x50, 0x11, 0xd4, 0x11, 0x98, 0x88, 0x12, 0x53, 0xd4, 0x81, 0xc4, 0xd4,
|
||||
0x20, 0x20, 0x62, 0xe2, 0x24, 0x85, 0xa6, 0xe5, 0x68, 0x69, 0xc0, 0xe9, 0xa0, 0xe9, 0x6c, 0x43,
|
||||
0x70, 0x71, 0x60, 0xf1, 0x94, 0x31, 0xf2, 0xc5, 0xf0, 0xc9, 0x8a, 0x79, 0x18, 0x25, 0x68, 0xf6,
|
||||
0x100, 0x01, 0x02, 0x100, 0x04, 0x01, 0x02, 0x05, 0x100, 0x08, 0x08, 0x100, 0x10c, 0x05, 0x04, 0x107,
|
||||
0x110, 0x11, 0x110, 0x12, 0x10, 0x105, 0x100, 0x12, 0x100, 0x119, 0x0a, 0x119, 0x11c, 0x14, 0x1a, 0x10f,
|
||||
0x20, 0x01, 0x02, 0x22, 0x24, 0x04, 0x24, 0x05, 0x100, 0x01, 0x120, 0x128, 0x28, 0x12c, 0x126, 0x2d,
|
||||
0x110, 0x10, 0x122, 0x130, 0x104, 0x14, 0x14, 0x117, 0x100, 0x09, 0x138, 0x39, 0x0c, 0x09, 0x12e, 0x13c,
|
||||
0x100, 0x40, 0x40, 0x02, 0x40, 0x141, 0x04, 0x107, 0x48, 0x108, 0x08, 0x140, 0x04, 0x140, 0x10e, 0x42,
|
||||
0x50, 0x141, 0x102, 0x52, 0x150, 0x114, 0x54, 0x45, 0x10, 0x101, 0x12, 0x153, 0x54, 0x101, 0x44, 0x5a,
|
||||
0x160, 0x161, 0x42, 0x101, 0x164, 0x105, 0x64, 0x65, 0x20, 0x121, 0x168, 0x10b, 0x10c, 0x10d, 0x120, 0x6a,
|
||||
0x100, 0x101, 0x22, 0x103, 0x54, 0x31, 0x14, 0x33, 0x158, 0x101, 0x50, 0x72, 0x74, 0x105, 0x7a, 0x150,
|
||||
0x80, 0x180, 0x82, 0x103, 0x184, 0x85, 0x100, 0x107, 0x80, 0x89, 0x8a, 0x09, 0x04, 0x101, 0x10e, 0x103,
|
||||
0x180, 0x90, 0x100, 0x11, 0x194, 0x190, 0x12, 0x107, 0x118, 0x11, 0x12, 0x09, 0x14, 0x09, 0x118, 0x11c,
|
||||
0x1a0, 0xa0, 0x1a2, 0x120, 0x1a4, 0x185, 0x126, 0x127, 0x1a0, 0x1a8, 0x8a, 0x123, 0x1a4, 0x18d, 0x2a, 0x22,
|
||||
0x80, 0x81, 0x1b0, 0x11, 0x94, 0x1b4, 0x32, 0x25, 0x120, 0xa0, 0x28, 0x8b, 0x120, 0x39, 0x12e, 0x13c,
|
||||
0x1c0, 0x1c0, 0x82, 0x41, 0x44, 0x180, 0x106, 0xc5, 0x100, 0x88, 0x180, 0x42, 0x1c4, 0xcd, 0xc4, 0x1c4,
|
||||
0x90, 0x90, 0x1c0, 0x103, 0xd4, 0x180, 0x110, 0x52, 0x50, 0x49, 0x52, 0x158, 0x180, 0xd5, 0x1c4, 0x4d,
|
||||
0x40, 0x101, 0x102, 0x21, 0x44, 0xc5, 0x1e4, 0xe2, 0x88, 0x1a1, 0x42, 0x22, 0x24, 0xac, 0x1a0, 0x127,
|
||||
0x50, 0x41, 0x112, 0xf2, 0x180, 0xc0, 0x1d6, 0x1b0, 0x50, 0x51, 0x32, 0x160, 0x74, 0x1bc, 0x1b0, 0x16f };
|
||||
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue