Upstream version 2.04 (rc)

pull/2/head
Stelios Bounanos 2007-10-29 03:15:22 +00:00
rodzic c222a66005
commit 2dab69f7a0
30 zmienionych plików z 495 dodań i 218 usunięć

Wyświetl plik

@ -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 \

Wyświetl plik

@ -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();
}

Wyświetl plik

@ -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");

Wyświetl plik

@ -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

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;

Wyświetl plik

@ -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("");
}

Wyświetl plik

@ -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;

Wyświetl plik

@ -91,6 +91,9 @@ struct configuration {
bool viewXmtSignal;
bool sendid;
bool macroid;
bool sendtextid;
string strTextid;
bool macrotextid;
int QRZ;
string QRZusername;
string QRZuserpassword;

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;

Wyświetl plik

@ -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

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;

Wyświetl plik

@ -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;

Wyświetl plik

@ -35,8 +35,6 @@
#include "globals.h"
#include "fl_digi.h"
// ----------------------------------------------------------------------------
extern void trx_start_modem(modem *);

Wyświetl plik

@ -2,6 +2,6 @@
#define _VERSION_H
#define FLDIGI_NAME "fldigi"
#define FLDIGI_VERSION "2.03"
#define FLDIGI_VERSION "2.04"
#endif

Wyświetl plik

@ -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";

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);

Wyświetl plik

@ -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");

Wyświetl plik

@ -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\

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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)

Wyświetl plik

@ -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;

Wyświetl plik

@ -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 };