Compare commits

..

13 Commits

Author SHA1 Message Date
Hibby 8c33ecb38c
fix version 2024-04-13 20:37:30 +01:00
Hibby fdb7a88ffc
Backport 2024-04-13 19:03:45 +01:00
Hibby a49942a8ee
Merge branch 'debian/latest' into raspbian/bullseye 2024-04-13 19:03:30 +01:00
Dave Hibberd dab20fbde3
Release 2023-12-17 14:09:40 +00:00
Dave Hibberd 6a25dc0295
Merge branch 'debian/latest' into raspbian/bullseye 2023-12-17 14:08:59 +00:00
Dave Hibberd 34f7198b1e
updates to make it install to the right place 2023-10-10 23:20:38 +01:00
Dave Hibberd 0aabb46f9b
Test bullseye release 2023-10-10 23:06:13 +01:00
Dave Hibberd 694b212be9
Merge branch 'debian/latest' into raspbian/bullseye 2023-10-10 23:04:50 +01:00
Dave Hibberd e6c6f75c88
Release 2023-09-14 22:21:11 +01:00
Dave Hibberd 9b43ba06e7
Merge branch 'debian/latest' into raspbian/bullseye 2023-09-14 22:20:35 +01:00
Dave Hibberd 3cc6abafc7
bullseye release 2023-09-12 21:56:16 +01:00
Dave Hibberd b2e73c3203
Merge branch 'debian/latest' into raspbian/bullseye 2023-09-12 21:55:27 +01:00
Dave Hibberd e22ebf7006
Raspi Release 2023-09-05 21:15:22 +01:00
50 changed files with 1246 additions and 9199 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
.pc/

377
6pack.cpp
View File

@ -1,377 +0,0 @@
/*
Using code from 6pack Linux Kernel driver with the following licence and credits
* 6pack driver version 0.4.2, 1999/08/22
*
* This module:
* This module 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 (at your option) any later version.
*
* This module implements the AX.25 protocol for kernel-based
* devices like TTYs. It interfaces between a raw TTY, and the
* kernel's AX.25 protocol layers, just like slip.c.
* AX.25 needs to be separated from slip.c while slip.c is no
* longer a static kernel device since it is a module.
*
* Author: Andreas Könsgen <ajk@ccac.rwth-aachen.de>
*
* Lots of stuff has been taken from mkiss.c, written by
* Hans Alblas <hans@esrac.ele.tue.nl>
*
* with the fixes from
*
* Jonathan (G4KLX) Fixed to match Linux networking changes - 2.1.15.
* Matthias (DG2FEF) Fixed bug in ax25_close(): dev_lock_wait() was
* called twice, causing a deadlock.
*/
// 6pack needs fast response to received characters, and I want to be able to operate over TCP links as well as serial.
// So I think the character level stuff may need to run in a separate thread, probably using select.
//
// I also need to support multiple 6pack ports.
// ?? Do we add this as a backend to KISS driver or a separate Driver. KISS Driver is already quite messy. Not decided yet.
// ?? If using serial/real TNC we need to be able to interleave control and data bytes, but I think with TCP/QtSM it won't be necessary
// ?? Also a don't see any point in running multiple copies of QtSM on one port, but maybe should treat the QtSM channels as
// multidropped ports for scheduling (?? only if on same radio ??)
// ?? I think it needs to look like a KISS (L2) driver but will need a transmit scheduler level to do DCD/CSMA/PTT processing,
// ideally with an interlock to other drivers on same port. This needs some thought with QtSM KISS with multiple modems on one channel
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE
/****************************************************************************
* Defines for the 6pack driver.
****************************************************************************/
#define TRUE 1
#define FALSE 0
#define AX25_MAXDEV 16 /* MAX number of AX25 channels;
This can be overridden with
insmod -oax25_maxdev=nnn */
#define AX_MTU 236
/* 6pack protocol bytes/masks. */
#define SIXP_INIT_CMD 0xE8
#define SIXP_TNC_FOUND 0xE9
#define SIXP_CMD_MASK 0xC0
#define SIXP_PRIO_CMD_MASK 0x80
#define SIXP_PRIO_DATA_MASK 0x38
#define SIXP_STD_CMD_MASK 0x40
#define SIXP_DCD_MASK 0x08
#define SIXP_RX_DCD_MASK 0x18
#define SIXP_CHN_MASK 0x07
#define SIXP_TX_MASK 0x20
#define SIXP_CON_LED_ON 0x68
#define SIXP_STA_LED_ON 0x70
#define SIXP_LED_OFF 0x60
/* checksum for a valid 6pack encapsulated packet */
#define SIXP_CHKSUM 0xFF
/* priority commands */
#define SIXP_SEOF 0x40 /* TX underrun */
#define SIXP_TX_URUN 0x48 /* TX underrun */
#define SIXP_RX_ORUN 0x50 /* RX overrun */
#define SIXP_RX_BUF_OVL 0x58 /* RX overrun */
struct ax_disp {
int magic;
char * name;
/* Various fields. */
// struct tty_struct *tty; /* ptr to TTY structure */
// struct device *dev; /* easy for intr handling */
struct ax_disp *sixpack; /* mkiss txport if mkiss channel*/
/* These are pointers to the malloc()ed frame buffers. */
unsigned char *rbuff; /* receiver buffer */
int rcount; /* received chars counter */
unsigned char *xbuff; /* transmitter buffer */
unsigned char *xhead; /* pointer to next byte to XMIT */
int xleft; /* bytes left in XMIT queue */
/* SLIP interface statistics. */
unsigned long rx_packets; /* inbound frames counter */
unsigned long tx_packets; /* outbound frames counter */
unsigned long rx_errors; /* Parity, etc. errors */
unsigned long tx_errors; /* Planned stuff */
unsigned long rx_dropped; /* No memory for skb */
unsigned long tx_dropped; /* When MTU change */
unsigned long rx_over_errors; /* Frame bigger then SLIP buf. */
/* Detailed SLIP statistics. */
int mtu; /* Our mtu (to spot changes!) */
int buffsize; /* Max buffers sizes */
unsigned char flags; /* Flag values/ mode etc */
#define AXF_INUSE 0 /* Channel in use */
#define AXF_ESCAPE 1 /* ESC received */
#define AXF_ERROR 2 /* Parity, etc. error */
#define AXF_KEEPTEST 3 /* Keepalive test flag */
#define AXF_OUTWAIT 4 /* is outpacket was flag */
int mode;
/* variables for the state machine */
unsigned char tnc_ok;
unsigned char status;
unsigned char status1;
unsigned char status2;
unsigned char duplex;
unsigned char led_state;
unsigned char tx_enable;
unsigned char raw_buf[4]; /* receive buffer */
unsigned char cooked_buf[400]; /* receive buffer after 6pack decoding */
unsigned int rx_count; /* counter for receive buffer */
unsigned int rx_count_cooked; /* counter for receive buffer after 6pack decoding */
unsigned char tx_delay;
unsigned char persistance;
unsigned char slottime;
};
struct sixpack_channel {
int magic; /* magic word */
int init; /* channel exists? */
struct tty_struct *tty; /* link to tty control structure */
};
#define AX25_MAGIC 0x5316
#define SIXP_DRIVER_MAGIC 0x5304
#define SIXP_INIT_RESYNC_TIMEOUT 150 /* in 10 ms */
#define SIXP_RESYNC_TIMEOUT 500 /* in 10 ms */
/* default radio channel access parameters */
#define SIXP_TXDELAY 25 /* in 10 ms */
#define SIXP_PERSIST 50
#define SIXP_SLOTTIME 10 /* in 10 ms */
static int sixpack_encaps(unsigned char *tx_buf, unsigned char *tx_buf_raw, int length, unsigned char tx_delay);
static void sixpack_decaps(struct ax_disp *, unsigned char);
static void decode_prio_command(unsigned char, struct ax_disp *);
static void decode_std_command(unsigned char, struct ax_disp *);
static void decode_data(unsigned char, struct ax_disp *);
static void resync_tnc(unsigned long);
static void xmit_on_air(struct ax_disp *ax);
static void start_tx_timer(struct ax_disp *ax);
extern "C" void Debugprintf(const char * format, ...);
void Process6PackByte(unsigned char inbyte);
struct ax_disp axdisp;
/* Send one completely decapsulated AX.25 packet to the AX.25 layer. */
static void ax_bump(struct ax_disp *ax)
{
}
void Process6PackData(unsigned char * Bytes, int Len)
{
while(Len--)
Process6PackByte(Bytes++[0]);
}
void Process6PackByte(unsigned char inbyte)
{
struct ax_disp *ax = &axdisp;
if (inbyte == SIXP_INIT_CMD)
{
Debugprintf("6pack: SIXP_INIT_CMD received.\n");
{
// Reset state machine and allocate a 6pack struct for each modem.
// reply with INIT_CMD with the channel no of last modem
}
return;
}
if ((inbyte & SIXP_PRIO_CMD_MASK) != 0)
decode_prio_command(inbyte, ax);
else if ((inbyte & SIXP_STD_CMD_MASK) != 0)
decode_std_command(inbyte, ax);
else {
if ((ax->status & SIXP_RX_DCD_MASK) == SIXP_RX_DCD_MASK)
decode_data(inbyte, ax);
} /* else */
}
/* identify and execute a 6pack priority command byte */
void decode_prio_command(unsigned char cmd, struct ax_disp *ax)
{
unsigned char channel;
channel = cmd & SIXP_CHN_MASK;
if ((cmd & SIXP_PRIO_DATA_MASK) != 0) { /* idle ? */
/* RX and DCD flags can only be set in the same prio command,
if the DCD flag has been set without the RX flag in the previous
prio command. If DCD has not been set before, something in the
transmission has gone wrong. In this case, RX and DCD are
cleared in order to prevent the decode_data routine from
reading further data that might be corrupt. */
if (((ax->status & SIXP_DCD_MASK) == 0) &&
((cmd & SIXP_RX_DCD_MASK) == SIXP_RX_DCD_MASK)) {
if (ax->status != 1)
Debugprintf("6pack: protocol violation\n");
else
ax->status = 0;
cmd &= !SIXP_RX_DCD_MASK;
}
ax->status = cmd & SIXP_PRIO_DATA_MASK;
} /* if */
/* if the state byte has been received, the TNC is present,
so the resync timer can be reset. */
if (ax->tnc_ok == 1) {
// del_timer(&(ax->resync_t));
// ax->resync_t.data = (unsigned long) ax;
// ax->resync_t.function = resync_tnc;
// ax->resync_t.expires = jiffies + SIXP_INIT_RESYNC_TIMEOUT;
// add_timer(&(ax->resync_t));
}
ax->status1 = cmd & SIXP_PRIO_DATA_MASK;
}
/* try to resync the TNC. Called by the resync timer defined in
decode_prio_command */
static void
resync_tnc(unsigned long channel)
{
static char resync_cmd = SIXP_INIT_CMD;
struct ax_disp *ax = (struct ax_disp *) channel;
Debugprintf("6pack: resyncing TNC\n");
/* clear any data that might have been received */
ax->rx_count = 0;
ax->rx_count_cooked = 0;
/* reset state machine */
ax->status = 1;
ax->status1 = 1;
ax->status2 = 0;
ax->tnc_ok = 0;
/* resync the TNC */
ax->led_state = SIXP_LED_OFF;
// ax->tty->driver.write(ax->tty, 0, &(ax->led_state), 1);
// ax->tty->driver.write(ax->tty, 0, &resync_cmd, 1);
/* Start resync timer again -- the TNC might be still absent */
// del_timer(&(ax->resync_t));
// ax->resync_t.data = (unsigned long) ax;
// ax->resync_t.function = resync_tnc;
// ax->resync_t.expires = jiffies + SIXP_RESYNC_TIMEOUT;
// add_timer(&(ax->resync_t));
}
/* identify and execute a standard 6pack command byte */
void decode_std_command(unsigned char cmd, struct ax_disp *ax)
{
unsigned char checksum = 0, channel;
unsigned int i;
channel = cmd & SIXP_CHN_MASK;
switch (cmd & SIXP_CMD_MASK) { /* normal command */
case SIXP_SEOF:
if ((ax->rx_count == 0) && (ax->rx_count_cooked == 0)) {
if ((ax->status & SIXP_RX_DCD_MASK) ==
SIXP_RX_DCD_MASK) {
ax->led_state = SIXP_CON_LED_ON;
// ax->tty->driver.write(ax->tty, 0, &(ax->led_state), 1);
} /* if */
}
else {
ax->led_state = SIXP_LED_OFF;
// ax->tty->driver.write(ax->tty, 0, &(ax->led_state), 1);
/* fill trailing bytes with zeroes */
if (ax->rx_count == 2) {
decode_data(0, ax);
decode_data(0, ax);
ax->rx_count_cooked -= 2;
}
else if (ax->rx_count == 3) {
decode_data(0, ax);
ax->rx_count_cooked -= 1;
}
for (i = 0; i < ax->rx_count_cooked; i++)
checksum += ax->cooked_buf[i];
if (checksum != SIXP_CHKSUM) {
Debugprintf("6pack: bad checksum %2.2x\n", checksum);
}
else {
ax->rcount = ax->rx_count_cooked - 1;
ax_bump(ax);
} /* else */
ax->rx_count_cooked = 0;
} /* else */
break;
case SIXP_TX_URUN:
Debugprintf("6pack: TX underrun\n");
break;
case SIXP_RX_ORUN:
Debugprintf("6pack: RX overrun\n");
break;
case SIXP_RX_BUF_OVL:
Debugprintf("6pack: RX buffer overflow\n");
} /* switch */
} /* function */
/* decode 4 sixpack-encoded bytes into 3 data bytes */
void decode_data(unsigned char inbyte, struct ax_disp *ax)
{
unsigned char *buf;
if (ax->rx_count != 3)
ax->raw_buf[ax->rx_count++] = inbyte;
else {
buf = ax->raw_buf;
ax->cooked_buf[ax->rx_count_cooked++] =
buf[0] | ((buf[1] << 2) & 0xc0);
ax->cooked_buf[ax->rx_count_cooked++] =
(buf[1] & 0x0f) | ((buf[2] << 2) & 0xf0);
ax->cooked_buf[ax->rx_count_cooked++] =
(buf[2] & 0x03) | (inbyte << 2);
ax->rx_count = 0;
}
}

View File

