Compare commits
11 Commits
debian/lat
...
debian/boo
Author | SHA1 | Date |
---|---|---|
Hibby | 1b72b1c376 | |
Hibby | b6e20c3a59 | |
Dave Hibberd | 7b958fadeb | |
Dave Hibberd | 98dec80284 | |
Dave Hibberd | 9547d44a87 | |
Dave Hibberd | 0a28d4cef1 | |
Dave Hibberd | 429b88ef7a | |
Dave Hibberd | 6cb5e954da | |
Dave Hibberd | 681f64bbce | |
Dave Hibberd | ae3fa2c2a3 | |
Dave Hibberd | efd021d52b |
|
@ -1 +0,0 @@
|
||||||
.pc/
|
|
377
6pack.cpp
377
6pack.cpp
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
331
ALSASound.c
331
ALSASound.c
|
@ -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,13 +882,16 @@ 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);
|
||||||
|
|
||||||
|
@ -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,12 +1189,6 @@ short * SoundInit();
|
||||||
|
|
||||||
void GetSoundDevices()
|
void GetSoundDevices()
|
||||||
{
|
{
|
||||||
if (onlyMixSnoop)
|
|
||||||
{
|
|
||||||
gethints();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (SoundMode == 0)
|
if (SoundMode == 0)
|
||||||
{
|
{
|
||||||
GetInputDeviceCollection();
|
GetInputDeviceCollection();
|
||||||
|
@ -1234,7 +1214,6 @@ void GetSoundDevices()
|
||||||
|
|
||||||
listpulse();
|
listpulse();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int InitSound(BOOL Quiet)
|
int InitSound(BOOL Quiet)
|
||||||
|
@ -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,34 +1418,9 @@ 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)
|
|
||||||
{
|
|
||||||
// Calulate PTT Time from Number of samples and samplerate
|
|
||||||
|
|
||||||
// samples sent is is in SampleNo, Time PTT was raised in timeval pttclk
|
|
||||||
// txLatency is extra ptt time to compenstate for time soundcard takes to start outputting samples
|
|
||||||
|
|
||||||
struct timespec pttnow;
|
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &pttnow);
|
|
||||||
|
|
||||||
time_t pttontimemS = (pttclk.tv_sec * 1000) + (pttclk.tv_nsec / 1000000);
|
|
||||||
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);
|
usleep(100000);
|
||||||
|
|
||||||
|
@ -1494,7 +1432,7 @@ void SoundFlush()
|
||||||
|
|
||||||
snd_pcm_status_alloca(&status); // alloca allocates once per function, does not need a free
|
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);
|
// Debugprintf("Waiting for complete. Avail %d Max %d last %d", avail, MaxAvail, lastavail);
|
||||||
|
|
||||||
if ((err = snd_pcm_status(playhandle, status)) != 0)
|
if ((err = snd_pcm_status(playhandle, status)) != 0)
|
||||||
{
|
{
|
||||||
|
@ -1507,7 +1445,7 @@ void SoundFlush()
|
||||||
// Debugprintf("PCM Status = %d", res);
|
// 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 || 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 (res != SND_PCM_STATE_RUNNING) // If sound system is not running then it needs data
|
||||||
// if (MaxAvail - avail < 100)
|
// if (MaxAvail - avail < 100)
|
||||||
{
|
{
|
||||||
// Send complete - Restart Capture
|
// Send complete - Restart Capture
|
||||||
|
@ -1518,9 +1456,6 @@ void SoundFlush()
|
||||||
lastavail = avail;
|
lastavail = avail;
|
||||||
usleep(50000);
|
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
189
ARDOPC.c
|
@ -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
|
||||||
|
|
168
BusyDetect.c
168
BusyDetect.c
|
@ -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.
|
||||||
|
|
58
Config.cpp
58
Config.cpp
|
@ -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]);
|
||||||
|
|
481
Config.cpp.bak
481
Config.cpp.bak
|
@ -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);
|
|
||||||
}
|
|
1064
ModemDialog.ui
1064
ModemDialog.ui
File diff suppressed because it is too large
Load Diff
30
Modulate.c
30
Modulate.c
|
@ -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--)
|
||||||
|
|
606
QtSoundModem.cpp
606
QtSoundModem.cpp
|
@ -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());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
3380
QtSoundModem.cpp.bak
3380
QtSoundModem.cpp.bak
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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>
|
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
|
@ -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>
|
|
@ -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
132
SMMain.c
|
@ -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";
|
||||||
|
|
58
UZ7HOStuff.h
58
UZ7HOStuff.h
|
@ -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
|
25
UZ7HOUtils.c
25
UZ7HOUtils.c
|
@ -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;
|
||||||
|
|
||||||
|
|
64
Waveout.c
64
Waveout.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
1
audio.c
1
audio.c
|
@ -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
15
ax25.c
|
@ -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;
|
||||||
|
|
||||||
|
|
70
ax25_agw.c
70
ax25_agw.c
|
@ -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 *)®_call, 1);
|
stringAdd(Msg, (UCHAR *)®_call, 1);
|
||||||
|
|
||||||
|
@ -273,17 +275,14 @@ string * AGW_G_Frame()
|
||||||
string * Msg;
|
string * Msg;
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
|
||||||
if (soundChannel[i])
|
|
||||||
{
|
{
|
||||||
Ports[0]++;
|
Ports[0]++;
|
||||||
|
if (soundChannel[i])
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
29
ax25_demod.c
29
ax25_demod.c
|
@ -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
|
||||||
|
|
54
ax25_l2.c
54
ax25_l2.c
|
@ -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,21 +1448,8 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
35
ax25_mod.c
35
ax25_mod.c
|
@ -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)
|
||||||
{
|
|
||||||
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);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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/>
|
||||||
|
|
|
@ -1,16 +1,8 @@
|
||||||
qtsoundmodem (0.0.0.73~rc1-1) UNRELEASED; urgency=medium
|
qtsoundmodem (0.0.0.72-1~bpo12+1) bookworm; urgency=medium
|
||||||
|
|
||||||
* Upstream import
|
* Rebuild for bookworm.
|
||||||
* Patches refreshed
|
|
||||||
|
|
||||||
-- hibby <hibby@velox.lan> Tue, 29 Oct 2024 22:45:40 +0000
|
-- Dave Hibberd <hibby@debian.org> Sat, 13 Apr 2024 19:02:30 +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
|
||||||
|
|
||||||
|
@ -19,30 +11,60 @@ qtsoundmodem (0.0.0.72-1) unstable; urgency=medium
|
||||||
|
|
||||||
-- 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~bpo12+1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* Rebuild for bookworm.
|
||||||
|
|
||||||
|
-- Dave Hibberd <d@vehibberd.com> Sun, 17 Dec 2023 14:10:48 +0000
|
||||||
|
|
||||||
qtsoundmodem (0.0.0.71-1) unstable; urgency=medium
|
qtsoundmodem (0.0.0.71-1) unstable; urgency=medium
|
||||||
|
|
||||||
* New Upstream Release
|
* New Upstream Release
|
||||||
|
|
||||||
-- 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~bpo12+1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* Rebuild for bookworm.
|
||||||
|
|
||||||
|
-- Dave Hibberd <d@vehibberd.com> Tue, 10 Oct 2023 23:42:46 +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~bpo12+1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* Rebuild for bookworm.
|
||||||
|
|
||||||
|
-- Dave Hibberd <d@vehibberd.com> Thu, 14 Sep 2023 22:04:39 +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~bpo12+1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* Rebuild for bookworm.
|
||||||
|
|
||||||
|
-- Dave Hibberd <d@vehibberd.com> Tue, 12 Sep 2023 21:52:54 +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~bpo12+1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* Rebuild for bookworm.
|
||||||
|
|
||||||
|
-- Dave Hibberd <d@vehibberd.com> Tue, 05 Sep 2023 21:28:15 +0100
|
||||||
|
|
||||||
qtsoundmodem (0.0.0.66-1) unstable; urgency=medium
|
qtsoundmodem (0.0.0.66-1) unstable; urgency=medium
|
||||||
|
|
||||||
* Initial release.
|
* Initial release.
|
||||||
|
|
|
@ -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);
|
|
||||||
|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
--- a/tcpCode.cpp
|
|
||||||
+++ b/tcpCode.cpp
|
|
||||||
@@ -732,7 +732,7 @@
|
|
||||||
|
|
||||||
QByteArray datas = FLRigsock->readAll();
|
|
||||||
|
|
||||||
- qDebug(datas.data());
|
|
||||||
+ qDebug() << "SetPTT Failed";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,2 @@
|
||||||
fix-bookworm-build.patch
|
|
||||||
libpulse.patch
|
libpulse.patch
|
||||||
build-fix.patch
|
build-fix.patch
|
||||||
|
|
|
@ -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 $@
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
||||||
|
|
209
devicesDialog.ui
209
devicesDialog.ui
|
@ -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>
|
||||||
<widget class="QCheckBox" name="useKISSControls">
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
<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 class="QGroupBox" name="Goup">
|
|
||||||
<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>
|
||||||
|
|
4
dw9600.c
4
dw9600.c
|
@ -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];
|
||||||
|
|
399
il2p.c
399
il2p.c
|
@ -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,34 +1065,18 @@ 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
|
|
||||||
{
|
|
||||||
Debugprintf("CRC Error from %s Decoder %d Calculated %x Received %x FEC corrections %d But ignore CRC Set", call, subchan, CRCCALC, CRCMSG, retries);
|
|
||||||
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);
|
freeString(data);
|
||||||
ax25_delete(pp);
|
ax25_delete(pp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
stringAdd(data, pp->frame_data, pp->frame_len + 2); // QTSM assumes a CRC
|
stringAdd(data, pp->frame_data, pp->frame_len + 2); // QTSM assumes a CRC
|
||||||
|
|
||||||
|
@ -1126,58 +1095,15 @@ 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);
|
|
||||||
|
|
||||||
if (index >= 0)
|
|
||||||
{
|
{
|
||||||
// Already have a copy of this frame
|
// Already have a copy of this frame
|
||||||
|
|
||||||
// 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);
|
freeString(data);
|
||||||
Debugprintf("Discarding copy rcvr %d emph %d FEC corrections %d", subchan, slice, retries);
|
Debugprintf("Discarding copy rcvr %d emph %d", subchan, 0);
|
||||||
return;
|
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,16 +4157,6 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
18
kiss_mode.c
18
kiss_mode.c
|
@ -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();
|
||||||
|
|
7
main.cpp
7
main.cpp
|
@ -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
1
ofdm.c
|
@ -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];
|
||||||
|
|
10
sm_main.c
10
sm_main.c
|
@ -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];
|
||||||
|
|
||||||
|
|
1431
sm_main.c.bak
1431
sm_main.c.bak
File diff suppressed because it is too large
Load Diff
439
tcpCode.cpp
439
tcpCode.cpp
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
31
tcpCode.h
31
tcpCode.h
|
@ -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:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue