kopia lustrzana https://github.com/jamescoxon/dl-fldigi
modem timing test
* read timing factors for string transmission by external program using new xmlrpc query - main.get_tx_timing respone - #samples: samplerate: transmit_time (secs) * read char rate table using external xmlrpc query - main.get_char_rates table structure char, ascii-rep', #samples, samplerate, transmit_time (secs) * added hidden macro <CPS_TEST> which simulates transmission of test string and measures the character per second rate for the modem in use. - <CPS_TEST> uses internal "Jabberwocky" string - <CPS_FILE:[full pathname to file]> uses external text file - <CPS_STRING:ascii text string...> - produces report similar to: CPS test text: /home/dave/dev.git/all.git/pskr-tests/paris.txt mode: PSK-500R # chars: 2400 xmt time: 56.580000 data time: 52.480000 data samples: 419840 sample rate: 8000 chars/sec: 45.731707 ~WPM: 457.317073 * Allow writing wav file during timing test * High Speed WAV - Add macros to enable writing WAV file in at maximum character throughput. - disables codec output - use this for creating wav test files * Suppress waterfall display for CPS and WAV tests * Remove PSK printf debug statements * Fix MFSK xmt 0x05 --> 0x04 during CPS testingpull/1/head
rodzic
2ca21dd9bb
commit
678f66b460
|
@ -48,6 +48,7 @@
|
|||
#include "status.h"
|
||||
#include "debug.h"
|
||||
#include "FTextRXTX.h"
|
||||
#include "modem.h"
|
||||
|
||||
#include "qrunner.h"
|
||||
|
||||
|
@ -181,6 +182,10 @@ void cw::tx_init(SoundBase *sc)
|
|||
phaseacc = 0;
|
||||
lastsym = 0;
|
||||
qskphase = 0;
|
||||
|
||||
symbols = 0;
|
||||
acc_symbols = 0;
|
||||
ovhd_symbols = 0;
|
||||
}
|
||||
|
||||
void cw::rx_init()
|
||||
|
@ -952,6 +957,8 @@ void cw::send_symbol(int bits, int len)
|
|||
float dsymlen = 0.0;
|
||||
int currsym = bits & 1;
|
||||
|
||||
acc_symbols += len;
|
||||
|
||||
freq = get_txfreq_woffset();
|
||||
|
||||
delta = (int) (len * (progdefaults.CWweight - 50) / 100.0);
|
||||
|
@ -1193,11 +1200,20 @@ int cw::tx_process()
|
|||
|
||||
c = get_tx_char();
|
||||
if (c == GET_TX_CHAR_ETX || stopflag) {
|
||||
// send_symbol(0, symbollen);
|
||||
stopflag = false;
|
||||
return -1;
|
||||
}
|
||||
acc_symbols = 0;
|
||||
send_ch(c);
|
||||
|
||||
xmt_samples = char_samples = acc_symbols;
|
||||
|
||||
printf("%5s %d samples, overhead %d, %f sec's\n",
|
||||
ascii3[c & 0xff],
|
||||
char_samples,
|
||||
ovhd_samples,
|
||||
1.0 * char_samples / samplerate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@ using namespace std;
|
|||
#include "debug.h"
|
||||
#include "synop.h"
|
||||
#include "main.h"
|
||||
#include "modem.h"
|
||||
|
||||
#define FILTER_DEBUG 0
|
||||
|
||||
|
@ -85,6 +86,10 @@ void rtty::tx_init(SoundBase *sc)
|
|||
phaseacc = 0;
|
||||
preamble = true;
|
||||
videoText();
|
||||
|
||||
symbols = 0;
|
||||
acc_symbols = 0;
|
||||
ovhd_symbols = 0;
|
||||
}
|
||||
|
||||
// Customizes output of Synop decoded data.
|
||||
|
@ -728,10 +733,13 @@ if (mnum < 2 * filter_length)
|
|||
// this makes the scope looking a little bit nicer, too...
|
||||
// aka: less noisy...
|
||||
if( abs(zp_mark[i]) > abs(zp_space[i]) ) {
|
||||
xy.imag( xy.imag() * abs(zp_space[i])/abs(zp_mark[i]) );
|
||||
// note ox x complex lib does not support xy.real(double) or xy.imag(double)
|
||||
xy = cmplx( xy.real(),
|
||||
xy.imag() * abs(zp_space[i])/abs(zp_mark[i]) );
|
||||
// xy.imag() *= abs(zp_space[i])/abs(zp_mark[i]);
|
||||
} else {
|
||||
xy.real( xy.real() / ( abs(zp_space[i])/abs(zp_mark[i]) ) );
|
||||
xy = cmplx( xy.real() / ( abs(zp_space[i])/abs(zp_mark[i]) ),
|
||||
xy.imag() );
|
||||
// xy.real() /= abs(zp_space[i])/abs(zp_mark[i]);
|
||||
}
|
||||
|
||||
|
@ -854,6 +862,7 @@ double rtty::FSKnco()
|
|||
|
||||
void rtty::send_symbol(int symbol, int len)
|
||||
{
|
||||
acc_symbols += len;
|
||||
#if 0
|
||||
double freq;
|
||||
|
||||
|
@ -1060,7 +1069,16 @@ int rtty::tx_process()
|
|||
|
||||
// if NOT Baudot
|
||||
if (nbits != 5) {
|
||||
///
|
||||
acc_symbols = 0;
|
||||
send_char(c);
|
||||
xmt_samples = char_samples = acc_symbols;
|
||||
|
||||
printf("%5s %d samples, overhead %d, %f sec's\n",
|
||||
ascii3[c & 0xff],
|
||||
char_samples,
|
||||
ovhd_samples,
|
||||
1.0 * char_samples / samplerate);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1118,8 +1136,16 @@ int rtty::tx_process()
|
|||
txmode = FIGURES;
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
acc_symbols = 0;
|
||||
send_char(c & 0x1F);
|
||||
xmt_samples = char_samples = acc_symbols;
|
||||
|
||||
printf("%5s %d samples, overhead %d, %f sec's\n",
|
||||
ascii3[c & 0xff],
|
||||
char_samples,
|
||||
ovhd_samples,
|
||||
1.0 * char_samples / samplerate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -8877,7 +8877,7 @@ nce.\nYou may change the state from either location.\n..."));
|
|||
mnuWavSampleRate->down_box(FL_BORDER_BOX);
|
||||
mnuWavSampleRate->callback((Fl_Callback*)cb_mnuWavSampleRate);
|
||||
mnuWavSampleRate->align(Fl_Align(FL_ALIGN_TOP_LEFT));
|
||||
o->add("22050|24000|44100|48000");
|
||||
o->add("8000|11025|16000|22050|24000|44100|48000");
|
||||
o->value(progdefaults.wavSampleRate);
|
||||
} // Fl_Choice* mnuWavSampleRate
|
||||
tabWavFile->end();
|
||||
|
|
|
@ -4927,7 +4927,7 @@ if (o->value()) {
|
|||
callback {progdefaults.wavSampleRate = o->value();
|
||||
progdefaults.changed = true;} open
|
||||
tooltip {Pick baud rate from list} xywh {60 96 150 24} down_box BORDER_BOX align 5
|
||||
code0 {o->add("22050|24000|44100|48000");}
|
||||
code0 {o->add("8000|11025|16000|22050|24000|44100|48000");}
|
||||
code1 {o->value(progdefaults.wavSampleRate);}
|
||||
} {}
|
||||
}
|
||||
|
|
|
@ -6522,6 +6522,11 @@ int get_tx_char(void)
|
|||
if (macro_idle_on) { return GET_TX_CHAR_NODATA; }
|
||||
if (idling) { return GET_TX_CHAR_NODATA; }
|
||||
|
||||
if (xmltest_char_available) {
|
||||
num_cps_chars++;
|
||||
return xmltest_char();
|
||||
}
|
||||
|
||||
if (arq_text_available) {
|
||||
char character = (arq_get_char() & 0xFF);
|
||||
if (character == 0x03) {
|
||||
|
@ -6564,6 +6569,10 @@ int get_tx_char(void)
|
|||
|
||||
c = TransmitText->nextChar();
|
||||
|
||||
if (c == GET_TX_CHAR_ETX) {
|
||||
return c;
|
||||
}
|
||||
|
||||
if (c == '^' && state == STATE_CHAR) {
|
||||
state = STATE_CTRL;
|
||||
c = TransmitText->nextChar();
|
||||
|
@ -6643,7 +6652,10 @@ int get_tx_char(void)
|
|||
|
||||
void put_echo_char(unsigned int data, int style)
|
||||
{
|
||||
trx_mode mode = active_modem->get_mode();
|
||||
// suppress print to rx widget when making timing tests
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) return;
|
||||
|
||||
trx_mode mode = active_modem->get_mode();
|
||||
|
||||
if (mode == MODE_CW && progdefaults.QSKadjust)
|
||||
return;
|
||||
|
@ -6659,6 +6671,8 @@ void put_echo_char(unsigned int data, int style)
|
|||
asc = ascii2;
|
||||
else if (mode == MODE_RTTY || mode == MODE_CW)
|
||||
asc = ascii;
|
||||
else if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)
|
||||
asc = ascii3;
|
||||
|
||||
// assign a style to the data
|
||||
if (asc == ascii2 && iscntrl(data))
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
extern const char *ascii[];
|
||||
extern const char *ascii2[];
|
||||
extern const char *ascii3[];
|
||||
|
||||
#define SOH 0x01 // SOH ascii character
|
||||
#define EOT 0x04 // EOT ascii character
|
||||
|
|
|
@ -1058,8 +1058,9 @@
|
|||
0) \
|
||||
ELEM_(int, wavSampleRate, "WAV_SAMPLERATE", \
|
||||
"Wave file record sample rate\n" \
|
||||
"0 - 22050, 1 - 24000, 2 - 44100, 3 - 48000", \
|
||||
3) \
|
||||
"0 - 8000, 1 - 11025, 2 - 16000, 3 - 22050\n" \
|
||||
"4 - 24000, 5 - 44100, 6 - 48000", \
|
||||
0) \
|
||||
ELEM_(bool, loop_playback, "LOOPPLAYBACK", \
|
||||
"true = continuous loop of sound file playback\n" \
|
||||
"false = single pass through playback file.", \
|
||||
|
|
|
@ -8,6 +8,12 @@
|
|||
#define MAXKEYROWS 4
|
||||
#define MAXMACROS (MAXKEYROWS * NUMMACKEYS)
|
||||
|
||||
extern void CPS_report(int);
|
||||
extern bool PERFORM_CPS_TEST;
|
||||
extern int num_cps_chars;
|
||||
extern struct timeval tv_cps_start;
|
||||
|
||||
|
||||
struct CONTESTCNTR {
|
||||
int count;
|
||||
char szCount[20];
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "digiscope.h"
|
||||
#include "globals.h"
|
||||
#include "morse.h"
|
||||
#include "ascii.h"
|
||||
|
||||
#define OUTBUFSIZE 16384
|
||||
// Constants for signal searching & s/n threshold
|
||||
|
@ -23,6 +24,9 @@ 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;
|
||||
|
@ -187,6 +191,20 @@ private:
|
|||
|
||||
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;
|
||||
|
|
|
@ -63,8 +63,7 @@ private:
|
|||
unsigned int shreg;
|
||||
//FEC: 2nd stream
|
||||
unsigned int shreg2;
|
||||
int numinterleavers; //interleaver size (speed dependant)
|
||||
double numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR
|
||||
int numinterleavers; //interleaver size (speed dependant)
|
||||
double inter_carrier; // Frequency gap betweeb carriers
|
||||
|
||||
// rx variables & functions
|
||||
|
@ -141,11 +140,11 @@ private:
|
|||
|
||||
// cmplx thirdorder;
|
||||
// tx variables & functions
|
||||
int accumulated_bits; //JD for multiple carriers
|
||||
int txsymbols[MAX_CARRIERS];
|
||||
int txsymbols[MAX_CARRIERS];
|
||||
|
||||
double *tx_shape;
|
||||
int preamble;
|
||||
void tx_carriers();
|
||||
void tx_symbol(int sym);
|
||||
void tx_bit(int bit);
|
||||
void tx_char(unsigned char c);
|
||||
|
@ -177,6 +176,7 @@ public:
|
|||
int tx_process();
|
||||
void searchDown();
|
||||
void searchUp();
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define XMLRPC_H
|
||||
|
||||
#include <iosfwd>
|
||||
#include <string>
|
||||
|
||||
class XmlRpcImpl;
|
||||
|
||||
|
@ -25,6 +26,8 @@ private:
|
|||
XmlRpcImpl* server_impl;
|
||||
};
|
||||
|
||||
void xmlrpc_set_qsy(long long rfc);
|
||||
|
||||
extern void xmlrpc_set_qsy(long long rfc);
|
||||
extern int xmltest_char();
|
||||
extern bool xmltest_char_available;
|
||||
extern int number_of_samples(std::string s);
|
||||
#endif // XMLRPC_H
|
||||
|
|
|
@ -1069,6 +1069,15 @@ int mfsk::tx_process()
|
|||
case TX_STATE_DATA:
|
||||
xmtbyte = get_tx_char();
|
||||
|
||||
if(active_modem->XMLRPC_CPS_TEST) {
|
||||
if(startpic) startpic = false;
|
||||
if(xmtbyte == 0x05) {
|
||||
sendchar(0x04); // 0x4 has the same symbol count as 0x5
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (xmtbyte == 0x05 || startpic == true) {
|
||||
put_status("Tx pic: start");
|
||||
int len = (int)strlen(picheader);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
// Copyright (C) 2006
|
||||
// Dave Freese, W1HKJ
|
||||
//
|
||||
// This file is part of fldigi. Adapted from code contained in gmfsk source code
|
||||
// This file is part of fldigi. Adapted from code contained in gmfsk source code
|
||||
// distribution.
|
||||
// gmfsk Copyright (C) 2001, 2002, 2003
|
||||
// Tomi Manninen (oh2bns@sral.fi)
|
||||
|
@ -32,36 +32,36 @@
|
|||
const char *ascii[256] = {
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"\b", "\t", "\n", "",
|
||||
"\b", "\t", "\n", "",
|
||||
"", "\r", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
"", "", "", "",
|
||||
" ", "!", "\"", "#",
|
||||
"$", "%", "&", "\'",
|
||||
"(", ")", "*", "+",
|
||||
",", "-", ".", "/",
|
||||
"0", "1", "2", "3",
|
||||
"4", "5", "6", "7",
|
||||
"8", "9", ":", ";",
|
||||
"<", "=", ">", "?",
|
||||
"@", "A", "B", "C",
|
||||
"D", "E", "F", "G",
|
||||
"H", "I", "J", "K",
|
||||
"L", "M", "N", "O",
|
||||
"P", "Q", "R", "S",
|
||||
"T", "U", "V", "W",
|
||||
"X", "Y", "Z", "[",
|
||||
"\\", "]", "^", "_",
|
||||
"`", "a", "b", "c",
|
||||
"d", "e", "f", "g",
|
||||
"h", "i", "j", "k",
|
||||
"l", "m", "n", "o",
|
||||
"p", "q", "r", "s",
|
||||
"t", "u", "v", "w",
|
||||
"x", "y", "z", "{",
|
||||
"|", "}", "~", ""
|
||||
" ", "!", "\"", "#",
|
||||
"$", "%", "&", "\'",
|
||||
"(", ")", "*", "+",
|
||||
",", "-", ".", "/",
|
||||
"0", "1", "2", "3",
|
||||
"4", "5", "6", "7",
|
||||
"8", "9", ":", ";",
|
||||
"<", "=", ">", "?",
|
||||
"@", "A", "B", "C",
|
||||
"D", "E", "F", "G",
|
||||
"H", "I", "J", "K",
|
||||
"L", "M", "N", "O",
|
||||
"P", "Q", "R", "S",
|
||||
"T", "U", "V", "W",
|
||||
"X", "Y", "Z", "[",
|
||||
"\\", "]", "^", "_",
|
||||
"`", "a", "b", "c",
|
||||
"d", "e", "f", "g",
|
||||
"h", "i", "j", "k",
|
||||
"l", "m", "n", "o",
|
||||
"p", "q", "r", "s",
|
||||
"t", "u", "v", "w",
|
||||
"x", "y", "z", "{",
|
||||
"|", "}", "~", "",
|
||||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
|
||||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
|
||||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
|
||||
|
@ -75,36 +75,36 @@ const char *ascii[256] = {
|
|||
const char *ascii2[256] = {
|
||||
"<NUL>", "<SOH>", "<STX>", "<ETX>",
|
||||
"<EOT>", "<ENQ>", "<ACK>", "<BEL>",
|
||||
"\b", "\t", "\n", "<VT>",
|
||||
"\b", "\t", "\n", "<VT>",
|
||||
"<FF>", "\r", "<SO>", "<SI>",
|
||||
"<DLE>", "<DC1>", "<DC2>", "<DC3>",
|
||||
"<DC4>", "<NAK>", "<SYN>", "<ETB>",
|
||||
"<CAN>", "<EM>", "<SUB>", "<ESC>",
|
||||
"<FS>", "<GS>", "<RS>", "<US>",
|
||||
" ", "!", "\"", "#",
|
||||
"$", "%", "&", "\'",
|
||||
"(", ")", "*", "+",
|
||||
",", "-", ".", "/",
|
||||
"0", "1", "2", "3",
|
||||
"4", "5", "6", "7",
|
||||
"8", "9", ":", ";",
|
||||
"<", "=", ">", "?",
|
||||
"@", "A", "B", "C",
|
||||
"D", "E", "F", "G",
|
||||
"H", "I", "J", "K",
|
||||
"L", "M", "N", "O",
|
||||
"P", "Q", "R", "S",
|
||||
"T", "U", "V", "W",
|
||||
"X", "Y", "Z", "[",
|
||||
"\\", "]", "^", "_",
|
||||
"`", "a", "b", "c",
|
||||
"d", "e", "f", "g",
|
||||
"h", "i", "j", "k",
|
||||
"l", "m", "n", "o",
|
||||
"p", "q", "r", "s",
|
||||
"t", "u", "v", "w",
|
||||
"x", "y", "z", "{",
|
||||
"|", "}", "~", "<DEL>"
|
||||
" ", "!", "\"", "#",
|
||||
"$", "%", "&", "\'",
|
||||
"(", ")", "*", "+",
|
||||
",", "-", ".", "/",
|
||||
"0", "1", "2", "3",
|
||||
"4", "5", "6", "7",
|
||||
"8", "9", ":", ";",
|
||||
"<", "=", ">", "?",
|
||||
"@", "A", "B", "C",
|
||||
"D", "E", "F", "G",
|
||||
"H", "I", "J", "K",
|
||||
"L", "M", "N", "O",
|
||||
"P", "Q", "R", "S",
|
||||
"T", "U", "V", "W",
|
||||
"X", "Y", "Z", "[",
|
||||
"\\", "]", "^", "_",
|
||||
"`", "a", "b", "c",
|
||||
"d", "e", "f", "g",
|
||||
"h", "i", "j", "k",
|
||||
"l", "m", "n", "o",
|
||||
"p", "q", "r", "s",
|
||||
"t", "u", "v", "w",
|
||||
"x", "y", "z", "{",
|
||||
"|", "}", "~", "<DEL>",
|
||||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
|
||||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
|
||||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
|
||||
|
@ -114,3 +114,38 @@ const char *ascii2[256] = {
|
|||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
|
||||
"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"
|
||||
};
|
||||
|
||||
const char *ascii3[256] = {
|
||||
"<NUL>", "<SOH>", "<STX>", "<ETX>", "<EOT>", "<ENQ>", "<ACK>", "<BEL>",
|
||||
"<BS>", "<TAB>", "<LF>", "<VT>", "<FF>", "<CR>", "<SO>", "<SI>",
|
||||
"<DLE>", "<DC1>", "<DC2>", "<DC3>", "<DC4>", "<NAK>", "<SYN>", "<ETB>",
|
||||
"<CAN>", "<EM>", "<SUB>", "<ESC>", "<FS>", "<GS>", "<RS>", "<US>",
|
||||
" ", "!", "\"", "#", "$", "%", "&", "\'",
|
||||
"(", ")", "*", "+", ",", "-", ".", "/",
|
||||
"0", "1", "2", "3", "4", "5", "6", "7",
|
||||
"8", "9", ":", ";", "<", "=", ">", "?",
|
||||
"@", "A", "B", "C", "D", "E", "F", "G",
|
||||
"H", "I", "J", "K", "L", "M", "N", "O",
|
||||
"P", "Q", "R", "S", "T", "U", "V", "W",
|
||||
"X", "Y", "Z", "[", "\\", "]", "^", "_",
|
||||
"`", "a", "b", "c", "d", "e", "f", "g",
|
||||
"h", "i", "j", "k", "l", "m", "n", "o",
|
||||
"p", "q", "r", "s", "t", "u", "v", "w",
|
||||
"x", "y", "z", "{", "|", "}", "~", "<DEL>",
|
||||
"<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>",
|
||||
"<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>",
|
||||
"<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>",
|
||||
"<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>",
|
||||
"<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>",
|
||||
"<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>",
|
||||
"<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>",
|
||||
"<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>",
|
||||
"<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>",
|
||||
"<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>",
|
||||
"<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>",
|
||||
"<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>",
|
||||
"<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>",
|
||||
"<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>",
|
||||
"<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>",
|
||||
"<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>"
|
||||
};
|
||||
|
|
|
@ -199,6 +199,16 @@ void loadBrowser(Fl_Widget *widget) {
|
|||
w->add(LINE_SEP);
|
||||
w->add(_("<COMMENT:comment text>\tignore all comment text"));
|
||||
|
||||
w->add(LINE_SEP);
|
||||
w->add(_("<CPS_TEST>\tmodem timing test internal string"));
|
||||
w->add(_("<CPS_FILE:>\tmodem timing test, spec' file"));
|
||||
w->add(_("<CPS_STRING:s>\tmodem timing test, string 's'"));
|
||||
|
||||
w->add(LINE_SEP);
|
||||
w->add(_("<WAV_TEST>\tWAV file; internal string"));
|
||||
w->add(_("<WAV_FILE:>\tWAV file; spec' file"));
|
||||
w->add(_("<WAV_STRING:s>\tWAV file; string 's'"));
|
||||
|
||||
w->add(LINE_SEP);
|
||||
assert(MODE_CONTESTIA < MODE_OLIVIA);
|
||||
char s[256];
|
||||
|
@ -318,6 +328,14 @@ void cbInsertMacro(Fl_Widget *, void *)
|
|||
text.insert(6, p);
|
||||
} else
|
||||
text = "";
|
||||
} else if ((text == "<CPS_FILE:>") || (text == "<WAV_FILE:>")) {
|
||||
string filters = "Text\t*." "txt";
|
||||
const char* p = FSEL::select(_("Test text file"), filters.c_str(),
|
||||
"text." "txt");
|
||||
if (p) {
|
||||
text.insert(10, p);
|
||||
} else
|
||||
text = "";
|
||||
} else if (text == "<IMAGE:>") {
|
||||
string filters = "Text\t*." "txt";
|
||||
const char *p = FSEL::select(_("MFSK image file"), "*.{png,jpg,bmp}\t*", "");
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
// ----------------------------------------------------------------------------
|
||||
|
||||
#include <config.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "macros.h"
|
||||
|
||||
|
@ -51,6 +52,7 @@
|
|||
#include "icons.h"
|
||||
#include "weather.h"
|
||||
#include "utf8file_io.h"
|
||||
#include "xmlrpc.h"
|
||||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/filename.H>
|
||||
|
@ -132,6 +134,343 @@ static size_t mystrftime( char *s, size_t max, const char *fmt, const struct tm
|
|||
return strftime(s, max, fmt, tm);
|
||||
}
|
||||
|
||||
static string CPSstring = "\
|
||||
=============================================\n\
|
||||
ABCDEFGHIJKLMN OPQRSTUVWXYZ\n\
|
||||
abcdefghijklmn opqrstuvwxyz\n\
|
||||
0123456789 9876543210\n\
|
||||
!@#$%&*()_+-=[]{}\\|;:'\",.<>/?\n\
|
||||
=============================================\n\
|
||||
\n\
|
||||
The Jaberwocky\n\
|
||||
\n\
|
||||
'Twas brillig, and the slithy toves\n\
|
||||
Did gyre and gimble in the wabe;\n\
|
||||
All mimsy were the borogoves,\n\
|
||||
And the mome raths outgrabe.\n\
|
||||
\n\
|
||||
\"Beware the Jabberwock, my son!\n\
|
||||
The jaws that bite, the claws that catch!\n\
|
||||
Beware the Jubjub bird, and shun\n\
|
||||
The frumious Bandersnatch!\"\n\
|
||||
\n\
|
||||
He took his vorpal sword in hand:\n\
|
||||
Long time the manxome foe he sought-\n\
|
||||
So rested he by the Tumtum tree,\n\
|
||||
And stood awhile in thought.\n\
|
||||
\n\
|
||||
And as in uffish thought he stood,\n\
|
||||
The Jabberwock, with eyes of flame,\n\
|
||||
Came whiffling through the tulgey wood,\n\
|
||||
And burbled as it came!\n\
|
||||
\n\
|
||||
One, two! One, two! and through and through\n\
|
||||
The vorpal blade went snicker-snack!\n\
|
||||
He left it dead, and with its head\n\
|
||||
He went galumphing back.\n\
|
||||
\n\
|
||||
\"And hast thou slain the Jabberwock?\n\
|
||||
Come to my arms, my beamish boy!\n\
|
||||
O frabjous day! Callooh! Callay!\"\n\
|
||||
He chortled in his joy.\n\
|
||||
\n\
|
||||
'Twas brillig, and the slithy toves\n\
|
||||
Did gyre and gimble in the wabe;\n\
|
||||
All mimsy were the borogoves,\n\
|
||||
And the mome raths outgrabe.\n";
|
||||
|
||||
bool PERFORM_CPS_TEST = false;
|
||||
int num_cps_chars = 0;
|
||||
string testfilename;
|
||||
|
||||
void CPS_report(int samples, int prepost)
|
||||
{
|
||||
char results[1000];
|
||||
double xmttime = 1.0 * samples / active_modem->get_samplerate();
|
||||
double datatime = 1.0 * (samples - prepost) / active_modem->get_samplerate();
|
||||
num_cps_chars--;
|
||||
snprintf(results, sizeof(results), "\n\
|
||||
CPS test\n\
|
||||
text: %s\n\
|
||||
mode: %s\n\
|
||||
# chars: %d\n\
|
||||
xmt time: %f\n\
|
||||
data time: %f\n\
|
||||
xmt samples: %d\n\
|
||||
prepost: %d\n\
|
||||
data samples: %d\n\
|
||||
sample rate: %d\n\
|
||||
chars/sec: %f\n\
|
||||
~WPM: %f\n",
|
||||
testfilename.c_str(),
|
||||
mode_info[active_modem->get_mode()].name,
|
||||
num_cps_chars,
|
||||
xmttime,
|
||||
datatime,
|
||||
samples,
|
||||
prepost,
|
||||
samples - prepost,
|
||||
active_modem->get_samplerate(),
|
||||
num_cps_chars / datatime,
|
||||
10 * num_cps_chars / datatime);
|
||||
|
||||
ReceiveText->add(results, FTextBase::ALTR);
|
||||
LOG_INFO("%s", results);
|
||||
PERFORM_CPS_TEST = false;
|
||||
}
|
||||
|
||||
static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket)
|
||||
{
|
||||
s.clear();
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ||
|
||||
id == MODE_SITORB || id == MODE_NAVTEX ) {
|
||||
ReceiveText->add("Mode not supported\n", FTextBase::ALTR);
|
||||
return;
|
||||
}
|
||||
testfilename = "internal string";
|
||||
|
||||
stopMacroTimer();
|
||||
active_modem->set_stopflag(false);
|
||||
PERFORM_CPS_TEST = true;
|
||||
trx_transmit();
|
||||
|
||||
int s0 = number_of_samples("");
|
||||
int s1 = 0;
|
||||
int start_stop_samples = 0;
|
||||
int j = 0;
|
||||
for(j = 1; j < 32; j++) {
|
||||
s1 = number_of_samples(string(j, 'e'));
|
||||
if(s1 > s0) break;
|
||||
}
|
||||
start_stop_samples = 2*s0 - s1;
|
||||
|
||||
num_cps_chars = 0;
|
||||
CPS_report(number_of_samples(CPSstring), start_stop_samples);
|
||||
PERFORM_CPS_TEST = false;
|
||||
|
||||
}
|
||||
|
||||
static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket)
|
||||
{
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ||
|
||||
id == MODE_SITORB || id == MODE_NAVTEX ) {
|
||||
ReceiveText->add("Mode not supported\n", FTextBase::ALTR);
|
||||
s.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string fname = s.substr(i+10, endbracket - i - 10);
|
||||
if (fname.length() > 0 && !within_exec) {
|
||||
FILE *toadd = fopen(fname.c_str(), "r");
|
||||
if (toadd) {
|
||||
std::string buffer;
|
||||
char c = getc(toadd);
|
||||
while (c && !feof(toadd)) {
|
||||
if (c != '\r') buffer += c; // damn MSDOS txt files
|
||||
c = getc(toadd);
|
||||
}
|
||||
s.clear();
|
||||
fclose(toadd);
|
||||
TransmitText->clear();
|
||||
testfilename = fname;
|
||||
|
||||
stopMacroTimer();
|
||||
active_modem->set_stopflag(false);
|
||||
PERFORM_CPS_TEST = true;
|
||||
trx_transmit();
|
||||
|
||||
int s0 = number_of_samples("");
|
||||
int s1 = 0;
|
||||
int start_stop_samples = 0;
|
||||
int j = 0;
|
||||
for(j = 1; j < 32; j++) {
|
||||
s1 = number_of_samples(string(j, 'e'));
|
||||
if(s1 > s0) break;
|
||||
}
|
||||
start_stop_samples = 2*s0 - s1;
|
||||
|
||||
num_cps_chars = 0;
|
||||
CPS_report(number_of_samples(buffer), start_stop_samples);
|
||||
PERFORM_CPS_TEST = false;
|
||||
|
||||
} else {
|
||||
string resp = "Could not locate ";
|
||||
resp.append(fname).append("\n");
|
||||
ReceiveText->add(resp.c_str(), FTextBase::ALTR);
|
||||
LOG_WARN("%s not found", fname.c_str());
|
||||
s.replace(i, endbracket - i + 1, "");
|
||||
PERFORM_CPS_TEST = false;
|
||||
}
|
||||
} else {
|
||||
PERFORM_CPS_TEST = false;
|
||||
s.clear();
|
||||
}
|
||||
}
|
||||
|
||||
static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket)
|
||||
{
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ||
|
||||
id == MODE_SITORB || id == MODE_NAVTEX ) {
|
||||
ReceiveText->add("Mode not supported\n", FTextBase::ALTR);
|
||||
s.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string buffer = s.substr(i+12, endbracket - i - 12);
|
||||
std::string txtbuf = buffer;
|
||||
s.clear();
|
||||
size_t p = buffer.find("\\n");
|
||||
while (p != string::npos) {
|
||||
buffer.replace(p,2,"\n");
|
||||
p = buffer.find("\\n");
|
||||
}
|
||||
if (buffer.length()) {
|
||||
TransmitText->clear();
|
||||
|
||||
stopMacroTimer();
|
||||
active_modem->set_stopflag(false);
|
||||
PERFORM_CPS_TEST = true;
|
||||
trx_transmit();
|
||||
|
||||
int s0 = number_of_samples("");
|
||||
printf("j %d: s %d\n", 0, s0);
|
||||
int s1 = 0;
|
||||
int start_stop_samples = 0;
|
||||
int j = 0;
|
||||
for(j = 1; j < 32; j++) {
|
||||
s1 = number_of_samples(string(j, 'e'));
|
||||
printf("j %d: s %d\n", j, s1);
|
||||
if(s1 > s0) break;
|
||||
}
|
||||
start_stop_samples = 2*s0 - s1;
|
||||
|
||||
num_cps_chars = 0;
|
||||
testfilename = txtbuf;
|
||||
CPS_report(number_of_samples(buffer), start_stop_samples);
|
||||
PERFORM_CPS_TEST = false;
|
||||
} else {
|
||||
string resp = "Text not specified";
|
||||
LOG_WARN("%s", resp.c_str());
|
||||
resp.append("\n");
|
||||
ReceiveText->add(resp.c_str(), FTextBase::ALTR);
|
||||
PERFORM_CPS_TEST = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void pWAV_TEST(std::string &s, size_t &i, size_t endbracket)
|
||||
{
|
||||
s.clear();
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ||
|
||||
id == MODE_SITORB || id == MODE_NAVTEX ) {
|
||||
ReceiveText->add("Mode not supported\n", FTextBase::ALTR);
|
||||
return;
|
||||
}
|
||||
testfilename = "internal string";
|
||||
|
||||
stopMacroTimer();
|
||||
active_modem->set_stopflag(false);
|
||||
|
||||
PERFORM_CPS_TEST = true;
|
||||
trx_transmit();
|
||||
number_of_samples(CPSstring);
|
||||
PERFORM_CPS_TEST = false;
|
||||
}
|
||||
|
||||
static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket)
|
||||
{
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ||
|
||||
id == MODE_SITORB || id == MODE_NAVTEX ) {
|
||||
ReceiveText->add("Mode not supported\n", FTextBase::ALTR);
|
||||
s.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string fname = s.substr(i+10, endbracket - i - 10);
|
||||
if (fname.length() > 0 && !within_exec) {
|
||||
FILE *toadd = fopen(fname.c_str(), "r");
|
||||
if (toadd) {
|
||||
std::string buffer;
|
||||
char c = getc(toadd);
|
||||
while (c && !feof(toadd)) {
|
||||
if (c != '\r') buffer += c; // damn MSDOS txt files
|
||||
c = getc(toadd);
|
||||
}
|
||||
s.clear();
|
||||
fclose(toadd);
|
||||
TransmitText->clear();
|
||||
testfilename = fname;
|
||||
|
||||
stopMacroTimer();
|
||||
active_modem->set_stopflag(false);
|
||||
PERFORM_CPS_TEST = true;
|
||||
trx_transmit();
|
||||
|
||||
number_of_samples(buffer);
|
||||
PERFORM_CPS_TEST = false;
|
||||
|
||||
} else {
|
||||
string resp = "Could not locate ";
|
||||
resp.append(fname).append("\n");
|
||||
ReceiveText->add(resp.c_str(), FTextBase::ALTR);
|
||||
LOG_WARN("%s not found", fname.c_str());
|
||||
s.replace(i, endbracket - i + 1, "");
|
||||
PERFORM_CPS_TEST = false;
|
||||
}
|
||||
} else {
|
||||
PERFORM_CPS_TEST = false;
|
||||
s.clear();
|
||||
}
|
||||
}
|
||||
|
||||
static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket)
|
||||
{
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ||
|
||||
id == MODE_SITORB || id == MODE_NAVTEX ) {
|
||||
ReceiveText->add("Mode not supported\n", FTextBase::ALTR);
|
||||
s.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string buffer = s.substr(i+12, endbracket - i - 12);
|
||||
std::string txtbuf = buffer;
|
||||
s.clear();
|
||||
size_t p = buffer.find("\\n");
|
||||
while (p != string::npos) {
|
||||
buffer.replace(p,2,"\n");
|
||||
p = buffer.find("\\n");
|
||||
}
|
||||
if (buffer.length()) {
|
||||
TransmitText->clear();
|
||||
|
||||
stopMacroTimer();
|
||||
active_modem->set_stopflag(false);
|
||||
PERFORM_CPS_TEST = true;
|
||||
trx_transmit();
|
||||
|
||||
testfilename = txtbuf;
|
||||
number_of_samples(buffer);
|
||||
PERFORM_CPS_TEST = false;
|
||||
} else {
|
||||
string resp = "Text not specified";
|
||||
LOG_WARN("%s", resp.c_str());
|
||||
resp.append("\n");
|
||||
ReceiveText->add(resp.c_str(), FTextBase::ALTR);
|
||||
PERFORM_CPS_TEST = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void pCOMMENT(std::string &s, size_t &i, size_t endbracket)
|
||||
{
|
||||
s.replace(i, endbracket - i + 1, "");
|
||||
|
@ -2219,6 +2558,14 @@ static std::string rxcmds = "<!MOD<!WAI<!GOH<!QSY<!GOF<!RIG<!FIL";
|
|||
struct MTAGS { const char *mTAG; void (*fp)(std::string &, size_t&, size_t );};
|
||||
|
||||
static const MTAGS mtags[] = {
|
||||
{"<CPS_FILE:", pCPS_FILE},
|
||||
{"<CPS_STRING:",pCPS_STRING},
|
||||
{"<CPS_TEST", pCPS_TEST},
|
||||
|
||||
{"<WAV_FILE:", pWAV_FILE},
|
||||
{"<WAV_STRING:",pWAV_STRING},
|
||||
{"<WAV_TEST", pWAV_TEST},
|
||||
|
||||
{"<COMMENT:", pCOMMENT},
|
||||
{"<CALL>", pCALL},
|
||||
{"<FREQ>", pFREQ},
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#include "wefax.h"
|
||||
#include "wefax-pic.h"
|
||||
#include "navtex.h"
|
||||
#include "ascii.h"
|
||||
|
||||
#if USE_HAMLIB
|
||||
#include "hamlib.h"
|
||||
|
@ -237,7 +238,7 @@ XML_RPC_Server::XML_RPC_Server()
|
|||
XML_RPC_Server::~XML_RPC_Server()
|
||||
{
|
||||
// run = false;
|
||||
// the xmlrpc server is closed and deleted when
|
||||
// the xmlrpc server is closed and deleted when
|
||||
// XML_RPC_Server::stop();
|
||||
// is called from main
|
||||
// delete methods;
|
||||
|
@ -1565,6 +1566,207 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
static string xmlchars;
|
||||
bool xmltest_char_available;
|
||||
static size_t pxmlchar = 0;
|
||||
int xmltest_char()
|
||||
{
|
||||
if (pxmlchar >= xmlchars.length() ) return -3;
|
||||
return xmlchars[pxmlchar++] & 0xFF;
|
||||
}
|
||||
|
||||
int number_of_samples( string s)
|
||||
{
|
||||
active_modem->XMLRPC_CPS_TEST = true;
|
||||
xmlchars = s;
|
||||
pxmlchar = 0;
|
||||
xmltest_char_available = true;
|
||||
|
||||
active_modem->set_stopflag(false);
|
||||
trx_transmit();
|
||||
|
||||
MilliSleep(10);
|
||||
while(trx_state != STATE_RX) {
|
||||
MilliSleep(10);
|
||||
Fl::awake();
|
||||
}
|
||||
xmltest_char_available = false;
|
||||
active_modem->XMLRPC_CPS_TEST = false;
|
||||
return active_modem->tx_sample_count;
|
||||
}
|
||||
|
||||
class Main_get_char_rates : public xmlrpc_c::method
|
||||
{
|
||||
public:
|
||||
Main_get_char_rates()
|
||||
{
|
||||
_signature = "s:n";
|
||||
_help = "Returns table of char rates.";
|
||||
}
|
||||
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
|
||||
{
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) {
|
||||
*retval = xmlrpc_c::value_string("0:1:0");
|
||||
return;
|
||||
}
|
||||
|
||||
XMLRPC_LOCK;
|
||||
stopMacroTimer();
|
||||
int s0 = 0;//number_of_samples("");
|
||||
int s1 = 0;
|
||||
|
||||
string xmlbuf;
|
||||
static char result[100];
|
||||
static string line;
|
||||
int chsamples = 0;
|
||||
int i = 0;
|
||||
for (int m = 0; m < 32; m++) {
|
||||
line.clear();
|
||||
for (int n = 0; n < 8; n++) {
|
||||
i = m*8+n;
|
||||
|
||||
if ( (id >= MODE_PSK31 && id <= MODE_PSK1000R) ||
|
||||
(id >= MODE_4X_PSK63R && id <= MODE_2X_PSK1000R) ||
|
||||
id == MODE_CW || id == MODE_RTTY ) {
|
||||
s1 = number_of_samples(string(1,i));
|
||||
chsamples = active_modem->char_samples;
|
||||
} else {
|
||||
s0 = number_of_samples(string(1, i));
|
||||
int j;
|
||||
for(j = 2; j < 32; j++) {
|
||||
s1 = number_of_samples(string(j, i));
|
||||
if(s1 > s0) break;
|
||||
}
|
||||
chsamples = (s1 - s0) / (j-1);
|
||||
}
|
||||
snprintf(result, sizeof(result),
|
||||
n == 7 ? " %.8f\n" : n == 0 ? "%.8f," : " %.8f,",
|
||||
1.0 * chsamples / active_modem->get_samplerate());
|
||||
line.append(result);
|
||||
}
|
||||
xmlbuf.append(line);
|
||||
}
|
||||
*retval = xmlrpc_c::value_string(xmlbuf);
|
||||
}
|
||||
};
|
||||
|
||||
class Main_get_char_timing : public xmlrpc_c::method
|
||||
{
|
||||
public:
|
||||
Main_get_char_timing()
|
||||
{
|
||||
_signature = "n:6";
|
||||
_help = "Input: value of character. Returns transmit duration for specified character (samples:sample rate).";
|
||||
}
|
||||
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
|
||||
{
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) {
|
||||
*retval = xmlrpc_c::value_string("0,1,0,0,0.0");
|
||||
return;
|
||||
}
|
||||
|
||||
XMLRPC_LOCK;
|
||||
stopMacroTimer();
|
||||
|
||||
vector<unsigned char> bytes = params.getBytestring(0);
|
||||
bytes.push_back(0);
|
||||
std::string totest = (const char*)&bytes[0];
|
||||
|
||||
if (totest.empty() || !active_modem) {
|
||||
*retval = xmlrpc_c::value_string("0:1:0");
|
||||
return;
|
||||
}
|
||||
|
||||
static std::string xmlbuf;
|
||||
char result[64];
|
||||
int character = 0;
|
||||
|
||||
int count = sscanf(totest.c_str(), "%d", &character);
|
||||
|
||||
if(count != 1) {
|
||||
*retval = xmlrpc_c::value_string("0:1:0");
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int s0 = 0, chsamples = 0, over_head = 0;
|
||||
|
||||
if ( (id >= MODE_4X_PSK63R && id <= MODE_2X_PSK1000R) ||
|
||||
(id >= MODE_PSK31 && id <= MODE_PSK1000R) ||
|
||||
id == MODE_CW || id == MODE_RTTY ) {
|
||||
s0 = number_of_samples(string(1,character));
|
||||
chsamples = active_modem->char_samples;
|
||||
over_head = active_modem->ovhd_samples;
|
||||
} else {
|
||||
unsigned int s1 = 0, s2 = 0;
|
||||
unsigned int temp = 0, no_of_chars = 1, k = 0;
|
||||
s0 = s1 = s2 = number_of_samples(string(no_of_chars, character));
|
||||
for(int i = no_of_chars + 1; i < 32; i++) {
|
||||
s2 = number_of_samples(string(i, character));
|
||||
if(s2 > s1 && temp++ > 2) {
|
||||
break;
|
||||
}
|
||||
s0 = s2;
|
||||
no_of_chars++;
|
||||
}
|
||||
k = no_of_chars * 4;
|
||||
s1 = number_of_samples(string(k, character));
|
||||
chsamples = (s1 - s0) / (k - no_of_chars);
|
||||
over_head = s1 - (chsamples * k);
|
||||
}
|
||||
|
||||
snprintf(result, sizeof(result), "%5u:%6u:%6u", chsamples,
|
||||
active_modem->get_samplerate(),
|
||||
over_head);
|
||||
xmlbuf.assign(result);
|
||||
|
||||
*retval = xmlrpc_c::value_string(xmlbuf);
|
||||
}
|
||||
};
|
||||
|
||||
class Main_get_tx_timing : public xmlrpc_c::method
|
||||
{
|
||||
public:
|
||||
Main_get_tx_timing()
|
||||
{
|
||||
_signature = "n:6";
|
||||
_help = "Returns transmit duration for test string (samples:sample rate:secs).";
|
||||
}
|
||||
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
|
||||
{
|
||||
trx_mode id = active_modem->get_mode();
|
||||
if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS ||
|
||||
id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ||
|
||||
id == MODE_SITORB || id == MODE_NAVTEX ) {
|
||||
*retval = xmlrpc_c::value_string("0:1:0.0");
|
||||
return;
|
||||
}
|
||||
XMLRPC_LOCK;
|
||||
vector<unsigned char> bytes = params.getBytestring(0);
|
||||
bytes.push_back(0);
|
||||
std::string totest = (const char*)&bytes[0];
|
||||
if (totest.empty() || !active_modem) {
|
||||
*retval = xmlrpc_c::value_string("0:1:0.0");
|
||||
return;
|
||||
}
|
||||
|
||||
int chsamples = number_of_samples(totest);// - start_stop_samples;
|
||||
|
||||
std::string xmlbuf;
|
||||
char buf[64];
|
||||
memset(buf, 0, sizeof(buf));
|
||||
snprintf(buf, sizeof(buf) - 1, "%u : %u : %.9f", \
|
||||
chsamples, active_modem->tx_sample_rate,
|
||||
1.0 * chsamples / active_modem->tx_sample_rate);
|
||||
xmlbuf.assign(buf);
|
||||
*retval = xmlrpc_c::value_string(xmlbuf);
|
||||
}
|
||||
};
|
||||
|
||||
class Rig_set_name : public xmlrpc_c::method
|
||||
{
|
||||
public:
|
||||
|
@ -2853,46 +3055,46 @@ struct Navtex_send_message : public xmlrpc_c::method
|
|||
|
||||
// method list: ELEM_(class_name, "method_name")
|
||||
#undef ELEM_
|
||||
#define METHOD_LIST \
|
||||
ELEM_(Fldigi_list, "fldigi.list") \
|
||||
ELEM_(Fldigi_name, "fldigi.name") \
|
||||
#define METHOD_LIST \
|
||||
ELEM_(Fldigi_list, "fldigi.list") \
|
||||
ELEM_(Fldigi_name, "fldigi.name") \
|
||||
ELEM_(Fldigi_version_struct, "fldigi.version_struct") \
|
||||
ELEM_(Fldigi_version_string, "fldigi.version") \
|
||||
ELEM_(Fldigi_name_version, "fldigi.name_version") \
|
||||
ELEM_(Fldigi_config_dir, "fldigi.config_dir") \
|
||||
ELEM_(Fldigi_name_version, "fldigi.name_version") \
|
||||
ELEM_(Fldigi_config_dir, "fldigi.config_dir") \
|
||||
ELEM_(Fldigi_terminate, "fldigi.terminate") \
|
||||
\
|
||||
\
|
||||
ELEM_(Modem_get_name, "modem.get_name") \
|
||||
ELEM_(Modem_get_names, "modem.get_names") \
|
||||
ELEM_(Modem_get_names, "modem.get_names") \
|
||||
ELEM_(Modem_get_id, "modem.get_id") \
|
||||
ELEM_(Modem_get_max_id, "modem.get_max_id") \
|
||||
ELEM_(Modem_set_by_name, "modem.set_by_name") \
|
||||
ELEM_(Modem_set_by_id, "modem.set_by_id") \
|
||||
\
|
||||
ELEM_(Modem_set_carrier, "modem.set_carrier") \
|
||||
ELEM_(Modem_inc_carrier, "modem.inc_carrier") \
|
||||
ELEM_(Modem_get_carrier, "modem.get_carrier") \
|
||||
\
|
||||
ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \
|
||||
ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \
|
||||
ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \
|
||||
\
|
||||
ELEM_(Modem_get_bw, "modem.get_bandwidth") \
|
||||
ELEM_(Modem_set_bw, "modem.set_bandwidth") \
|
||||
ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \
|
||||
\
|
||||
ELEM_(Modem_get_quality, "modem.get_quality") \
|
||||
ELEM_(Modem_search_up, "modem.search_up") \
|
||||
ELEM_(Modem_search_down, "modem.search_down") \
|
||||
\
|
||||
ELEM_(Modem_set_by_name, "modem.set_by_name") \
|
||||
ELEM_(Modem_set_by_id, "modem.set_by_id") \
|
||||
\
|
||||
ELEM_(Modem_set_carrier, "modem.set_carrier") \
|
||||
ELEM_(Modem_inc_carrier, "modem.inc_carrier") \
|
||||
ELEM_(Modem_get_carrier, "modem.get_carrier") \
|
||||
\
|
||||
ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \
|
||||
ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \
|
||||
ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \
|
||||
\
|
||||
ELEM_(Modem_get_bw, "modem.get_bandwidth") \
|
||||
ELEM_(Modem_set_bw, "modem.set_bandwidth") \
|
||||
ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \
|
||||
\
|
||||
ELEM_(Modem_get_quality, "modem.get_quality") \
|
||||
ELEM_(Modem_search_up, "modem.search_up") \
|
||||
ELEM_(Modem_search_down, "modem.search_down") \
|
||||
\
|
||||
ELEM_(Modem_olivia_set_bandwidth, "modem.olivia.set_bandwidth") \
|
||||
ELEM_(Modem_olivia_get_bandwidth, "modem.olivia.get_bandwidth") \
|
||||
ELEM_(Modem_olivia_set_tones, "modem.olivia.set_tones") \
|
||||
ELEM_(Modem_olivia_get_tones, "modem.olivia.get_tones") \
|
||||
\
|
||||
\
|
||||
ELEM_(Main_get_status1, "main.get_status1") \
|
||||
ELEM_(Main_get_status2, "main.get_status2") \
|
||||
\
|
||||
\
|
||||
ELEM_(Main_get_sb, "main.get_sideband") \
|
||||
ELEM_(Main_set_sb, "main.set_sideband") \
|
||||
ELEM_(Main_get_wf_sideband, "main.get_wf_sideband") \
|
||||
|
@ -2900,124 +3102,127 @@ struct Navtex_send_message : public xmlrpc_c::method
|
|||
ELEM_(Main_get_freq, "main.get_frequency") \
|
||||
ELEM_(Main_set_freq, "main.set_frequency") \
|
||||
ELEM_(Main_inc_freq, "main.inc_frequency") \
|
||||
\
|
||||
\
|
||||
ELEM_(Main_get_afc, "main.get_afc") \
|
||||
ELEM_(Main_set_afc, "main.set_afc") \
|
||||
ELEM_(Main_toggle_afc, "main.toggle_afc") \
|
||||
\
|
||||
ELEM_(Main_toggle_afc, "main.toggle_afc") \
|
||||
\
|
||||
ELEM_(Main_get_sql, "main.get_squelch") \
|
||||
ELEM_(Main_set_sql, "main.set_squelch") \
|
||||
ELEM_(Main_toggle_sql, "main.toggle_squelch") \
|
||||
\
|
||||
ELEM_(Main_toggle_sql, "main.toggle_squelch") \
|
||||
\
|
||||
ELEM_(Main_get_sql_level, "main.get_squelch_level") \
|
||||
ELEM_(Main_set_sql_level, "main.set_squelch_level") \
|
||||
ELEM_(Main_inc_sql_level, "main.inc_squelch_level") \
|
||||
\
|
||||
\
|
||||
ELEM_(Main_get_rev, "main.get_reverse") \
|
||||
ELEM_(Main_set_rev, "main.set_reverse") \
|
||||
ELEM_(Main_toggle_rev, "main.toggle_reverse") \
|
||||
\
|
||||
ELEM_(Main_get_lock, "main.get_lock") \
|
||||
ELEM_(Main_set_lock, "main.set_lock") \
|
||||
ELEM_(Main_toggle_rev, "main.toggle_reverse") \
|
||||
\
|
||||
ELEM_(Main_get_lock, "main.get_lock") \
|
||||
ELEM_(Main_set_lock, "main.set_lock") \
|
||||
ELEM_(Main_toggle_lock, "main.toggle_lock") \
|
||||
\
|
||||
ELEM_(Main_get_rsid, "main.get_rsid") \
|
||||
ELEM_(Main_set_rsid, "main.set_rsid") \
|
||||
\
|
||||
ELEM_(Main_get_rsid, "main.get_rsid") \
|
||||
ELEM_(Main_set_rsid, "main.set_rsid") \
|
||||
ELEM_(Main_toggle_rsid, "main.toggle_rsid") \
|
||||
\
|
||||
ELEM_(Main_get_trx_status, "main.get_trx_status") \
|
||||
ELEM_(Main_tx, "main.tx") \
|
||||
ELEM_(Main_tune, "main.tune") \
|
||||
ELEM_(Main_rsid, "main.rsid") \
|
||||
ELEM_(Main_rx, "main.rx") \
|
||||
\
|
||||
ELEM_(Main_get_trx_status, "main.get_trx_status") \
|
||||
ELEM_(Main_tx, "main.tx") \
|
||||
ELEM_(Main_tune, "main.tune") \
|
||||
ELEM_(Main_rsid, "main.rsid") \
|
||||
ELEM_(Main_rx, "main.rx") \
|
||||
ELEM_(Main_abort, "main.abort") \
|
||||
\
|
||||
\
|
||||
ELEM_(Main_get_trx_state, "main.get_trx_state") \
|
||||
ELEM_(Main_set_rig_name, "main.set_rig_name") \
|
||||
ELEM_(Main_get_tx_timing, "main.get_tx_timing") \
|
||||
ELEM_(Main_get_char_rates, "main.get_char_rates") \
|
||||
ELEM_(Main_get_char_timing, "main.get_char_timing") \
|
||||
ELEM_(Main_set_rig_name, "main.set_rig_name") \
|
||||
ELEM_(Main_set_rig_frequency, "main.set_rig_frequency") \
|
||||
ELEM_(Main_set_rig_modes, "main.set_rig_modes") \
|
||||
ELEM_(Main_set_rig_mode, "main.set_rig_mode") \
|
||||
ELEM_(Main_set_rig_mode, "main.set_rig_mode") \
|
||||
ELEM_(Main_get_rig_modes, "main.get_rig_modes") \
|
||||
ELEM_(Main_get_rig_mode, "main.get_rig_mode") \
|
||||
ELEM_(Main_get_rig_mode, "main.get_rig_mode") \
|
||||
ELEM_(Main_set_rig_bandwidths, "main.set_rig_bandwidths") \
|
||||
ELEM_(Main_set_rig_bandwidth, "main.set_rig_bandwidth") \
|
||||
ELEM_(Main_get_rig_bandwidth, "main.get_rig_bandwidth") \
|
||||
ELEM_(Main_get_rig_bandwidths, "main.get_rig_bandwidths") \
|
||||
\
|
||||
\
|
||||
ELEM_(Main_run_macro, "main.run_macro") \
|
||||
ELEM_(Main_get_max_macro_id, "main.get_max_macro_id") \
|
||||
\
|
||||
\
|
||||
ELEM_(Rig_set_name, "rig.set_name") \
|
||||
ELEM_(Rig_get_name, "rig.get_name") \
|
||||
ELEM_(Rig_set_frequency, "rig.set_frequency") \
|
||||
ELEM_(Rig_set_modes, "rig.set_modes") \
|
||||
ELEM_(Rig_set_frequency, "rig.set_frequency") \
|
||||
ELEM_(Rig_set_modes, "rig.set_modes") \
|
||||
ELEM_(Rig_set_mode, "rig.set_mode") \
|
||||
ELEM_(Rig_get_modes, "rig.get_modes") \
|
||||
ELEM_(Rig_get_modes, "rig.get_modes") \
|
||||
ELEM_(Rig_get_mode, "rig.get_mode") \
|
||||
ELEM_(Rig_set_bandwidths, "rig.set_bandwidths") \
|
||||
ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \
|
||||
ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \
|
||||
ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \
|
||||
ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \
|
||||
ELEM_(Rig_get_bandwidths, "rig.get_bandwidths") \
|
||||
ELEM_(Rig_get_notch, "rig.get_notch") \
|
||||
ELEM_(Rig_set_notch, "rig.set_notch") \
|
||||
ELEM_(Rig_get_notch, "rig.get_notch") \
|
||||
ELEM_(Rig_set_notch, "rig.set_notch") \
|
||||
ELEM_(Rig_take_control, "rig.take_control") \
|
||||
ELEM_(Rig_release_control, "rig.release_control") \
|
||||
\
|
||||
ELEM_(Log_get_freq, "log.get_frequency") \
|
||||
ELEM_(Log_get_time_on, "log.get_time_on") \
|
||||
ELEM_(Rig_release_control, "rig.release_control") \
|
||||
\
|
||||
ELEM_(Log_get_freq, "log.get_frequency") \
|
||||
ELEM_(Log_get_time_on, "log.get_time_on") \
|
||||
ELEM_(Log_get_time_off, "log.get_time_off") \
|
||||
ELEM_(Log_get_call, "log.get_call") \
|
||||
ELEM_(Log_get_name, "log.get_name") \
|
||||
ELEM_(Log_get_rst_in, "log.get_rst_in") \
|
||||
ELEM_(Log_get_rst_out, "log.get_rst_out") \
|
||||
ELEM_(Log_get_rst_out, "log.get_rst_out") \
|
||||
ELEM_(Log_get_serial_number, "log.get_serial_number") \
|
||||
ELEM_(Log_set_serial_number, "log.set_serial_number") \
|
||||
ELEM_(Log_get_serial_number_sent, "log.get_serial_number_sent") \
|
||||
ELEM_(Log_get_exchange, "log.get_exchange") \
|
||||
ELEM_(Log_set_exchange, "log.set_exchange") \
|
||||
ELEM_(Log_get_state, "log.get_state") \
|
||||
ELEM_(Log_get_state, "log.get_state") \
|
||||
ELEM_(Log_get_province, "log.get_province") \
|
||||
ELEM_(Log_get_country, "log.get_country") \
|
||||
ELEM_(Log_get_qth, "log.get_qth") \
|
||||
ELEM_(Log_get_country, "log.get_country") \
|
||||
ELEM_(Log_get_qth, "log.get_qth") \
|
||||
ELEM_(Log_get_band, "log.get_band") \
|
||||
ELEM_(Log_get_sb, "log.get_sideband") \
|
||||
ELEM_(Log_get_notes, "log.get_notes") \
|
||||
ELEM_(Log_get_locator, "log.get_locator") \
|
||||
ELEM_(Log_get_sb, "log.get_sideband") \
|
||||
ELEM_(Log_get_notes, "log.get_notes") \
|
||||
ELEM_(Log_get_locator, "log.get_locator") \
|
||||
ELEM_(Log_get_az, "log.get_az") \
|
||||
ELEM_(Log_clear, "log.clear") \
|
||||
ELEM_(Log_clear, "log.clear") \
|
||||
ELEM_(Log_set_call, "log.set_call") \
|
||||
ELEM_(Log_set_name, "log.set_name") \
|
||||
ELEM_(Log_set_qth, "log.set_qth") \
|
||||
ELEM_(Log_set_locator, "log.set_locator") \
|
||||
\
|
||||
ELEM_(Text_get_rx_length, "text.get_rx_length") \
|
||||
ELEM_(Text_get_rx, "text.get_rx") \
|
||||
ELEM_(Text_clear_rx, "text.clear_rx") \
|
||||
ELEM_(Text_add_tx, "text.add_tx") \
|
||||
ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \
|
||||
ELEM_(Text_clear_tx, "text.clear_tx") \
|
||||
\
|
||||
ELEM_(RXTX_get_data, "rxtx.get_data") \
|
||||
ELEM_(RX_get_data, "rx.get_data") \
|
||||
ELEM_(TX_get_data, "tx.get_data") \
|
||||
\
|
||||
ELEM_(Spot_get_auto, "spot.get_auto") \
|
||||
ELEM_(Spot_set_auto, "spot.set_auto") \
|
||||
ELEM_(Spot_toggle_auto, "spot.toggle_auto") \
|
||||
ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \
|
||||
ELEM_(Log_set_qth, "log.set_qth") \
|
||||
ELEM_(Log_set_locator, "log.set_locator") \
|
||||
\
|
||||
ELEM_(Wefax_state_string, "wefax.state_string") \
|
||||
ELEM_(Wefax_skip_apt, "wefax.skip_apt") \
|
||||
ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \
|
||||
ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \
|
||||
ELEM_(Text_get_rx_length, "text.get_rx_length") \
|
||||
ELEM_(Text_get_rx, "text.get_rx") \
|
||||
ELEM_(Text_clear_rx, "text.clear_rx") \
|
||||
ELEM_(Text_add_tx, "text.add_tx") \
|
||||
ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \
|
||||
ELEM_(Text_clear_tx, "text.clear_tx") \
|
||||
\
|
||||
ELEM_(RXTX_get_data, "rxtx.get_data") \
|
||||
ELEM_(RX_get_data, "rx.get_data") \
|
||||
ELEM_(TX_get_data, "tx.get_data") \
|
||||
\
|
||||
ELEM_(Spot_get_auto, "spot.get_auto") \
|
||||
ELEM_(Spot_set_auto, "spot.set_auto") \
|
||||
ELEM_(Spot_toggle_auto, "spot.toggle_auto") \
|
||||
ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \
|
||||
\
|
||||
ELEM_(Wefax_state_string, "wefax.state_string") \
|
||||
ELEM_(Wefax_skip_apt, "wefax.skip_apt") \
|
||||
ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \
|
||||
ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \
|
||||
ELEM_(Wefax_end_reception, "wefax.end_reception") \
|
||||
ELEM_(Wefax_start_manual_reception, "wefax.start_manual_reception") \
|
||||
ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \
|
||||
ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \
|
||||
ELEM_(Wefax_set_max_lines, "wefax.set_max_lines") \
|
||||
ELEM_(Wefax_get_received_file, "wefax.get_received_file") \
|
||||
ELEM_(Wefax_get_received_file, "wefax.get_received_file") \
|
||||
ELEM_(Wefax_send_file, "wefax.send_file") \
|
||||
\
|
||||
ELEM_(Navtex_get_message, "navtex.get_message") \
|
||||
ELEM_(Navtex_get_message, "navtex.get_message") \
|
||||
ELEM_(Navtex_send_message, "navtex.send_message") \
|
||||
|
||||
struct rm_pred
|
||||
|
|
128
src/psk/psk.cxx
128
src/psk/psk.cxx
|
@ -45,8 +45,9 @@
|
|||
#include "status.h"
|
||||
#include "viewpsk.h"
|
||||
#include "pskeval.h"
|
||||
#include "ascii.h"
|
||||
#include "modem.h"
|
||||
#include "Viewer.h"
|
||||
#include "macros.h"
|
||||
|
||||
extern waterfall *wf;
|
||||
|
||||
|
@ -96,8 +97,9 @@ void psk::tx_init(SoundBase *sc)
|
|||
bitshreg = 0;
|
||||
startpreamble = true;
|
||||
|
||||
//Multiple carriers handling
|
||||
accumulated_bits = 0;
|
||||
symbols = 0;
|
||||
acc_symbols = 0;
|
||||
ovhd_symbols = 0;
|
||||
|
||||
}
|
||||
|
||||
|
@ -130,6 +132,8 @@ void psk::rx_init()
|
|||
// interleaver, split incoming bit stream into two, one late by one bit
|
||||
rxbitstate = 0;
|
||||
fecmet = fecmet2 = 0;
|
||||
if (Rxinlv) Rxinlv->flush();
|
||||
if (Rxinlv2) Rxinlv2->flush();
|
||||
|
||||
}
|
||||
|
||||
|
@ -560,7 +564,7 @@ psk::psk(trx_mode pskmode) : modem()
|
|||
numcarriers = 1;
|
||||
}
|
||||
|
||||
//printf("%s: symlen %d, dcdbits %d, _qpsk %d, _pskr %d, numc %f\n",
|
||||
//printf("%s: symlen %d, dcdbits %d, _qpsk %d, _pskr %d, numc %d\n",
|
||||
//mode_info[mode].sname,
|
||||
//symbollen, dcdbits, _qpsk, _pskr, numcarriers);
|
||||
|
||||
|
@ -821,7 +825,7 @@ void psk::rx_pskr(unsigned char symbol)
|
|||
int c;
|
||||
|
||||
//In the case of multiple carriers, if even number of carriers then we
|
||||
// know the bit-order and don't need voting otherwise
|
||||
// know the bit-order and don't need voting otherwise
|
||||
// we accumulate the soft bits for the interleaver THEN submit to Viterbi
|
||||
// decoder in alternance so that each one is processed one bit later.
|
||||
// Only two possibilities for sync: current bit or previous one since
|
||||
|
@ -836,7 +840,7 @@ void psk::rx_pskr(unsigned char symbol)
|
|||
rxbitstate++;
|
||||
//Only use one decoder is using even carriers (we know the bits order)
|
||||
// if (((int)numcarriers) % 2 == 0) {
|
||||
// fecmet2 = -9999.0;
|
||||
// fecmet2 = -9999.0;
|
||||
// return;
|
||||
// }
|
||||
// copy to avoid scrambling symbolpair for the next bit
|
||||
|
@ -970,12 +974,12 @@ void psk::findsignal()
|
|||
}
|
||||
}
|
||||
|
||||
//JD: disable for multiple carriers as we are running as modem and
|
||||
//JD: disable for multiple carriers as we are running as modem and
|
||||
// therefore use other strategies for frequency alignment like RSID
|
||||
void psk::phaseafc()
|
||||
{
|
||||
double error;
|
||||
if (afcmetric < 0.05 ||
|
||||
if (afcmetric < 0.05 ||
|
||||
mode == MODE_PSK500 ||
|
||||
mode == MODE_QPSK500 ||
|
||||
numcarriers > 1 ) return;
|
||||
|
@ -1028,7 +1032,7 @@ static double averageamp;
|
|||
} else { // bpsk and pskr
|
||||
bits = (((int) (phase / M_PI + 0.5)) & 1) << 1;
|
||||
// hard decode if needed
|
||||
// softbit = (bits & 2) ? 0 : 255;
|
||||
// softbit = (bits & 2) ? 0 : 255;
|
||||
// reversed as we normally pass "!bits" when hard decoding
|
||||
|
||||
// Soft decode section below
|
||||
|
@ -1106,7 +1110,7 @@ static double averageamp;
|
|||
}
|
||||
break;
|
||||
|
||||
case 0: // DCD off by postamble. Not for PSKR modes as this is not unique to postamble.
|
||||
case 0: // DCD off by postamble. Not for PSKR modes as this is not unique to postamble.
|
||||
if (!_pskr) {
|
||||
dcd = false;
|
||||
acquire = 0;
|
||||
|
@ -1218,7 +1222,7 @@ int psk::rx_process(const double *buf, int len)
|
|||
fir2[car]->run( z, z2[car] ); // fir2 returns value on every sample
|
||||
|
||||
//On last carrier processing
|
||||
if (car == numcarriers - 1) {
|
||||
if (car == numcarriers - 1) {
|
||||
|
||||
calcSN_IMD(z); //JD OR all carriers together check logic???
|
||||
|
||||
|
@ -1228,9 +1232,9 @@ int psk::rx_process(const double *buf, int len)
|
|||
* expected to have been modified to a fairly symmetric shape. The
|
||||
* magnitude of the samples are taken, thus rectifying the signal to
|
||||
* positive values. "bitclk" is a counter that is very close in rate to
|
||||
* (samples / symbol). Its purpose is to repeatedly "draw" one symbol
|
||||
* (samples / symbol). Its purpose is to repeatedly "draw" one symbol
|
||||
* waveform in the syncbuf array, according to its amplitude (not phase).
|
||||
*/
|
||||
*/
|
||||
|
||||
int idx = (int) bitclk;
|
||||
double sum = 0.0;
|
||||
|
@ -1256,11 +1260,11 @@ int psk::rx_process(const double *buf, int len)
|
|||
/**
|
||||
* Here we sum up the difference between each sample's magnitude in the
|
||||
* lower half of the array with its counterpart on the upper half of the
|
||||
* array, or the other side of the waveform. Each pair's difference is
|
||||
* array, or the other side of the waveform. Each pair's difference is
|
||||
* divided by their sum, scaling it so that the signal amplitude does not
|
||||
* affect the result. When the differences are summed, it gives an
|
||||
* indication of which side is larger than the other.
|
||||
*/
|
||||
*/
|
||||
|
||||
for (int i = 0; i < symsteps; i++) {
|
||||
sum += (syncbuf[i] - syncbuf[i+symsteps]);
|
||||
|
@ -1275,11 +1279,11 @@ int psk::rx_process(const double *buf, int len)
|
|||
* be a little faster, so that the next drawing of the waveform in syncbuf
|
||||
* will be shifted right. Conversely, if the sum is positive, then it needs
|
||||
* to slow down bitclk so that the waveform is shifted left. Thus the
|
||||
* error is subtracted from bitclk, rather than added. The goal is to
|
||||
* error is subtracted from bitclk, rather than added. The goal is to
|
||||
* get the error as close to zero as possible, so that the receiver is
|
||||
* exactly synced with the transmitter and the waveform is exactly in
|
||||
* the middle of syncbuf.
|
||||
*/
|
||||
* the middle of syncbuf.
|
||||
*/
|
||||
|
||||
// bitclk -= sum / 5.0;
|
||||
bitclk -= sum / (5.0 * 16 / bitsteps);
|
||||
|
@ -1289,11 +1293,11 @@ int psk::rx_process(const double *buf, int len)
|
|||
* When bitclock reaches the end of the buffer, then a complete waveform
|
||||
* has been received. It is time to output the current sample and wrap
|
||||
* around to the next cycle.
|
||||
*
|
||||
*
|
||||
* There is a complete symbol waveform in syncbuf, so that each
|
||||
* sample[0..N/2-1] is very close in amplitude with the corresponding
|
||||
* sample in [N/2..N-1].
|
||||
*
|
||||
*
|
||||
* | ******** ******** |
|
||||
* | **** **** **** **** |
|
||||
* | *** *** *** *** |
|
||||
|
@ -1303,9 +1307,9 @@ int psk::rx_process(const double *buf, int len)
|
|||
* |* * *|
|
||||
* |_______________________________________________________________|
|
||||
* 0 N/2 N-1
|
||||
*
|
||||
*
|
||||
* === or some variation of it .... ===
|
||||
*
|
||||
*
|
||||
* |**** ******** *****|
|
||||
* | **** **** **** **** |
|
||||
* | *** *** *** *** |
|
||||
|
@ -1320,7 +1324,7 @@ int psk::rx_process(const double *buf, int len)
|
|||
* have the maximum phase difference, if any, from the previous symbol's
|
||||
* phase.
|
||||
*
|
||||
*/
|
||||
*/
|
||||
|
||||
// if (bitclk < 0) bitclk += 16.0;
|
||||
// if (bitclk >= 16.0) {
|
||||
|
@ -1371,30 +1375,24 @@ int psk::rx_process(const double *buf, int len)
|
|||
// transmit processes
|
||||
//=====================================================================
|
||||
|
||||
void psk::tx_symbol(int sym)
|
||||
void psk::tx_carriers()
|
||||
{
|
||||
double delta[MAX_CARRIERS];
|
||||
double ival, qval, shapeA, shapeB;
|
||||
cmplx symbol;
|
||||
double frequencies[MAX_CARRIERS];
|
||||
|
||||
txsymbols[accumulated_bits] = sym;
|
||||
|
||||
if (++accumulated_bits < numcarriers) {
|
||||
return;
|
||||
}
|
||||
|
||||
//Process all carrier's symbols, then submit to sound card
|
||||
accumulated_bits = 0; //reset
|
||||
frequencies[0] = get_txfreq_woffset() + ((-1 * numcarriers) + 1) * inter_carrier / 2;
|
||||
delta[0] = TWOPI * frequencies[0] / samplerate;
|
||||
for (int car = 1; car < numcarriers; car++) {
|
||||
for (int car = 1; car < symbols; car++) {
|
||||
frequencies[car] = frequencies[car - 1] + inter_carrier;
|
||||
delta[car] = TWOPI * frequencies[car] / samplerate;
|
||||
}
|
||||
|
||||
double maxamp = 0;
|
||||
for (int car = 0; car < numcarriers; car++) {
|
||||
double maxamp = 0;
|
||||
int sym;
|
||||
for (int car = 0; car < symbols; car++) {
|
||||
sym = txsymbols[car];
|
||||
|
||||
if (_qpsk && !reverse)
|
||||
|
@ -1426,7 +1424,7 @@ double maxamp = 0;
|
|||
qval = shapeA * prevsymbol[car].imag() + shapeB * symbol.imag();
|
||||
|
||||
if (car != 0) {
|
||||
outbuf[i] += (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car]));// / numcarriers;
|
||||
outbuf[i] += (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car]));// / numcarriers;
|
||||
} else {
|
||||
outbuf[i] = (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car]));// / numcarriers;
|
||||
}
|
||||
|
@ -1441,12 +1439,23 @@ double maxamp = 0;
|
|||
|
||||
prevsymbol[car] = symbol;
|
||||
}
|
||||
|
||||
if (maxamp)
|
||||
for (int i = 0; i < symbollen; i++) outbuf[i] /= maxamp;
|
||||
|
||||
ModulateXmtr(outbuf, symbollen);
|
||||
}
|
||||
|
||||
void psk::tx_symbol(int sym)
|
||||
{
|
||||
acc_symbols++;
|
||||
txsymbols[symbols] = sym;
|
||||
if (++symbols < numcarriers) {
|
||||
return;
|
||||
}
|
||||
tx_carriers();
|
||||
symbols = 0; //reset
|
||||
}
|
||||
|
||||
void psk::tx_bit(int bit)
|
||||
{
|
||||
unsigned int sym;
|
||||
|
@ -1454,35 +1463,33 @@ void psk::tx_bit(int bit)
|
|||
// qpsk transmission
|
||||
if (_qpsk) {
|
||||
sym = enc->encode(bit);
|
||||
//JD add interleaver
|
||||
// Txinlv->bits(&sym);
|
||||
sym = sym & 3;//JD just to make sure
|
||||
tx_symbol(sym);
|
||||
// else pskr (fec + interleaver) transmission
|
||||
} else if (_pskr) {
|
||||
// Encode into two bits
|
||||
// Encode into two bits
|
||||
bitshreg = enc->encode(bit);
|
||||
// pass through interleaver
|
||||
// pass through interleaver
|
||||
if (mode != MODE_PSK63F) Txinlv->bits(&bitshreg);
|
||||
// Send low bit first. tx_symbol expects 0 or 2 for BPSK
|
||||
// Send low bit first. tx_symbol expects 0 or 2 for BPSK
|
||||
sym = (bitshreg & 1) << 1;
|
||||
tx_symbol(sym);
|
||||
sym = bitshreg & 2;
|
||||
tx_symbol(sym);
|
||||
// else normal bpsk tranmission
|
||||
// else normal bpsk tranmission
|
||||
} else {
|
||||
sym = bit << 1;
|
||||
tx_symbol(sym);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned char ch;
|
||||
void psk::tx_char(unsigned char c)
|
||||
{
|
||||
ch = c;
|
||||
const char *code;
|
||||
|
||||
char_symbols = acc_symbols;
|
||||
if (_pskr) {
|
||||
// acc_symbols = 0;
|
||||
// ARQ varicode instead of MFSK for PSK63FEC
|
||||
code = varienc(c);
|
||||
} else {
|
||||
|
@ -1498,21 +1505,18 @@ void psk::tx_char(unsigned char c)
|
|||
tx_bit(0);
|
||||
tx_bit(0);
|
||||
}
|
||||
char_symbols = acc_symbols - char_symbols;
|
||||
}
|
||||
|
||||
|
||||
void psk::tx_flush()
|
||||
{
|
||||
if (_pskr) {
|
||||
//VK2ETA replace with a more effective flushing sequence (avoids cutting the last characters in low s/n)
|
||||
/* for (int i = 0; i < dcdbits; i++)
|
||||
tx_bit(0);
|
||||
}
|
||||
*/
|
||||
for (int i = 0; i < dcdbits / 2; i++) {
|
||||
tx_bit(1);
|
||||
tx_bit(1);
|
||||
}
|
||||
ovhd_symbols = ((numcarriers - symbols) % numcarriers);
|
||||
//VK2ETA replace with a more effective flushing sequence (avoids cutting the last characters in low s/n)
|
||||
for (int i = 0; i < ovhd_symbols/2; i++) tx_bit(0);
|
||||
|
||||
for (int i = 0; i < dcdbits; i++) tx_bit(0);
|
||||
return;
|
||||
}
|
||||
// QPSK - flush the encoder
|
||||
if (_qpsk) {
|
||||
|
@ -1538,8 +1542,6 @@ void psk::clearbits()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int psk::tx_process()
|
||||
{
|
||||
int c;
|
||||
|
@ -1555,9 +1557,10 @@ int psk::tx_process()
|
|||
preamble--;
|
||||
tx_bit(1);
|
||||
tx_bit(0);
|
||||
// FEC: Mark start of first character with a double zero
|
||||
// FEC: Mark start of first character with a double zero
|
||||
// to ensure sync at end of preamble
|
||||
if (preamble == 0) tx_bit(0);
|
||||
if (preamble == 0)
|
||||
while (acc_symbols % numcarriers) tx_bit(0);
|
||||
return 0;
|
||||
} else {
|
||||
//JD for QPSK500R
|
||||
|
@ -1575,6 +1578,11 @@ int psk::tx_process()
|
|||
tx_flush();
|
||||
stopflag = false;
|
||||
cwid();
|
||||
|
||||
char_samples = char_symbols * symbollen / numcarriers;
|
||||
xmt_samples = acc_symbols * symbollen / numcarriers;
|
||||
ovhd_samples = (acc_symbols - char_symbols - ovhd_symbols) * symbollen / numcarriers;
|
||||
|
||||
return -1; // we're done
|
||||
}
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@
|
|||
#include "debug.h"
|
||||
#include "qrunner.h"
|
||||
#include "icons.h"
|
||||
#include "macros.h"
|
||||
|
||||
#define SND_BUF_LEN 65536
|
||||
#define SND_RW_LEN (8 * SND_BUF_LEN)
|
||||
|
@ -79,7 +80,7 @@
|
|||
// We never write duplicate/QSK/PTT tone/PseudoFSK data to the sound files
|
||||
#define SNDFILE_CHANNELS 1
|
||||
|
||||
int sndfile_samplerate[4] = {22050, 24000, 44100, 48000};
|
||||
int sndfile_samplerate[7] = {8000, 11025, 16000, 22050, 24000, 44100, 48000};
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -376,7 +377,8 @@ LOG_INFO("src ratio %f", play_src_data->src_ratio);
|
|||
|
||||
// ---------------------------------------------------------------------
|
||||
// write_file
|
||||
// All sound buffer data is resampled to 48000 samples/sec
|
||||
// All sound buffer data is resampled to a specified sample rate
|
||||
// progdefaults.wavSampleRate
|
||||
// resultant data (left channel only) is written to a wav file
|
||||
//----------------------------------------------------------------------
|
||||
void SoundBase::write_file(SNDFILE* file, float* buf, size_t count)
|
||||
|
@ -384,7 +386,7 @@ void SoundBase::write_file(SNDFILE* file, float* buf, size_t count)
|
|||
int err;
|
||||
if (modem_wr_sr != sample_frequency) {
|
||||
modem_wr_sr = sample_frequency;
|
||||
writ_src_data->src_ratio = sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr;
|
||||
writ_src_data->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr;
|
||||
src_set_ratio(writ_src_state, writ_src_data->src_ratio);
|
||||
}
|
||||
writ_src_data->data_in = buf;
|
||||
|
@ -742,6 +744,11 @@ size_t SoundOSS::Write(double *buf, size_t count)
|
|||
write_file(ofGenerate, buf, count);
|
||||
#endif
|
||||
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) {
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
if (txppm != progdefaults.TX_corr) {
|
||||
txppm = progdefaults.TX_corr;
|
||||
tx_src_data->src_ratio = 1.0 + txppm/1e6;
|
||||
|
@ -806,6 +813,10 @@ size_t SoundOSS::Write_stereo(double *bufleft, double *bufright, size_t count)
|
|||
write_file(ofGenerate, bufleft, count);
|
||||
#endif
|
||||
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) {
|
||||
return count;
|
||||
}
|
||||
|
||||
if (txppm != progdefaults.TX_corr) {
|
||||
txppm = progdefaults.TX_corr;
|
||||
tx_src_data->src_ratio = 1.0 + txppm/1e6;
|
||||
|
@ -1241,6 +1252,10 @@ size_t SoundPort::Write(double *buf, size_t count)
|
|||
write_file(ofGenerate, buf, count);
|
||||
#endif
|
||||
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) {
|
||||
return count;
|
||||
}
|
||||
|
||||
// copy input to both channels if right channel enabled
|
||||
for (size_t i = 0; i < count; i++)
|
||||
if (progdefaults.mono_audio)
|
||||
|
@ -1270,6 +1285,10 @@ size_t SoundPort::Write_stereo(double *bufleft, double *bufright, size_t count)
|
|||
write_file(ofCapture, bufleft, count);
|
||||
#endif
|
||||
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) {
|
||||
return count;
|
||||
}
|
||||
|
||||
// interleave into fbuf
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
if (progdefaults.ReverseAudio) {
|
||||
|
@ -1895,6 +1914,10 @@ size_t SoundPulse::Write(double* buf, size_t count)
|
|||
write_file(ofGenerate, buf, count);
|
||||
#endif
|
||||
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) {
|
||||
return count;
|
||||
}
|
||||
|
||||
// copy input to both channels
|
||||
for (size_t i = 0; i < count; i++)
|
||||
if (progdefaults.mono_audio)
|
||||
|
@ -1924,6 +1947,10 @@ size_t SoundPulse::Write_stereo(double* bufleft, double* bufright, size_t count)
|
|||
write_file(ofGenerate, bufleft, count);
|
||||
#endif
|
||||
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) {
|
||||
return count;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
if (progdefaults.ReverseAudio) {
|
||||
fbuf[sd[1].stream_params.channels * i + 1] = bufleft[i];
|
||||
|
@ -2061,6 +2088,10 @@ size_t SoundNull::Write(double* buf, size_t count)
|
|||
write_file(ofGenerate, buf, count);
|
||||
#endif
|
||||
|
||||
if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) {
|
||||
return count;
|
||||
}
|
||||
|
||||
MilliSleep((long)ceil((1e3 * count) / sample_frequency));
|
||||
|
||||
return count;
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include "configuration.h"
|
||||
#include "waterfall.h"
|
||||
#include "qrunner.h"
|
||||
#include "macros.h"
|
||||
|
||||
#include "status.h"
|
||||
#include "debug.h"
|
||||
|
@ -182,6 +183,11 @@ double modem::frequency = 1000;
|
|||
double modem::tx_frequency = 1000;
|
||||
bool modem::freqlock = false;
|
||||
|
||||
// For xml socket command
|
||||
unsigned long modem::tx_sample_count = 0;
|
||||
unsigned int modem::tx_sample_rate = 0;
|
||||
bool modem::XMLRPC_CPS_TEST = false;
|
||||
|
||||
modem::modem()
|
||||
{
|
||||
scptr = 0;
|
||||
|
@ -426,6 +432,8 @@ void modem::ModulateXmtr(double *buffer, int len)
|
|||
{
|
||||
if (unlikely(!scard)) return;
|
||||
|
||||
tx_sample_count += len;
|
||||
|
||||
if (progdefaults.PTTrightchannel) {
|
||||
for (int i = 0; i < len; i++)
|
||||
PTTchannel[i] = PTTnco();
|
||||
|
@ -433,7 +441,8 @@ void modem::ModulateXmtr(double *buffer, int len)
|
|||
return;
|
||||
}
|
||||
|
||||
if (progdefaults.viewXmtSignal)
|
||||
if (progdefaults.viewXmtSignal &&
|
||||
!(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST))
|
||||
trx_xmit_wfall_queue(samplerate, buffer, (size_t)len);
|
||||
|
||||
if (withnoise && progdefaults.noise) add_noise(buffer, len);
|
||||
|
@ -463,7 +472,10 @@ void modem::ModulateStereo(double *left, double *right, int len)
|
|||
{
|
||||
if (unlikely(!scard)) return;
|
||||
|
||||
if (progdefaults.viewXmtSignal)
|
||||
tx_sample_count += len;
|
||||
|
||||
if (progdefaults.viewXmtSignal &&
|
||||
!(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST))
|
||||
trx_xmit_wfall_queue(samplerate, left, (size_t)len);
|
||||
|
||||
if (withnoise && progdefaults.noise) add_noise(left, len);
|
||||
|
@ -699,7 +711,7 @@ struct mfntchr { char c; int byte[MAXROWS]; };
|
|||
extern mfntchr idch1[]; // original id font definition
|
||||
extern mfntchr idch2[]; // extended id font definition
|
||||
|
||||
static int symbols[MAXCHARS];
|
||||
static int id_symbols[MAXCHARS];
|
||||
|
||||
static C_FIR_filter vidfilt;
|
||||
|
||||
|
@ -728,7 +740,7 @@ void modem::wfid_send(int numchars)
|
|||
for (i = 0; i < IDSYMLEN; i++) {
|
||||
val = 0.0;
|
||||
for (k = 0; k < numchars; k++) {
|
||||
sym = symbols[numchars - k - 1];
|
||||
sym = id_symbols[numchars - k - 1];
|
||||
for (j = 0; j < NUMCOLS; j++) {
|
||||
if (sym & 1)
|
||||
val += sin(wfid_w[j + k * NUMCOLS] * i);
|
||||
|
@ -764,9 +776,9 @@ void modem::wfid_sendchars(string s)
|
|||
for (int row = 0; row < NUMROWS; row++) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (useIDSMALL)
|
||||
symbols[i] = idch1[n[i]].byte[NUMROWS - 1 - row];
|
||||
id_symbols[i] = idch1[n[i]].byte[NUMROWS - 1 - row];
|
||||
else
|
||||
symbols[i] = idch2[n[i]].byte[NUMROWS - 1 - row];
|
||||
id_symbols[i] = idch2[n[i]].byte[NUMROWS - 1 - row];
|
||||
}
|
||||
wfid_send(len);
|
||||
if (stopflag)
|
||||
|
@ -856,7 +868,7 @@ void modem::wfid_text(const string& s)
|
|||
break;
|
||||
}
|
||||
// blank lines
|
||||
for (int i = 0; i < vidwidth; i++) symbols[i] = 0;
|
||||
for (int i = 0; i < vidwidth; i++) id_symbols[i] = 0;
|
||||
wfid_send(vidwidth);
|
||||
wfid_send(vidwidth);
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include <config.h>
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <fcntl.h>
|
||||
#include <semaphore.h>
|
||||
#include <cstdlib>
|
||||
|
@ -310,6 +311,7 @@ void trx_trx_transmit_loop()
|
|||
return;
|
||||
}
|
||||
if (active_modem) {
|
||||
|
||||
try {
|
||||
current_samplerate = active_modem->get_samplerate();
|
||||
scard->Open(O_WRONLY, current_samplerate);
|
||||
|
@ -321,7 +323,10 @@ void trx_trx_transmit_loop()
|
|||
return;
|
||||
}
|
||||
|
||||
if (active_modem != ssb_modem && active_modem != anal_modem) {
|
||||
if ((active_modem != ssb_modem) &&
|
||||
(active_modem != anal_modem) &&
|
||||
!active_modem->XMLRPC_CPS_TEST &&
|
||||
!PERFORM_CPS_TEST ) {
|
||||
push2talk->set(true);
|
||||
REQ(&waterfall::set_XmtRcvBtn, wf, true);
|
||||
}
|
||||
|
@ -348,10 +353,17 @@ void trx_trx_transmit_loop()
|
|||
}
|
||||
|
||||
if (progStatus.n_rsids >= 0) {
|
||||
|
||||
// if(trx_state == STATE_TX) {
|
||||
active_modem->tx_sample_count = 0;
|
||||
active_modem->tx_sample_rate = active_modem->get_samplerate();
|
||||
// }
|
||||
|
||||
while (trx_state == STATE_TX) {
|
||||
try {
|
||||
if (active_modem->tx_process() < 0)
|
||||
if (active_modem->tx_process() < 0) {
|
||||
trx_state = STATE_RX;
|
||||
}
|
||||
}
|
||||
catch (const SndException& e) {
|
||||
scard->Close();
|
||||
|
|
|
@ -2105,12 +2105,10 @@ void waterfall::handle_mouse_wheel(int what, int d)
|
|||
val->do_callback();
|
||||
progdefaults.changed = changed_save;
|
||||
if (val == cntServerOffset || val == cntSearchRange) {
|
||||
if (active_modem)
|
||||
active_modem->set_sigsearch(SIGSEARCH);
|
||||
}
|
||||
else if (val == sldrSquelch) // sldrSquelch gives focus to TransmitText
|
||||
if (active_modem) active_modem->set_sigsearch(SIGSEARCH);
|
||||
} else if (val == sldrSquelch) { // sldrSquelch gives focus to TransmitText
|
||||
take_focus();
|
||||
|
||||
}
|
||||
if (msg_fmt) {
|
||||
char msg[60];
|
||||
snprintf(msg, sizeof(msg), msg_fmt, msg_label, val->value());
|
||||
|
|
Ładowanie…
Reference in New Issue