@ -42,19 +42,10 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
#define VOID void #define VOID void
char * strlop(char * buf, char delim);
int gethints();
struct timespec pttclk;
extern int Closing; extern int Closing;
int SoundMode = 0; int SoundMode = 0;
int stdinMode = 0; int stdinMode = 0;
int onlyMixSnoop = 0;
int txLatency;
//#define SHARECAPTURE // if defined capture device is opened and closed for each transission //#define SHARECAPTURE // if defined capture device is opened and closed for each transission
@ -300,10 +291,10 @@ void platformInit()
void txSleep(int mS) void txSleep(int mS)
{ {
// called while waiting for next TX buffer. Run background processes // called while waiting for next TX buffer or to delay response.
// Run background processes
if (mS < 0) // called while waiting for next TX buffer. Run background processes
return;
while (mS > 50) while (mS > 50)
{ {
@ -635,8 +626,7 @@ int OpenSoundPlayback(char * PlaybackDevice, int m_sampleRate, int channels, int
{ {
int err = 0; int err = 0;
char buf1[256]; char buf1[100];
char buf2[256];
char * ptr; char * ptr;
if (playhandle) if (playhandle)
@ -648,20 +638,18 @@ int OpenSoundPlayback(char * PlaybackDevice, int m_sampleRate, int channels, int
strcpy(SavedPlaybackDevice, PlaybackDevice); // Saved so we can reopen in error recovery strcpy(SavedPlaybackDevice, PlaybackDevice); // Saved so we can reopen in error recovery
SavedPlaybackRate = m_sampleRate; SavedPlaybackRate = m_sampleRate;
strcpy(buf2, PlaybackDevice); if (strstr(PlaybackDevice, "plug") == 0 && strchr(PlaybackDevice, ':'))
sprintf(buf1, "plug%s", PlaybackDevice);
ptr = strchr(buf2, ' ');
if (ptr) *ptr = 0; // Get Device part of name
if (strstr(buf2, "plug") == 0 && strchr(buf2, ':'))
sprintf(buf1, "plug%s", buf2);
else else
strcpy(buf1, buf2); strcpy(buf1, PlaybackDevice);
if (Report) if (Report)
Debugprintf("Real Device %s", buf1); Debugprintf("Real Device %s", buf1);
ptr = strchr(buf1, ' ');
if (ptr) *ptr = 0; // Get Device part of name
snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_t *hw_params;
if ((err = snd_pcm_open(&playhandle, buf1, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0) if ((err = snd_pcm_open(&playhandle, buf1, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) < 0)
@ -746,9 +734,7 @@ int OpenSoundCapture(char * CaptureDevice, int m_sampleRate, int Report)
{ {
int err = 0; int err = 0;
char buf1[256]; char buf1[100];
char buf2[256];
char * ptr; char * ptr;
snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_t *hw_params;
@ -769,19 +755,16 @@ int OpenSoundCapture(char * CaptureDevice, int m_sampleRate, int Report)
strcpy(SavedCaptureDevice, CaptureDevice); // Saved so we can reopen in error recovery strcpy(SavedCaptureDevice, CaptureDevice); // Saved so we can reopen in error recovery
SavedCaptureRate = m_sampleRate; SavedCaptureRate = m_sampleRate;
strcpy(buf2, CaptureDevice); if (strstr(CaptureDevice, "plug") == 0 && strchr(CaptureDevice, ':'))
sprintf(buf1, "plug%s", CaptureDevice);
ptr = strchr(buf2, ' ');
if (ptr) *ptr = 0; // Get Device part of name
if (strstr(buf2, "plug") == 0 && strchr(buf2, ':'))
sprintf(buf1, "plug%s", buf2);
else else
strcpy(buf1, buf2); strcpy(buf1, CaptureDevice);
if (Report) if (Report)
Debugprintf("Real Device %s", buf1); Debugprintf("Real Device %s", buf1);
ptr = strchr(buf1, ' ');
if (ptr) *ptr = 0; // Get Device part of name
if ((err = snd_pcm_open (&rechandle, buf1, SND_PCM_STREAM_CAPTURE, 0)) < 0) { if ((err = snd_pcm_open (&rechandle, buf1, SND_PCM_STREAM_CAPTURE, 0)) < 0) {
Debugprintf("cannot open capture audio device %s (%s)", buf1, snd_strerror(err)); Debugprintf("cannot open capture audio device %s (%s)", buf1, snd_strerror(err));
@ -899,14 +882,17 @@ int OpenSoundCapture(char * CaptureDevice, int m_sampleRate, int Report)
if (Report) if (Report)
Debugprintf("Capture using %d channels", m_recchannels); Debugprintf("Capture using %d channels", m_recchannels);
int i;
short buf[256]; short buf[256];
if ((err = snd_pcm_readi(rechandle, buf, 12)) != 12) for (i = 0; i < 10; ++i)
{ {
Debugprintf("read from audio interface failed (%s)", snd_strerror(err)); if ((err = snd_pcm_readi (rechandle, buf, 128)) != 128)
{
Debugprintf("read from audio interface failed (%s)", snd_strerror (err));
}
} }
// Debugprintf("Read got %d", err); // Debugprintf("Read got %d", err);
return TRUE; return TRUE;
@ -971,11 +957,11 @@ int SoundCardWrite(short * input, int nSamples)
// Stop Capture // Stop Capture
// if (rechandle) if (rechandle)
// { {
// snd_pcm_close(rechandle); snd_pcm_close(rechandle);
// rechandle = NULL; rechandle = NULL;
// } }
avail = snd_pcm_avail_update(playhandle); avail = snd_pcm_avail_update(playhandle);
// Debugprintf("avail before play returned %d", (int)avail); // Debugprintf("avail before play returned %d", (int)avail);
@ -1203,37 +1189,30 @@ short * SoundInit();
void GetSoundDevices() void GetSoundDevices()
{ {
if (onlyMixSnoop) if (SoundMode == 0)
{ {
gethints(); GetInputDeviceCollection();
GetOutputDeviceCollection();
} }
else else if (SoundMode == 1)
{ {
if (SoundMode == 0) PlaybackCount = 3;
{
GetInputDeviceCollection();
GetOutputDeviceCollection();
}
else if (SoundMode == 1)
{
PlaybackCount = 3;
strcpy(&PlaybackNames[0][0], "/dev/dsp0"); strcpy(&PlaybackNames[0][0], "/dev/dsp0");
strcpy(&PlaybackNames[1][0], "/dev/dsp1"); strcpy(&PlaybackNames[1][0], "/dev/dsp1");
strcpy(&PlaybackNames[2][0], "/dev/dsp2"); strcpy(&PlaybackNames[2][0], "/dev/dsp2");
CaptureCount = 3; CaptureCount = 3;
strcpy(&CaptureNames[0][0], "/dev/dsp0"); strcpy(&CaptureNames[0][0], "/dev/dsp0");
strcpy(&CaptureNames[1][0], "/dev/dsp1"); strcpy(&CaptureNames[1][0], "/dev/dsp1");
strcpy(&CaptureNames[2][0], "/dev/dsp2"); strcpy(&CaptureNames[2][0], "/dev/dsp2");
} }
else if (SoundMode == 2) else if (SoundMode == 2)
{ {
// Pulse // Pulse
listpulse(); listpulse();
}
} }
} }
@ -1321,18 +1300,7 @@ void PollReceivedSamples()
// if still not enough, too bad! // if still not enough, too bad!
if (bytes != ReceiveSize * 2) if (bytes != ReceiveSize * 2)
{
// This seems to happen occasionally even when we shouldn't be in stdin mode. Exit
Debugprintf("Short Read %d", bytes); Debugprintf("Short Read %d", bytes);
closeTraceLog();
Closing = TRUE;
sleep(1);
exit(1);
}
// convert to stereo // convert to stereo
@ -1370,7 +1338,7 @@ void PollReceivedSamples()
{ {
lastlevelGUI = Now; lastlevelGUI = Now;
if ((Now - lastlevelreport) > 60000) // 60 Secs if ((Now - lastlevelreport) > 10000) // 10 Secs
{ {
char HostCmd[64]; char HostCmd[64];
lastlevelreport = Now; lastlevelreport = Now;
@ -1435,11 +1403,6 @@ short * SoundInit()
// Called at end of transmission // Called at end of transmission
int useTimedPTT = 1;
extern int SampleNo;
int pttOnTime();
void SoundFlush() void SoundFlush()
{ {
// Append Trailer then send remaining samples // Append Trailer then send remaining samples
@ -1455,71 +1418,43 @@ void SoundFlush()
// Wait for tx to complete // Wait for tx to complete
// Debugprintf("Flush Soundmode = %d", SoundMode); Debugprintf("Flush Soundmode = %d", SoundMode);
if (SoundMode == 0) // ALSA if (SoundMode == 0) // ALSA
{ {
if (useTimedPTT) usleep(100000);
while (1 && playhandle)
{ {
// Calulate PTT Time from Number of samples and samplerate snd_pcm_sframes_t avail = snd_pcm_avail_update(playhandle);
// samples sent is is in SampleNo, Time PTT was raised in timeval pttclk // Debugprintf("Waiting for complete. Avail %d Max %d", avail, MaxAvail);
// txLatency is extra ptt time to compenstate for time soundcard takes to start outputting samples
struct timespec pttnow; snd_pcm_status_alloca(&status); // alloca allocates once per function, does not need a free
clock_gettime(CLOCK_MONOTONIC, &pttnow); // Debugprintf("Waiting for complete. Avail %d Max %d last %d", avail, MaxAvail, lastavail);
time_t pttontimemS = (pttclk.tv_sec * 1000) + (pttclk.tv_nsec / 1000000); if ((err = snd_pcm_status(playhandle, status)) != 0)
time_t nowtimemS = (pttnow.tv_sec * 1000) + (pttnow.tv_nsec / 1000000);
// We have already added latency to tail, so don't add again
int txlenMs = (1000 * SampleNo / TX_Samplerate); // 12000 samples per sec.
Debugprintf("Tx Time %d Time till end = %d", txlenMs, (nowtimemS - pttontimemS));
txSleep(txlenMs - (nowtimemS - pttontimemS));
}
else
{
usleep(100000);
while (1 && playhandle)
{ {
snd_pcm_sframes_t avail = snd_pcm_avail_update(playhandle); Debugprintf("snd_pcm_status() failed: %s", snd_strerror(err));
break;
// Debugprintf("Waiting for complete. Avail %d Max %d", avail, MaxAvail);
snd_pcm_status_alloca(&status); // alloca allocates once per function, does not need a free
// Debugprintf("Waiting for complete. Avail %d Max %d last %d", avail, MaxAvail, lastavail);
if ((err = snd_pcm_status(playhandle, status)) != 0)
{
Debugprintf("snd_pcm_status() failed: %s", snd_strerror(err));
break;
}
res = snd_pcm_status_get_state(status);
// Debugprintf("PCM Status = %d", res);
if (res != SND_PCM_STATE_RUNNING || lastavail == avail) // If sound system is not running then it needs data
// if (res != SND_PCM_STATE_RUNNING) // If sound system is not running then it needs data
// if (MaxAvail - avail < 100)
{
// Send complete - Restart Capture
OpenSoundCapture(SavedCaptureDevice, SavedCaptureRate, 0);
break;
}
lastavail = avail;
usleep(50000);
} }
res = snd_pcm_status_get_state(status);
// Debugprintf("PCM Status = %d", res);
if (res != SND_PCM_STATE_RUNNING || lastavail == avail) // If sound system is not running then it needs data
// if (res != SND_PCM_STATE_RUNNING) // If sound system is not running then it needs data
// if (MaxAvail - avail < 100)
{
// Send complete - Restart Capture
OpenSoundCapture(SavedCaptureDevice, SavedCaptureRate, 0);
break;
}
lastavail = avail;
usleep(50000);
} }
// I think we should turn round the link here. I dont see the point in // I think we should turn round the link here. I dont see the point in
// waiting for MainPoll // waiting for MainPoll
@ -1789,6 +1724,32 @@ int gpioInitialise(void)
int stricmp(const unsigned char * pStr1, const unsigned char *pStr2)
{
unsigned char c1, c2;
int v;
if (pStr1 == NULL)
{
if (pStr2)
Debugprintf("stricmp called with NULL 1st param - 2nd %s ", pStr2);
else
Debugprintf("stricmp called with two NULL params");
return 1;
}
do {
c1 = *pStr1++;
c2 = *pStr2++;
/* The casts are necessary when pStr1 is shorter & char is signed */
v = tolower(c1) - tolower(c2);
} while ((v == 0) && (c1 != '\0') && (c2 != '\0') );
return v;
}
char Leds[8]= {0}; char Leds[8]= {0};
unsigned int PKTLEDTimer = 0; unsigned int PKTLEDTimer = 0;
@ -1858,7 +1819,7 @@ VOID COMClearRTS(HANDLE fd)
HANDLE OpenCOMPort(char * Port, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits) HANDLE OpenCOMPort(char * Port, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits)
{ {
char buf[256]; char buf[100];
// Linux Version. // Linux Version.
@ -1967,177 +1928,3 @@ VOID CloseCOMPort(HANDLE fd)
close(fd); close(fd);
} }
// "hints" processing for looking for SNOOP/MIX devices
int gethints()
{
const char *iface = "pcm";
void **hints;
char **n;
int err;
char hwdev[256];
snd_pcm_t *pcm = NULL;
char NameString[256];
CloseSoundCard();
Debugprintf("Available Mix/Snoop Devices\n");
PlaybackCount = 0;
CaptureCount = 0;
err = snd_device_name_hint(-1, iface, &hints);
if (err < 0)
Debugprintf("snd_device_name_hint error: %s", snd_strerror(err));
n = (char **)hints;
while (*n != NULL)
{
if (memcmp(*n, "NAMEmix", 7) == 0) //NAMEmix00|DESCQtSM Mix for hw0:0
{
char Hint[256];
char * ptr;
snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK;
strcpy(Hint, *n);
ptr = strchr(Hint, '|');
if (ptr)
{
*ptr++ = 0;
}
strcpy(hwdev, &Hint[4]);
err = snd_pcm_open(&pcm, hwdev, stream, SND_PCM_NONBLOCK);
if (err)
{
Debugprintf("Error %d opening output device %s ", err, hwdev);
goto nextdevice;
}
// Add device to list
if (ptr)
sprintf(NameString, "%s %s", hwdev, &ptr[4]);
else
strcpy(NameString, hwdev);
Debugprintf(NameString);
strcpy(PlaybackNames[PlaybackCount++], NameString);
snd_pcm_close(pcm);
pcm = NULL;
}
else if (memcmp(*n, "NAMEsnoop", 9) == 0)
{
char Hint[256];
char * ptr;
snd_pcm_stream_t stream = SND_PCM_STREAM_CAPTURE;
strcpy(Hint, *n);
ptr = strchr(Hint, '|');
if (ptr)
{
*ptr++ = 0;
}
strcpy(hwdev, &Hint[4]);
err = snd_pcm_open(&pcm, hwdev, stream, SND_PCM_NONBLOCK);
if (err)
{
Debugprintf("Error %d opening input device %s ", err, hwdev);
goto nextdevice;
}
// Add device to list
if (ptr)
sprintf(NameString, "%s %s", hwdev, &ptr[4]);
else
strcpy(NameString, hwdev);
Debugprintf(NameString);
strcpy(CaptureNames[CaptureCount++], NameString);
snd_pcm_close(pcm);
pcm = NULL;
}
nextdevice:
n++;
}
snd_device_name_free_hint(hints);
return 0;
}
// Microsoft routines not available in gcc
int memicmp(unsigned char *a, unsigned char *b, int n)
{
if (n)
{
while (n && (toupper(*a) == toupper(*b)))
n--, a++, b++;
if (n)
return toupper(*a) - toupper(*b);
}
return 0;
}
int stricmp(const unsigned char * pStr1, const unsigned char *pStr2)
{
unsigned char c1, c2;
int v;
if (pStr1 == NULL)
{
if (pStr2)
Debugprintf("stricmp called with NULL 1st param - 2nd %s ", pStr2);
else
Debugprintf("stricmp called with two NULL params");
return 1;
}
do {
c1 = *pStr1++;
c2 = *pStr2++;
/* The casts are necessary when pStr1 is shorter & char is signed */
v = tolower(c1) - tolower(c2);
} while ((v == 0) && (c1 != '\0') && (c2 != '\0'));
return v;
}
char * strupr(char* s)
{
char* p = s;
if (s == 0)
return 0;
while (*p = toupper(*p)) p++;
return s;
}
char * strlwr(char* s)
{
char* p = s;
while (*p = tolower(*p)) p++;
return s;
}

189
ARDOPC.c
View File

@ -1025,6 +1025,195 @@ BOOL blnErrorsCorrected;
#define NEWRS #define NEWRS
BOOL xRSDecode(UCHAR * bytRcv, int Length, int CheckLen, BOOL * blnRSOK)
{
#ifdef NEWRS
// Using a modified version of Henry Minsky's code
//Copyright Henry Minsky (hqm@alum.mit.edu) 1991-2009
// Rick's Implementation processes the byte array in reverse. and also
// has the check bytes in the opposite order. I've modified the encoder
// to allow for this, but so far haven't found a way to mske the decoder
// work, so I have to reverse the data and checksum to decode G8BPQ Nov 2015
// returns TRUE if was ok or correction succeeded, FALSE if correction impossible
UCHAR intTemp[256]; // WOrk Area to pass to Decoder
int i;
UCHAR * ptr2 = intTemp;
UCHAR * ptr1 = &bytRcv[Length - CheckLen -1]; // Last Byte of Data
int DataLen = Length - CheckLen;
int PadLength = 255 - Length; // Padding bytes needed for shortened RS codes
*blnRSOK = FALSE;
if (Length > 255 || Length < (1 + CheckLen)) //Too long or too short
return FALSE;
if (NPAR != CheckLen) // Changed RS Len, so recalc constants;
{
NPAR = CheckLen;
MaxErrors = NPAR /2;
initialize_ecc();
}
// We reverse the data while zero padding it to speed things up
// We Need (Data Reversed) (Zero Padding) (Checkbytes Reversed)
// Reverse Data
for (i = 0; i < DataLen; i++)
{
*(ptr2++) = *(ptr1--);
}
// Clear padding
memset(ptr2, 0, PadLength);
ptr2+= PadLength;
// Error Bits
ptr1 = &bytRcv[Length - 1]; // End of check bytes
for (i = 0; i < CheckLen; i++)
{
*(ptr2++) = *(ptr1--);
}
decode_data(intTemp, 255);
// check if syndrome is all zeros
if (check_syndrome() == 0)
{
// RS ok, so no need to correct
*blnRSOK = TRUE;
return TRUE; // No Need to Correct
}
if (correct_errors_erasures (intTemp, 255, 0, 0) == 0) // Dont support erasures at the momnet
// Uncorrectable
return FALSE;
// Data has been corrected, so need to reverse again
ptr1 = &intTemp[DataLen - 1];
ptr2 = bytRcv; // Last Byte of Data
for (i = 0; i < DataLen; i++)
{
*(ptr2++) = *(ptr1--);
}
// ?? Do we need to return the check bytes ??
// Yes, so we can redo RS Check on supposedly connected frame
ptr1 = &intTemp[254]; // End of Check Bytes
for (i = 0; i < CheckLen; i++)
{
*(ptr2++) = *(ptr1--);
}
return TRUE;
}
#else
// Old (Rick's) code
// Sets blnRSOK if OK without correction
// Returns TRUE if OK oe Corrected
// False if Can't correct
UCHAR intTemp[256]; // Work Area to pass to Decoder
int i;
int intStartIndex;
UCHAR * ptr2 = intTemp;
UCHAR * ptr1 = bytRcv;
BOOL RSWasOK;
int DataLen = Length - CheckLen;
int PadLength = 255 - Length; // Padding bytes needed for shortened RS codes
*blnRSOK = FALSE;
if (Length > 255 || Length < (1 + CheckLen)) //Too long or too short
return FALSE;
if (NPAR != CheckLen) // Changed RS Len, so recalc constants;
{
NPAR = CheckLen;
tt = sqrt(NPAR);
kk = 255-CheckLen;
generate_gf();
gen_poly();
}
intStartIndex = 255 - Length; // set the start point for shortened RS codes
// We always work on a 255 byte buffer, prepending zeros if neccessary
// Clear padding
memset(ptr2, 0, PadLength);
ptr2 += PadLength;
memcpy(ptr2, ptr1, Length);
// convert to indexed form
for(i = 0; i < 256; i++)
{
// intIsave = i;
// intIndexSave = index_of[intTemp[i]];
recd[i] = index_of[intTemp[i]];
}
// printtick("entering decode_rs");
blnErrorsCorrected = FALSE;
RSWasOK = decode_rs();
// printtick("decode_rs Done");
*blnRSOK = RSWasOK;
if (RSWasOK)
return TRUE;
if(blnErrorsCorrected)
{
for (i = 0; i < DataLen; i++)
{
bytRcv[i] = recd[i + intStartIndex];
}
return TRUE;
}
return FALSE;
}
#endif
// Function to encode ConnectRequest frame // Function to encode ConnectRequest frame
// ' Function to encode an ACK control frame (2 bytes total) ...with 5 bit Quality code // ' Function to encode an ACK control frame (2 bytes total) ...with 5 bit Quality code

View File

@ -45,28 +45,156 @@ VOID ClearBusy()
intLastStop = 0; // This will force the busy detector to ignore old averages and initialze the rolling average filters intLastStop = 0; // This will force the busy detector to ignore old averages and initialze the rolling average filters
} }
extern int FFTSize; /*
// Function to implement a busy detector based on 1024 point FFT
BOOL BusyDetect3(float * dblMag, int StartFreq, int EndFreq) BOOL BusyDetect2(float * dblMag, int intStart, int intStop) // this only called while searching for leader ...once leader detected, no longer called.
{ {
// each bin is about 12000/1024 or 11.72 Hz
// Based on code from ARDOP, but using diffferent FFT size // this only called while searching for leader ...once leader detected, no longer called.
// QtSM is using an FFT size based on waterfall settings.
// First sort signals and look at highes signals:baseline ratio.. // First sort signals and look at highes signals:baseline ratio..
// Start and Stop are in Hz. Convert to bin numbers float dblAVGSignalPerBinNarrow, dblAVGSignalPerBinWide, dblAVGBaselineNarrow, dblAVGBaselineWide;
float dblFastAlpha = 0.4f;
float dblSlowAlpha = 0.2f;
float dblAvgStoNNarrow, dblAvgStoNWide;
int intNarrow = 8; // 8 x 11.72 Hz about 94 z
int intWide = ((intStop - intStart) * 2) / 3; //* 0.66);
int blnBusy = FALSE;
float dblAvgStoNSlowNarrow = 0;
float dblAvgStoNFastNarrow = 0;
float dblAvgStoNSlowWide = 0;
float dblAvgStoNFastWide = 0;
// First narrow band (~94Hz)
SortSignals(dblMag, intStart, intStop, intNarrow, &dblAVGSignalPerBinNarrow, &dblAVGBaselineNarrow);
if (intLastStart == intStart && intLastStop == intStop)
{
dblAvgStoNSlowNarrow = (1 - dblSlowAlpha) * dblAvgStoNSlowNarrow + dblSlowAlpha * dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
dblAvgStoNFastNarrow = (1 - dblFastAlpha) * dblAvgStoNFastNarrow + dblFastAlpha * dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
}
else
{
dblAvgStoNSlowNarrow = dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
dblAvgStoNFastNarrow = dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
intLastStart = intStart;
intLastStop = intStop;
}
dblAvgStoNNarrow = max(dblAvgStoNSlowNarrow, dblAvgStoNFastNarrow); // computes fast attack, slow release
// Wide band (66% ofr current bandwidth)
SortSignals(dblMag, intStart, intStop, intWide, &dblAVGSignalPerBinWide, &dblAVGBaselineWide);
if (intLastStart == intStart && intLastStop == intStop)
{
dblAvgStoNSlowWide = (1 - dblSlowAlpha) * dblAvgStoNSlowWide + dblSlowAlpha * dblAVGSignalPerBinWide / dblAVGBaselineWide;
dblAvgStoNFastWide = (1 - dblFastAlpha) * dblAvgStoNFastWide + dblFastAlpha * dblAVGSignalPerBinWide / dblAVGBaselineWide;
}
else
{
dblAvgStoNSlowWide = dblAVGSignalPerBinWide / dblAVGBaselineWide;
dblAvgStoNFastWide = dblAVGSignalPerBinWide / dblAVGBaselineWide;
intLastStart = intStart;
intLastStop = intStop;
}
dblAvgStoNNarrow = max(dblAvgStoNSlowNarrow, dblAvgStoNFastNarrow); // computes fast attack, slow release
dblAvgStoNWide = max(dblAvgStoNSlowWide, dblAvgStoNFastWide); // computes fast attack, slow release
// Preliminary calibration...future a function of bandwidth and BusyDet.
switch (ARQBandwidth)
{
case B200MAX:
case B200FORCED:
if (dblAvgStoNNarrow > 1.5 * BusyDet|| dblAvgStoNWide > 2.5 * BusyDet)
blnBusy = True;
break;
case B500MAX:
case B500FORCED:
if (dblAvgStoNNarrow > 1.5 * BusyDet || dblAvgStoNWide > 2.5 * BusyDet)
blnBusy = True;
break;
case B1000MAX:
case B1000FORCED:
if (dblAvgStoNNarrow > 1.4 * BusyDet || dblAvgStoNWide > 2 * BusyDet)
blnBusy = True;
break;
case B2000MAX:
case B2000FORCED:
if (dblAvgStoNNarrow > 1.4 * BusyDet || dblAvgStoNWide > 2 * BusyDet)
blnBusy = True;
}
if (blnBusy) // This used to skip over one call busy nuisance trips. Busy must be present at least 2 consecutive times to be reported
{
intBusyOnCnt += 1;
intBusyOffCnt = 0;
if (intBusyOnCnt > 1)
blnBusy = True;
else if (!blnBusy)
{
intBusyOffCnt += 1;
intBusyOnCnt = 0;
if (intBusyOffCnt > 3)
blnBusy = False;
}
}
if (blnLastBusy == False && blnBusy)
{
int x = round(dblAvgStoNNarrow); // odd, but PI doesnt print floats properly
int y = round(dblAvgStoNWide);
blnLastBusy = True;
LastBusyOn = Now;
#ifdef __ARM_ARCH
WriteDebugLog(LOGDEBUG, "[BusyDetect2: BUSY ON StoN Narrow = %d StoN Wide %d", x, y);
#else
WriteDebugLog(LOGDEBUG, "[BusyDetect2: BUSY ON StoN Narrow = %f StoN Wide %f", dblAvgStoNNarrow, dblAvgStoNWide);
#endif
}
else if (blnLastBusy == True && !blnBusy)
{
int x = round(dblAvgStoNNarrow); // odd, but PI doesnt print floats properly
int y = round(dblAvgStoNWide);
blnLastBusy = False;
LastBusyOff = Now;
#ifdef __ARM_ARCH
WriteDebugLog(LOGDEBUG, "[BusyDetect2: BUSY OFF StoN Narrow = %d StoN Wide %d", x, y);
#else
WriteDebugLog(LOGDEBUG, "[BusyDetect2: BUSY OFF StoN Narrow = %f StoN Wide %f", dblAvgStoNNarrow, dblAvgStoNWide);
#endif
}
return blnLastBusy;
}
float BinSize = 12000.0 / FFTSize; */
int StartBin = StartFreq / BinSize;
int EndBin = EndFreq / BinSize;
BOOL BusyDetect3(float * dblMag, int intStart, int intStop) // this only called while searching for leader ...once leader detected, no longer called.
{
// each bin is about 12000/1024 or 11.72 Hz
// this only called while searching for leader ...once leader detected, no longer called.
// First sort signals and look at highes signals:baseline ratio..
float dblAVGSignalPerBinNarrow, dblAVGSignalPerBinWide, dblAVGBaselineNarrow, dblAVGBaselineWide; float dblAVGSignalPerBinNarrow, dblAVGSignalPerBinWide, dblAVGBaselineNarrow, dblAVGBaselineWide;
float dblSlowAlpha = 0.2f; float dblSlowAlpha = 0.2f;
float dblAvgStoNNarrow = 0, dblAvgStoNWide = 0; float dblAvgStoNNarrow = 0, dblAvgStoNWide = 0;
int intNarrow = 100 / BinSize; // 8 x 11.72 Hz about 94 z int intNarrow = 8; // 8 x 11.72 Hz about 94 z
int intWide = ((EndBin - StartBin) * 2) / 3; //* 0.66); int intWide = ((intStop - intStart) * 2) / 3; //* 0.66);
int blnBusy = FALSE; int blnBusy = FALSE;
int BusyDet4th = BusyDet * BusyDet * BusyDet * BusyDet; int BusyDet4th = BusyDet * BusyDet * BusyDet * BusyDet;
@ -74,32 +202,32 @@ BOOL BusyDetect3(float * dblMag, int StartFreq, int EndFreq)
// First sort signals and look at highest signals:baseline ratio.. // First sort signals and look at highest signals:baseline ratio..
// First narrow band (~94Hz) // First narrow band (~94Hz)
SortSignals2(dblMag, StartBin, EndBin, intNarrow, &dblAVGSignalPerBinNarrow, &dblAVGBaselineNarrow); SortSignals2(dblMag, intStart, intStop, intNarrow, &dblAVGSignalPerBinNarrow, &dblAVGBaselineNarrow);
if (intLastStart == StartBin && intLastStop == EndBin) if (intLastStart == intStart && intLastStop == intStop)
dblAvgStoNNarrow = (1 - dblSlowAlpha) * dblAvgStoNNarrow + dblSlowAlpha * dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow; dblAvgStoNNarrow = (1 - dblSlowAlpha) * dblAvgStoNNarrow + dblSlowAlpha * dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
else else
{ {
// This initializes the Narrow average after a bandwidth change // This initializes the Narrow average after a bandwidth change
dblAvgStoNNarrow = dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow; dblAvgStoNNarrow = dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
intLastStart = StartBin; intLastStart = intStart;
intLastStop = EndBin; intLastStop = intStop;
} }
// Wide band (66% of current bandwidth) // Wide band (66% of current bandwidth)
SortSignals2(dblMag, StartBin, EndBin, intWide, &dblAVGSignalPerBinWide, &dblAVGBaselineWide); SortSignals2(dblMag, intStart, intStop, intWide, &dblAVGSignalPerBinWide, &dblAVGBaselineWide);
if (intLastStart == StartBin && intLastStop == EndBin) if (intLastStart == intStart && intLastStop == intStop)
dblAvgStoNWide = (1 - dblSlowAlpha) * dblAvgStoNWide + dblSlowAlpha * dblAVGSignalPerBinWide / dblAVGBaselineWide; dblAvgStoNWide = (1 - dblSlowAlpha) * dblAvgStoNWide + dblSlowAlpha * dblAVGSignalPerBinWide / dblAVGBaselineWide;
else else
{ {
// This initializes the Wide average after a bandwidth change // This initializes the Wide average after a bandwidth change
dblAvgStoNWide = dblAVGSignalPerBinWide / dblAVGBaselineWide; dblAvgStoNWide = dblAVGSignalPerBinWide / dblAVGBaselineWide;
intLastStart = StartBin; intLastStart = intStart;
intLastStop = EndBin; intLastStop = intStop;
} }
// Preliminary calibration...future a function of bandwidth and BusyDet. // Preliminary calibration...future a function of bandwidth and BusyDet.

View File

@ -1,4 +1,4 @@
/* /*extern "C"
Copyright (C) 2019-2020 Andrei Kopanchuk UZ7HO Copyright (C) 2019-2020 Andrei Kopanchuk UZ7HO
This file is part of QtSoundModem This file is part of QtSoundModem
@ -29,12 +29,8 @@ extern "C" void get_exclude_list(char * line, TStringList * list);
extern "C" void get_exclude_frm(char * line, TStringList * list); extern "C" void get_exclude_frm(char * line, TStringList * list);
extern "C" int SoundMode; extern "C" int SoundMode;
extern "C" bool onlyMixSnoop; extern "C" int RX_SR;
extern "C" int TX_SR;
//extern "C" int RX_SR;
//extern "C" int TX_SR;
extern "C" int txLatency;
extern "C" int multiCore; extern "C" int multiCore;
extern "C" char * Wisdom; extern "C" char * Wisdom;
extern int WaterfallMin; extern int WaterfallMin;
@ -59,18 +55,11 @@ extern int CWIDRight;
extern int CWIDType; extern int CWIDType;
extern bool afterTraffic; extern bool afterTraffic;
extern bool darkTheme; extern bool darkTheme;
extern "C" bool useKISSControls;
extern "C" int RSID_SABM[4]; extern "C" int RSID_SABM[4];
extern "C" int RSID_UI[4]; extern "C" int RSID_UI[4];
extern "C" int RSID_SetModem[4]; extern "C" int RSID_SetModem[4];
extern "C" int nonGUIMode;
extern char SixPackDevice[256];
extern int SixPackPort;
extern int SixPackEnable;
extern int MgmtPort;
extern QFont Font; extern QFont Font;
@ -150,12 +139,8 @@ void getSettings()
strcpy(UDPHost, settings->value("Init/UDPHost", "192.168.1.255").toString().toUtf8()); strcpy(UDPHost, settings->value("Init/UDPHost", "192.168.1.255").toString().toUtf8());
UDPServ = settings->value("Init/UDPServer", FALSE).toBool(); UDPServ = settings->value("Init/UDPServer", FALSE).toBool();
// RX_SR = settings->value("Init/RXSampleRate", 12000).toInt(); RX_SR = settings->value("Init/RXSampleRate", 12000).toInt();
// TX_SR = settings->value("Init/TXSampleRate", 12000).toInt(); TX_SR = settings->value("Init/TXSampleRate", 12000).toInt();
txLatency = settings->value("Init/txLatency", 50).toInt();
onlyMixSnoop = settings->value("Init/onlyMixSnoop", 0).toInt();
strcpy(CaptureDevice, settings->value("Init/SndRXDeviceName", "hw:1,0").toString().toUtf8()); strcpy(CaptureDevice, settings->value("Init/SndRXDeviceName", "hw:1,0").toString().toUtf8());
strcpy(PlaybackDevice, settings->value("Init/SndTXDeviceName", "hw:1,0").toString().toUtf8()); strcpy(PlaybackDevice, settings->value("Init/SndTXDeviceName", "hw:1,0").toString().toUtf8());
@ -181,10 +166,6 @@ void getSettings()
HamLibPort = settings->value("Init/HamLibPort", 4532).toInt(); HamLibPort = settings->value("Init/HamLibPort", 4532).toInt();
strcpy(HamLibHost, settings->value("Init/HamLibHost", "127.0.0.1").toString().toUtf8()); strcpy(HamLibHost, settings->value("Init/HamLibHost", "127.0.0.1").toString().toUtf8());
FLRigPort = settings->value("Init/FLRigPort", 12345).toInt();
strcpy(FLRigHost, settings->value("Init/FLRigHost", "127.0.0.1").toString().toUtf8());
DualPTT = settings->value("Init/DualPTT", 1).toInt(); DualPTT = settings->value("Init/DualPTT", 1).toInt();
TX_rotate = settings->value("Init/TXRotate", 0).toInt(); TX_rotate = settings->value("Init/TXRotate", 0).toInt();
multiCore = settings->value("Init/multiCore", 0).toInt(); multiCore = settings->value("Init/multiCore", 0).toInt();
@ -219,7 +200,6 @@ void getSettings()
soundChannel[3] = settings->value("Modem/soundChannel4", 0).toInt(); soundChannel[3] = settings->value("Modem/soundChannel4", 0).toInt();
SCO = settings->value("Init/SCO", 0).toInt(); SCO = settings->value("Init/SCO", 0).toInt();
useKISSControls = settings->value("Init/useKISSControls", 0).toBool();
dcd_threshold = settings->value("Modem/DCDThreshold", 40).toInt(); dcd_threshold = settings->value("Modem/DCDThreshold", 40).toInt();
rxOffset = settings->value("Modem/rxOffset", 0).toInt(); rxOffset = settings->value("Modem/rxOffset", 0).toInt();
@ -228,14 +208,9 @@ void getSettings()
AGWPort = settings->value("AGWHost/Port", 8000).toInt(); AGWPort = settings->value("AGWHost/Port", 8000).toInt();
KISSServ = settings->value("KISS/Server", FALSE).toBool(); KISSServ = settings->value("KISS/Server", FALSE).toBool();
KISSPort = settings->value("KISS/Port", 8105).toInt(); KISSPort = settings->value("KISS/Port", 8105).toInt();
MgmtPort = settings->value("MGMT/Port", 0).toInt();
SixPackEnable = settings->value("SixPack/Enable", FALSE).toBool(); RX_Samplerate = RX_SR + RX_SR * 0.000001*RX_PPM;
SixPackPort = settings->value("SixPack/Port", 0).toInt(); TX_Samplerate = TX_SR + TX_SR * 0.000001*TX_PPM;
strcpy(SixPackDevice, settings->value("SixPack/Device", "").toString().toUtf8());
// RX_Samplerate = RX_SR + RX_SR * 0.000001*RX_PPM;
// TX_Samplerate = TX_SR + TX_SR * 0.000001*TX_PPM;
emph_all[0] = settings->value("Modem/PreEmphasisAll1", FALSE).toBool(); emph_all[0] = settings->value("Modem/PreEmphasisAll1", FALSE).toBool();
emph_all[1] = settings->value("Modem/PreEmphasisAll2", FALSE).toBool(); emph_all[1] = settings->value("Modem/PreEmphasisAll2", FALSE).toBool();
@ -390,9 +365,7 @@ void saveSettings()
settings->setValue("PointSize", Font.pointSize()); settings->setValue("PointSize", Font.pointSize());
settings->setValue("Weight", Font.weight()); settings->setValue("Weight", Font.weight());
if (nonGUIMode == 0) settings->setValue("PSKWindow", constellationDialog->geometry());
settings->setValue("PSKWindow", constellationDialog->geometry());
settings->setValue("Init/SoundMode", SoundMode); settings->setValue("Init/SoundMode", SoundMode);
settings->setValue("Init/UDPClientPort", UDPClientPort); settings->setValue("Init/UDPClientPort", UDPClientPort);
settings->setValue("Init/UDPServerPort", UDPServerPort); settings->setValue("Init/UDPServerPort", UDPServerPort);
@ -402,16 +375,12 @@ void saveSettings()
settings->setValue("Init/UDPHost", UDPHost); settings->setValue("Init/UDPHost", UDPHost);
// settings->setValue("Init/TXSampleRate", TX_SR); settings->setValue("Init/TXSampleRate", TX_SR);
// settings->setValue("Init/RXSampleRate", RX_SR); settings->setValue("Init/RXSampleRate", RX_SR);
settings->setValue("Init/txLatency", txLatency);
settings->setValue("Init/onlyMixSnoop", onlyMixSnoop);
settings->setValue("Init/SndRXDeviceName", CaptureDevice); settings->setValue("Init/SndRXDeviceName", CaptureDevice);
settings->setValue("Init/SndTXDeviceName", PlaybackDevice); settings->setValue("Init/SndTXDeviceName", PlaybackDevice);
settings->setValue("Init/useKISSControls", useKISSControls);
settings->setValue("Init/SCO", SCO); settings->setValue("Init/SCO", SCO);
settings->setValue("Init/DualPTT", DualPTT); settings->setValue("Init/DualPTT", DualPTT);
settings->setValue("Init/TXRotate", TX_rotate); settings->setValue("Init/TXRotate", TX_rotate);
@ -431,9 +400,6 @@ void saveSettings()
settings->setValue("Init/CM108Addr", CM108Addr); settings->setValue("Init/CM108Addr", CM108Addr);
settings->setValue("Init/HamLibPort", HamLibPort); settings->setValue("Init/HamLibPort", HamLibPort);
settings->setValue("Init/HamLibHost", HamLibHost); settings->setValue("Init/HamLibHost", HamLibHost);
settings->setValue("Init/FLRigPort", FLRigPort);
settings->setValue("Init/FLRigHost", FLRigHost);
settings->setValue("Init/MinimizetoTray", MintoTray); settings->setValue("Init/MinimizetoTray", MintoTray);
settings->setValue("Init/multiCore", multiCore); settings->setValue("Init/multiCore", multiCore);
settings->setValue("Init/Wisdom", Wisdom); settings->setValue("Init/Wisdom", Wisdom);
@ -470,12 +436,6 @@ void saveSettings()
settings->setValue("AGWHost/Port", AGWPort); settings->setValue("AGWHost/Port", AGWPort);
settings->setValue("KISS/Server", KISSServ); settings->setValue("KISS/Server", KISSServ);
settings->setValue("KISS/Port", KISSPort); settings->setValue("KISS/Port", KISSPort);
settings->setValue("MGMT/Port", MgmtPort);
settings->setValue("SixPack/Enable", SixPackEnable);
settings->setValue("SixPack/Port", SixPackPort);
settings->setValue("SixPack/Device", SixPackDevice);
settings->setValue("Modem/PreEmphasisAll1", emph_all[0]); settings->setValue("Modem/PreEmphasisAll1", emph_all[0]);
settings->setValue("Modem/PreEmphasisAll2", emph_all[1]); settings->setValue("Modem/PreEmphasisAll2", emph_all[1]);

View File

@ -1,481 +0,0 @@
/*extern "C"
Copyright (C) 2019-2020 Andrei Kopanchuk UZ7HO
This file is part of QtSoundModem
QtSoundModem is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QtSoundModem is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QtSoundModem. If not, see http://www.gnu.org/licenses
*/
// UZ7HO Soundmodem Port by John Wiseman G8BPQ
#include <QSettings>
#include <QDialog>
#include "UZ7HOStuff.h"
extern "C" void get_exclude_list(char * line, TStringList * list);
extern "C" void get_exclude_frm(char * line, TStringList * list);
extern "C" int SoundMode;
extern "C" int RX_SR;
extern "C" int TX_SR;
extern "C" int multiCore;
extern "C" char * Wisdom;
extern int WaterfallMin;
extern int WaterfallMax;
extern "C" word MEMRecovery[5];
extern int MintoTray;
extern "C" int UDPClientPort;
extern "C" int UDPServerPort;
extern "C" int TXPort;
extern char UDPHost[64];
extern QDialog * constellationDialog;
extern QRect PSKRect;
extern char CWIDCall[128];
extern "C" char CWIDMark[32];
extern int CWIDInterval;
extern int CWIDLeft;
extern int CWIDRight;
extern int CWIDType;
extern bool afterTraffic;
extern bool darkTheme;
extern "C" int RSID_SABM[4];
extern "C" int RSID_UI[4];
extern "C" int RSID_SetModem[4];
extern QFont Font;
QSettings* settings = new QSettings("QtSoundModem.ini", QSettings::IniFormat);
// This makes geting settings for more channels easier
char Prefix[16] = "AX25_A";
void GetPortSettings(int Chan);
QVariant getAX25Param(const char * key, QVariant Default)
{
char fullKey[64];
QVariant Q;
QByteArray x;
sprintf(fullKey, "%s/%s", Prefix, key);
Q = settings->value(fullKey, Default);
x = Q.toString().toUtf8();
return Q;
}
void getAX25Params(int chan)
{
Prefix[5] = chan + 'A';
GetPortSettings(chan);
}
void GetPortSettings(int Chan)
{
tx_hitoneraisedb[Chan] = getAX25Param("HiToneRaise", 0).toInt();
maxframe[Chan] = getAX25Param("Maxframe", 3).toInt();
fracks[Chan] = getAX25Param("Retries", 15).toInt();
frack_time[Chan] = getAX25Param("FrackTime", 5).toInt();
idletime[Chan] = getAX25Param("IdleTime", 180).toInt();
slottime[Chan] = getAX25Param("SlotTime", 100).toInt();
persist[Chan] = getAX25Param("Persist", 128).toInt();
resptime[Chan] = getAX25Param("RespTime", 1500).toInt();
TXFrmMode[Chan] = getAX25Param("TXFrmMode", 1).toInt();
max_frame_collector[Chan] = getAX25Param("FrameCollector", 6).toInt();
KISS_opt[Chan] = getAX25Param("KISSOptimization", false).toInt();;
dyn_frack[Chan] = getAX25Param("DynamicFrack", false).toInt();;
recovery[Chan] = getAX25Param("BitRecovery", 0).toInt();
NonAX25[Chan] = getAX25Param("NonAX25Frm", false).toInt();;
MEMRecovery[Chan]= getAX25Param("MEMRecovery", 200).toInt();
IPOLL[Chan] = getAX25Param("IPOLL", 80).toInt();
strcpy(MyDigiCall[Chan], getAX25Param("MyDigiCall", "").toString().toUtf8());
strcpy(exclude_callsigns[Chan], getAX25Param("ExcludeCallsigns", "").toString().toUtf8());
fx25_mode[Chan] = getAX25Param("FX25", FX25_MODE_RX).toInt();
il2p_mode[Chan] = getAX25Param("IL2P", IL2P_MODE_NONE).toInt();
il2p_crc[Chan] = getAX25Param("IL2PCRC", 0).toInt();
RSID_UI[Chan] = getAX25Param("RSID_UI", 0).toInt();
RSID_SABM[Chan] = getAX25Param("RSID_SABM", 0).toInt();
RSID_SetModem[Chan] = getAX25Param("RSID_SetModem", 0).toInt();
}
void getSettings()
{
int snd_ch;
QSettings* settings = new QSettings("QtSoundModem.ini", QSettings::IniFormat);
settings->sync();
PSKRect = settings->value("PSKWindow").toRect();
SoundMode = settings->value("Init/SoundMode", 0).toInt();
UDPClientPort = settings->value("Init/UDPClientPort", 8888).toInt();
UDPServerPort = settings->value("Init/UDPServerPort", 8884).toInt();
TXPort = settings->value("Init/TXPort", UDPServerPort).toInt();
strcpy(UDPHost, settings->value("Init/UDPHost", "192.168.1.255").toString().toUtf8());
UDPServ = settings->value("Init/UDPServer", FALSE).toBool();
RX_SR = settings->value("Init/RXSampleRate", 12000).toInt();
TX_SR = settings->value("Init/TXSampleRate", 12000).toInt();
strcpy(CaptureDevice, settings->value("Init/SndRXDeviceName", "hw:1,0").toString().toUtf8());
strcpy(PlaybackDevice, settings->value("Init/SndTXDeviceName", "hw:1,0").toString().toUtf8());
raduga = settings->value("Init/DispMode", DISP_RGB).toInt();
strcpy(PTTPort, settings->value("Init/PTT", "").toString().toUtf8());
PTTMode = settings->value("Init/PTTMode", 19200).toInt();
PTTBAUD = settings->value("Init/PTTBAUD", 19200).toInt();
strcpy(PTTOnString, settings->value("Init/PTTOnString", "").toString().toUtf8());
strcpy(PTTOffString, settings->value("Init/PTTOffString", "").toString().toUtf8());
pttGPIOPin = settings->value("Init/pttGPIOPin", 17).toInt();
pttGPIOPinR = settings->value("Init/pttGPIOPinR", 17).toInt();
#ifdef WIN32
strcpy(CM108Addr, settings->value("Init/CM108Addr", "0xD8C:0x08").toString().toUtf8());
#else
strcpy(CM108Addr, settings->value("Init/CM108Addr", "/dev/hidraw0").toString().toUtf8());
#endif
HamLibPort = settings->value("Init/HamLibPort", 4532).toInt();
strcpy(HamLibHost, settings->value("Init/HamLibHost", "127.0.0.1").toString().toUtf8());
DualPTT = settings->value("Init/DualPTT", 1).toInt();
TX_rotate = settings->value("Init/TXRotate", 0).toInt();
multiCore = settings->value("Init/multiCore", 0).toInt();
MintoTray = settings->value("Init/MinimizetoTray", 1).toInt();
Wisdom = strdup(settings->value("Init/Wisdom", "").toString().toUtf8());
WaterfallMin = settings->value("Init/WaterfallMin", 0).toInt();
WaterfallMax = settings->value("Init/WaterfallMax", 3300).toInt();
rx_freq[0] = settings->value("Modem/RXFreq1", 1700).toInt();
rx_freq[1] = settings->value("Modem/RXFreq2", 1700).toInt();
rx_freq[2] = settings->value("Modem/RXFreq3", 1700).toInt();
rx_freq[3] = settings->value("Modem/RXFreq4", 1700).toInt();
rcvr_offset[0] = settings->value("Modem/RcvrShift1", 30).toInt();
rcvr_offset[1] = settings->value("Modem/RcvrShift2", 30).toInt();
rcvr_offset[2] = settings->value("Modem/RcvrShift3", 30).toInt();
rcvr_offset[3] = settings->value("Modem/RcvrShift4", 30).toInt();
speed[0] = settings->value("Modem/ModemType1", SPEED_1200).toInt();
speed[1] = settings->value("Modem/ModemType2", SPEED_1200).toInt();
speed[2] = settings->value("Modem/ModemType3", SPEED_1200).toInt();
speed[3] = settings->value("Modem/ModemType4", SPEED_1200).toInt();
RCVR[0] = settings->value("Modem/NRRcvrPairs1", 0).toInt();;
RCVR[1] = settings->value("Modem/NRRcvrPairs2", 0).toInt();;
RCVR[2] = settings->value("Modem/NRRcvrPairs3", 0).toInt();;
RCVR[3] = settings->value("Modem/NRRcvrPairs4", 0).toInt();;
soundChannel[0] = settings->value("Modem/soundChannel1", 1).toInt();
soundChannel[1] = settings->value("Modem/soundChannel2", 0).toInt();
soundChannel[2] = settings->value("Modem/soundChannel3", 0).toInt();
soundChannel[3] = settings->value("Modem/soundChannel4", 0).toInt();
SCO = settings->value("Init/SCO", 0).toInt();
dcd_threshold = settings->value("Modem/DCDThreshold", 40).toInt();
rxOffset = settings->value("Modem/rxOffset", 0).toInt();
AGWServ = settings->value("AGWHost/Server", TRUE).toBool();
AGWPort = settings->value("AGWHost/Port", 8000).toInt();
KISSServ = settings->value("KISS/Server", FALSE).toBool();
KISSPort = settings->value("KISS/Port", 8105).toInt();
RX_Samplerate = RX_SR + RX_SR * 0.000001*RX_PPM;
TX_Samplerate = TX_SR + TX_SR * 0.000001*TX_PPM;
emph_all[0] = settings->value("Modem/PreEmphasisAll1", FALSE).toBool();
emph_all[1] = settings->value("Modem/PreEmphasisAll2", FALSE).toBool();
emph_all[2] = settings->value("Modem/PreEmphasisAll3", FALSE).toBool();
emph_all[3] = settings->value("Modem/PreEmphasisAll4", FALSE).toBool();
emph_db[0] = settings->value("Modem/PreEmphasisDB1", 0).toInt();
emph_db[1] = settings->value("Modem/PreEmphasisDB2", 0).toInt();
emph_db[2] = settings->value("Modem/PreEmphasisDB3", 0).toInt();
emph_db[3] = settings->value("Modem/PreEmphasisDB4", 0).toInt();
Firstwaterfall = settings->value("Window/Waterfall1", TRUE).toInt();
Secondwaterfall = settings->value("Window/Waterfall2", TRUE).toInt();
txdelay[0] = settings->value("Modem/TxDelay1", 250).toInt();
txdelay[1] = settings->value("Modem/TxDelay2", 250).toInt();
txdelay[2] = settings->value("Modem/TxDelay3", 250).toInt();
txdelay[3] = settings->value("Modem/TxDelay4", 250).toInt();
txtail[0] = settings->value("Modem/TxTail1", 50).toInt();
txtail[1] = settings->value("Modem/TxTail2", 50).toInt();
txtail[2] = settings->value("Modem/TxTail3", 50).toInt();
txtail[3] = settings->value("Modem/TxTail4", 50).toInt();
strcpy(CWIDCall, settings->value("Modem/CWIDCall", "").toString().toUtf8().toUpper());
strcpy(CWIDMark, settings->value("Modem/CWIDMark", "").toString().toUtf8().toUpper());
CWIDInterval = settings->value("Modem/CWIDInterval", 0).toInt();
CWIDLeft = settings->value("Modem/CWIDLeft", 0).toInt();
CWIDRight = settings->value("Modem/CWIDRight", 0).toInt();
CWIDType = settings->value("Modem/CWIDType", 1).toInt(); // on/off
afterTraffic = settings->value("Modem/afterTraffic", false).toBool();
getAX25Params(0);
getAX25Params(1);
getAX25Params(2);
getAX25Params(3);
// Validate and process settings
UsingLeft = 0;
UsingRight = 0;
UsingBothChannels = 0;
for (int i = 0; i < 4; i++)
{
if (soundChannel[i] == LEFT)
{
UsingLeft = 1;
modemtoSoundLR[i] = 0;
}
else if (soundChannel[i] == RIGHT)
{
UsingRight = 1;
modemtoSoundLR[i] = 1;
}
}
if (UsingLeft && UsingRight)
UsingBothChannels = 1;
for (snd_ch = 0; snd_ch < 4; snd_ch++)
{
tx_hitoneraise[snd_ch] = powf(10.0f, -abs(tx_hitoneraisedb[snd_ch]) / 20.0f);
if (IPOLL[snd_ch] < 0)
IPOLL[snd_ch] = 0;
else if (IPOLL[snd_ch] > 65535)
IPOLL[snd_ch] = 65535;
if (MEMRecovery[snd_ch] < 1)
MEMRecovery[snd_ch] = 1;
// if (MEMRecovery[snd_ch]> 65535)
// MEMRecovery[snd_ch]= 65535;
/*
if resptime[snd_ch] < 0 then resptime[snd_ch]= 0;
if resptime[snd_ch] > 65535 then resptime[snd_ch]= 65535;
if persist[snd_ch] > 255 then persist[snd_ch]= 255;
if persist[snd_ch] < 32 then persist[snd_ch]= 32;
if fracks[snd_ch] < 1 then fracks[snd_ch]= 1;
if frack_time[snd_ch] < 1 then frack_time[snd_ch]= 1;
if idletime[snd_ch] < frack_time[snd_ch] then idletime[snd_ch]= 180;
*/
if (emph_db[snd_ch] < 0 || emph_db[snd_ch] > nr_emph)
emph_db[snd_ch] = 0;
if (max_frame_collector[snd_ch] > 6) max_frame_collector[snd_ch] = 6;
if (maxframe[snd_ch] == 0 || maxframe[snd_ch] > 7) maxframe[snd_ch] = 3;
if (qpsk_set[snd_ch].mode > 1) qpsk_set[snd_ch].mode = 0;
}
darkTheme = settings->value("Init/darkTheme", false).toBool();
delete(settings);
}
void SavePortSettings(int Chan);
void saveAX25Param(const char * key, QVariant Value)
{
char fullKey[64];
sprintf(fullKey, "%s/%s", Prefix, key);
settings->setValue(fullKey, Value);
}
void saveAX25Params(int chan)
{
Prefix[5] = chan + 'A';
SavePortSettings(chan);
}
void SavePortSettings(int Chan)
{
saveAX25Param("Retries", fracks[Chan]);
saveAX25Param("HiToneRaise", tx_hitoneraisedb[Chan]);
saveAX25Param("Maxframe",maxframe[Chan]);
saveAX25Param("Retries", fracks[Chan]);
saveAX25Param("FrackTime", frack_time[Chan]);
saveAX25Param("IdleTime", idletime[Chan]);
saveAX25Param("SlotTime", slottime[Chan]);
saveAX25Param("Persist", persist[Chan]);
saveAX25Param("RespTime", resptime[Chan]);
saveAX25Param("TXFrmMode", TXFrmMode[Chan]);
saveAX25Param("FrameCollector", max_frame_collector[Chan]);
saveAX25Param("ExcludeCallsigns", exclude_callsigns[Chan]);
saveAX25Param("ExcludeAPRSFrmType", exclude_APRS_frm[Chan]);
saveAX25Param("KISSOptimization", KISS_opt[Chan]);
saveAX25Param("DynamicFrack", dyn_frack[Chan]);
saveAX25Param("BitRecovery", recovery[Chan]);
saveAX25Param("NonAX25Frm", NonAX25[Chan]);
saveAX25Param("MEMRecovery", MEMRecovery[Chan]);
saveAX25Param("IPOLL", IPOLL[Chan]);
saveAX25Param("MyDigiCall", MyDigiCall[Chan]);
saveAX25Param("FX25", fx25_mode[Chan]);
saveAX25Param("IL2P", il2p_mode[Chan]);
saveAX25Param("IL2PCRC", il2p_crc[Chan]);
saveAX25Param("RSID_UI", RSID_UI[Chan]);
saveAX25Param("RSID_SABM", RSID_SABM[Chan]);
saveAX25Param("RSID_SetModem", RSID_SetModem[Chan]);
}
void saveSettings()
{
QSettings * settings = new QSettings("QtSoundModem.ini", QSettings::IniFormat);
settings->setValue("FontFamily", Font.family());
settings->setValue("PointSize", Font.pointSize());
settings->setValue("Weight", Font.weight());
settings->setValue("PSKWindow", constellationDialog->geometry());
settings->setValue("Init/SoundMode", SoundMode);
settings->setValue("Init/UDPClientPort", UDPClientPort);
settings->setValue("Init/UDPServerPort", UDPServerPort);
settings->setValue("Init/TXPort", TXPort);
settings->setValue("Init/UDPServer", UDPServ);
settings->setValue("Init/UDPHost", UDPHost);
settings->setValue("Init/TXSampleRate", TX_SR);
settings->setValue("Init/RXSampleRate", RX_SR);
settings->setValue("Init/SndRXDeviceName", CaptureDevice);
settings->setValue("Init/SndTXDeviceName", PlaybackDevice);
settings->setValue("Init/SCO", SCO);
settings->setValue("Init/DualPTT", DualPTT);
settings->setValue("Init/TXRotate", TX_rotate);
settings->setValue("Init/DispMode", raduga);
settings->setValue("Init/PTT", PTTPort);
settings->setValue("Init/PTTBAUD", PTTBAUD);
settings->setValue("Init/PTTMode", PTTMode);
settings->setValue("Init/PTTOffString", PTTOffString);
settings->setValue("Init/PTTOnString", PTTOnString);
settings->setValue("Init/pttGPIOPin", pttGPIOPin);
settings->setValue("Init/pttGPIOPinR", pttGPIOPinR);
settings->setValue("Init/CM108Addr", CM108Addr);
settings->setValue("Init/HamLibPort", HamLibPort);
settings->setValue("Init/HamLibHost", HamLibHost);
settings->setValue("Init/MinimizetoTray", MintoTray);
settings->setValue("Init/multiCore", multiCore);
settings->setValue("Init/Wisdom", Wisdom);
settings->setValue("Init/WaterfallMin", WaterfallMin);
settings->setValue("Init/WaterfallMax", WaterfallMax);
// Don't save freq on close as it could be offset by multiple decoders
settings->setValue("Modem/NRRcvrPairs1", RCVR[0]);
settings->setValue("Modem/NRRcvrPairs2", RCVR[1]);
settings->setValue("Modem/NRRcvrPairs3", RCVR[2]);
settings->setValue("Modem/NRRcvrPairs4", RCVR[3]);
settings->setValue("Modem/RcvrShift1", rcvr_offset[0]);
settings->setValue("Modem/RcvrShift2", rcvr_offset[1]);
settings->setValue("Modem/RcvrShift3", rcvr_offset[2]);
settings->setValue("Modem/RcvrShift4", rcvr_offset[3]);
settings->setValue("Modem/ModemType1", speed[0]);
settings->setValue("Modem/ModemType2", speed[1]);
settings->setValue("Modem/ModemType3", speed[2]);
settings->setValue("Modem/ModemType4", speed[3]);
settings->setValue("Modem/soundChannel1", soundChannel[0]);
settings->setValue("Modem/soundChannel2", soundChannel[1]);
settings->setValue("Modem/soundChannel3", soundChannel[2]);
settings->setValue("Modem/soundChannel4", soundChannel[3]);
settings->setValue("Modem/DCDThreshold", dcd_threshold);
settings->setValue("Modem/rxOffset", rxOffset);
settings->setValue("AGWHost/Server", AGWServ);
settings->setValue("AGWHost/Port", AGWPort);
settings->setValue("KISS/Server", KISSServ);
settings->setValue("KISS/Port", KISSPort);
settings->setValue("Modem/PreEmphasisAll1", emph_all[0]);
settings->setValue("Modem/PreEmphasisAll2", emph_all[1]);
settings->setValue("Modem/PreEmphasisAll3", emph_all[2]);
settings->setValue("Modem/PreEmphasisAll4", emph_all[3]);
settings->setValue("Modem/PreEmphasisDB1", emph_db[0]);
settings->setValue("Modem/PreEmphasisDB2", emph_db[1]);
settings->setValue("Modem/PreEmphasisDB3", emph_db[2]);
settings->setValue("Modem/PreEmphasisDB4", emph_db[3]);
settings->setValue("Window/Waterfall1", Firstwaterfall);
settings->setValue("Window/Waterfall2", Secondwaterfall);
settings->setValue("Modem/TxDelay1", txdelay[0]);
settings->setValue("Modem/TxDelay2", txdelay[1]);
settings->setValue("Modem/TxDelay3", txdelay[2]);
settings->setValue("Modem/TxDelay4", txdelay[3]);
settings->setValue("Modem/TxTail1", txtail[0]);
settings->setValue("Modem/TxTail2", txtail[1]);
settings->setValue("Modem/TxTail3", txtail[2]);
settings->setValue("Modem/TxTail4", txtail[3]);
settings->setValue("Modem/CWIDCall", CWIDCall);
settings->setValue("Modem/CWIDMark", CWIDMark);
settings->setValue("Modem/CWIDInterval", CWIDInterval);
settings->setValue("Modem/CWIDLeft", CWIDLeft);
settings->setValue("Modem/CWIDRight", CWIDRight);
settings->setValue("Modem/CWIDType", CWIDType);
settings->setValue("Modem/afterTraffic", afterTraffic);
settings->setValue("Init/darkTheme", darkTheme);
saveAX25Params(0);
saveAX25Params(1);
saveAX25Params(2);
saveAX25Params(3);
settings->sync();
delete(settings);
}

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
#define ARDOPBufferSize 12000 * 100 #define ARDOPBufferSize 12000 * 100
char CWIDMark[32] = ""; extern char CWIDMark[32];
extern short ARDOPTXBuffer[4][ARDOPBufferSize]; // Enough to hold whole frame of samples extern short ARDOPTXBuffer[4][ARDOPBufferSize]; // Enough to hold whole frame of samples
@ -1025,34 +1025,6 @@ void sendCWID(char * strID, BOOL CWOnOff, int Chan)
initFilter(200, Filter, Chan); initFilter(200, Filter, Chan);
// if sending 1500 cal tone send mark tone for 10 secs
if (strcmp(strID, "1500TONE") == 0)
{
float m_amplitude = 30000.0f;
float m_frequency = 1500.0f;
float m_phase = 0.0;
float m_time = 0.0;
float m_deltaTime = 1.0f / 12000;
float x;
// generate sin wave in mono
for (int sample = 0; sample < 120000; ++sample)
{
x = m_amplitude * sin(2 * M_PI * m_frequency * m_time + m_phase);
ARDOPSampleSink(x);
m_time += m_deltaTime;
}
ARDOPTXPtr[Chan] = 0;
ARDOPTXLen[Chan] = Number;
Number = 0;
return;
}
//Generate leader for VOX 6 dots long //Generate leader for VOX 6 dots long
for (k = 6; k >0; k--) for (k = 6; k >0; k--)

View File

@ -47,10 +47,8 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QScrollBar> #include <QScrollBar>
#include <QFontDialog> #include <QFontDialog>
#include <QFile>
#include "UZ7HOStuff.h" #include "UZ7HOStuff.h"
#include <time.h>
QImage *Constellation[4]; QImage *Constellation[4];
QImage *Waterfall = 0; QImage *Waterfall = 0;
@ -71,7 +69,6 @@ QTextEdit * monWindowCopy;
extern workerThread *t; extern workerThread *t;
extern QtSoundModem * w; extern QtSoundModem * w;
extern QCoreApplication * a; extern QCoreApplication * a;
extern serialThread *serial;
QList<QSerialPortInfo> Ports = QSerialPortInfo::availablePorts(); QList<QSerialPortInfo> Ports = QSerialPortInfo::availablePorts();
@ -96,8 +93,6 @@ extern "C" char CaptureNames[16][256];
extern "C" char PlaybackNames[16][256]; extern "C" char PlaybackNames[16][256];
extern "C" int SoundMode; extern "C" int SoundMode;
extern "C" bool onlyMixSnoop;
extern "C" int multiCore; extern "C" int multiCore;
extern "C" int refreshModems; extern "C" int refreshModems;
@ -117,10 +112,6 @@ extern "C" int using48000; // Set if using 48K sample rate (ie RUH Modem activ
extern "C" int ReceiveSize; extern "C" int ReceiveSize;
extern "C" int SendSize; // 100 mS for now extern "C" int SendSize; // 100 mS for now
extern "C" int txLatency;
extern "C" int BusyDet;
extern "C" extern "C"
{ {
int InitSound(BOOL Report); int InitSound(BOOL Report);
@ -141,7 +132,6 @@ extern "C"
void sendRSID(int Chan, int dropTX); void sendRSID(int Chan, int dropTX);
void RSIDinitfft(); void RSIDinitfft();
void il2p_init(int il2p_debug); void il2p_init(int il2p_debug);
void closeTraceLog();
} }
void make_graph_buf(float * buf, short tap, QPainter * bitmap); void make_graph_buf(float * buf, short tap, QPainter * bitmap);
@ -157,7 +147,7 @@ int FreqD = 1500;
int DCD = 50; int DCD = 50;
char CWIDCall[128] = ""; char CWIDCall[128] = "";
extern "C" char CWIDMark[32]; extern "C" char CWIDMark[32] = "";
int CWIDInterval = 0; int CWIDInterval = 0;
int CWIDLeft = 0; int CWIDLeft = 0;
int CWIDRight = 0; int CWIDRight = 0;
@ -172,8 +162,6 @@ int Configuring = 0;
bool lockWaterfall = false; bool lockWaterfall = false;
bool inWaterfall = false; bool inWaterfall = false;
int MgmtPort = 0;
extern "C" int NeedWaterfallHeaders; extern "C" int NeedWaterfallHeaders;
extern "C" float BinSize; extern "C" float BinSize;
@ -197,7 +185,6 @@ QRgb rxText = qRgb(0, 0, 192);
bool darkTheme = true; bool darkTheme = true;
bool minimizeonStart = true; bool minimizeonStart = true;
extern "C" bool useKISSControls;
// Indexed colour list from ARDOPC // Indexed colour list from ARDOPC
@ -233,13 +220,8 @@ extern "C" int TXPort;
extern char UDPHost[64]; extern char UDPHost[64];
QTimer *cwidtimer; QTimer *cwidtimer;
QTimer *PTTWatchdog;
QWidget * mythis; QWidget * mythis;
QElapsedTimer pttOnTimer;
QSystemTrayIcon * trayIcon = nullptr; QSystemTrayIcon * trayIcon = nullptr;
@ -247,21 +229,6 @@ int MintoTray = 1;
int RSID_WF = 0; // Set to use RSID FFT for Waterfall. int RSID_WF = 0; // Set to use RSID FFT for Waterfall.
char SixPackDevice[256] = "";
int SixPackPort = 0;
int SixPackEnable = 0;
// Stats
uint64_t PTTonTime[4] = { 0 };
uint64_t PTTActivemS[4] = { 0 }; // For Stats
uint64_t BusyonTime[4] = { 0 };
uint64_t BusyActivemS[4] = { 0 };
int AvPTT[4] = { 0 };
int AvBusy[4] = { 0 };
extern "C" void WriteDebugLog(char * Mess) extern "C" void WriteDebugLog(char * Mess)
{ {
qDebug() << Mess; qDebug() << Mess;
@ -270,24 +237,6 @@ extern "C" void WriteDebugLog(char * Mess)
void QtSoundModem::doupdateDCD(int Chan, int State) void QtSoundModem::doupdateDCD(int Chan, int State)
{ {
DCDLabel[Chan]->setVisible(State); DCDLabel[Chan]->setVisible(State);
// This also tries to get a percentage on time over a minute
uint64_t Time = QDateTime::currentMSecsSinceEpoch();
if (State)
{
BusyonTime[Chan] = Time;
return;
}
if (BusyonTime[Chan])
{
BusyActivemS[Chan] += Time - BusyonTime[Chan];
BusyonTime[Chan] = 0;
}
} }
extern "C" char * frame_monitor(string * frame, char * code, bool tx_stat); extern "C" char * frame_monitor(string * frame, char * code, bool tx_stat);
@ -369,6 +318,9 @@ void QtSoundModem::resizeEvent(QResizeEvent* event)
QRect r = geometry(); QRect r = geometry();
QRect r1 = ui.monWindow->geometry();
QRect r2 = ui.centralWidget->geometry();
int modemBoxHeight = 34; int modemBoxHeight = 34;
int Width = r.width(); int Width = r.width();
@ -548,7 +500,6 @@ void DoPSKWindows()
} }
QTimer *wftimer; QTimer *wftimer;
extern "C" struct timespec pttclk;
QtSoundModem::QtSoundModem(QWidget *parent) : QMainWindow(parent) QtSoundModem::QtSoundModem(QWidget *parent) : QMainWindow(parent)
{ {
@ -556,20 +507,12 @@ QtSoundModem::QtSoundModem(QWidget *parent) : QMainWindow(parent)
int csize; int csize;
QFont::Weight weight; QFont::Weight weight;
#ifndef WIN32
clock_getres(CLOCK_MONOTONIC, &pttclk);
printf("CLOCK_MONOTONIC %d, %d\n", pttclk.tv_sec, pttclk.tv_nsec);
#endif
ui.setupUi(this); ui.setupUi(this);
mythis = this; mythis = this;
getSettings(); getSettings();
serial = new serialThread;
QSettings mysettings("QtSoundModem.ini", QSettings::IniFormat); QSettings mysettings("QtSoundModem.ini", QSettings::IniFormat);
family = mysettings.value("FontFamily", "Courier New").toString(); family = mysettings.value("FontFamily", "Courier New").toString();
@ -816,11 +759,6 @@ QtSoundModem::QtSoundModem(QWidget *parent) : QMainWindow(parent)
QObject::connect(t, SIGNAL(updateDCD(int, int)), this, SLOT(doupdateDCD(int, int)), Qt::QueuedConnection); QObject::connect(t, SIGNAL(updateDCD(int, int)), this, SLOT(doupdateDCD(int, int)), Qt::QueuedConnection);
QObject::connect(t, SIGNAL(startCWIDTimer()), this, SLOT(startCWIDTimerSlot()), Qt::QueuedConnection); QObject::connect(t, SIGNAL(startCWIDTimer()), this, SLOT(startCWIDTimerSlot()), Qt::QueuedConnection);
QObject::connect(t, SIGNAL(setWaterfallImage()), this, SLOT(setWaterfallImage()), Qt::QueuedConnection);
QObject::connect(t, SIGNAL(setLevelImage()), this, SLOT(setLevelImage()), Qt::QueuedConnection);
QObject::connect(t, SIGNAL(setConstellationImage(int, int)), this, SLOT(setConstellationImage(int, int)), Qt::QueuedConnection);
QObject::connect(t, SIGNAL(startWatchdog()), this, SLOT(StartWatchdog()), Qt::QueuedConnection);
QObject::connect(t, SIGNAL(stopWatchdog()), this, SLOT(StopWatchdog()), Qt::QueuedConnection);
connect(ui.RXOffsetA, SIGNAL(returnPressed()), this, SLOT(returnPressed())); connect(ui.RXOffsetA, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
connect(ui.RXOffsetB, SIGNAL(returnPressed()), this, SLOT(returnPressed())); connect(ui.RXOffsetB, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
@ -831,19 +769,13 @@ QtSoundModem::QtSoundModem(QWidget *parent) : QMainWindow(parent)
connect(timer, SIGNAL(timeout()), this, SLOT(MyTimerSlot())); connect(timer, SIGNAL(timeout()), this, SLOT(MyTimerSlot()));
timer->start(100); timer->start(100);
QTimer *statstimer = new QTimer(this);
connect(statstimer, SIGNAL(timeout()), this, SLOT(StatsTimer()));
statstimer->start(60000); // One Minute
wftimer = new QTimer(this); wftimer = new QTimer(this);
connect(wftimer, SIGNAL(timeout()), this, SLOT(doRestartWF())); connect(wftimer, SIGNAL(timeout()), this, SLOT(doRestartWF()));
// wftimer->start(1000 * 300); wftimer->start(1000 * 300);
cwidtimer = new QTimer(this); cwidtimer = new QTimer(this);
connect(cwidtimer, SIGNAL(timeout()), this, SLOT(CWIDTimer())); connect(cwidtimer, SIGNAL(timeout()), this, SLOT(CWIDTimer()));
PTTWatchdog = new QTimer(this);
connect(PTTWatchdog, SIGNAL(timeout()), this, SLOT(PTTWatchdogExpired()));
if (CWIDInterval && afterTraffic == false) if (CWIDInterval && afterTraffic == false)
cwidtimer->start(CWIDInterval * 60000); cwidtimer->start(CWIDInterval * 60000);
@ -857,9 +789,6 @@ QtSoundModem::QtSoundModem(QWidget *parent) : QMainWindow(parent)
QTimer::singleShot(200, this, &QtSoundModem::updateFont); QTimer::singleShot(200, this, &QtSoundModem::updateFont);
connect(serial, &serialThread::request, this, &QtSoundModem::showRequest);
} }
void QtSoundModem::updateFont() void QtSoundModem::updateFont()
@ -924,112 +853,6 @@ void extSetOffset(int chan)
return; return;
} }
extern TMgmtMode ** MgmtConnections;
extern int MgmtConCount;
extern QList<QTcpSocket*> _MgmtSockets;
extern "C" void doAGW2MinTimer();
#define FEND 0xc0
#define QTSMKISSCMD 7
int AGW2MinTimer = 0;
void QtSoundModem::StatsTimer()
{
// Calculate % Busy over last minute
for (int n = 0; n < 4; n++)
{
if (soundChannel[n] == 0) // Channel not used
continue;
AvPTT[n] = PTTActivemS[n] / 600; // ms but want %
PTTActivemS[n] = 0;
AvBusy[n] = BusyActivemS[n] / 600;
BusyActivemS[n] = 0;
// send to any connected Mgmt streams
char Msg[64];
uint64_t ret;
if (!useKISSControls)
{
for (QTcpSocket* socket : _MgmtSockets)
{
// Find Session
TMgmtMode * MGMT = NULL;
for (int i = 0; i < MgmtConCount; i++)
{
if (MgmtConnections[i]->Socket == socket)
{
MGMT = MgmtConnections[i];
break;
}
}
if (MGMT == NULL)
continue;
if (MGMT->BPQPort[n])
{
sprintf(Msg, "STATS %d %d %d\r", MGMT->BPQPort[n], AvPTT[n], AvBusy[n]);
ret = socket->write(Msg);
}
}
}
else // useKISSControls set
{
UCHAR * Control = (UCHAR *)malloc(32);
int len = sprintf((char *)Control, "%c%cSTATS %d %d%c", FEND, (n) << 4 | QTSMKISSCMD, AvPTT[n], AvBusy[n], FEND);
KISSSendtoServer(NULL, Control, len);
}
}
AGW2MinTimer++;
if (AGW2MinTimer > 1)
{
AGW2MinTimer = 0;
doAGW2MinTimer();
}
}
// PTT Stats
extern "C" void UpdatePTTStats(int Chan, int State)
{
uint64_t Time = QDateTime::currentMSecsSinceEpoch();
if (State)
{
PTTonTime[Chan] = Time;
// Cancel Busy timer (stats include ptt on time in port active
if (BusyonTime[Chan])
{
BusyActivemS[Chan] += (Time - BusyonTime[Chan]);
BusyonTime[Chan] = 0;
}
}
else
{
if (PTTonTime[Chan])
{
PTTActivemS[Chan] += (Time - PTTonTime[Chan]);
PTTonTime[Chan] = 0;
}
}
}
void QtSoundModem::MyTimerSlot() void QtSoundModem::MyTimerSlot()
{ {
// 100 mS Timer Event // 100 mS Timer Event
@ -1200,7 +1023,7 @@ void QtSoundModem::clickedSlotI(int i)
if (strcmp(Name, "centerB") == 0) if (strcmp(Name, "centerB") == 0)
{ {
if (i > 300) if (i > 299)
{ {
QSettings * settings = new QSettings("QtSoundModem.ini", QSettings::IniFormat); QSettings * settings = new QSettings("QtSoundModem.ini", QSettings::IniFormat);
ui.centerB->setValue(Freq_Change(1, i)); ui.centerB->setValue(Freq_Change(1, i));
@ -1237,8 +1060,6 @@ void QtSoundModem::clickedSlotI(int i)
if (strcmp(Name, "DCDSlider") == 0) if (strcmp(Name, "DCDSlider") == 0)
{ {
dcd_threshold = i; dcd_threshold = i;
BusyDet = i / 10; // for ardop busy detect code
saveSettings(); saveSettings();
return; return;
} }
@ -1420,16 +1241,6 @@ void QtSoundModem::clickedSlot()
return; return;
} }
if (strcmp(Name, "Cal1500") == 0)
{
char call[] = "1500TONE";
sendCWID(call, 0, 0);
calib_mode[0] = 4;
return;
}
if (strcmp(Name, "actFont") == 0) if (strcmp(Name, "actFont") == 0)
{ {
bool ok; bool ok;
@ -1641,14 +1452,10 @@ void QtSoundModem::doModems()
Dlg->IL2PModeC->setCurrentIndex(il2p_mode[2]); Dlg->IL2PModeC->setCurrentIndex(il2p_mode[2]);
Dlg->IL2PModeD->setCurrentIndex(il2p_mode[3]); Dlg->IL2PModeD->setCurrentIndex(il2p_mode[3]);
Dlg->CRCTX_A->setChecked((il2p_crc[0] & 1)); Dlg->CRC_A->setChecked(il2p_crc[0]);
Dlg->CRCRX_A->setChecked((il2p_crc[0] & 2)); Dlg->CRC_B->setChecked(il2p_crc[1]);
Dlg->CRCTX_B->setChecked((il2p_crc[1] & 1)); Dlg->CRC_C->setChecked(il2p_crc[2]);
Dlg->CRCRX_B->setChecked((il2p_crc[1] & 2)); Dlg->CRC_D->setChecked(il2p_crc[3]);
Dlg->CRCTX_C->setChecked((il2p_crc[2] & 1));
Dlg->CRCRX_C->setChecked((il2p_crc[2] & 2));
Dlg->CRCTX_D->setChecked((il2p_crc[3] & 1));
Dlg->CRCRX_D->setChecked((il2p_crc[3] & 2));
Dlg->CWIDCall->setText(CWIDCall); Dlg->CWIDCall->setText(CWIDCall);
Dlg->CWIDInterval->setText(QString::number(CWIDInterval)); Dlg->CWIDInterval->setText(QString::number(CWIDInterval));
@ -1874,21 +1681,10 @@ void QtSoundModem::modemSave()
il2p_mode[2] = Dlg->IL2PModeC->currentIndex(); il2p_mode[2] = Dlg->IL2PModeC->currentIndex();
il2p_mode[3] = Dlg->IL2PModeD->currentIndex(); il2p_mode[3] = Dlg->IL2PModeD->currentIndex();
il2p_crc[0] = Dlg->CRCTX_A->isChecked(); il2p_crc[0] = Dlg->CRC_A->isChecked();
if (Dlg->CRCRX_A->isChecked()) il2p_crc[1] = Dlg->CRC_B->isChecked();
il2p_crc[0] |= 2; il2p_crc[2] = Dlg->CRC_C->isChecked();
il2p_crc[3] = Dlg->CRC_D->isChecked();
il2p_crc[1] = Dlg->CRCTX_B->isChecked();
if (Dlg->CRCRX_B->isChecked())
il2p_crc[1] |= 2;
il2p_crc[2] = Dlg->CRCTX_C->isChecked();
if (Dlg->CRCRX_C->isChecked())
il2p_crc[2] |= 2;
il2p_crc[3] = Dlg->CRCTX_D->isChecked();
if (Dlg->CRCRX_D->isChecked())
il2p_crc[3] |= 2;
recovery[0] = Dlg->recoverBitA->currentIndex(); recovery[0] = Dlg->recoverBitA->currentIndex();
recovery[1] = Dlg->recoverBitB->currentIndex(); recovery[1] = Dlg->recoverBitB->currentIndex();
@ -2026,8 +1822,6 @@ char NewPTTPort[80];
int newSoundMode = 0; int newSoundMode = 0;
int oldSoundMode = 0; int oldSoundMode = 0;
int oldSnoopMix = 0;
int newSnoopMix = 0;
void QtSoundModem::SoundModeChanged(bool State) void QtSoundModem::SoundModeChanged(bool State)
{ {
@ -2035,8 +1829,6 @@ void QtSoundModem::SoundModeChanged(bool State)
// Mustn't change SoundMode until dialog is accepted // Mustn't change SoundMode until dialog is accepted
newSnoopMix = Dev->onlyMixSnoop->isChecked();
if (Dev->UDP->isChecked()) if (Dev->UDP->isChecked())
newSoundMode = 3; newSoundMode = 3;
else if (Dev->PULSE->isChecked()) else if (Dev->PULSE->isChecked())
@ -2122,17 +1914,6 @@ void QtSoundModem::PTTPortChanged(int Selected)
Dev->PTTOn->setText(HamLibHost); Dev->PTTOn->setText(HamLibHost);
Dev->PTTOn->setVisible(true); Dev->PTTOn->setVisible(true);
} }
else if (strcmp(NewPTTPort, "FLRIG") == 0)
{
Dev->CM108Label->setVisible(true);
Dev->CM108Label->setText("FLRig Port");
Dev->VIDPID->setText(QString::number(FLRigPort));
Dev->VIDPID->setVisible(true);
Dev->PTTOnLab->setText("FLRig Host");
Dev->PTTOnLab->setVisible(true);
Dev->PTTOn->setText(FLRigHost);
Dev->PTTOn->setVisible(true);
}
else else
{ {
Dev->RTSDTR->setVisible(true); Dev->RTSDTR->setVisible(true);
@ -2175,7 +1956,6 @@ bool myResize::eventFilter(QObject *obj, QEvent *event)
void QtSoundModem::doDevices() void QtSoundModem::doDevices()
{ {
char valChar[10]; char valChar[10];
QStringList items;
Dev = new(Ui_devicesDialog); Dev = new(Ui_devicesDialog);
@ -2192,53 +1972,28 @@ void QtSoundModem::doDevices()
UI.installEventFilter(resize); UI.installEventFilter(resize);
// Set serial names
for (const QSerialPortInfo &info : Ports)
{
items.append(info.portName());
}
items.sort();
Dev->SixPackSerial->addItem("None");
for (const QString &info : items)
{
Dev->SixPackSerial->addItem(info);
}
newSoundMode = SoundMode; newSoundMode = SoundMode;
oldSoundMode = SoundMode; oldSoundMode = SoundMode;
oldSnoopMix = newSnoopMix = onlyMixSnoop;
#ifdef WIN32 #ifdef WIN32
Dev->ALSA->setText("WaveOut"); Dev->ALSA->setText("WaveOut");
Dev->OSS->setVisible(0); Dev->OSS->setVisible(0);
Dev->PULSE->setVisible(0); Dev->PULSE->setVisible(0);
Dev->onlyMixSnoop->setVisible(0); #endif
Dev->ALSA->setChecked(1);
#else
if (SoundMode == 0) if (SoundMode == 0)
{
Dev->onlyMixSnoop->setVisible(1);
Dev->ALSA->setChecked(1); Dev->ALSA->setChecked(1);
}
else if (SoundMode == 1) else if (SoundMode == 1)
Dev->OSS->setChecked(1); Dev->OSS->setChecked(1);
else if (SoundMode == 2) else if (SoundMode == 2)
Dev->PULSE->setChecked(1); Dev->PULSE->setChecked(1);
else if (SoundMode == 2) else if (SoundMode == 2)
Dev->UDP->setChecked(1); Dev->UDP->setChecked(1);
#endif
Dev->onlyMixSnoop->setChecked(onlyMixSnoop);
connect(Dev->ALSA, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool))); connect(Dev->ALSA, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool)));
connect(Dev->OSS, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool))); connect(Dev->OSS, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool)));
connect(Dev->PULSE, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool))); connect(Dev->PULSE, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool)));
connect(Dev->UDP, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool))); connect(Dev->UDP, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool)));
connect(Dev->onlyMixSnoop, SIGNAL(toggled(bool)), this, SLOT(SoundModeChanged(bool)));
for (i = 0; i < PlaybackCount; i++) for (i = 0; i < PlaybackCount; i++)
Dev->outputDevice->addItem(&PlaybackNames[i][0]); Dev->outputDevice->addItem(&PlaybackNames[i][0]);
@ -2270,8 +2025,6 @@ void QtSoundModem::doDevices()
} }
Dev->inputDevice->setCurrentIndex(i); Dev->inputDevice->setCurrentIndex(i);
Dev->txLatency->setText(QString::number(txLatency));
Dev->Modem_1_Chan->setCurrentIndex(soundChannel[0]); Dev->Modem_1_Chan->setCurrentIndex(soundChannel[0]);
Dev->Modem_2_Chan->setCurrentIndex(soundChannel[1]); Dev->Modem_2_Chan->setCurrentIndex(soundChannel[1]);
Dev->Modem_3_Chan->setCurrentIndex(soundChannel[2]); Dev->Modem_3_Chan->setCurrentIndex(soundChannel[2]);
@ -2283,7 +2036,6 @@ void QtSoundModem::doDevices()
QStandardItem * item = model->item(0, 0); QStandardItem * item = model->item(0, 0);
item->setEnabled(false); item->setEnabled(false);
Dev->useKISSControls->setChecked(useKISSControls);
Dev->singleChannelOutput->setChecked(SCO); Dev->singleChannelOutput->setChecked(SCO);
Dev->colourWaterfall->setChecked(raduga); Dev->colourWaterfall->setChecked(raduga);
@ -2295,26 +2047,6 @@ void QtSoundModem::doDevices()
Dev->AGWPort->setText(valChar); Dev->AGWPort->setText(valChar);
Dev->AGWEnabled->setChecked(AGWServ); Dev->AGWEnabled->setChecked(AGWServ);
Dev->MgmtPort->setText(QString::number(MgmtPort));
// If we are using a user specifed device add it
i = Dev->SixPackSerial->findText(SixPackDevice, Qt::MatchFixedString);
if (i == -1)
{
// Add our device to list
Dev->SixPackSerial->insertItem(0, SixPackDevice);
i = Dev->SixPackSerial->findText(SixPackDevice, Qt::MatchContains);
}
Dev->SixPackSerial->setCurrentIndex(i);
sprintf(valChar, "%d", SixPackPort);
Dev->SixPackTCP->setText(valChar);
Dev->SixPackEnable->setChecked(SixPackEnable);
Dev->PTTOn->setText(PTTOnString); Dev->PTTOn->setText(PTTOnString);
Dev->PTTOff->setText(PTTOffString); Dev->PTTOff->setText(PTTOffString);
@ -2341,6 +2073,8 @@ void QtSoundModem::doDevices()
Dev->VIDPID->setText(CM108Addr); Dev->VIDPID->setText(CM108Addr);
QStringList items;
connect(Dev->CAT, SIGNAL(toggled(bool)), this, SLOT(CATChanged(bool))); connect(Dev->CAT, SIGNAL(toggled(bool)), this, SLOT(CATChanged(bool)));
connect(Dev->DualPTT, SIGNAL(toggled(bool)), this, SLOT(DualPTTChanged(bool))); connect(Dev->DualPTT, SIGNAL(toggled(bool)), this, SLOT(DualPTTChanged(bool)));
connect(Dev->PTTPort, SIGNAL(currentIndexChanged(int)), this, SLOT(PTTPortChanged(int))); connect(Dev->PTTPort, SIGNAL(currentIndexChanged(int)), this, SLOT(PTTPortChanged(int)));
@ -2350,6 +2084,13 @@ void QtSoundModem::doDevices()
else else
Dev->RTSDTR->setChecked(true); Dev->RTSDTR->setChecked(true);
for (const QSerialPortInfo &info : Ports)
{
items.append(info.portName());
}
items.sort();
Dev->PTTPort->addItem("None"); Dev->PTTPort->addItem("None");
Dev->PTTPort->addItem("CM108"); Dev->PTTPort->addItem("CM108");
@ -2360,7 +2101,6 @@ void QtSoundModem::doDevices()
//#endif //#endif
Dev->PTTPort->addItem("HAMLIB"); Dev->PTTPort->addItem("HAMLIB");
Dev->PTTPort->addItem("FLRIG");
for (const QString &info : items) for (const QString &info : items)
{ {
@ -2446,7 +2186,7 @@ void QtSoundModem::deviceaccept()
} }
} }
if (oldSoundMode != newSoundMode || oldSnoopMix != newSnoopMix) if (oldSoundMode != newSoundMode)
{ {
QMessageBox msgBox; QMessageBox msgBox;
@ -2461,7 +2201,6 @@ void QtSoundModem::deviceaccept()
if (i == QMessageBox::Ok) if (i == QMessageBox::Ok)
{ {
SoundMode = newSoundMode; SoundMode = newSoundMode;
onlyMixSnoop = newSnoopMix;
saveSettings(); saveSettings();
Closing = 1; Closing = 1;
@ -2490,12 +2229,6 @@ void QtSoundModem::deviceaccept()
cardChanged = 1; cardChanged = 1;
} }
if (onlyMixSnoop != Dev->onlyMixSnoop->isChecked())
{
onlyMixSnoop = Dev->onlyMixSnoop->isChecked();
cardChanged = 1;
}
CaptureIndex = Dev->inputDevice->currentIndex(); CaptureIndex = Dev->inputDevice->currentIndex();
Q = Dev->outputDevice->currentText(); Q = Dev->outputDevice->currentText();
@ -2508,9 +2241,6 @@ void QtSoundModem::deviceaccept()
PlayBackIndex = Dev->outputDevice->currentIndex(); PlayBackIndex = Dev->outputDevice->currentIndex();
Q = Dev->txLatency->text();
txLatency = Q.toInt();
soundChannel[0] = Dev->Modem_1_Chan->currentIndex(); soundChannel[0] = Dev->Modem_1_Chan->currentIndex();
soundChannel[1] = Dev->Modem_2_Chan->currentIndex(); soundChannel[1] = Dev->Modem_2_Chan->currentIndex();
soundChannel[2] = Dev->Modem_3_Chan->currentIndex(); soundChannel[2] = Dev->Modem_3_Chan->currentIndex();
@ -2537,8 +2267,6 @@ void QtSoundModem::deviceaccept()
if (UsingLeft && UsingRight) if (UsingLeft && UsingRight)
UsingBothChannels = 1; UsingBothChannels = 1;
useKISSControls = Dev->useKISSControls->isChecked();
SCO = Dev->singleChannelOutput->isChecked(); SCO = Dev->singleChannelOutput->isChecked();
raduga = Dev->colourWaterfall->isChecked(); raduga = Dev->colourWaterfall->isChecked();
AGWServ = Dev->AGWEnabled->isChecked(); AGWServ = Dev->AGWEnabled->isChecked();
@ -2550,26 +2278,9 @@ void QtSoundModem::deviceaccept()
Q = Dev->AGWPort->text(); Q = Dev->AGWPort->text();
AGWPort = Q.toInt(); AGWPort = Q.toInt();
Q = Dev->MgmtPort->text();
MgmtPort = Q.toInt();
Q = Dev->SixPackSerial->currentText();
char temp[256];
strcpy(temp, Q.toString().toUtf8());
if (strlen(temp))
strcpy(SixPackDevice, temp);
Q = Dev->SixPackTCP->text();
SixPackPort = Q.toInt();
SixPackEnable = Dev->SixPackEnable->isChecked();
Q = Dev->PTTPort->currentText(); Q = Dev->PTTPort->currentText();
char temp[256];
strcpy(temp, Q.toString().toUtf8()); strcpy(temp, Q.toString().toUtf8());
@ -2632,12 +2343,6 @@ void QtSoundModem::deviceaccept()
Q = Dev->PTTOn->text(); Q = Dev->PTTOn->text();
strcpy(HamLibHost, Q.toString().toUtf8()); strcpy(HamLibHost, Q.toString().toUtf8());
} }
else if (strcmp(PTTPort, "FLRIG") == 0)
{
FLRigPort = Q.toInt();
Q = Dev->PTTOn->text();
strcpy(FLRigHost, Q.toString().toUtf8());
}
Q = Dev->WaterfallMax->currentText(); Q = Dev->WaterfallMax->currentText();
newMax = Q.toInt(); newMax = Q.toInt();
@ -2719,12 +2424,9 @@ void QtSoundModem::handleButton(int Port, int Type)
void QtSoundModem::doRestartWF() void QtSoundModem::doRestartWF()
{ {
return; if (inWaterfall)
if (((tx_status[0] | tx_status[1] | tx_status[2] | tx_status[3]) != TX_SILENCE) || inWaterfall)
{ {
// in waterfall update thread // in waterfall update thread
@ -2732,8 +2434,6 @@ void QtSoundModem::doRestartWF()
return; return;
} }
wftimer->start(1000 * 300);
lockWaterfall = true; lockWaterfall = true;
if (Firstwaterfall | Secondwaterfall) if (Firstwaterfall | Secondwaterfall)
@ -2802,7 +2502,6 @@ void QtSoundModem::doCalibrate()
connect(Calibrate.High_D, SIGNAL(released()), this, SLOT(clickedSlot())); connect(Calibrate.High_D, SIGNAL(released()), this, SLOT(clickedSlot()));
connect(Calibrate.Both_D, SIGNAL(released()), this, SLOT(clickedSlot())); connect(Calibrate.Both_D, SIGNAL(released()), this, SLOT(clickedSlot()));
connect(Calibrate.Stop_D, SIGNAL(released()), this, SLOT(clickedSlot())); connect(Calibrate.Stop_D, SIGNAL(released()), this, SLOT(clickedSlot()));
connect(Calibrate.Cal1500, SIGNAL(released()), this, SLOT(clickedSlot()));
/* /*
@ -2881,7 +2580,7 @@ void RefreshLevel(unsigned int Level, unsigned int LevelR)
RXLevel->setPixel(x, y, white); RXLevel->setPixel(x, y, white);
} }
} }
// RXLevelCopy->setPixmap(QPixmap::fromImage(*RXLevel)); RXLevelCopy->setPixmap(QPixmap::fromImage(*RXLevel));
for (x = 0; x < 150; x++) for (x = 0; x < 150; x++)
{ {
@ -2900,10 +2599,7 @@ void RefreshLevel(unsigned int Level, unsigned int LevelR)
RXLevel2->setPixel(x, y, white); RXLevel2->setPixel(x, y, white);
} }
} }
RXLevel2Copy->setPixmap(QPixmap::fromImage(*RXLevel2));
emit t->setLevelImage();
/// RXLevel2Copy->setPixmap(QPixmap::fromImage(*RXLevel2));
} }
extern "C" unsigned char CurrentLevel; extern "C" unsigned char CurrentLevel;
@ -3192,9 +2888,7 @@ extern "C" void displayWaterfall()
else else
WaterfallCopy->setAlignment(Qt::AlignTop | Qt::AlignLeft); WaterfallCopy->setAlignment(Qt::AlignTop | Qt::AlignLeft);
// WaterfallCopy->setPixmap(QPixmap::fromImage(*Waterfall)); WaterfallCopy->setPixmap(QPixmap::fromImage(*Waterfall));
emit t->setWaterfallImage();
} }
extern "C" float aFFTAmpl[1024]; extern "C" float aFFTAmpl[1024];
@ -3210,9 +2904,6 @@ void doWaterfallThread(void * param)
if (Configuring) if (Configuring)
return; return;
if (inWaterfall)
return;
inWaterfall = true; // don't allow restart waterfall inWaterfall = true; // don't allow restart waterfall
if (snd_ch == 1 && UsingLeft == 0) // Only using right if (snd_ch == 1 && UsingLeft == 0) // Only using right
@ -3312,9 +3003,7 @@ void doWaterfallThread(void * param)
SMUpdateBusyDetector(snd_ch, RealOut, ImagOut); SMUpdateBusyDetector(snd_ch, RealOut, ImagOut);
// we always do fft so we can get centre freq and do busy detect. But only upodate waterfall if on display
// we always do fft so we can get centre freq and do busy detect. But only update waterfall if on display
if (bm == 0) if (bm == 0)
{ {
@ -3353,8 +3042,6 @@ void doWaterfallThread(void * param)
// Scroll // Scroll
int TopLine = NextWaterfallLine[snd_ch]; int TopLine = NextWaterfallLine[snd_ch];
int TopScanLine = WaterfallHeaderPixels; int TopScanLine = WaterfallHeaderPixels;
@ -3367,23 +3054,9 @@ void doWaterfallThread(void * param)
if (NextWaterfallLine[snd_ch] > 79) if (NextWaterfallLine[snd_ch] > 79)
NextWaterfallLine[snd_ch] = 0; NextWaterfallLine[snd_ch] = 0;
// Sanity check
if ((79 + TopScanLine) >= bm->height())
{
printf("Invalid WFMaxLine %d \n", bm->height());
exit(1);
}
for (int j = 79; j > 0; j--) for (int j = 79; j > 0; j--)
{ {
p = bm->scanLine(j + TopScanLine); p = bm->scanLine(j + TopScanLine);
if (p == nullptr)
{
printf("Invalid WF Pointer \n");
exit(1);
}
memcpy(p, &WaterfallLines[snd_ch][TopLine][0], lineLen); memcpy(p, &WaterfallLines[snd_ch][TopLine][0], lineLen);
TopLine++; TopLine++;
if (TopLine > 79) if (TopLine > 79)
@ -3393,26 +3066,6 @@ void doWaterfallThread(void * param)
inWaterfall = false; inWaterfall = false;
} }
void QtSoundModem::setWaterfallImage()
{
ui.Waterfall->setPixmap(QPixmap::fromImage(*Waterfall));
}
void QtSoundModem::setLevelImage()
{
RXLevelCopy->setPixmap(QPixmap::fromImage(*RXLevel));
RXLevel2Copy->setPixmap(QPixmap::fromImage(*RXLevel2));
}
void QtSoundModem::setConstellationImage(int chan, int Qual)
{
char QualText[64];
sprintf(QualText, "Chan %c Qual = %d", chan + 'A', Qual);
QualLabel[chan]->setText(QualText);
constellationLabel[chan]->setPixmap(QPixmap::fromImage(*Constellation[chan]));
}
void QtSoundModem::changeEvent(QEvent* e) void QtSoundModem::changeEvent(QEvent* e)
{ {
@ -3457,8 +3110,6 @@ QtSoundModem::~QtSoundModem()
{ {
qDebug() << "Saving Settings"; qDebug() << "Saving Settings";
closeTraceLog();
QSettings mysettings("QtSoundModem.ini", QSettings::IniFormat); QSettings mysettings("QtSoundModem.ini", QSettings::IniFormat);
mysettings.setValue("geometry", saveGeometry()); mysettings.setValue("geometry", saveGeometry());
mysettings.setValue("windowState", saveState()); mysettings.setValue("windowState", saveState());
@ -3483,7 +3134,7 @@ void QtSoundModem::show_grid()
int snd_ch, i, num_rows, row_idx; int snd_ch, i, num_rows, row_idx;
QTableWidgetItem *item; QTableWidgetItem *item;
const char * msg = ""; const char * msg;
int speed_tx, speed_rx; int speed_tx, speed_rx;
@ -3628,7 +3279,7 @@ void QtSoundModem::onTEselectionChanged()
extern "C" int SMUpdatePhaseConstellation(int chan, float * Phases, float * Mags, int intPSKPhase, int Count) extern "C" int SMUpdatePhaseConstellation(int chan, float * Phases, float * Mags, int intPSKPhase, int Count)
{ {
// Subroutine to update Constellation plot for PSK modes... // Subroutine to update bmpConstellation plot for PSK modes...
// Skip plotting and calculations of intPSKPhase(0) as this is a reference phase (9/30/2014) // Skip plotting and calculations of intPSKPhase(0) as this is a reference phase (9/30/2014)
float dblPhaseError; float dblPhaseError;
@ -3696,194 +3347,13 @@ extern "C" int SMUpdatePhaseConstellation(int chan, float * Phases, float * Mags
if (nonGUIMode == 0) if (nonGUIMode == 0)
{ {
emit t->setConstellationImage(chan, intQuality); char QualText[64];
// char QualText[64]; sprintf(QualText, "Chan %c Qual = %d", chan + 'A', intQuality);
// sprintf(QualText, "Chan %c Qual = %d", chan + 'A', intQuality); QualLabel[chan]->setText(QualText);
// QualLabel[chan]->setText(QualText); constellationLabel[chan]->setPixmap(QPixmap::fromImage(*Constellation[chan]));
// constellationLabel[chan]->setPixmap(QPixmap::fromImage(*Constellation[chan]));
} }
return intQuality; return intQuality;
} }
QFile tracefile("Tracelog.txt");
extern "C" int openTraceLog()
{
if (!tracefile.open(QIODevice::Append | QIODevice::Text))
return 0;
return 1;
}
extern "C" qint64 writeTraceLog(char * Data)
{
return tracefile.write(Data);
}
extern "C" void closeTraceLog()
{
tracefile.close();
}
extern "C" void debugTimeStamp(char * Text, char Dirn)
{
#ifndef LOGTX
if (Dirn == 'T')
return;
#endif
#ifndef LOGRX
if (Dirn == 'R')
return;
#endif
QTime Time(QTime::currentTime());
QString String = Time.toString("hh:mm:ss.zzz");
char Msg[2048];
sprintf(Msg, "%s %s\n", String.toUtf8().data(), Text);
writeTraceLog(Msg);
}
// Timer functions need to run in GUI Thread
extern "C" int SampleNo;
extern "C" int pttOnTime()
{
return pttOnTimer.elapsed();
}
extern "C" void startpttOnTimer()
{
pttOnTimer.start();
}
extern "C" void StartWatchdog()
{
// Get Monotonic clock for PTT drop time calculation
#ifndef WIN32
clock_gettime(CLOCK_MONOTONIC, &pttclk);
#endif
debugTimeStamp((char *)"PTT On", 'T');
emit t->startWatchdog();
pttOnTimer.start();
}
extern "C" void StopWatchdog()
{
int txlenMs = (1000 * SampleNo / TX_Samplerate);
Debugprintf("Samples Sent %d, Calc Time %d, PTT Time %d", SampleNo, txlenMs, pttOnTime());
debugTimeStamp((char *)"PTT Off", 'T');
closeTraceLog();
openTraceLog();
debugTimeStamp((char *)"Log Reopened", 'T');
emit t->stopWatchdog();
}
void QtSoundModem::StartWatchdog()
{
PTTWatchdog->start(60 * 1000);
}
void QtSoundModem::StopWatchdog()
{
PTTWatchdog->stop();
}
void QtSoundModem::PTTWatchdogExpired()
{
PTTWatchdog->stop();
}
// KISS Serial Port code - mainly for 6Pack but should work with KISS as well
// Serial Read needs to block and signal the main thread whenever a character is received. TX can probably be uncontrolled
void serialThread::startSlave(const QString &portName, int waitTimeout, const QString &response)
{
QMutexLocker locker(&mutex);
this->portName = portName;
this->waitTimeout = waitTimeout;
this->response = response;
if (!isRunning())
start();
}
void serialThread::run()
{
QSerialPort serial;
bool currentPortNameChanged = false;
mutex.lock();
QString currentPortName;
if (currentPortName != portName) {
currentPortName = portName;
currentPortNameChanged = true;
}
int currentWaitTimeout = waitTimeout;
QString currentRespone = response;
mutex.unlock();
if (currentPortName.isEmpty())
{
Debugprintf("Port not set");
return;
}
serial.setPortName(currentPortName);
if (!serial.open(QIODevice::ReadWrite))
{
Debugprintf("Can't open %s, error code %d", portName, serial.error());
return;
}
while (1)
{
if (serial.waitForReadyRead(currentWaitTimeout))
{
// read request
QByteArray requestData = serial.readAll();
while (serial.waitForReadyRead(10))
requestData += serial.readAll();
// Pass data to 6pack handler
emit this->request(requestData);
}
else {
Debugprintf("Serial read request timeout");
}
}
}
void Process6PackData(unsigned char * Bytes, int Len);
void QtSoundModem::showRequest(QByteArray Data)
{
Process6PackData((unsigned char *)Data.data(), Data.length());
}

File diff suppressed because it is too large Load Diff

View File

@ -43,7 +43,6 @@ private slots:
void updateFont(); void updateFont();
void MinimizetoTray(); void MinimizetoTray();
void TrayActivated(QSystemTrayIcon::ActivationReason reason); void TrayActivated(QSystemTrayIcon::ActivationReason reason);
void StatsTimer();
void MyTimerSlot(); void MyTimerSlot();
void returnPressed(); void returnPressed();
void clickedSlotI(int i); void clickedSlotI(int i);
@ -75,15 +74,8 @@ private slots:
void preEmphAllDChanged(int state); void preEmphAllDChanged(int state);
void menuChecked(); void menuChecked();
void onTEselectionChanged(); void onTEselectionChanged();
void StartWatchdog();
void StopWatchdog();
void PTTWatchdogExpired();
void showRequest(QByteArray Data);
void clickedSlot(); void clickedSlot();
void startCWIDTimerSlot(); void startCWIDTimerSlot();
void setWaterfallImage();
void setLevelImage();
void setConstellationImage(int chan, int Qual);
protected: protected:
@ -126,25 +118,3 @@ protected:
#define WaterfallTotalPixels WaterfallDisplayPixels + WaterfallHeaderPixels #define WaterfallTotalPixels WaterfallDisplayPixels + WaterfallHeaderPixels
#define WaterfallImageHeight (WaterfallTotalPixels + WaterfallTotalPixels) #define WaterfallImageHeight (WaterfallTotalPixels + WaterfallTotalPixels)
class serialThread : public QThread
{
Q_OBJECT
public:
void run() Q_DECL_OVERRIDE;
void startSlave(const QString &portName, int waitTimeout, const QString &response);
signals:
void request(const QByteArray &s);
void error(const QString &s);
void timeout(const QString &s);
private:
QString portName;
QString response;
int waitTimeout;
QMutex mutex;
bool quit;
};

View File

@ -44,8 +44,8 @@ SOURCES += ./audio.c \
./ofdm.c \ ./ofdm.c \
./pktARDOP.c \ ./pktARDOP.c \
./BusyDetect.c \ ./BusyDetect.c \
./DW9600.c \ ./DW9600.c
./6pack.cpp
FORMS += ./calibrateDialog.ui \ FORMS += ./calibrateDialog.ui \

View File

@ -1,263 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 11.0.3, 2024-08-15T14:29:24. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{6e41d268-43e9-43ac-b8fa-a3c083d547a3}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="qlonglong">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value>
<value type="bool" key="AutoTest.Framework.CTest">false</value>
<value type="bool" key="AutoTest.Framework.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">true</value>
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
</valuemap>
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value>
<valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">0</value>
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
</valuemap>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop (x86-darwin-generic-mach_o-64bit)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop (x86-darwin-generic-mach_o-64bit)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{a36d9ffa-38ce-4dfc-9820-5a456a9dc53d}</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Volumes/Source/QT/build-QtSoundModem-Desktop_x86_darwin_generic_mach_o_64bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Volumes/Source/QT/build-QtSoundModem-Desktop_x86_darwin_generic_mach_o_64bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Volumes/Source/QT/build-QtSoundModem-Desktop_x86_darwin_generic_mach_o_64bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Volumes/Source/QT/build-QtSoundModem-Desktop_x86_darwin_generic_mach_o_64bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Volumes/Source/QT/build-QtSoundModem-Desktop_x86_darwin_generic_mach_o_64bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Volumes/Source/QT/build-QtSoundModem-Desktop_x86_darwin_generic_mach_o_64bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">0</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/Volumes/Source/QT/QtSoundModem/QtSoundModem.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/Volumes/Source/QT/QtSoundModem/QtSoundModem.pro</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/Volumes/Source/QT/build-QtSoundModem-Desktop_x86_darwin_generic_mach_o_64bit-Debug/QtSoundModem.app/Contents/MacOS</value>
</valuemap>
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="qlonglong">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

View File

@ -1,64 +0,0 @@
QT += core gui
QT += network
QT += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QtSoundModem
TEMPLATE = app
HEADERS += ./UZ7HOStuff.h \
./QtSoundModem.h \
./tcpCode.h
SOURCES += ./audio.c \
./pulse.c \
./ax25.c \
./ax25_demod.c \
./ax25_l2.c \
./ax25_mod.c \
./Config.cpp \
./kiss_mode.c \
./main.cpp \
./QtSoundModem.cpp \
./ShowFilter.cpp \
./SMMain.c \
./sm_main.c \
./UZ7HOUtils.c \
./ALSASound.c \
./ax25_agw.c \
./berlekamp.c \
./galois.c \
./rs.c \
./rsid.c \
./il2p.c \
./tcpCode.cpp \
./ax25_fec.c \
./RSUnit.c \
./ARDOPC.c \
./ardopSampleArrays.c \
./SoundInput.c \
./Modulate.c \
./ofdm.c \
./pktARDOP.c \
./BusyDetect.c \
./DW9600.c
FORMS += ./calibrateDialog.ui \
./devicesDialog.ui \
./filterWindow.ui \
./ModemDialog.ui \
./QtSoundModem.ui
RESOURCES += QtSoundModem.qrc
RC_ICONS = QtSoundModem.ico
QMAKE_CFLAGS += -g
#QMAKE_LFLAGS += -lasound -lpulse-simple -lpulse -lfftw3f
QMAKE_LIBS += -lasound -lfftw3f -ldl

View File

@ -382,9 +382,7 @@
</QtUic> </QtUic>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="6pack.cpp" />
<ClCompile Include="ARDOPC.c" /> <ClCompile Include="ARDOPC.c" />
<ClCompile Include="berlekamp.c" />
<ClCompile Include="BusyDetect.c" /> <ClCompile Include="BusyDetect.c" />
<ClCompile Include="Config.cpp" /> <ClCompile Include="Config.cpp" />
<ClCompile Include="dw9600.c" /> <ClCompile Include="dw9600.c" />
@ -408,6 +406,7 @@
<ClCompile Include="ax25_fec.c" /> <ClCompile Include="ax25_fec.c" />
<ClCompile Include="ax25_l2.c" /> <ClCompile Include="ax25_l2.c" />
<ClCompile Include="ax25_mod.c" /> <ClCompile Include="ax25_mod.c" />
<ClCompile Include="berlekamp.c" />
<ClCompile Include="galois.c" /> <ClCompile Include="galois.c" />
<ClCompile Include="kiss_mode.c" /> <ClCompile Include="kiss_mode.c" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />

View File

@ -98,6 +98,9 @@
<ClCompile Include="ax25_mod.c"> <ClCompile Include="ax25_mod.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="berlekamp.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="galois.c"> <ClCompile Include="galois.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@ -137,17 +140,14 @@
<ClCompile Include="dw9600.c"> <ClCompile Include="dw9600.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="berlekamp.c">
<Filter>Generated Files</Filter>
</ClCompile>
<ClCompile Include="6pack.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<QtMoc Include="QtSoundModem.h"> <QtMoc Include="QtSoundModem.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
<ClInclude Include="UZ7HOStuff.h">
<Filter>Header Files</Filter>
</ClInclude>
<QtMoc Include="tcpCode.h"> <QtMoc Include="tcpCode.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</QtMoc> </QtMoc>
@ -187,9 +187,4 @@
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</Image> </Image>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="UZ7HOStuff.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project> </Project>

View File

@ -20,15 +20,15 @@
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<QtLastBackgroundBuild>2024-10-02T12:37:32.3312444Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2023-11-24T17:50:14.6138870Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings">
<QtLastBackgroundBuild>2024-10-02T12:37:32.7461423Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2023-11-24T17:50:14.7454647Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<QtLastBackgroundBuild>2024-10-02T12:37:33.4644113Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2023-11-24T17:50:14.8872599Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
<QtLastBackgroundBuild>2024-10-02T12:37:33.9800504Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2023-11-24T17:50:15.0594798Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

Binary file not shown.

132
SMMain.c
View File

@ -29,42 +29,6 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
#include <errno.h> #include <errno.h>
#include <stdint.h> #include <stdint.h>
void platformInit();
void RsCreate();
void detector_init();
void KISS_init();
void ax25_init();
void init_raduga();
void il2p_init(int il2p_debug);
void SoundFlush();
void BufferFull(short * Samples, int nSamples);
void PollReceivedSamples();
void chk_dcd1(int snd_ch, int buf_size);
void make_core_BPF(UCHAR snd_ch, short freq, short width);
void modulator(UCHAR snd_ch, int buf_size);
void sendAckModeAcks(int snd_ch);
void PktARDOPEncode(UCHAR * Data, int Len, int Chan);
void RUHEncode(unsigned char * Data, int Len, int chan);
void sendRSID(int Chan, int dropTX);
void SetupGPIOPTT();
int stricmp(const unsigned char * pStr1, const unsigned char *pStr2);
int gpioInitialise(void);
int OpenCOMPort(char * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits);
void HAMLIBSetPTT(int PTTState);
void FLRigSetPTT(int PTTState);
void StartWatchdog();
void StopWatchdog();
void gpioWrite(unsigned gpio, unsigned level);
BOOL WriteCOMBlock(int fd, char * Block, int BytesToWrite);
void COMSetDTR(int fd);
void COMSetRTS(int fd);
void analiz_frame(int snd_ch, string * frame, char * code, boolean fecflag);
size_t write(int fd, void * buf, size_t count);
int close(int fd);
void SendMgmtPTT(int snd_ch, int PTTState);
BOOL KISSServ; BOOL KISSServ;
int KISSPort; int KISSPort;
@ -206,6 +170,7 @@ void SampleSink(int LR, short Sample)
{ {
DMABuffer[2 * Number] = Sample; DMABuffer[2 * Number] = Sample;
DMABuffer[1 + 2 * Number] = Sample; DMABuffer[1 + 2 * Number] = Sample;
} }
else else
{ {
@ -403,13 +368,13 @@ extern int intLastStop;
void SMSortSignals2(float * dblMag, int intStartBin, int intStopBin, int intNumBins, float * dblAVGSignalPerBin, float * dblAVGBaselinePerBin); void SMSortSignals2(float * dblMag, int intStartBin, int intStopBin, int intNumBins, float * dblAVGSignalPerBin, float * dblAVGBaselinePerBin);
BOOL SMBusyDetect3(int Chan, float * dblMag, int intStart, int intStop) // this only called while searching for leader ...once leader detected, no longer called. BOOL SMBusyDetect3(float * dblMag, int intStart, int intStop) // this only called while searching for leader ...once leader detected, no longer called.
{ {
// First sort signals and look at highes signals:baseline ratio.. // First sort signals and look at highes signals:baseline ratio..
float dblAVGSignalPerBinNarrow, dblAVGSignalPerBinWide, dblAVGBaselineNarrow, dblAVGBaselineWide; float dblAVGSignalPerBinNarrow, dblAVGSignalPerBinWide, dblAVGBaselineNarrow, dblAVGBaselineWide;
float dblSlowAlpha = 0.2f; float dblSlowAlpha = 0.2f;
static float dblAvgStoNNarrow[4] = { 0 }, dblAvgStoNWide[4] = {0}; float dblAvgStoNNarrow = 0, dblAvgStoNWide = 0;
int intNarrow = 8; // 8 x 11.72 Hz about 94 z int intNarrow = 8; // 8 x 11.72 Hz about 94 z
int intWide = ((intStop - intStart) * 2) / 3; //* 0.66); int intWide = ((intStop - intStart) * 2) / 3; //* 0.66);
int blnBusy = FALSE; int blnBusy = FALSE;
@ -420,16 +385,15 @@ BOOL SMBusyDetect3(int Chan, float * dblMag, int intStart, int intStop) /
SMSortSignals2(dblMag, intStart, intStop, intNarrow, &dblAVGSignalPerBinNarrow, &dblAVGBaselineNarrow); SMSortSignals2(dblMag, intStart, intStop, intNarrow, &dblAVGSignalPerBinNarrow, &dblAVGBaselineNarrow);
// Shouldn't dblAvgStoNNarrow, dblAvgStoNWide be static ??????
if (intLastStart == intStart && intLastStop == intStop) if (intLastStart == intStart && intLastStop == intStop)
dblAvgStoNNarrow[Chan] = (1 - dblSlowAlpha) * dblAvgStoNNarrow[Chan] + dblSlowAlpha * dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow; dblAvgStoNNarrow = (1 - dblSlowAlpha) * dblAvgStoNNarrow + dblSlowAlpha * dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
else else
{ {
// This initializes the Narrow average after a bandwidth change // This initializes the Narrow average after a bandwidth change
dblAvgStoNNarrow[Chan] = dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow; dblAvgStoNNarrow = dblAVGSignalPerBinNarrow / dblAVGBaselineNarrow;
intLastStart = intStart;
intLastStop = intStop;
} }
// Wide band (66% of current bandwidth) // Wide band (66% of current bandwidth)
@ -437,12 +401,12 @@ BOOL SMBusyDetect3(int Chan, float * dblMag, int intStart, int intStop) /
SMSortSignals2(dblMag, intStart, intStop, intWide, &dblAVGSignalPerBinWide, &dblAVGBaselineWide); SMSortSignals2(dblMag, intStart, intStop, intWide, &dblAVGSignalPerBinWide, &dblAVGBaselineWide);
if (intLastStart == intStart && intLastStop == intStop) if (intLastStart == intStart && intLastStop == intStop)
dblAvgStoNWide[Chan] = (1 - dblSlowAlpha) * dblAvgStoNWide[Chan] + dblSlowAlpha * dblAVGSignalPerBinWide / dblAVGBaselineWide; dblAvgStoNWide = (1 - dblSlowAlpha) * dblAvgStoNWide + dblSlowAlpha * dblAVGSignalPerBinWide / dblAVGBaselineWide;
else else
{ {
// This initializes the Wide average after a bandwidth change // This initializes the Wide average after a bandwidth change
dblAvgStoNWide[Chan] = dblAVGSignalPerBinWide / dblAVGBaselineWide; dblAvgStoNWide = dblAVGSignalPerBinWide / dblAVGBaselineWide;
intLastStart = intStart; intLastStart = intStart;
intLastStop = intStop; intLastStop = intStop;
} }
@ -450,7 +414,7 @@ BOOL SMBusyDetect3(int Chan, float * dblMag, int intStart, int intStop) /
// Preliminary calibration...future a function of bandwidth and BusyDet. // Preliminary calibration...future a function of bandwidth and BusyDet.
blnBusy = (dblAvgStoNNarrow[Chan] > (3 + 0.008 * BusyDet4th)) || (dblAvgStoNWide[Chan] > (5 + 0.02 * BusyDet4th)); blnBusy = (dblAvgStoNNarrow > (3 + 0.008 * BusyDet4th)) || (dblAvgStoNWide > (5 + 0.02 * BusyDet4th));
// if (BusyDet == 0) // if (BusyDet == 0)
// blnBusy = FALSE; // 0 Disables check ?? Is this the best place to do this? // blnBusy = FALSE; // 0 Disables check ?? Is this the best place to do this?
@ -489,7 +453,7 @@ void SMSortSignals2(float * dblMag, int intStartBin, int intStopBin, int intNumB
*dblAVGBaselinePerBin = dblSum2 / (intStopBin - intStartBin - intNumBins - 1); *dblAVGBaselinePerBin = dblSum2 / (intStopBin - intStartBin - intNumBins - 1);
} }
extern void updateDCD(int Chan, BOOL State);
void SMUpdateBusyDetector(int LR, float * Real, float *Imag) void SMUpdateBusyDetector(int LR, float * Real, float *Imag)
{ {
@ -502,8 +466,10 @@ void SMUpdateBusyDetector(int LR, float * Real, float *Imag)
static BOOL blnLastBusyStatus[4]; static BOOL blnLastBusyStatus[4];
float dblMagAvg = 0; float dblMagAvg = 0;
int intTuneLineLow, intTuneLineHi, intDelta;
int i, chan; int i, chan;
return;
if (Now - LastBusyCheck < 100) // ?? if (Now - LastBusyCheck < 100) // ??
return; return;
@ -522,9 +488,6 @@ void SMUpdateBusyDetector(int LR, float * Real, float *Imag)
Low = tx_freq[chan] - txbpf[chan] / 2; Low = tx_freq[chan] - txbpf[chan] / 2;
High = tx_freq[chan] + txbpf[chan] / 2; High = tx_freq[chan] + txbpf[chan] / 2;
// Low = tx_freq[chan] - 0.5*rx_shift[chan];
// High = tx_freq[chan] + 0.5*rx_shift[chan];
// BinSize is width of each fft bin in Hz // BinSize is width of each fft bin in Hz
Start = (Low / BinSize); // First and last bins to process Start = (Low / BinSize); // First and last bins to process
@ -537,18 +500,20 @@ void SMUpdateBusyDetector(int LR, float * Real, float *Imag)
dblMagAvg += dblMag[i]; dblMagAvg += dblMag[i];
} }
blnBusyStatus = SMBusyDetect3(chan, dblMag, Start, End); blnBusyStatus = SMBusyDetect3(dblMag, Start, End);
if (blnBusyStatus && !blnLastBusyStatus[chan]) if (blnBusyStatus && !blnLastBusyStatus[chan])
{ {
// Debugprintf("Ch %d Busy True", chan); Debugprintf("Ch %d Busy True", chan);
updateDCD(chan, TRUE);
} }
else if (blnLastBusyStatus[chan] && !blnBusyStatus) else if (blnLastBusyStatus[chan] && !blnBusyStatus)
{ {
// Debugprintf("Ch %d Busy False", chan); Debugprintf("Ch %d Busy False", chan);
updateDCD(chan, FALSE);
} }
// stcStatus.Text = "FALSE"
// queTNCStatus.Enqueue(stcStatus)
// 'Debug.WriteLine("BUSY FALSE @ " & Format(DateTime.UtcNow, "HH:mm:ss"))
blnLastBusyStatus[chan] = blnBusyStatus; blnLastBusyStatus[chan] = blnBusyStatus;
} }
} }
@ -572,21 +537,15 @@ void doCalib(int Chan, int Act)
if (Chan == 1 && calib_mode[0]) if (Chan == 1 && calib_mode[0])
return; return;
calib_mode[Chan] = Act;
if (Act == 0) if (Act == 0)
{ {
calib_mode[Chan] = 0;
tx_status[Chan] = TX_SILENCE; // Stop TX tx_status[Chan] = TX_SILENCE; // Stop TX
Flush(); Flush();
RadioPTT(Chan, 0); RadioPTT(Chan, 0);
Debugprintf("Stop Calib"); Debugprintf("Stop Calib");
} }
else
{
if (calib_mode[Chan] == 0)
SampleNo = 0;
calib_mode[Chan] = Act;
}
} }
int Freq_Change(int Chan, int Freq) int Freq_Change(int Chan, int Freq)
@ -722,7 +681,7 @@ void DoTX(int Chan)
if (tx_status[Chan] == TX_NO_DATA) if (tx_status[Chan] == TX_NO_DATA)
{ {
Flush(); Flush();
Debugprintf("TX Complete %d", SampleNo); Debugprintf("TX Complete");
RadioPTT(Chan, 0); RadioPTT(Chan, 0);
Continuation[Chan] = 0; Continuation[Chan] = 0;
@ -803,7 +762,7 @@ void DoTX(int Chan)
return; return;
} }
Debugprintf("TX Complete %d", SampleNo); Debugprintf("TX Complete");
RadioPTT(Chan, 0); RadioPTT(Chan, 0);
Continuation[Chan] = 0; Continuation[Chan] = 0;
@ -995,10 +954,7 @@ BOOL useGPIO = FALSE;
BOOL gotGPIO = FALSE; BOOL gotGPIO = FALSE;
int HamLibPort = 4532; int HamLibPort = 4532;
char HamLibHost[32] = "127.0.0.1"; char HamLibHost[32] = "192.168.1.14";
int FLRigPort = 12345;
char FLRigHost[32] = "127.0.0.1";
char CM108Addr[80] = ""; char CM108Addr[80] = "";
@ -1172,12 +1128,6 @@ void OpenPTTPort()
HAMLIBSetPTT(0); // to open port HAMLIBSetPTT(0); // to open port
return; return;
} }
else if (stricmp(PTTPort, "FLRIG") == 0)
{
PTTMode |= PTTFLRIG;
FLRigSetPTT(0); // to open port
return;
}
else // Not GPIO else // Not GPIO
{ {
@ -1257,8 +1207,6 @@ void CM108_set_ptt(int PTTState)
float amplitudes[4] = { 32000, 32000, 32000, 32000 }; float amplitudes[4] = { 32000, 32000, 32000, 32000 };
extern float amplitude; extern float amplitude;
void startpttOnTimer();
extern void UpdatePTTStats(int Chan, int State);
void RadioPTT(int snd_ch, BOOL PTTState) void RadioPTT(int snd_ch, BOOL PTTState)
{ {
@ -1268,24 +1216,13 @@ void RadioPTT(int snd_ch, BOOL PTTState)
{ {
txmax = txmin = 0; txmax = txmin = 0;
amplitude = amplitudes[snd_ch]; amplitude = amplitudes[snd_ch];
StartWatchdog();
} }
else else
{ {
Debugprintf("Output peaks = %d, %d, amp %f", txmin, txmax, amplitude); Debugprintf("Output peaks = %d, %d, amp %f", txmin, txmax, amplitude);
amplitudes[snd_ch] = amplitude; amplitudes[snd_ch] = amplitude;
StopWatchdog();
} }
if ((PTTMode & PTTHOST))
{
// Send PTT ON/OFF to any mgmt connections
SendMgmtPTT(snd_ch, PTTState);
}
UpdatePTTStats(snd_ch, PTTState);
#ifdef __ARM_ARCH #ifdef __ARM_ARCH
if (useGPIO) if (useGPIO)
{ {
@ -1293,7 +1230,7 @@ void RadioPTT(int snd_ch, BOOL PTTState)
gpioWrite(pttGPIOPinR, (pttGPIOInvert ? (1 - PTTState) : (PTTState))); gpioWrite(pttGPIOPinR, (pttGPIOInvert ? (1 - PTTState) : (PTTState)));
else else
gpioWrite(pttGPIOPin, (pttGPIOInvert ? (1 - PTTState) : (PTTState))); gpioWrite(pttGPIOPin, (pttGPIOInvert ? (1 - PTTState) : (PTTState)));
startpttOnTimer();
return; return;
} }
@ -1302,29 +1239,17 @@ void RadioPTT(int snd_ch, BOOL PTTState)
if ((PTTMode & PTTCM108)) if ((PTTMode & PTTCM108))
{ {
CM108_set_ptt(PTTState); CM108_set_ptt(PTTState);
startpttOnTimer();
return; return;
} }
if ((PTTMode & PTTHAMLIB)) if ((PTTMode & PTTHAMLIB))
{ {
HAMLIBSetPTT(PTTState); HAMLIBSetPTT(PTTState);
startpttOnTimer();
return; return;
} }
if ((PTTMode & PTTFLRIG))
{
FLRigSetPTT(PTTState);
startpttOnTimer();
return;
}
if (hPTTDevice == 0) if (hPTTDevice == 0)
{
startpttOnTimer();
return; return;
}
if ((PTTMode & PTTCAT)) if ((PTTMode & PTTCAT))
{ {
if (PTTState) if (PTTState)
@ -1353,9 +1278,6 @@ void RadioPTT(int snd_ch, BOOL PTTState)
} }
} }
startpttOnTimer();
} }
char ShortDT[] = "HH:MM:SS"; char ShortDT[] = "HH:MM:SS";

View File

@ -4,11 +4,8 @@
// My port of UZ7HO's Soundmodem // My port of UZ7HO's Soundmodem
// //
#define VersionString "0.0.0.73" #define VersionString "0.0.0.72 Beta 1"
#define VersionBytes {0, 0, 0, 73} #define VersionBytes {0, 0, 0, 72}
//#define LOGTX
//#define LOGRX
// Added FX25. 4x100 FEC and V27 not Working and disabled // Added FX25. 4x100 FEC and V27 not Working and disabled
@ -181,31 +178,7 @@
// Improve reliability of waterfall update // Improve reliability of waterfall update
// Report and set fx.25 and il2p flags to/from BPQ // Report and set fx.25 and il2p flags to/from BPQ
// .72 Fix IL2P for RUH modems // July 2024 // .72 Fix IL2P for RUH modems
// Fix crash when closing in non-gui mode
// Fix loop in chk_dcd1
// Change method of timing PTT
// Add FLRIG PTT Support
// Beta 13 revert to new ptt timing
// Beta 14 Add display of mix/snoop devices
// Change phase map of QPSK3600 mode to match Nino TNC
//.73 Fix QPSK3600 RX Filters
// Add Mgmt Interface (Beta 2)
// Use ARDOP Busy detector (Beta 3)
// Various fixes to AGW interface (Beta 4)
// As far as I can see txtail is only there to make sure all bits get through the tx filter,
// so it shouldn't really matter what is sent. Code worked in characters, so resolution of txtail
// is 24 mS at 300 baud. I don't see why I can't work in bits, or even samples. Any reason why I shouldn't send
// a single tone during tail? .
//
// I'm currently sending reversals with timing resolution of bits (~3 mS at 300 baud)
#include <string.h> #include <string.h>
@ -322,15 +295,6 @@ typedef struct TKISSMode_t
} TKISSMode; } TKISSMode;
typedef struct MgmtMode_t
{
void * Socket; // Used as a key
char Msg[512]; // Received message
int Len;
int BPQPort[4]; // BPQ port for each modem
} TMgmtMode;
typedef struct TMChannel_t typedef struct TMChannel_t
{ {
@ -475,7 +439,7 @@ typedef struct AGWUser_t
{ {
void *socket; void *socket;
string * data_in; string * data_in;
// TStringList AGW_frame_buf; TStringList AGW_frame_buf;
boolean Monitor; boolean Monitor;
boolean Monitor_raw; boolean Monitor_raw;
boolean reportFreqAndModem; // Can report modem and frequency to host boolean reportFreqAndModem; // Can report modem and frequency to host
@ -547,8 +511,6 @@ typedef struct TAX25Port_t
#define PTTCAT 4 #define PTTCAT 4
#define PTTCM108 8 #define PTTCM108 8
#define PTTHAMLIB 16 #define PTTHAMLIB 16
#define PTTFLRIG 32
#define PTTHOST 128 // May be combined with others
// Status flags // Status flags
@ -693,7 +655,7 @@ extern int SendSize;
#define MODEM_Q2400_LPF_TAP 128 //128 #define MODEM_Q2400_LPF_TAP 128 //128
// //
#define MODEM_Q3600_BPF 3600 #define MODEM_Q3600_BPF 3600
#define MODEM_Q3600_TXBPF 3000 #define MODEM_Q3600_TXBPF 3750
#define MODEM_Q3600_LPF 1350 #define MODEM_Q3600_LPF 1350
#define MODEM_Q3600_BPF_TAP 256 #define MODEM_Q3600_BPF_TAP 256
#define MODEM_Q3600_LPF_TAP 128 #define MODEM_Q3600_LPF_TAP 128
@ -985,8 +947,6 @@ extern int PID;
extern char CM108Addr[80]; extern char CM108Addr[80];
extern int HamLibPort; extern int HamLibPort;
extern char HamLibHost[]; extern char HamLibHost[];
extern int FLRigPort;
extern char FLRigHost[];
extern int SCO; extern int SCO;
extern int DualPTT; extern int DualPTT;
@ -1026,9 +986,6 @@ extern int IPOLL[4];
extern int maxframe[4]; extern int maxframe[4];
extern int TXFrmMode[4]; extern int TXFrmMode[4];
extern int bytes[4];
extern int bytes2mins[4];
extern char MyDigiCall[4][512]; extern char MyDigiCall[4][512];
extern char exclude_callsigns[4][512]; extern char exclude_callsigns[4][512];
extern char exclude_APRS_frm[4][512]; extern char exclude_APRS_frm[4][512];
@ -1103,7 +1060,6 @@ void AGW_Raw_monitor(int snd_ch, string * data);
// Delphi emulation functions // Delphi emulation functions
string * Strings(TStringList * Q, int Index); string * Strings(TStringList * Q, int Index);
void replaceString(TStringList * Q, int Index, string * item);
void Clear(TStringList * Q); void Clear(TStringList * Q);
int Count(TStringList * List); int Count(TStringList * List);
@ -1184,10 +1140,6 @@ struct il2p_context_s {
extern int NeedWaterfallHeaders; extern int NeedWaterfallHeaders;
#define stringAdd(s1, s2, c) mystringAdd(s1, s2, c, __FILE__, __LINE__)
string * mystringAdd(string * Msg, UCHAR * Chars, int Count, char * FILE, int LINE);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -96,24 +96,12 @@ void freeString(string * Msg)
string * Strings(TStringList * Q, int Index) string * Strings(TStringList * Q, int Index)
{ {
// Gets string at index in stringlist
if (Index >= Q->Count) if (Index >= Q->Count)
return NULL; return NULL;
return Q->Items[Index]; return Q->Items[Index];
} }
void replaceString(TStringList * Q, int Index, string * item)
{
// Gets string at index in stringlist
if (Index >= Q->Count)
return;
Q->Items[Index] = item;
}
int Add(TStringList * Q, string * Entry) int Add(TStringList * Q, string * Entry)
{ {
Q->Items = realloc(Q->Items,(Q->Count + 1) * sizeof(void *)); Q->Items = realloc(Q->Items,(Q->Count + 1) * sizeof(void *));
@ -178,27 +166,16 @@ void setlength(string * Msg, int Count)
Msg->Length = Count; Msg->Length = Count;
} }
string * mystringAdd(string * Msg, UCHAR * Chars, int Count, char * FILE, int LINE) string * stringAdd(string * Msg, UCHAR * Chars, int Count)
{ {
// Add Chars to string // Add Chars to string
if (Count < 0 || Count > 65536)
{
printf("stringAdd Strange Count %d called from %s %d\r\n", Count, FILE, LINE);
}
if (Msg->Length + Count > Msg->AllocatedLength) if (Msg->Length + Count > Msg->AllocatedLength)
{ {
Msg->AllocatedLength += Count + 256; Msg->AllocatedLength += Count + 256;
Msg->Data = realloc(Msg->Data, Msg->AllocatedLength); Msg->Data = realloc(Msg->Data, Msg->AllocatedLength);
} }
if (Msg->Data == 0)
{
printf("realloc failed\r\n");
exit(1);
}
memcpy(&Msg->Data[Msg->Length], Chars, Count); memcpy(&Msg->Data[Msg->Length], Chars, Count);
Msg->Length += Count; Msg->Length += Count;

View File

@ -44,11 +44,6 @@ void printtick(char * msg);
void PollReceivedSamples(); void PollReceivedSamples();
short * SoundInit(); short * SoundInit();
void StdinPollReceivedSamples(); void StdinPollReceivedSamples();
extern void WriteDebugLog(char * Mess);
extern void UDPPollReceivedSamples();
extern void QSleep(int ms);
extern void ProcessNewSamples(short * Samples, int nSamples);
extern void sendSamplestoStdout(short * Samples, int nSamples);
#include <math.h> #include <math.h>
@ -62,7 +57,7 @@ void GetSoundDevices();
#define MaxReceiveSize 2048 // Enough for 9600 #define MaxReceiveSize 2048 // Enough for 9600
#define MaxSendSize 4096 #define MaxSendSize 4096
short buffer[4][MaxSendSize * 2]; // Two Transfer/DMA buffers of 0.1 Sec (x2 for Stereo) short buffer[2][MaxSendSize * 2]; // Two Transfer/DMA buffers of 0.1 Sec (x2 for Stereo)
short inbuffer[5][MaxReceiveSize * 2]; // Input Transfer/ buffers of 0.1 Sec (x2 for Stereo) short inbuffer[5][MaxReceiveSize * 2]; // Input Transfer/ buffers of 0.1 Sec (x2 for Stereo)
extern short * DMABuffer; extern short * DMABuffer;
@ -100,19 +95,15 @@ int PlaybackCount = 0;
char CaptureNames[16][256]= {""}; char CaptureNames[16][256]= {""};
char PlaybackNames[16][256]= {""}; char PlaybackNames[16][256]= {""};
int txLatency;
WAVEFORMATEX wfx = { WAVE_FORMAT_PCM, 2, 12000, 48000, 4, 16, 0 }; WAVEFORMATEX wfx = { WAVE_FORMAT_PCM, 2, 12000, 48000, 4, 16, 0 };
HWAVEOUT hWaveOut = 0; HWAVEOUT hWaveOut = 0;
HWAVEIN hWaveIn = 0; HWAVEIN hWaveIn = 0;
WAVEHDR header[4] = WAVEHDR header[2] =
{ {
{(char *)buffer[0], 0, 0, 0, 0, 0, 0, 0}, {(char *)buffer[0], 0, 0, 0, 0, 0, 0, 0},
{(char *)buffer[1], 0, 0, 0, 0, 0, 0, 0}, {(char *)buffer[1], 0, 0, 0, 0, 0, 0, 0}
{(char *)buffer[2], 0, 0, 0, 0, 0, 0, 0},
{(char *)buffer[3], 0, 0, 0, 0, 0, 0, 0}
}; };
WAVEHDR inheader[5] = WAVEHDR inheader[5] =
@ -162,6 +153,12 @@ VOID __cdecl Debugprintf(const char * format, ...)
void platformInit() void platformInit()
{ {
TIMECAPS tc;
unsigned int wTimerRes;
DWORD t, lastt = 0;
int i = 0;
_strupr(CaptureDevice); _strupr(CaptureDevice);
_strupr(PlaybackDevice); _strupr(PlaybackDevice);
@ -193,9 +190,6 @@ void txSleep(int mS)
{ {
// called while waiting for next TX buffer. Run background processes // called while waiting for next TX buffer. Run background processes
if (mS < 0)
return;
while (mS > 50) while (mS > 50)
{ {
if (SoundMode == 3) if (SoundMode == 3)
@ -225,20 +219,20 @@ FILE * wavfp1;
BOOL DMARunning = FALSE; // Used to start DMA on first write BOOL DMARunning = FALSE; // Used to start DMA on first write
BOOL SeeIfCardBusy()
{
if ((header[!Index].dwFlags & WHDR_DONE))
return 0;
return 1;
}
extern void sendSamplestoUDP(short * Samples, int nSamples, int Port); extern void sendSamplestoUDP(short * Samples, int nSamples, int Port);
extern int UDPClientPort; extern int UDPClientPort;
short * SendtoCard(unsigned short * buf, int n) short * SendtoCard(unsigned short * buf, int n)
{ {
int NextBuffer = Index;
char Msg[80];
NextBuffer++;
if (NextBuffer > 3)
NextBuffer = 0;
if (SoundMode == 3) // UDP if (SoundMode == 3) // UDP
{ {
sendSamplestoUDP(buf, n, UDPClientPort); sendSamplestoUDP(buf, n, UDPClientPort);
@ -257,17 +251,15 @@ short * SendtoCard(unsigned short * buf, int n)
waveOutPrepareHeader(hWaveOut, &header[Index], sizeof(WAVEHDR)); waveOutPrepareHeader(hWaveOut, &header[Index], sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &header[Index], sizeof(WAVEHDR)); waveOutWrite(hWaveOut, &header[Index], sizeof(WAVEHDR));
// wait till next buffer is free // wait till previous buffer is complete
while (!(header[NextBuffer].dwFlags & WHDR_DONE)) while (!(header[!Index].dwFlags & WHDR_DONE))
{ {
txSleep(5); // Run buckground while waiting txSleep(5); // Run buckground while waiting
} }
waveOutUnprepareHeader(hWaveOut, &header[NextBuffer], sizeof(WAVEHDR)); waveOutUnprepareHeader(hWaveOut, &header[!Index], sizeof(WAVEHDR));
Index = NextBuffer; Index = !Index;
sprintf(Msg, "TX Buffer %d", NextBuffer);
return &buffer[Index][0]; return &buffer[Index][0];
} }
@ -364,11 +356,10 @@ void GetSoundDevices()
HANDLE hStdin; HANDLE hStdin;
int onlyMixSnoop = 0;
int InitSound(BOOL Report) int InitSound(BOOL Report)
{ {
int i, ret; int i, t, ret;
if (SoundMode == 4) if (SoundMode == 4)
{ {
@ -403,8 +394,6 @@ int InitSound(BOOL Report)
header[0].dwFlags = WHDR_DONE; header[0].dwFlags = WHDR_DONE;
header[1].dwFlags = WHDR_DONE; header[1].dwFlags = WHDR_DONE;
header[2].dwFlags = WHDR_DONE;
header[3].dwFlags = WHDR_DONE;
if (strlen(PlaybackDevice) <= 2) if (strlen(PlaybackDevice) <= 2)
PlayBackIndex = atoi(PlaybackDevice); PlayBackIndex = atoi(PlaybackDevice);
@ -574,7 +563,7 @@ void PollReceivedSamples()
lastlevelGUI = Now; lastlevelGUI = Now;
if ((Now - lastlevelreport) > 60000) // 60 Secs if ((Now - lastlevelreport) > 10000) // 10 Secs
{ {
char HostCmd[64]; char HostCmd[64];
lastlevelreport = Now; lastlevelreport = Now;
@ -714,8 +703,6 @@ extern int Number; // Number of samples waiting to be sent
// Subroutine to add trailer before filtering // Subroutine to add trailer before filtering
extern int SampleNo;
void SoundFlush() void SoundFlush()
{ {
// Append Trailer then wait for TX to complete // Append Trailer then wait for TX to complete
@ -733,10 +720,6 @@ void SoundFlush()
txSleep(10); txSleep(10);
while (!(header[1].dwFlags & WHDR_DONE)) while (!(header[1].dwFlags & WHDR_DONE))
txSleep(10); txSleep(10);
while (!(header[2].dwFlags & WHDR_DONE))
txSleep(10);
while (!(header[3].dwFlags & WHDR_DONE))
txSleep(10);
// I think we should turn round the link here. I dont see the point in // I think we should turn round the link here. I dont see the point in
// waiting for MainPoll // waiting for MainPoll
@ -931,7 +914,6 @@ BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite)
if ((!fWriteStat) || (BytesToWrite != BytesWritten)) if ((!fWriteStat) || (BytesToWrite != BytesWritten))
{ {
int Err = GetLastError(); int Err = GetLastError();
Debugprintf("Serial Write Error %d", Err);
ClearCommError(fd, &ErrorFlags, &ComStat); ClearCommError(fd, &ErrorFlags, &ComStat);
return FALSE; return FALSE;
} }

View File

@ -40,7 +40,6 @@
#endif #endif
void Debugprintf(const char * format, ...); void Debugprintf(const char * format, ...);
void Sleep(int mS);
extern int Closing; extern int Closing;

15
ax25.c
View File

@ -29,20 +29,10 @@ __declspec(dllimport) unsigned short __stdcall ntohs(__in unsigned short hostsho
#else #else
#include <stdint.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
#define strtok_s strtok_r #define strtok_s strtok_r
#include <stddef.h> #include <stddef.h>
#endif #endif
void set_DM(int snd_ch, Byte * path);
void rst_values(TAX25Port * AX25Sess);
void decode_frame(Byte * frame, int len, Byte * path, string * data, void decode_frame(Byte * frame, int len, Byte * path, string * data,
Byte * pid, Byte * nr, Byte * ns, Byte * f_type, Byte * f_id, Byte * pid, Byte * nr, Byte * ns, Byte * f_type, Byte * f_id,
Byte * rpt, Byte * pf, Byte * cr); Byte * rpt, Byte * pf, Byte * cr);
@ -254,9 +244,6 @@ int maxframe[4] = { 0,0,0,0 };
int TXFrmMode[4] = { 0,0,0,0 }; int TXFrmMode[4] = { 0,0,0,0 };
int max_frame_collector[4] = { 0,0,0,0 }; int max_frame_collector[4] = { 0,0,0,0 };
int bytes[4] = { 0,0,0,0 };
int bytes2mins[4] = { 0,0,0,0 };
char MyDigiCall[4][512] = { "","","","" }; char MyDigiCall[4][512] = { "","","","" };
char exclude_callsigns[4][512] = { "","","","" }; char exclude_callsigns[4][512] = { "","","","" };
char exclude_APRS_frm[4][512] = { "","","","" }; char exclude_APRS_frm[4][512] = { "","","","" };
@ -1742,7 +1729,7 @@ int is_excluded_frm(int snd_ch, int f_id, string * data)
int number_digi(char * path) int number_digi(string path)
{ {
int n = 0; int n = 0;

View File

@ -177,7 +177,7 @@ void AGW_del_socket(void * socket)
if (AGW == NULL) if (AGW == NULL)
return; return;
// Clear(&AGW->AGW_frame_buf); Clear(&AGW->AGW_frame_buf);
freeString(AGW->data_in); freeString(AGW->data_in);
AGW->Monitor = 0; AGW->Monitor = 0;
AGW->Monitor_raw = 0; AGW->Monitor_raw = 0;
@ -189,8 +189,10 @@ void AGW_del_socket(void * socket)
void AGW_add_socket(void * socket) void AGW_add_socket(void * socket)
{ {
AGWUser * User = (struct AGWUser_t *)malloc(sizeof(struct AGWUser_t)); // One Client AGWUser * User = (struct AGWUser_t *)malloc(sizeof(struct AGWUser_t)); // One Client
memset(User, 0, sizeof(struct AGWUser_t));
AGWUsers = realloc(AGWUsers, (AGWConCount + 1) * sizeof(void *)); AGWUsers = realloc(AGWUsers, (AGWConCount + 1) * sizeof(void *));
AGWUsers[AGWConCount++] = User; AGWUsers[AGWConCount++] = User;
User->data_in = newString(); User->data_in = newString();
@ -257,7 +259,7 @@ string * AGW_R_Frame()
string * AGW_X_Frame(char * CallFrom, UCHAR reg_call) string * AGW_X_Frame(char * CallFrom, UCHAR reg_call)
{ {
string * Msg = AGW_frame_header(0, 'X', 0, CallFrom, "", 1); string * Msg = AGW_frame_header(0, 'x', 0, CallFrom, "", 1);
stringAdd(Msg, (UCHAR *)&reg_call, 1); stringAdd(Msg, (UCHAR *)&reg_call, 1);
@ -274,16 +276,13 @@ string * AGW_G_Frame()
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
Ports[0]++;
if (soundChannel[i]) if (soundChannel[i])
{
Ports[0]++;
sprintf(portMsg, "Port%c with SoundCard Ch %c;", Ports[0], 'A' + i); sprintf(portMsg, "Port%c with SoundCard Ch %c;", Ports[0], 'A' + i);
strcat(Ports, portMsg); else
} sprintf(portMsg, "Port%c Disabled;", Ports[0]);
// else
// sprintf(portMsg, "Port%c Disabled;", Ports[0]);
; strcat(Ports, portMsg);
} }
@ -295,6 +294,7 @@ string * AGW_G_Frame()
}; };
string * AGW_Gs_Frame(int port, Byte * port_info, int Len) string * AGW_Gs_Frame(int port, Byte * port_info, int Len)
{ {
string * Msg; string * Msg;
@ -511,50 +511,12 @@ void on_AGW_R_frame(AGWUser * AGW)
int refreshModems = 0; int refreshModems = 0;
/*
+ 00 On air baud rate(0 = 1200 / 1 = 2400 / 2 = 4800 / 3 = 9600)
+ 01 Traffic level(if 0xFF the port is not in autoupdate mode)
+ 02 TX Delay
+ 03 TX Tail
+ 04 Persist
+ 05 SlotTime
+ 06 MaxFrame
+ 07 How Many connections are active on this port
+ 08 LSB Low Word
+ 09 MSB Low Word
+ 10 LSB High Word
+ 11 MSB High Word HowManyBytes(received in the last 2 minutes) as a 32 bits(4 bytes) integer.Updated every two minutes.
*/
void on_AGW_Gs_frame(AGWUser * AGW, struct AGWHeader * Frame, Byte * Data) void on_AGW_Gs_frame(AGWUser * AGW, struct AGWHeader * Frame, Byte * Data)
{ {
// QTSM with a data field is used by QtSM to set/read Modem Params // QTSM with a data field is used by QtSM to set/read Modem Params
Byte info[48] = { 0, 255, 24, 3, 100, 15, 6, 0, 1, 0, 0, 0 }; //QTSM Signature Byte info[48] = { 0, 255, 24, 3, 100, 15, 6, 0, 1, 0, 0, 0 }; //QTSM Signature
int Len = 12; int Len = 12;
int Port = Frame->Port;
// KD6YAM wants the info to be correct. BPQ used 24, 3, 100 as a signature but could use the Version.
// For now I'll fill in the rest
info[2] = txdelay[Port] / 10;
info[3] = txtail[Port] / 10;
info[4] = persist[Port];
info[5] = slottime[Port];
info[6] = maxframe[Port];
info[7] = 0;
int i = 0;
while (i < port_num)
{
if (AX25Port[Port][i].status != STAT_NO_LINK)
info[7]++;
i++;
}
memcpy(&info[8], &bytes2mins[Port], 4);
if (Frame->DataLength == 32) if (Frame->DataLength == 32)
{ {
@ -1398,6 +1360,7 @@ void AGW_Report_Modem_Change(int port)
int i; int i;
AGWUser * AGW; AGWUser * AGW;
string * pkt;
if (soundChannel[port] == 0) // Not in use if (soundChannel[port] == 0) // Not in use
return; return;
@ -1574,16 +1537,3 @@ void AGW_frame_analiz(AGWUser * AGW)
Debugprintf("AGW %c", Frame->DataKind); Debugprintf("AGW %c", Frame->DataKind);
} }
} }
void doAGW2MinTimer()
{
for (int n = 0; n < 4; n++)
{
if (soundChannel[n] == 0) // Channel not used
continue;
bytes2mins[n] = bytes[n];
bytes[n] = 0;
}
}

View File

@ -27,14 +27,6 @@ extern word MEMRecovery[5];
void make_rx_frame_FX25(int snd_ch, int rcvr_nr, int emph, string * data); void make_rx_frame_FX25(int snd_ch, int rcvr_nr, int emph, string * data);
string * memory_ARQ(TStringList * buf, string * data); string * memory_ARQ(TStringList * buf, string * data);
void CreateStringList(TStringList * List);
void analiz_frame(int snd_ch, string * frame, char * code, boolean fecflag);
void KISS_on_data_out(int port, string * frame, int TX);
void updateDCD(int Chan, boolean State);
void Frame_Optimize(TAX25Port * AX25Sess, TStringList * buf);
void RX2TX(int snd_ch);
int fx25_decode_rs(Byte * data, int * eras_pos, int no_eras, int pad, int rs_size);
void il2p_rec_bit(int chan, int subchan, int slice, int dbit);
float GuessCentreFreq(int i); float GuessCentreFreq(int i);
void ProcessRXFrames(int snd_ch); void ProcessRXFrames(int snd_ch);
@ -343,7 +335,7 @@ void chk_dcd1(int snd_ch, int buf_size)
// ? does this work as Andy passes aborted frames to decoder // ? does this work as Andy passes aborted frames to decoder
Byte port; Byte port;
int i; word i;
single tick; single tick;
word active; word active;
boolean ind_dcd; boolean ind_dcd;
@ -382,7 +374,6 @@ void chk_dcd1(int snd_ch, int buf_size)
if (lastDCDState[snd_ch] != dcd_bit_sync[snd_ch]) if (lastDCDState[snd_ch] != dcd_bit_sync[snd_ch])
{ {
updateDCD(snd_ch, dcd_bit_sync[snd_ch]);
updateDCD(snd_ch, dcd_bit_sync[snd_ch]); updateDCD(snd_ch, dcd_bit_sync[snd_ch]);
lastDCDState[snd_ch] = dcd_bit_sync[snd_ch]; lastDCDState[snd_ch] = dcd_bit_sync[snd_ch];
} }
@ -432,9 +423,9 @@ void chk_dcd1(int snd_ch, int buf_size)
if (TX_rotate) if (TX_rotate)
{ {
for (int n = 0; n < 4; n++) for (int i = 0; i < 4; i++)
{ {
if (snd_status[n] == SND_TX) if (snd_status[i] == SND_TX)
dcd[snd_ch] = TRUE; dcd[snd_ch] = TRUE;
} }
} }
@ -444,7 +435,7 @@ void chk_dcd1(int snd_ch, int buf_size)
if (!dcd[snd_ch] && resptime_tick[snd_ch] >= resptime[snd_ch]) if (!dcd[snd_ch] && resptime_tick[snd_ch] >= resptime[snd_ch])
{ {
int n = 0; i = 0;
port = new_tx_port[snd_ch]; port = new_tx_port[snd_ch];
do do
@ -472,9 +463,9 @@ void chk_dcd1(int snd_ch, int buf_size)
if (all_frame_buf[snd_ch].Count > 0) if (all_frame_buf[snd_ch].Count > 0)
new_tx_port[snd_ch] = port; new_tx_port[snd_ch] = port;
n++; i++;
} while (all_frame_buf[snd_ch].Count == 0 && n < port_num); } while (all_frame_buf[snd_ch].Count == 0 && i < port_num);
// Add KISS frames // Add KISS frames
@ -484,7 +475,7 @@ void chk_dcd1(int snd_ch, int buf_size)
if (all_frame_buf[snd_ch].Count > 0) if (all_frame_buf[snd_ch].Count > 0)
{ {
for (int n = 0; n < all_frame_buf[snd_ch].Count; n++) for (n = 0; n < all_frame_buf[snd_ch].Count; n++)
{ {
KISS_on_data_out(snd_ch, Strings(&all_frame_buf[snd_ch], n), 1); // Mon TX KISS_on_data_out(snd_ch, Strings(&all_frame_buf[snd_ch], n), 1); // Mon TX
} }
@ -494,14 +485,14 @@ void chk_dcd1(int snd_ch, int buf_size)
if (KISS.buffer[snd_ch].Count > 0) if (KISS.buffer[snd_ch].Count > 0)
{ {
for (int k = 0; k < KISS.buffer[snd_ch].Count; k++) for (n = 0; n < KISS.buffer[snd_ch].Count; n++)
{ {
if (AGWServ) if (AGWServ)
AGW_Raw_monitor(snd_ch, Strings(&KISS.buffer[snd_ch], n)); AGW_Raw_monitor(snd_ch, Strings(&KISS.buffer[snd_ch], n));
// Need to add copy as clear will free original // Need to add copy as clear will free original
Add(&all_frame_buf[snd_ch], duplicateString(Strings(&KISS.buffer[snd_ch], k))); Add(&all_frame_buf[snd_ch], duplicateString(Strings(&KISS.buffer[snd_ch], n)));
} }
Clear(&KISS.buffer[snd_ch]); Clear(&KISS.buffer[snd_ch]);
} }
@ -4267,7 +4258,7 @@ void ProcessRXFrames(int snd_ch)
// Work out which decoder and which emph settings worked. // Work out which decoder and which emph settings worked.
if (snd_ch < 0 || snd_ch > 3) if (snd_ch < 0 || snd_ch >3)
return; return;
if (detect_list[snd_ch].Count > 0) // no point if nothing decoded if (detect_list[snd_ch].Count > 0) // no point if nothing decoded

View File

@ -28,16 +28,6 @@ extern int RSID_SetModem[4];
extern int needRSID[4]; extern int needRSID[4];
extern int needRSID[4]; extern int needRSID[4];
BOOL useKISSControls = 0;
#define FEND 0xc0
#define FESC 0xDB
#define TFEND 0xDC
#define TFESC 0xDD
#define KISS_ACKMODE 0x0C
#define KISS_DATA 0
#define QTSMKISSCMD 7
/* /*
@ -70,23 +60,6 @@ string * make_frame(string * data, Byte * path, Byte pid, Byte nr, Byte ns, Byt
void rst_t3(TAX25Port * AX25Sess); void rst_t3(TAX25Port * AX25Sess);
TAX25Port * get_user_port(int snd_ch, Byte * path); TAX25Port * get_user_port(int snd_ch, Byte * path);
void analiz_frame(int snd_ch, string * frame, char * code, boolean fecflag);
boolean is_last_digi(Byte *path);
int is_excluded_call(int snd_ch, unsigned char * path);
boolean is_correct_path(Byte * path, Byte pid);
void KISS_on_data_out(int port, string * frame, int TX);
void ax25_info_init(TAX25Port * AX25Sess);
void clr_frm_win(TAX25Port * AX25Sess);
void decode_frame(Byte * frame, int len, Byte * path, string * data,
Byte * pid, Byte * nr, Byte * ns, Byte * f_type, Byte * f_id,
Byte * rpt, Byte * pf, Byte * cr);
void ax25_info_init(TAX25Port * AX25Sess);
void AGW_AX25_disc(TAX25Port * AX25Sess, Byte mode);
void AGW_AX25_conn(TAX25Port * AX25Sess, int snd_ch, Byte mode);
int number_digi(char * path);
void AGW_AX25_data_in(void * socket, int snd_ch, int PID, Byte * path, string * data);
void inc_frack(TAX25Port * AX25Sess) void inc_frack(TAX25Port * AX25Sess)
{ {
@ -1127,8 +1100,7 @@ void on_FRMR(void * socket, TAX25Port * AX25Sess, Byte * path)
{ {
AX25Sess->info.stat_end_ses = time(NULL); AX25Sess->info.stat_end_ses = time(NULL);
AGW_AX25_disc(AX25Sess, MODE_OTHER); AGW_AX25_disc(socket, AX25Sess->snd_ch, MODE_OTHER, path);
write_ax25_info(AX25Sess); write_ax25_info(AX25Sess);
} }
@ -1436,18 +1408,14 @@ void analiz_frame(int snd_ch, string * frame, char * code, boolean fecflag)
if (len < PKT_ERR) if (len < PKT_ERR)
return; return;
bytes[snd_ch] += frame->Length; // For AGW stats
if (AGWServ)
AGW_AX25_frame_analiz(snd_ch, TRUE, frame);
decode_frame(frame->Data, frame->Length, path, data, &pid, &nr, &ns, &f_type, &f_id, &rpt, &pf, &cr); decode_frame(frame->Data, frame->Length, path, data, &pid, &nr, &ns, &f_type, &f_id, &rpt, &pf, &cr);
if (is_excluded_call(snd_ch, path)) if (is_excluded_call(snd_ch, path))
excluded = TRUE; excluded =TRUE;
// if is_excluded_frm(snd_ch,f_id,data) then excluded:=TRUE; // if is_excluded_frm(snd_ch,f_id,data) then excluded:=TRUE;
if (excluded) if (excluded)
return; return;
@ -1480,20 +1448,7 @@ void analiz_frame(int snd_ch, string * frame, char * code, boolean fecflag)
AGW_Raw_monitor(snd_ch, frame); AGW_Raw_monitor(snd_ch, frame);
if (KISSServ) if (KISSServ)
{
if (useKISSControls)
{
// Send a KISS Control frame with frame stats before data frame
int len = strlen(code);
UCHAR * Control = (UCHAR *)malloc(64);
len = sprintf(Control, "%c%cPKTINFO [%s]%c", FEND, (snd_ch) << 4 | QTSMKISSCMD, code, FEND);
KISSSendtoServer(NULL, Control, len);
}
KISS_on_data_out(snd_ch, frame, 0); KISS_on_data_out(snd_ch, frame, 0);
}
} }
// Digipeat frame // Digipeat frame
@ -1663,6 +1618,9 @@ void analiz_frame(int snd_ch, string * frame, char * code, boolean fecflag)
on_FRMR(socket, AX25Sess, path); on_FRMR(socket, AX25Sess, path);
break; break;
} }
if (AGWServ)
AGW_AX25_frame_analiz(snd_ch, TRUE, frame);
} }

View File

@ -25,17 +25,6 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
// I assume this modulates (and sends?} frames // I assume this modulates (and sends?} frames
void InitBuffers();
void EncodeRS(Byte * xData, Byte * xEncoded);
void scrambler(UCHAR * in_buf, int Len);
void fx25_encode_rs(Byte * data, Byte *parity, int pad, int rs_size);
int fx25_decode_rs(Byte * data, int * eras_pos, int no_eras, int pad, int rs_size);
int il2p_get_new_bit_tail(UCHAR snd_ch, UCHAR bit);
int il2p_get_new_bit(int snd_ch, Byte bit);
int ARDOPSendToCard(int Chan, int Len);
void Flush();
void SampleSink(int LR, short Sample);
int RSEncode(UCHAR * bytToRS, UCHAR * RSBytes, int DataLen, int RSLen); int RSEncode(UCHAR * bytToRS, UCHAR * RSBytes, int DataLen, int RSLen);
//unit ax25_mod; //unit ax25_mod;
@ -877,6 +866,7 @@ int get_new_bit_tail(UCHAR snd_ch, UCHAR bit)
} }
else else
{ {
Debugprintf("End TXTAIL %d", SampleNo);
tx_status[snd_ch] = TX_WAIT_BPF; tx_status[snd_ch] = TX_WAIT_BPF;
} }
@ -891,6 +881,7 @@ int get_new_bit_tail(UCHAR snd_ch, UCHAR bit)
} }
else else
{ {
Debugprintf("End TXTAIL %d", SampleNo);
tx_status[snd_ch] = TX_WAIT_BPF; tx_status[snd_ch] = TX_WAIT_BPF;
} }
break; break;
@ -1208,7 +1199,7 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
tx_status[snd_ch] = TX_FRAME; tx_status[snd_ch] = TX_FRAME;
if (tx_status[snd_ch] == TX_TAIL) if (tx_status[snd_ch] == TX_TAIL)
bit = il2p_get_new_bit_tail(snd_ch, bit); bit = get_new_bit_tail(snd_ch, bit);
if (tx_status[snd_ch] == TX_FRAME) if (tx_status[snd_ch] == TX_FRAME)
bit = il2p_get_new_bit(snd_ch, bit); bit = il2p_get_new_bit(snd_ch, bit);
@ -1239,7 +1230,6 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
*bitptr = tx_nrzi(snd_ch, bit); *bitptr = tx_nrzi(snd_ch, bit);
} }
} }
// BPSK Mode // BPSK Mode
@ -1250,10 +1240,13 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
if (tx_status[snd_ch] == TX_SILENCE) if (tx_status[snd_ch] == TX_SILENCE)
{ {
tx_delay_cnt[snd_ch] = 0; tx_delay_cnt[snd_ch] = 0;
Debugprintf("Start TXD");
tx_status[snd_ch] = TX_DELAY; tx_status[snd_ch] = TX_DELAY;
} }
// il2p generates TXDELAY as part of the frame, so go straight to TX_FRAME
// il2p generates TXDELAY as part of the frame, so go straight too TX_FRAME
if (tx_status[snd_ch] == TX_DELAY) if (tx_status[snd_ch] == TX_DELAY)
if (il2p_mode[snd_ch] >= IL2P_MODE_TXRX) if (il2p_mode[snd_ch] >= IL2P_MODE_TXRX)
@ -1262,12 +1255,7 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
bit = get_new_bit_delay(snd_ch, bit); bit = get_new_bit_delay(snd_ch, bit);
if (tx_status[snd_ch] == TX_TAIL) if (tx_status[snd_ch] == TX_TAIL)
{ bit = get_new_bit_tail(snd_ch, bit);
if (il2p_mode[snd_ch] >= IL2P_MODE_TXRX)
bit = il2p_get_new_bit_tail(snd_ch, bit);
else
bit = get_new_bit_tail(snd_ch, bit);
}
if (tx_status[snd_ch] == TX_FRAME) if (tx_status[snd_ch] == TX_FRAME)
{ {
@ -1278,7 +1266,6 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
else else
bit = get_new_bit(snd_ch, bit); bit = get_new_bit(snd_ch, bit);
} }
// ?? *bitptr = tx_nrzi(snd_ch, bit); // ?? *bitptr = tx_nrzi(snd_ch, bit);
if (bit == 0) if (bit == 0)
@ -1310,7 +1297,7 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
tx_status[snd_ch] = TX_FRAME; // il2p generates TXDELAY as part of the frame, so go straight to TX_FRAME tx_status[snd_ch] = TX_FRAME; // il2p generates TXDELAY as part of the frame, so go straight to TX_FRAME
if (tx_status[snd_ch] == TX_TAIL) if (tx_status[snd_ch] == TX_TAIL)
bit = il2p_get_new_bit_tail(snd_ch, bit); bit = get_new_bit_tail(snd_ch, bit);
if (tx_status[snd_ch] == TX_FRAME) if (tx_status[snd_ch] == TX_FRAME)
bit = il2p_get_new_bit(snd_ch, bit); bit = il2p_get_new_bit(snd_ch, bit);
@ -1385,6 +1372,7 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
if (tx_status[snd_ch] == TX_SILENCE) if (tx_status[snd_ch] == TX_SILENCE)
{ {
tx_delay_cnt[snd_ch] = 0; tx_delay_cnt[snd_ch] = 0;
Debugprintf("Start TXD");
tx_status[snd_ch] = TX_DELAY; tx_status[snd_ch] = TX_DELAY;
} }
@ -1394,7 +1382,7 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
tx_status[snd_ch] = TX_FRAME; // il2p generates TXDELAY as part of the frame, so go straight to TX_FRAME tx_status[snd_ch] = TX_FRAME; // il2p generates TXDELAY as part of the frame, so go straight to TX_FRAME
if (tx_status[snd_ch] == TX_TAIL) if (tx_status[snd_ch] == TX_TAIL)
bit = il2p_get_new_bit_tail(snd_ch, bit); bit = get_new_bit_tail(snd_ch, bit);
if (tx_status[snd_ch] == TX_FRAME) if (tx_status[snd_ch] == TX_FRAME)
bit = il2p_get_new_bit(snd_ch, bit); bit = il2p_get_new_bit(snd_ch, bit);
@ -1502,7 +1490,7 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
tx_status[snd_ch] = TX_FRAME; // il2p generates TXDELAY as part of the frame, so go straight to TX_FRAME tx_status[snd_ch] = TX_FRAME; // il2p generates TXDELAY as part of the frame, so go straight to TX_FRAME
if (tx_status[snd_ch] == TX_TAIL) if (tx_status[snd_ch] == TX_TAIL)
bit = il2p_get_new_bit_tail(snd_ch, bit); bit = get_new_bit_tail(snd_ch, bit);
if (tx_status[snd_ch] == TX_FRAME) if (tx_status[snd_ch] == TX_FRAME)
bit = il2p_get_new_bit(snd_ch, bit); bit = il2p_get_new_bit(snd_ch, bit);
@ -1602,6 +1590,7 @@ float make_samples(unsigned char snd_ch, unsigned char * bitptr)
if (tx_status[snd_ch] == TX_SILENCE) if (tx_status[snd_ch] == TX_SILENCE)
{ {
tx_delay_cnt[snd_ch] = 0; tx_delay_cnt[snd_ch] = 0;
Debugprintf("Start TXD");
tx_status[snd_ch] = TX_DELAY; tx_status[snd_ch] = TX_DELAY;
} }

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>270</width> <width>270</width>
<height>453</height> <height>411</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -276,19 +276,6 @@
</property> </property>
</widget> </widget>
</widget> </widget>
<widget class="QPushButton" name="Cal1500">
<property name="geometry">
<rect>
<x>66</x>
<y>416</y>
<width>139</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>10 secs 1500Hz Tone</string>
</property>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>

44
debian/changelog vendored
View File

@ -1,16 +1,8 @@
qtsoundmodem (0.0.0.73~rc1-1) UNRELEASED; urgency=medium qtsoundmodem (0.0.0.72-1~bpo11+1) bullseye; urgency=medium
* Upstream import * Rebuild for bullseye.
* Patches refreshed
-- hibby <hibby@velox.lan> Tue, 29 Oct 2024 22:45:40 +0000 -- Dave Hibberd <hibby@debian.org> Sat, 13 Apr 2024 19:03:36 +0100
qtsoundmodem (0.0.0.72.1-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream release, I was a bit hasty with that 0.72 release earlier
this year
-- Dave Hibberd <hibby@debian.org> Fri, 06 Sep 2024 18:40:36 +0100
qtsoundmodem (0.0.0.72-1) unstable; urgency=medium qtsoundmodem (0.0.0.72-1) unstable; urgency=medium
@ -18,6 +10,11 @@ qtsoundmodem (0.0.0.72-1) unstable; urgency=medium
* Override QA settings for function-implicit-declaration * Override QA settings for function-implicit-declaration
-- Dave Hibberd <hibby@debian.org> Sat, 13 Apr 2024 19:01:02 +0100 -- Dave Hibberd <hibby@debian.org> Sat, 13 Apr 2024 19:01:02 +0100
qtsoundmodem (0.0.0.71-1~bpo11+1) bullseye; urgency=medium
* Rebuild for bullseye.
-- Dave Hibberd <d@vehibberd.com> Sun, 17 Dec 2023 14:09:09 +0000
qtsoundmodem (0.0.0.71-1) unstable; urgency=medium qtsoundmodem (0.0.0.71-1) unstable; urgency=medium
@ -25,24 +22,49 @@ qtsoundmodem (0.0.0.71-1) unstable; urgency=medium
-- Dave Hibberd <d@vehibberd.com> Sun, 17 Dec 2023 14:07:52 +0000 -- Dave Hibberd <d@vehibberd.com> Sun, 17 Dec 2023 14:07:52 +0000
qtsoundmodem (0.0.0.68-1~bpo11+1) bullseye; urgency=medium
* Rebuild for bullseye.
-- Dave Hibberd <d@vehibberd.com> Tue, 10 Oct 2023 23:05:11 +0100
qtsoundmodem (0.0.0.68-1) unstable; urgency=medium qtsoundmodem (0.0.0.68-1) unstable; urgency=medium
* New Upstream * New Upstream
-- Dave Hibberd <d@vehibberd.com> Tue, 10 Oct 2023 23:03:20 +0100 -- Dave Hibberd <d@vehibberd.com> Tue, 10 Oct 2023 23:03:20 +0100
qtsoundmodem (0.0.0.67-2~bpo11+1) bullseye; urgency=medium
* Rebuild for bullseye.
-- Dave Hibberd <d@vehibberd.com> Thu, 14 Sep 2023 22:20:42 +0100
qtsoundmodem (0.0.0.67-2) unstable; urgency=medium qtsoundmodem (0.0.0.67-2) unstable; urgency=medium
* Fixing libpulse * Fixing libpulse
-- Dave Hibberd <d@vehibberd.com> Thu, 14 Sep 2023 21:53:22 +0100 -- Dave Hibberd <d@vehibberd.com> Thu, 14 Sep 2023 21:53:22 +0100
qtsoundmodem (0.0.0.67-1~bpo11+1) bullseye; urgency=medium
* Rebuild for bullseye-backports.
-- Dave Hibberd <d@vehibberd.com> Tue, 12 Sep 2023 21:55:47 +0100
qtsoundmodem (0.0.0.67-1) unstable; urgency=medium qtsoundmodem (0.0.0.67-1) unstable; urgency=medium
* New Upstream * New Upstream
-- Dave Hibberd <d@vehibberd.com> Tue, 12 Sep 2023 21:49:25 +0100 -- Dave Hibberd <d@vehibberd.com> Tue, 12 Sep 2023 21:49:25 +0100
qtsoundmodem (0.0.0.66-1~bpo11+1) bullseye; urgency=medium
* Rebuild for bullseye-backports.
* Raspi for oarc!
-- Dave Hibberd <d@vehibberd.com> Tue, 05 Sep 2023 21:14:20 +0100
qtsoundmodem (0.0.0.66-1) unstable; urgency=medium qtsoundmodem (0.0.0.66-1) unstable; urgency=medium
* Initial release. * Initial release.

2
debian/control vendored
View File

@ -6,7 +6,7 @@ Standards-Version: 4.6.2.0
Vcs-Browser: Vcs-Browser:
Vcs-Git: Vcs-Git:
Homepage: https://www.cantab.net/users/john.wiseman/Documents/QtSoundModem.html Homepage: https://www.cantab.net/users/john.wiseman/Documents/QtSoundModem.html
Build-Depends: debhelper-compat (= 13), qtbase5-dev, qt5-qmake, libqt5serialport5-dev, libfftw3-dev, libpulse-dev, libasound2-dev, extra-xdg-menus Build-Depends: debhelper-compat (= 12), qtbase5-dev, qt5-qmake, libqt5serialport5-dev, libfftw3-dev, libpulse-dev, libasound2-dev, extra-xdg-menus
Rules-Requires-Root: no Rules-Requires-Root: no
Package: qtsoundmodem Package: qtsoundmodem

View File

@ -1,6 +1,6 @@
--- a/tcpCode.cpp --- a/tcpCode.cpp
+++ b/tcpCode.cpp +++ b/tcpCode.cpp
@@ -775,7 +775,7 @@ @@ -370,7 +370,7 @@
QByteArray datas = HAMLIBsock->readAll(); QByteArray datas = HAMLIBsock->readAll();
@ -9,122 +9,3 @@
} }
--- a/ax25.c
+++ b/ax25.c
@@ -1758,7 +1758,7 @@
-get_monitor_path(Byte * path, char * mycall, char * corrcall, char * digi)
+void get_monitor_path(Byte * path, char * mycall, char * corrcall, char * digi)
{
Byte * digiptr = digi;
--- a/ax25_l2.c
+++ b/ax25_l2.c
@@ -374,7 +374,7 @@
void delete_I_FRM_port(TAX25Port * AX25Sess)
{
string * frame;
- string path = { 0 };
+ Byte path[80];
string data= { 0 };
Byte pid, nr, ns, f_type, f_id, rpt, cr, pf;
@@ -386,7 +386,7 @@
optimize = TRUE;
frame = Strings(&AX25Sess->frame_buf, i);
- decode_frame(frame->Data, frame->Length, &path, &data, &pid, &nr, &ns, &f_type, &f_id, &rpt, &pf, &cr);
+ decode_frame(frame->Data, frame->Length, path, &data, &pid, &nr, &ns, &f_type, &f_id, &rpt, &pf, &cr);
if (f_id == I_I)
{
@@ -916,7 +916,7 @@
while (i != AX25Sess->hi_vs)
{
- i = (i++) & 7;
+ i = (i + 1) & 7;
need_frame[index++] = i + '0';
if (index > 10)
{
--- a/UZ7HOStuff.h
+++ b/UZ7HOStuff.h
@@ -1096,6 +1096,20 @@
BOOL ConvToAX25(char * callsign, unsigned char * ax25call);
void Debugprintf(const char * format, ...);
+// Hibby's collection for GCC14 and Hardening
+void closeTraceLog();
+void get_monitor_path(Byte * path, char * mycall, char * corrcall, char * digi);
+void decode_frame(Byte * frame, int len, Byte * path, string * data, Byte * pid, Byte * nr, Byte * ns, Byte * f_type, Byte * f_id, Byte * rpt, Byte * pf, Byte * cr);
+void Demodulator(int snd_ch, int rcvr_nr, float * src_buf, int last, int xcenter);
+void sendSamplestoUDP(short * Samples, int nSamples, int Port);
+void RSIDProcessSamples(short * Samples, int nSamples);
+void ARDOPProcessNewSamples(int chan, short * Samples, int nSamples);
+void ProcessRXFrames(int snd_ch);
+void doWaterfall(int snd_ch);
+void displayWaterfall();
+void timer_event();
+void CheckPSKWindows();
+
double pila(double x);
void AGW_Raw_monitor(int snd_ch, string * data);
@@ -1190,4 +1204,4 @@
#ifdef __cplusplus
}
-#endif
\ No newline at end of file
+#endif
--- a/SMMain.c
+++ b/SMMain.c
@@ -223,8 +223,9 @@
if (using48000)
{
// Need to upsample to 48K. Try just duplicating sample
-
- uint32_t * ptr = &DMABuffer[2 * Number];
+ // split init and initialisation for compiler cleanliness
+ uint32_t * ptr;
+ ptr = (uint32_t *)&DMABuffer[2 * Number];
*(&ptr[1]) = *(ptr);
*(&ptr[2]) = *(ptr);
@@ -388,7 +389,7 @@
#endif
extern int blnBusyStatus;
-BusyDet = 5;
+int BusyDet = 5;
#define PLOTWATERFALL
--- a/sm_main.c
+++ b/sm_main.c
@@ -796,7 +796,8 @@
void runModems()
{
- int snd_ch, res;
+ int snd_ch;
+ void *res;
pthread_t thread[4] = { 0,0,0,0 };
for (snd_ch = 0; snd_ch < 4; snd_ch++)
--- a/il2p.c
+++ b/il2p.c
@@ -394,6 +394,11 @@
typedef enum cmdres_e { cr_00 = 2, cr_cmd = 1, cr_res = 0, cr_11 = 3 } cmdres_t;
+// Hibby: Headers for GCC14
+
+int set_addrs(packet_t pp, char addrs, int num_addr, cmdres_t cr);
+static inline int ax25_get_control_offset(packet_t this_p);
+static inline int ax25_get_num_control(packet_t this_p);
extern packet_t ax25_new(void);

View File

@ -1,11 +0,0 @@
--- a/tcpCode.cpp
+++ b/tcpCode.cpp
@@ -732,7 +732,7 @@
QByteArray datas = FLRigsock->readAll();
- qDebug(datas.data());
+ qDebug() << "SetPTT Failed";
}

View File

@ -1,3 +1,2 @@
fix-bookworm-build.patch
libpulse.patch libpulse.patch
build-fix.patch build-fix.patch

3
debian/rules vendored
View File

@ -1,7 +1,8 @@
#!/usr/bin/make -f #!/usr/bin/make -f
export QT_SELECT=5 export QT_SELECT=5
export DEB_BUILD_MAINT_OPTIONS=hardening=+all,qa=-bug-implicit-func export DEB_BUILD_MAINT_OPTIONS=hardening=+all
export DEB_CFLAGS_MAINT_STRIP=-Werror=implicit-function-declaration
%: %:
dh $@ dh $@

View File

@ -1,12 +0,0 @@
#define _MSC_EXTENSIONS
#define _INTEGRAL_MAX_BITS 64
#define _MSC_VER 1916
#define _MSC_FULL_VER 191627051
#define _MSC_BUILD 0
#define _WIN32
#define _M_IX86 600
#define _M_IX86_FP 2
#define _CPPRTTI
#define _DEBUG
#define _MT
#define _DLL

View File

@ -1,12 +0,0 @@
#define _MSC_EXTENSIONS
#define _INTEGRAL_MAX_BITS 64
#define _MSC_VER 1916
#define _MSC_FULL_VER 191627043
#define _MSC_BUILD 0
#define _WIN32
#define _M_IX86 600
#define _M_IX86_FP 2
#define _CPPRTTI
#define _DEBUG
#define _MT
#define _DLL

View File

@ -1,12 +0,0 @@
#define _MSC_EXTENSIONS
#define _INTEGRAL_MAX_BITS 64
#define _MSC_VER 1916
#define _MSC_FULL_VER 191627043
#define _MSC_BUILD 0
#define _WIN32
#define _M_IX86 600
#define _M_IX86_FP 2
#define _CPPRTTI
#define _DEBUG
#define _MT
#define _DLL

View File

@ -1,7 +1,7 @@
#define _MSC_EXTENSIONS #define _MSC_EXTENSIONS
#define _INTEGRAL_MAX_BITS 64 #define _INTEGRAL_MAX_BITS 64
#define _MSC_VER 1916 #define _MSC_VER 1916
#define _MSC_FULL_VER 191627043 #define _MSC_FULL_VER 191627045
#define _MSC_BUILD 0 #define _MSC_BUILD 0
#define _WIN32 #define _WIN32
#define _M_IX86 600 #define _M_IX86 600

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>528</width> <width>535</width>
<height>721</height> <height>698</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -20,9 +20,9 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>5</x> <x>5</x>
<y>0</y> <y>10</y>
<width>513</width> <width>512</width>
<height>711</height> <height>671</height>
</rect> </rect>
</property> </property>
<property name="verticalScrollBarPolicy"> <property name="verticalScrollBarPolicy">
@ -40,7 +40,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>508</width> <width>508</width>
<height>706</height> <height>668</height>
</rect> </rect>
</property> </property>
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
@ -49,7 +49,7 @@
<x>5</x> <x>5</x>
<y>10</y> <y>10</y>
<width>541</width> <width>541</width>
<height>361</height> <height>331</height>
</rect> </rect>
</property> </property>
<property name="title"> <property name="title">
@ -60,7 +60,7 @@
<rect> <rect>
<x>108</x> <x>108</x>
<y>25</y> <y>25</y>
<width>371</width> <width>261</width>
<height>22</height> <height>22</height>
</rect> </rect>
</property> </property>
@ -73,7 +73,7 @@
<rect> <rect>
<x>108</x> <x>108</x>
<y>55</y> <y>55</y>
<width>371</width> <width>261</width>
<height>22</height> <height>22</height>
</rect> </rect>
</property> </property>
@ -99,7 +99,7 @@
<rect> <rect>
<x>13</x> <x>13</x>
<y>55</y> <y>55</y>
<width>91</width> <width>71</width>
<height>19</height> <height>19</height>
</rect> </rect>
</property> </property>
@ -159,37 +159,63 @@
<string>Minimize window on startup</string> <string>Minimize window on startup</string>
</property> </property>
</widget> </widget>
<widget class="QLineEdit" name="txLatency"> <widget class="QLineEdit" name="txSamplerate">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>220</x> <x>108</x>
<y>140</y> <y>124</y>
<width>63</width> <width>63</width>
<height>20</height> <height>20</height>
</rect> </rect>
</property> </property>
<property name="text"> <property name="text">
<string>0</string> <string>12000</string>
</property>
</widget>
<widget class="QLineEdit" name="rxSamplerate">
<property name="geometry">
<rect>
<x>304</x>
<y>124</y>
<width>63</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>12000</string>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>13</x> <x>13</x>
<y>140</y> <y>125</y>
<width>201</width> <width>91</width>
<height>18</height> <height>18</height>
</rect> </rect>
</property> </property>
<property name="text"> <property name="text">
<string>Soundcard TX latency mS</string> <string>TX SampleRate</string>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>190</x>
<y>125</y>
<width>91</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>RX SampleRate</string>
</property> </property>
</widget> </widget>
<widget class="QComboBox" name="Modem_1_Chan"> <widget class="QComboBox" name="Modem_1_Chan">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>72</x> <x>70</x>
<y>170</y> <y>164</y>
<width>86</width> <width>86</width>
<height>20</height> <height>20</height>
</rect> </rect>
@ -219,7 +245,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>12</x> <x>12</x>
<y>172</y> <y>166</y>
<width>61</width> <width>61</width>
<height>16</height> <height>16</height>
</rect> </rect>
@ -232,7 +258,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>180</x> <x>180</x>
<y>170</y> <y>164</y>
<width>86</width> <width>86</width>
<height>20</height> <height>20</height>
</rect> </rect>
@ -257,7 +283,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>165</x> <x>165</x>
<y>172</y> <y>166</y>
<width>21</width> <width>21</width>
<height>16</height> <height>16</height>
</rect> </rect>
@ -326,7 +352,7 @@
<rect> <rect>
<x>168</x> <x>168</x>
<y>90</y> <y>90</y>
<width>131</width> <width>91</width>
<height>20</height> <height>20</height>
</rect> </rect>
</property> </property>
@ -380,7 +406,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>290</x> <x>290</x>
<y>170</y> <y>164</y>
<width>86</width> <width>86</width>
<height>20</height> <height>20</height>
</rect> </rect>
@ -405,7 +431,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>272</x> <x>272</x>
<y>172</y> <y>166</y>
<width>21</width> <width>21</width>
<height>16</height> <height>16</height>
</rect> </rect>
@ -418,7 +444,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>385</x> <x>385</x>
<y>172</y> <y>166</y>
<width>21</width> <width>21</width>
<height>16</height> <height>16</height>
</rect> </rect>
@ -431,7 +457,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>400</x> <x>400</x>
<y>170</y> <y>164</y>
<width>86</width> <width>86</width>
<height>20</height> <height>20</height>
</rect> </rect>
@ -569,40 +595,14 @@
<string>Dark Theme</string> <string>Dark Theme</string>
</property> </property>
</widget> </widget>
<widget class="QCheckBox" name="onlyMixSnoop">
<property name="geometry">
<rect>
<x>30</x>
<y>110</y>
<width>421</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Only Mix/Snoop Devices (needs custom .asoundrc)</string>
</property>
</widget>
<widget class="QCheckBox" name="useKISSControls">
<property name="geometry">
<rect>
<x>20</x>
<y>328</y>
<width>271</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Enable KISS Control and Reporting</string>
</property>
</widget>
</widget> </widget>
<widget class="QGroupBox" name="Goup"> <widget class="QGroupBox" name="groupBox_2">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>380</y> <y>360</y>
<width>481</width> <width>481</width>
<height>133</height> <height>101</height>
</rect> </rect>
</property> </property>
<property name="title"> <property name="title">
@ -613,7 +613,7 @@
<rect> <rect>
<x>22</x> <x>22</x>
<y>24</y> <y>24</y>
<width>129</width> <width>121</width>
<height>18</height> <height>18</height>
</rect> </rect>
</property> </property>
@ -646,7 +646,7 @@
<rect> <rect>
<x>22</x> <x>22</x>
<y>48</y> <y>48</y>
<width>131</width> <width>111</width>
<height>18</height> <height>18</height>
</rect> </rect>
</property> </property>
@ -731,7 +731,7 @@
<rect> <rect>
<x>20</x> <x>20</x>
<y>74</y> <y>74</y>
<width>135</width> <width>111</width>
<height>18</height> <height>18</height>
</rect> </rect>
</property> </property>
@ -739,97 +739,12 @@
<string>UDP Sound Server Host</string> <string>UDP Sound Server Host</string>
</property> </property>
</widget> </widget>
<widget class="QComboBox" name="SixPackSerial">
<property name="geometry">
<rect>
<x>160</x>
<y>100</y>
<width>81</width>
<height>20</height>
</rect>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="label_17">
<property name="geometry">
<rect>
<x>20</x>
<y>98</y>
<width>111</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>6Pack Serial Port</string>
</property>
</widget>
<widget class="QLineEdit" name="SixPackTCP">
<property name="geometry">
<rect>
<x>320</x>
<y>100</y>
<width>47</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>252</x>
<y>101</y>
<width>63</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>TCP Port</string>
</property>
</widget>
<widget class="QCheckBox" name="SixPackEnable">
<property name="geometry">
<rect>
<x>380</x>
<y>99</y>
<width>70</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Enabled</string>
</property>
</widget>
<widget class="QLineEdit" name="MgmtPort">
<property name="geometry">
<rect>
<x>410</x>
<y>25</y>
<width>47</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_18">
<property name="geometry">
<rect>
<x>340</x>
<y>25</y>
<width>91</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Mgmt Port</string>
</property>
</widget>
</widget> </widget>
<widget class="QGroupBox" name="groupBox_3"> <widget class="QGroupBox" name="groupBox_3">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>520</y> <y>470</y>
<width>481</width> <width>481</width>
<height>151</height> <height>151</height>
</rect> </rect>
@ -1031,8 +946,8 @@
<widget class="QWidget" name="layoutWidget"> <widget class="QWidget" name="layoutWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>130</x> <x>140</x>
<y>670</y> <y>626</y>
<width>215</width> <width>215</width>
<height>33</height> <height>33</height>
</rect> </rect>

View File

@ -23,10 +23,6 @@ typedef struct TStringList_T
#include <stddef.h> #include <stddef.h>
#include "dw9600.h" #include "dw9600.h"
#define stringAdd(s1, s2, c) mystringAdd(s1, s2, c, __FILE__, __LINE__)
string * mystringAdd(string * Msg, unsigned char * Chars, int Count, char * FILE, int LINE);
extern int fx25_mode[4]; extern int fx25_mode[4];
extern int il2p_mode[4]; extern int il2p_mode[4];
extern int il2p_crc[4]; extern int il2p_crc[4];

413
il2p.c
View File

@ -46,10 +46,6 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
#include <stdint.h> // for uint64_t #include <stdint.h> // for uint64_t
void debugHexDump(unsigned char * Data, int Len, char Dirn);
extern void debugTimeStamp(char * Text, char Dirn);
extern int useTimedPTT;
// Oct 2023 Nino has added an optional crc // Oct 2023 Nino has added an optional crc
// Hamming(7,4) Encoding Table // Hamming(7,4) Encoding Table
@ -87,10 +83,6 @@ uint16_t Hamming74DecodeTable[128] = { \
void Debugprintf(const char * format, ...); void Debugprintf(const char * format, ...);
int SMUpdatePhaseConstellation(int chan, float * Phases, float * Mags, int intPSKPhase, int Count); int SMUpdatePhaseConstellation(int chan, float * Phases, float * Mags, int intPSKPhase, int Count);
extern int openTraceLog();
extern uint64_t writeTraceLog(char * Data);
extern void closeTraceLog();
#define MAX_ADEVS 3 #define MAX_ADEVS 3
#define MAX_RADIO_CHANS ((MAX_ADEVS) * 2) #define MAX_RADIO_CHANS ((MAX_ADEVS) * 2)
@ -1050,19 +1042,12 @@ void multi_modem_process_rec_packet(int snd_ch, int subchan, int slice, packet_t
string * data = newString(); string * data = newString();
char Mode[32] = "IL2P"; char Mode[32] = "IL2P";
int Quality = 0; int Quality = 0;
int CRCOK = 1;
char debugmsg[256];
sprintf(Mode, "IL2P %d", centreFreq); sprintf(Mode, "IL2P %d", centreFreq);
unsigned char * axcall = &pp->frame_data[7];
char call[10];
call[ConvFromAX25(axcall, call)] = 0;
// check crc if enabled // check crc if enabled
if (il2p_crc[snd_ch] & 1) if (il2p_crc[snd_ch])
{ {
unsigned short CRCMSG; unsigned short CRCMSG;
unsigned short CRCCALC; unsigned short CRCCALC;
@ -1080,32 +1065,16 @@ void multi_modem_process_rec_packet(int snd_ch, int subchan, int slice, packet_t
crc[2] = Hamming74DecodeTable[(pp->crc[2] & 0x7f)]; crc[2] = Hamming74DecodeTable[(pp->crc[2] & 0x7f)];
crc[3] = Hamming74DecodeTable[(pp->crc[3] & 0x7f)]; crc[3] = Hamming74DecodeTable[(pp->crc[3] & 0x7f)];
debugTimeStamp("CRC after Hamming decode is", 'R');
debugHexDump(crc, 4, 'R');
CRCMSG = crc[0] << 12 | crc[1] << 8 | crc[2] << 4 | crc[3]; CRCMSG = crc[0] << 12 | crc[1] << 8 | crc[2] << 4 | crc[3];
CRCCALC = get_fcs(pp->frame_data, pp->frame_len); CRCCALC = get_fcs(pp->frame_data, pp->frame_len);
if (CRCCALC != CRCMSG) if (CRCCALC != CRCMSG)
{ {
CRCOK = 0; Debugprintf("CRC Error Decoder %d Received %x Sent %x", subchan, CRCCALC, CRCMSG);
if ((il2p_crc[snd_ch] & 2) == 0) // Ignore CRC Error freeString(data);
{ ax25_delete(pp);
Debugprintf("CRC Error from %s Decoder %d Calculated %x Received %x FEC corrections %d But ignore CRC Set", call, subchan, CRCCALC, CRCMSG, retries); return;
sprintf(debugmsg, "CRC Error from %s Decoder %d Calculated %x Received %x FEC corrections %d But ignore CRC Set", call, subchan, CRCCALC, CRCMSG, retries);
debugTimeStamp(debugmsg, 'R');
}
else
{
Debugprintf("CRC Error from %s Decoder %d Calculated %x Received %x FEC corrections %d", call, subchan, CRCCALC, CRCMSG, retries);
freeString(data);
ax25_delete(pp);
return;
}
} }
} }
@ -1126,59 +1095,16 @@ void multi_modem_process_rec_packet(int snd_ch, int subchan, int slice, packet_t
pDET->errors = 0; pDET->errors = 0;
} }
if (detect_list[snd_ch].Count > 0) if (detect_list[snd_ch].Count > 0 &&
my_indexof(&detect_list[snd_ch], data) >= 0)
{ {
int index = my_indexof(&detect_list[snd_ch], data); // Already have a copy of this frame
if (index >= 0) freeString(data);
{ Debugprintf("Discarding copy rcvr %d emph %d", subchan, 0);
// Already have a copy of this frame return;
// See if new one has fewer corrections
string * xx = Strings(&detect_list_c[snd_ch], index); // Should be corresponding frame info
string * olddata = Strings(&detect_list[snd_ch], index);
if (xx)
{
int oldRetries = xx->Data[255];
int oldCRCOK = xx->Data[254];
if ((oldCRCOK == 0 && CRCOK == 1) || (oldRetries > retries))
{
replaceString(&detect_list[snd_ch], index, data);
freeString(olddata);
// Just update the metadata
Debugprintf("Replacing il2p frame from %s rcvr %d emph %d FEC corrections %d CRCOK %d", call, subchan, slice, retries, CRCOK);
memset(xx->Data, 0, 16);
if (pskStates[snd_ch])
{
Quality = SMUpdatePhaseConstellation(snd_ch, &Phases[snd_ch][subchan][slice][0], &Mags[snd_ch][subchan][slice][0], pskStates[snd_ch], nPhases[snd_ch][subchan][slice]);
sprintf(Mode, "%s][Q%d", Mode, Quality);
}
xx->Length= sprintf(xx->Data, "%s", Mode);
xx->Data[254] = CRCOK;
xx->Data[255] = retries;
return;
}
}
freeString(data);
Debugprintf("Discarding copy rcvr %d emph %d FEC corrections %d", subchan, slice, retries);
return;
}
} }
Debugprintf("Good il2p frame from %s rcvr %d emph %d FEC corrections %d", call, subchan, slice, retries);
sprintf(debugmsg, "Good il2p frame from %s rcvr %d emph %d FEC corrections %d", call, subchan, slice, retries);
debugTimeStamp(debugmsg, 'R');
string * xx = newString(); string * xx = newString();
memset(xx->Data, 0, 16); memset(xx->Data, 0, 16);
@ -1195,11 +1121,7 @@ void multi_modem_process_rec_packet(int snd_ch, int subchan, int slice, packet_t
// sprintf(Mode, "IP2P-%d", retries); // sprintf(Mode, "IP2P-%d", retries);
stringAdd(xx, Mode, strlen(Mode)); stringAdd(xx, Mode, strlen(Mode));
xx->Data[254] = CRCOK;
xx->Data[255] = retries;
closeTraceLog();
openTraceLog();
return; return;
@ -2312,8 +2234,6 @@ void il2p_init(int il2p_debug)
} }
} }
openTraceLog();
} // end il2p_init } // end il2p_init
@ -2918,9 +2838,6 @@ int il2p_encode_frame(packet_t pp, int max_fec, unsigned char *iout)
int e; int e;
int out_len = 0; int out_len = 0;
debugTimeStamp("TX Raw Packet is", 'T');
debugHexDump(pp->frame_data, pp->frame_len, 'T');
e = il2p_type_1_header(pp, max_fec, hdr); e = il2p_type_1_header(pp, max_fec, hdr);
if (e >= 0) { if (e >= 0) {
il2p_scramble_block(hdr, iout, IL2P_HEADER_SIZE); il2p_scramble_block(hdr, iout, IL2P_HEADER_SIZE);
@ -2929,10 +2846,6 @@ int il2p_encode_frame(packet_t pp, int max_fec, unsigned char *iout)
if (e == 0) { if (e == 0) {
// Success. No info part. // Success. No info part.
debugTimeStamp("TX Type 1 IL2P Packet no info is", 'T');
debugHexDump(iout, out_len, 'R');
return (out_len); return (out_len);
} }
@ -2946,9 +2859,6 @@ int il2p_encode_frame(packet_t pp, int max_fec, unsigned char *iout)
if (k > 0) { if (k > 0) {
out_len += k; out_len += k;
// Success. Info part was <= 1023 bytes. // Success. Info part was <= 1023 bytes.
debugTimeStamp("TX Type 1 IL2P Packet is", 'T');
debugHexDump(iout, out_len, 'T');
return (out_len); return (out_len);
} }
@ -2975,10 +2885,6 @@ int il2p_encode_frame(packet_t pp, int max_fec, unsigned char *iout)
if (k > 0) { if (k > 0) {
out_len += k; out_len += k;
// Success. Entire AX.25 frame <= 1023 bytes. // Success. Entire AX.25 frame <= 1023 bytes.
debugTimeStamp("TX Type 2 IL2P Packet is", 'T');
debugHexDump(iout, out_len, 'T');
return (out_len); return (out_len);
} }
// Something went wrong with the payload encoding. // Something went wrong with the payload encoding.
@ -4111,9 +4017,6 @@ void il2p_rec_bit(int chan, int subchan, int slice, int dbit)
// Determine Centre Freq // Determine Centre Freq
centreFreq[chan] = GuessCentreFreq(chan); centreFreq[chan] = GuessCentreFreq(chan);
debugTimeStamp("SYNC Detected", 'R');
} }
else if (__builtin_popcount((~(F->acc) & 0x00ffffff) ^ IL2P_SYNC_WORD) <= 1) { else if (__builtin_popcount((~(F->acc) & 0x00ffffff) ^ IL2P_SYNC_WORD) <= 1) {
// FIXME - this pops up occasionally with random noise. Find better way to convey information. // FIXME - this pops up occasionally with random noise. Find better way to convey information.
@ -4159,7 +4062,7 @@ void il2p_rec_bit(int chan, int subchan, int slice, int dbit)
F->eplen = il2p_payload_compute(&plprop, len, max_fec); F->eplen = il2p_payload_compute(&plprop, len, max_fec);
if (il2p_get_debug() >= 2) if (il2p_get_debug() >= 1)
{ {
Debugprintf("Header type %d, max fec = %d", hdr_type, max_fec); Debugprintf("Header type %d, max fec = %d", hdr_type, max_fec);
Debugprintf("Need to collect %d encoded bytes for %d byte payload.", F->eplen, len); Debugprintf("Need to collect %d encoded bytes for %d byte payload.", F->eplen, len);
@ -4254,21 +4157,11 @@ void il2p_rec_bit(int chan, int subchan, int slice, int dbit)
{ {
// have all crc bytes. enter DECODE // have all crc bytes. enter DECODE
debugTimeStamp("CRC Complete Header is", 'R');
debugHexDump(F->shdr, 15, 'R');
if (F->pc)
{
debugTimeStamp("Payload is", 'R');
debugHexDump(F->spayload, F->pc, 'R');
}
debugTimeStamp("CRC is", 'R');
debugHexDump(F->crc, 4, 'R');
F->state = IL2P_DECODE; F->state = IL2P_DECODE;
} }
} }
break; break;
case IL2P_DECODE: case IL2P_DECODE:
@ -4289,12 +4182,10 @@ void il2p_rec_bit(int chan, int subchan, int slice, int dbit)
{ {
// Most likely too many FEC errors. // Most likely too many FEC errors.
Debugprintf("FAILED to construct frame in %s.\n", __func__); Debugprintf("FAILED to construct frame in %s.\n", __func__);
debugTimeStamp("Packet Decode failed", 'R');
} }
} }
if (pp != NULL) if (pp != NULL) {
{
alevel_t alevel = demod_get_audio_level(chan, subchan); alevel_t alevel = demod_get_audio_level(chan, subchan);
retry_t retries = F->corrected; retry_t retries = F->corrected;
int is_fx25 = 1; // FIXME: distinguish fx.25 and IL2P. int is_fx25 = 1; // FIXME: distinguish fx.25 and IL2P.
@ -4304,9 +4195,6 @@ void il2p_rec_bit(int chan, int subchan, int slice, int dbit)
// if using crc pass received crc to packet object // if using crc pass received crc to packet object
debugTimeStamp("Decoded Packet is", 'R');
debugHexDump(pp->frame_data, pp->frame_len, 'R');
if (il2p_crc[chan]) if (il2p_crc[chan])
{ {
//copy crc bytes to packet object //copy crc bytes to packet object
@ -4317,15 +4205,14 @@ void il2p_rec_bit(int chan, int subchan, int slice, int dbit)
pp->crc[3] = F->crc[3]; pp->crc[3] = F->crc[3];
} }
debugTimeStamp("CRC raw bytes", 'R');
debugHexDump(pp->crc, 4, 'R');
multi_modem_process_rec_packet(chan, subchan, slice, pp, alevel, retries, is_fx25, slice, centreFreq[chan]); multi_modem_process_rec_packet(chan, subchan, slice, pp, alevel, retries, is_fx25, slice, centreFreq[chan]);
} }
} // end block for local variables. } // end block for local variables.
if (il2p_get_debug() >= 2) if (il2p_get_debug() >= 1) {
Debugprintf("-----"); Debugprintf("-----");
}
F->state = IL2P_SEARCHING; F->state = IL2P_SEARCHING;
break; break;
@ -4539,7 +4426,7 @@ string * il2p_send_frame(int chan, packet_t pp, int max_fec, int polarity)
// if we are using crc add it now. elen should point to end of data // if we are using crc add it now. elen should point to end of data
// crc should be at pp->frame_data[pp->frame_len] // crc should be at pp->frame_data[pp->frame_len]
if (il2p_crc[chan] & 1) if (il2p_crc[chan])
{ {
// The four encoded CRC bytes are arranged : // The four encoded CRC bytes are arranged :
// | CRC3 | CRC2 | CRC1 | CRC0 | // | CRC3 | CRC2 | CRC1 | CRC0 |
@ -4553,9 +4440,10 @@ string * il2p_send_frame(int chan, packet_t pp, int max_fec, int polarity)
encoded[elen++] = Hamming74EncodeTable[crc1 &0xf]; encoded[elen++] = Hamming74EncodeTable[crc1 &0xf];
} }
number_of_bits_sent[chan] = 0; number_of_bits_sent[chan] = 0;
if (il2p_get_debug() >= 2) { if (il2p_get_debug() >= 1) {
Debugprintf("IL2P frame, max_fec = %d, %d encoded bytes total", max_fec, elen); Debugprintf("IL2P frame, max_fec = %d, %d encoded bytes total", max_fec, elen);
// fx_hex_dump(encoded, elen); // fx_hex_dump(encoded, elen);
} }
@ -4587,15 +4475,13 @@ string * il2p_send_frame(int chan, packet_t pp, int max_fec, int polarity)
stringAdd(packet, encoded, elen); stringAdd(packet, encoded, elen);
// Add bytes for tail and TX padding, but don't send if another packet is available (?? how ??)
number_of_bits_sent[chan] = 0;
tx_fx25_size[chan] = packet->Length * 8; tx_fx25_size[chan] = packet->Length * 8;
return packet; return packet;
} }
// TX Code. Builds whole packet then sends a bit at a time // TX Code. Builds whole packet then sends a bit at a time
#define TX_SILENCE 0 #define TX_SILENCE 0
@ -4636,11 +4522,6 @@ string * fill_il2p_data(int snd_ch, string * data)
result = il2p_send_frame(snd_ch, pp, 1, 0); result = il2p_send_frame(snd_ch, pp, 1, 0);
ax25_delete(pp);
debugTimeStamp("TX Complete packet including Preamble and CRC and Tail", 'T');
debugHexDump(result->Data, result->Length, 'T');
return result; return result;
} }
@ -4776,10 +4657,6 @@ int il2p_get_new_bit(int snd_ch, Byte bit)
break; break;
case FRAME_NO_FRAME: case FRAME_NO_FRAME:
// I dont really like this state machine. We have run out of frames to send so
// should go straight to tail. This way we add an extra bit. Or does this really matter ??
tx_tail_cnt[snd_ch] = 0; tx_tail_cnt[snd_ch] = 0;
tx_frame_status[snd_ch] = FRAME_EMPTY; tx_frame_status[snd_ch] = FRAME_EMPTY;
tx_status[snd_ch] = TX_TAIL; tx_status[snd_ch] = TX_TAIL;
@ -4789,251 +4666,5 @@ int il2p_get_new_bit(int snd_ch, Byte bit)
return bit; return bit;
} }
extern int txLatency;
extern int useTImedPTT;
int il2p_get_new_bit_tail(UCHAR snd_ch, UCHAR bit)
{
// This sends reversals. It is an experiment
int tailbits = (txtail[snd_ch] * tx_baudrate[snd_ch]) / 1000;
#ifndef WIN32
if (useTimedPTT)
tailbits += (txLatency * tx_baudrate[snd_ch]) / 1000; // add padding to tx buffer to make sure we don't send silence
#endif
if (tx_tail_cnt[snd_ch]++ > tailbits)
tx_status[snd_ch] = TX_WAIT_BPF;
return (tx_tail_cnt[snd_ch] & 1); // altenating 1/0
}
void debugHexDump(unsigned char * Data, int Len, char Dirn)
{
char Line[256];
#ifndef LOGTX
if (Dirn == 'T')
return;
#endif
#ifndef LOGRX
if (Dirn == 'R')
return;
#endif
while (Len > 0)
{
sprintf(Line, "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
Data[0], Data[1], Data[2], Data[3], Data[4], Data[5], Data[6], Data[7],
Data[8], Data[9], Data[10], Data[11], Data[12], Data[13], Data[14], Data[15]);
if (Len < 16)
{
Line[Len * 3] = 10;
Line[Len * 3 + 1] = 0;
}
writeTraceLog(Line);
Data += 16;
Len -= 16;
}
}
// Hamming experiments
// from https://github.com/nasserkessas/hamming-codes/blob/master/hamming.c
#define block unsigned short // 16 bits
#define bit uint8_t // 8 bits (only last is used)
int multipleXor(int *indicies, int len)
{
int val = indicies[0];
for (int i = 1; i < len; i++)
{
val = val ^ indicies[i];
}
return val;
}
bit getBit(unsigned short b, int i)
{
return (b << i) & (int)pow(2, (sizeof(unsigned short) * 8 - 1));
}
unsigned short toggleBit(unsigned short b, int i)
{
return b ^ (1 << i);
}
bit getCharBit(char b, int i)
{
return (b << i) & (int)pow(2, (sizeof(char) * 8 - 1));
}
block modifyBit(block n, int p, bit b)
{
return ((n & ~(1 << (sizeof(block) * 8 - 1 - p))) | (b << (sizeof(block) * 8 - 1 - p)));
}
void encode(char *input, int len, FILE *ptr) {
// Amount of bits in a block //
int bits = sizeof(block) * 8;
// Amount of bits per block used to carry the message //
int messageBits = bits - log2(bits) - 1;
// Amount of blocks needed to encode message //
int blocks = ceil((float)len / messageBits);
// Array of encoded blocks //
block encoded[16];
// Loop through each block //
for (int i = 0; i < blocks + 1; i++) {
printf("On Block %d:\n", i);
// Final encoded block variable //
block thisBlock = 0;
// Amount of "skipped" bits (used for parity) //
int skipped = 0;
// Count of how many bits are "on" //
int onCount = 0;
// Array of "on" bits //
int onList[64];
// Loop through each message bit in this block to populate final block //
for (int j = 0; j < bits; j++) {
// Skip bit if reserved for parity bit //
if ((j & (j - 1)) == 0) { // Check if j is a power of two or 0
skipped++;
continue;
}
bit thisBit;
if (i != blocks) {
// Current overall bit number //
int currentBit = i * messageBits + (j - skipped);
// Current character //
int currentChar = currentBit / (sizeof(char) * 8); // int division
// Value of current bit //
thisBit = currentBit < len * sizeof(char) * 8 ? getCharBit(input[currentChar], currentBit - currentChar * 8) : 0;
}
else {
thisBit = getBit(len / 8, j - skipped + (sizeof(block) * 8 - messageBits));
}
// If bit is "on", add to onList and onCount //
if (thisBit) {
onList[onCount] = j;
onCount++;
}
// Populate final message block //
thisBlock = modifyBit(thisBlock, j, thisBit);
}
// Calculate values of parity bits //
block parityBits = multipleXor(onList, onCount);
// Loop through skipped bits (parity bits) //
for (int k = 1; k < skipped; k++) { // skip bit 0
// If bit is "on", add to onCount
if (getBit(parityBits, sizeof(block) * 8 - skipped + k)) {
onCount++;
}
// Add parity bit to final block //
thisBlock = modifyBit(thisBlock, (int)pow(2, skipped - k - 1), getBit(parityBits, sizeof(block) * 8 - skipped + k));
}
// Add overall parity bit (total parity of onCount) //
thisBlock = modifyBit(thisBlock, 0, onCount & 1);
// Output final block //
// printBlock(thisBlock);
// putchar('\n');
// Add block to encoded blocks //
encoded[i] = thisBlock;
}
// Write encoded message to file //
fwrite(encoded, sizeof(block), blocks + 1, ptr);
}
void decode(block input[], int len, FILE *ptr)
{
// Amount of bits in a block //
int bits = sizeof(block) * 8;
for (int b = 0; b < (len / sizeof(block)); b++) {
printf("On Block %d:\n", b);
// Print initial block //
// printBlock(input[b]);
// Count of how many bits are "on" //
int onCount = 0;
// Array of "on" bits //
int onList[64];
// Populate onCount and onList //
for (int i = 1; i < bits; i++) {
getBit(input[b], i);
if (getBit(input[b], i)) {
onList[onCount] = i;
onCount++;
}
}
// Check for single errors //
int errorLoc = multipleXor(onList, onCount);
if (errorLoc) {
// Check for multiple errors //
if (!(onCount & 1 ^ getBit(input[b], 0))) { // last bit of onCount (total parity) XOR first bit of block (parity bit)
printf("\nMore than one error detected. Aborting.\n");
exit(1);
}
// Flip error bit //
else {
printf("\nDetected error at position %d, flipping bit.\n", errorLoc);
input[b] = toggleBit(input[b], (bits - 1) - errorLoc);
// Re-print block for comparison //
// printBlock(input[b]);
}
}
putchar('\n');
}
}

View File

@ -22,7 +22,19 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
#include "UZ7HOStuff.h" #include "UZ7HOStuff.h"
int add_raw_frames(int snd_ch, string * frame, TStringList * buf); /*
uses sysutils,classes;
procedure KISS_init;
procedure KISS_free;
procedure KISS_add_stream(socket: integer);
procedure KISS_del_stream(socket: integer);
procedure KISS_on_data_in(socket: integer; data: string);
procedure KISS_on_data_out(port: byte; frame: string);
procedure KISS_send_ack(port: byte; data: string);
procedure KISS_send_ack1(port: byte);
*/
// I don't like this. maybe fine for Dephi but overcomlicated for C
// I think I need a struct for each connection, but a simple array of entries should be fine // I think I need a struct for each connection, but a simple array of entries should be fine
// My normal ** and count system // My normal ** and count system
@ -37,7 +49,6 @@ int KISSConCount = 0;
#define TFESC 0xDD #define TFESC 0xDD
#define KISS_ACKMODE 0x0C #define KISS_ACKMODE 0x0C
#define KISS_DATA 0 #define KISS_DATA 0
#define QTSMKISSCMD 7
struct TKISSMode_t KISS; struct TKISSMode_t KISS;
@ -84,8 +95,7 @@ void KISS_add_stream(void * Socket)
KissConnections = realloc(KissConnections, (KISSConCount + 1) * sizeof(void *)); KissConnections = realloc(KissConnections, (KISSConCount + 1) * sizeof(void *));
KISS = KissConnections[KISSConCount++] = malloc(sizeof(*KISS)); KISS = KissConnections[KISSConCount++] = malloc(sizeof(KISS));
memset(KISS, 0, sizeof(*KISS));
KISS->Socket = Socket; KISS->Socket = Socket;
KISS->data_in = newString(); KISS->data_in = newString();

View File

@ -33,18 +33,15 @@ extern void saveSettings();
extern int Closing; extern int Closing;
workerThread *t; workerThread *t;
serialThread *serial;
mynet m1; mynet m1;
QCoreApplication * a; QCoreApplication * a;
QtSoundModem * w; QtSoundModem * w;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
char Title[128]; char Title[128];
QString Response;
if (argc > 1 && strcmp(argv[1], "nogui") == 0) if (argc > 1 && strcmp(argv[1], "nogui") == 0)
nonGUIMode = 1; nonGUIMode = 1;
@ -80,10 +77,6 @@ int main(int argc, char *argv[])
} }
QObject::connect(&m1, SIGNAL(HLSetPTT(int)), &m1, SLOT(doHLSetPTT(int)), Qt::QueuedConnection); QObject::connect(&m1, SIGNAL(HLSetPTT(int)), &m1, SLOT(doHLSetPTT(int)), Qt::QueuedConnection);
QObject::connect(&m1, SIGNAL(FLRigSetPTT(int)), &m1, SLOT(doFLRigSetPTT(int)), Qt::QueuedConnection);
QObject::connect(&m1, SIGNAL(mgmtSetPTT(int, int)), &m1, SLOT(domgmtSetPTT(int, int)), Qt::QueuedConnection);
QObject::connect(&m1, SIGNAL(startTimer(int)), &m1, SLOT(dostartTimer(int)), Qt::QueuedConnection); QObject::connect(&m1, SIGNAL(startTimer(int)), &m1, SLOT(dostartTimer(int)), Qt::QueuedConnection);
QObject::connect(&m1, SIGNAL(stopTimer()), &m1, SLOT(dostopTimer()), Qt::QueuedConnection); QObject::connect(&m1, SIGNAL(stopTimer()), &m1, SLOT(dostopTimer()), Qt::QueuedConnection);

1
ofdm.c
View File

@ -200,7 +200,6 @@ extern int LastDataFrameType; // Last data frame processed (for Memory ARQ, et
extern int intNAKctr; extern int intNAKctr;
extern int intACKctr; extern int intACKctr;
extern int intTimeouts; extern int intTimeouts;
void ARDOPSampleSink(short Sample);
extern UCHAR goodReceivedBlocks[128]; extern UCHAR goodReceivedBlocks[128];
extern UCHAR goodReceivedBlockLen[128]; extern UCHAR goodReceivedBlockLen[128];

View File

@ -74,8 +74,8 @@ int Channels = 2;
int BitsPerSample = 16; int BitsPerSample = 16;
float TX_Samplerate = 12000; float TX_Samplerate = 12000;
float RX_Samplerate = 12000; float RX_Samplerate = 12000;
//int RX_SR = 11025; int RX_SR = 11025;
//int TX_SR = 11025; int TX_SR = 11025;
int RX_PPM = 0; int RX_PPM = 0;
int TX_PPM = 0; int TX_PPM = 0;
int tx_bufsize = 512; int tx_bufsize = 512;
@ -448,12 +448,11 @@ void init_Q4800(int snd_ch)
void init_Q3600(int snd_ch) void init_Q3600(int snd_ch)
{ {
qpsk_set[snd_ch].mode = QPSK_V26; // QPSK_SM; qpsk_set[snd_ch].mode = QPSK_SM;
modem_mode[snd_ch] = MODE_QPSK; modem_mode[snd_ch] = MODE_QPSK;
rx_shift[snd_ch] = 1800; rx_shift[snd_ch] = 1800;
rx_baudrate[snd_ch] = 1800; rx_baudrate[snd_ch] = 1800;
tx_bitrate[snd_ch] = 3600; tx_bitrate[snd_ch] = 3600;
pskStates[snd_ch] = 4;
if (modem_def[snd_ch]) if (modem_def[snd_ch])
get_filter_values(snd_ch); get_filter_values(snd_ch);
} }
@ -1042,10 +1041,7 @@ void BufferFull(short * Samples, int nSamples) // These are Stereo Samples
// We need to run the waterfall FFT for the frequency guessing to work // We need to run the waterfall FFT for the frequency guessing to work
int FirstWaterfallChan = 0; int FirstWaterfallChan = 0;
short * ptr1 = &fft_buf[0][fftCount]; short * ptr1 = &fft_buf[0][fftCount];
short * ptr2 = &fft_buf[1][fftCount]; short * ptr2 = &fft_buf[1][fftCount];
@ -1091,7 +1087,7 @@ void BufferFull(short * Samples, int nSamples) // These are Stereo Samples
data2 += 2; data2 += 2;
} }
if (((Toggle & 1) == 0)) if (((Toggle & 1) == 0))
doWaterfall(1); doWaterfall(1);
} }
if (Firstwaterfall || Secondwaterfall) if (Firstwaterfall || Secondwaterfall)

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,6 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
*/ */
// UZ7HO Soundmodem Port by John Wiseman G8BPQ // UZ7HO Soundmodem Port by John Wiseman G8BPQ
#include <QMessageBox> #include <QMessageBox>
@ -28,26 +27,15 @@ along with QtSoundModem. If not, see http://www.gnu.org/licenses
#define CONNECT(sndr, sig, rcvr, slt) connect(sndr, SIGNAL(sig), rcvr, SLOT(slt)) #define CONNECT(sndr, sig, rcvr, slt) connect(sndr, SIGNAL(sig), rcvr, SLOT(slt))
QList<QTcpSocket*> _MgmtSockets;
QList<QTcpSocket*> _KISSSockets; QList<QTcpSocket*> _KISSSockets;
QList<QTcpSocket*> _AGWSockets; QList<QTcpSocket*> _AGWSockets;
QTcpServer * _KISSserver; QTcpServer * _KISSserver;
QTcpServer * _AGWserver; QTcpServer * _AGWserver;
QTcpServer * SixPackServer;
QTcpSocket *SixPackSocket;
QTcpServer * _MgmtServer;
TMgmtMode ** MgmtConnections = NULL;
int MgmtConCount = 0;
extern workerThread *t; extern workerThread *t;
extern mynet m1; extern mynet m1;
extern serialThread *serial;
QString Response;
extern int MgmtPort;
extern "C" int KISSPort; extern "C" int KISSPort;
extern "C" void * initPulse(); extern "C" void * initPulse();
extern "C" int SoundMode; extern "C" int SoundMode;
@ -56,10 +44,6 @@ extern "C" int UDPClientPort;
extern "C" int UDPServerPort; extern "C" int UDPServerPort;
extern "C" int TXPort; extern "C" int TXPort;
extern char SixPackDevice[256];
extern int SixPackPort;
extern int SixPackEnable;
char UDPHost[64] = ""; char UDPHost[64] = "";
int UDPServ = 0; // UDP Server Active (ie broadcast sound frams as UDP packets) int UDPServ = 0; // UDP Server Active (ie broadcast sound frams as UDP packets)
@ -84,9 +68,8 @@ extern "C"
void MainLoop(); void MainLoop();
void set_speed(int snd_ch, int Modem); void set_speed(int snd_ch, int Modem);
void init_speed(int snd_ch); void init_speed(int snd_ch);
}
void Process6PackData(unsigned char * Bytes, int Len); }
extern "C" int nonGUIMode; extern "C" int nonGUIMode;
@ -138,56 +121,12 @@ void mynet::start()
} }
} }
if (MgmtPort)
{
_MgmtServer = new(QTcpServer);
if (_MgmtServer->listen(QHostAddress::Any, MgmtPort))
connect(_MgmtServer, SIGNAL(newConnection()), this, SLOT(onMgmtConnection()));
else
{
if (nonGUIMode)
Debugprintf("Listen failed for Mgmt Port");
else
{
QMessageBox msgBox;
msgBox.setText("Listen failed for Mgmt Port.");
msgBox.exec();
}
}
}
QObject::connect(t, SIGNAL(sendtoKISS(void *, unsigned char *, int)), this, SLOT(sendtoKISS(void *, unsigned char *, int)), Qt::QueuedConnection); QObject::connect(t, SIGNAL(sendtoKISS(void *, unsigned char *, int)), this, SLOT(sendtoKISS(void *, unsigned char *, int)), Qt::QueuedConnection);
QTimer *timer = new QTimer(this); QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(MyTimerSlot())); connect(timer, SIGNAL(timeout()), this, SLOT(MyTimerSlot()));
timer->start(100); timer->start(100);
if (SixPackEnable)
{
if (SixPackDevice[0] && strcmp(SixPackDevice, "None") != 0) // Using serial
{
serial->startSlave(SixPackDevice, 30000, Response);
serial->start();
// connect(serial, &serialThread::request, this, &QtSoundModem::showRequest);
// connect(serial, &serialThread::error, this, &QtSoundModem::processError);
// connect(serial, &serialThread::timeout, this, &QtSoundModem::processTimeout);
}
else if (SixPackPort) // using TCP
{
SixPackServer = new(QTcpServer);
if (SixPackServer->listen(QHostAddress::Any, SixPackPort))
connect(SixPackServer, SIGNAL(newConnection()), this, SLOT(on6PackConnection()));
}
}
} }
void mynet::MyTimerSlot() void mynet::MyTimerSlot()
@ -233,32 +172,6 @@ void mynet::onAGWReadyRead()
AGW_explode_frame(sender, datas.data(), datas.length()); AGW_explode_frame(sender, datas.data(), datas.length());
} }
void mynet::on6PackReadyRead()
{
QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
QByteArray datas = sender->readAll();
Process6PackData((unsigned char *)datas.data(), datas.length());
}
void mynet::on6PackSocketStateChanged(QAbstractSocket::SocketState socketState)
{
if (socketState == QAbstractSocket::UnconnectedState)
{
QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
}
}
void mynet::on6PackConnection()
{
QTcpSocket *clientSocket = SixPackServer->nextPendingConnection();
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(on6PackReadyRead()));
connect(clientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(on6PackSocketStateChanged(QAbstractSocket::SocketState)));
Debugprintf("6Pack Connect Sock %x", clientSocket);
}
void mynet::onKISSConnection() void mynet::onKISSConnection()
{ {
@ -273,183 +186,6 @@ void mynet::onKISSConnection()
Debugprintf("KISS Connect Sock %x", clientSocket); Debugprintf("KISS Connect Sock %x", clientSocket);
} }
void Mgmt_del_socket(void * socket)
{
int i;
TMgmtMode * MGMT = NULL;
if (MgmtConCount == 0)
return;
for (i = 0; i < MgmtConCount; i++)
{
if (MgmtConnections[i]->Socket == socket)
{
MGMT = MgmtConnections[i];
break;
}
}
if (MGMT == NULL)
return;
// Need to remove entry and move others down
MgmtConCount--;
while (i < MgmtConCount)
{
MgmtConnections[i] = MgmtConnections[i + 1];
i++;
}
}
void mynet::onMgmtConnection()
{
QTcpSocket *clientSocket = (QTcpSocket *)_MgmtServer->nextPendingConnection();
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onMgmtReadyRead()));
connect(clientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onMgmtSocketStateChanged(QAbstractSocket::SocketState)));
_MgmtSockets.append(clientSocket);
// Create a data structure to hold session info
TMgmtMode * MGMT;
MgmtConnections = (TMgmtMode **)realloc(MgmtConnections, (MgmtConCount + 1) * sizeof(void *));
MGMT = MgmtConnections[MgmtConCount++] = (TMgmtMode *)malloc(sizeof(*MGMT));
memset(MGMT, 0, sizeof(*MGMT));
MGMT->Socket = clientSocket;
Debugprintf("Mgmt Connect Sock %x", clientSocket);
clientSocket->write("Connected to QtSM\r");
}
void mynet::onMgmtSocketStateChanged(QAbstractSocket::SocketState socketState)
{
if (socketState == QAbstractSocket::UnconnectedState)
{
QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
Mgmt_del_socket(sender);
// free(sender->Msg);
_MgmtSockets.removeOne(sender);
Debugprintf("Mgmt Disconnect Sock %x", sender);
}
}
void mynet::onMgmtReadyRead()
{
QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
MgmtProcessLine(sender);
}
extern "C" void SendMgmtPTT(int snd_ch, int PTTState)
{
// Won't work in non=gui mode
emit m1.mgmtSetPTT(snd_ch, PTTState);
}
extern "C" char * strlop(char * buf, char delim);
extern "C" char modes_name[modes_count][21];
extern "C" int speed[5];
#ifndef WIN32
extern "C" int memicmp(char *a, char *b, int n);
#endif
void mynet::MgmtProcessLine(QTcpSocket* socket)
{
// Find Session
TMgmtMode * MGMT = NULL;
for (int i = 0; i < MgmtConCount; i++)
{
if (MgmtConnections[i]->Socket == socket)
{
MGMT = MgmtConnections[i];
break;
}
}
if (MGMT == NULL)
{
socket->readAll();
return;
}
while (socket->bytesAvailable())
{
QByteArray datas = socket->peek(512);
char * Line = datas.data();
if (strchr(Line, '\r') == 0)
return;
char * rest = strlop(Line, '\r');
int used = rest - Line;
// Read the upto the cr Null
datas = socket->read(used);
Line = datas.data();
rest = strlop(Line, '\r');
if (memicmp(Line, "QtSMPort ", 8) == 0)
{
if (strlen(Line) > 10)
{
int port = atoi(&Line[8]);
int bpqport = atoi(&Line[10]);
if ((port > 0 && port < 5) && (bpqport > 0 && bpqport < 64))
{
MGMT->BPQPort[port - 1] = bpqport;
socket->write("Ok\r");
}
}
}
else if (memicmp(Line, "Modem ", 6) == 0)
{
int port = atoi(&Line[6]);
if (port > 0 && port < 5)
{
// if any more params - if a name follows, set it else return it
char reply[80];
sprintf(reply, "Port %d Chan %d Freq %d Modem %s \r", MGMT->BPQPort[port - 1], port, rx_freq[port - 1], modes_name[speed[port - 1]]);
socket->write(reply);
}
else
socket->write("Invalid Port\r");
}
else
{
socket->write("Invalid command\r");
}
}
}
void mynet::onKISSSocketStateChanged(QAbstractSocket::SocketState socketState) void mynet::onKISSSocketStateChanged(QAbstractSocket::SocketState socketState)
{ {
if (socketState == QAbstractSocket::UnconnectedState) if (socketState == QAbstractSocket::UnconnectedState)
@ -459,7 +195,6 @@ void mynet::onKISSSocketStateChanged(QAbstractSocket::SocketState socketState)
KISS_del_socket(sender); KISS_del_socket(sender);
_KISSSockets.removeOne(sender); _KISSSockets.removeOne(sender);
Debugprintf("KISS Disconnect Sock %x", sender);
} }
} }
@ -500,7 +235,7 @@ void mynet::sendtoKISS(void * sock, unsigned char * Msg, int Len)
QTcpSocket* socket = (QTcpSocket*)sock; QTcpSocket* socket = (QTcpSocket*)sock;
socket->write((char *)Msg, Len); socket->write((char *)Msg, Len);
} }
free(Msg); // free(Msg);
} }
@ -509,10 +244,6 @@ QTcpSocket * HAMLIBsock;
int HAMLIBConnected = 0; int HAMLIBConnected = 0;
int HAMLIBConnecting = 0; int HAMLIBConnecting = 0;
QTcpSocket * FLRIGsock;
int FLRIGConnected = 0;
int FLRIGConnecting = 0;
void mynet::HAMLIBdisplayError(QAbstractSocket::SocketError socketError) void mynet::HAMLIBdisplayError(QAbstractSocket::SocketError socketError)
{ {
switch (socketError) switch (socketError)
@ -601,142 +332,6 @@ extern "C" void HAMLIBSetPTT(int PTTState)
emit m1.HLSetPTT(PTTState); emit m1.HLSetPTT(PTTState);
} }
extern "C" void FLRigSetPTT(int PTTState)
{
// Won't work in non=gui mode
emit m1.FLRigSetPTT(PTTState);
}
QTcpSocket * FLRigsock;
int FLRigConnected = 0;
int FLRigConnecting = 0;
void mynet::FLRigdisplayError(QAbstractSocket::SocketError socketError)
{
switch (socketError)
{
case QAbstractSocket::RemoteHostClosedError:
break;
case QAbstractSocket::HostNotFoundError:
QMessageBox::information(nullptr, tr("QtSM"),
"FLRig host was not found. Please check the "
"host name and portsettings->");
break;
case QAbstractSocket::ConnectionRefusedError:
qDebug() << "FLRig Connection Refused";
break;
default:
qDebug() << "FLRig Connection Failed";
break;
}
FLRigConnecting = 0;
FLRigConnected = 0;
}
void mynet::FLRigreadyRead()
{
unsigned char Buffer[4096];
QTcpSocket* Socket = static_cast<QTcpSocket*>(QObject::sender());
// read the data from the socket. Don't do anyhing with it at the moment
Socket->read((char *)Buffer, 4095);
}
void mynet::onFLRigSocketStateChanged(QAbstractSocket::SocketState socketState)
{
if (socketState == QAbstractSocket::UnconnectedState)
{
// Close any connections
FLRigConnected = 0;
FLRigConnecting = 0;
// delete (FLRigsock);
// FLRigsock = 0;
qDebug() << "FLRig Connection Closed";
}
else if (socketState == QAbstractSocket::ConnectedState)
{
FLRigConnected = 1;
FLRigConnecting = 0;
qDebug() << "FLRig Connected";
}
}
void mynet::ConnecttoFLRig()
{
delete(FLRigsock);
FLRigConnected = 0;
FLRigConnecting = 1;
FLRigsock = new QTcpSocket();
connect(FLRigsock, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(FLRigdisplayError(QAbstractSocket::SocketError)));
connect(FLRigsock, SIGNAL(readyRead()), this, SLOT(FLRigreadyRead()));
connect(FLRigsock, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onFLRigSocketStateChanged(QAbstractSocket::SocketState)));
FLRigsock->connectToHost(FLRigHost, FLRigPort);
return;
}
static char MsgHddr[] = "POST /RPC2 HTTP/1.1\r\n"
"User-Agent: XMLRPC++ 0.8\r\n"
"Host: 127.0.0.1:7362\r\n"
"Content-Type: text/xml\r\n"
"Content-length: %d\r\n"
"\r\n%s";
static char Req[] = "<?xml version=\"1.0\"?>\r\n"
"<methodCall><methodName>%s</methodName>\r\n"
"%s"
"</methodCall>\r\n";
void mynet::doFLRigSetPTT(int c)
{
int Len;
char ReqBuf[512];
char SendBuff[512];
char ValueString[256] = "";
sprintf(ValueString, "<params><param><value><i4>%d</i4></value></param></params\r\n>", c);
Len = sprintf(ReqBuf, Req, "rig.set_ptt", ValueString);
Len = sprintf(SendBuff, MsgHddr, Len, ReqBuf);
if (FLRigsock == nullptr || FLRigsock->state() != QAbstractSocket::ConnectedState)
ConnecttoFLRig();
if (FLRigsock == nullptr || FLRigsock->state() != QAbstractSocket::ConnectedState)
return;
FLRigsock->write(SendBuff);
FLRigsock->waitForBytesWritten(3000);
QByteArray datas = FLRigsock->readAll();
qDebug(datas.data());
}
extern "C" void startTimer(int Time) extern "C" void startTimer(int Time)
{ {
// Won't work in non=gui mode // Won't work in non=gui mode
@ -779,36 +374,6 @@ void mynet::doHLSetPTT(int c)
} }
void mynet::domgmtSetPTT(int snd_ch, int PTTState)
{
char Msg[64];
uint64_t ret;
for (QTcpSocket* socket : _MgmtSockets)
{
// Find Session
TMgmtMode * MGMT = NULL;
for (int i = 0; i < MgmtConCount; i++)
{
if (MgmtConnections[i]->Socket == socket)
{
MGMT = MgmtConnections[i];
break;
}
}
if (MGMT == NULL)
continue;
if (MGMT->BPQPort[snd_ch])
{
sprintf(Msg, "PTT %d %s\r", MGMT->BPQPort[snd_ch], PTTState ? "ON" : "OFF");
ret = socket->write(Msg);
}
}
}

View File

@ -4,16 +4,6 @@
#define CONNECT(sndr, sig, rcvr, slt) connect(sndr, SIGNAL(sig), rcvr, SLOT(slt)) #define CONNECT(sndr, sig, rcvr, slt) connect(sndr, SIGNAL(sig), rcvr, SLOT(slt))
//class myTcpSocket : public QTcpSocket
//{
//public:
// char Msg[512]; // Received message
// int Len;
// int BPQPort[4]; // BPQ port for each modem
//};
class mynet : public QObject class mynet : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -21,8 +11,6 @@ class mynet : public QObject
signals: signals:
void HLSetPTT(int c); void HLSetPTT(int c);
void FLRigSetPTT(int c);
void mgmtSetPTT(int port, int state);
void startTimer(int Time); void startTimer(int Time);
void stopTimer(); void stopTimer();
@ -34,27 +22,17 @@ public:
public slots: public slots:
void onAGWReadyRead(); void onAGWReadyRead();
void onKISSSocketStateChanged(QAbstractSocket::SocketState socketState); void onKISSSocketStateChanged(QAbstractSocket::SocketState socketState);
void onMgmtSocketStateChanged(QAbstractSocket::SocketState socketState);
void onMgmtReadyRead();
void onKISSReadyRead(); void onKISSReadyRead();
void onAGWSocketStateChanged(QAbstractSocket::SocketState socketState); void onAGWSocketStateChanged(QAbstractSocket::SocketState socketState);
void onKISSConnection(); void onKISSConnection();
void onMgmtConnection();
void MyTimerSlot(); void MyTimerSlot();
void onAGWConnection(); void onAGWConnection();
void on6PackConnection();
void on6PackReadyRead();
void on6PackSocketStateChanged(QAbstractSocket::SocketState socketState);
void dropPTT(); void dropPTT();
void displayError(QAbstractSocket::SocketError socketError); void displayError(QAbstractSocket::SocketError socketError);
void sendtoKISS(void * sock, unsigned char * Msg, int Len); void sendtoKISS(void * sock, unsigned char * Msg, int Len);
void FLRigdisplayError(QAbstractSocket::SocketError socketError);
void FLRigreadyRead();
void onFLRigSocketStateChanged(QAbstractSocket::SocketState socketState);
void ConnecttoFLRig();
void HAMLIBdisplayError(QAbstractSocket::SocketError socketError); void HAMLIBdisplayError(QAbstractSocket::SocketError socketError);
void HAMLIBreadyRead(); void HAMLIBreadyRead();
void onHAMLIBSocketStateChanged(QAbstractSocket::SocketState socketState); void onHAMLIBSocketStateChanged(QAbstractSocket::SocketState socketState);
@ -62,8 +40,6 @@ public slots:
void dostartTimer(int Time); void dostartTimer(int Time);
void dostopTimer(); void dostopTimer();
void doHLSetPTT(int c); void doHLSetPTT(int c);
void domgmtSetPTT(int chan, int state);
void doFLRigSetPTT(int c);
void readPendingDatagrams(); void readPendingDatagrams();
void socketError(); void socketError();
@ -77,7 +53,6 @@ private:
int bytesReceived; int bytesReceived;
int TotalBytes; int TotalBytes;
int PayloadSize; int PayloadSize;
void MgmtProcessLine(QTcpSocket* socket);
}; };
@ -90,11 +65,6 @@ signals:
void sendtoKISS(void *, unsigned char *, int); void sendtoKISS(void *, unsigned char *, int);
void openSockets(); void openSockets();
void startCWIDTimer(); void startCWIDTimer();
void setWaterfallImage();
void setLevelImage();
void setConstellationImage(int, int);
void startWatchdog();
void stopWatchdog();
private: private:
@ -105,3 +75,4 @@ public: