New upstream version 0.0.0.79

This commit is contained in:
Hibby 2025-09-30 20:26:28 +01:00
parent 14657a895c
commit e4cb672cbb
15 changed files with 901 additions and 270 deletions

View file

@ -262,7 +262,7 @@ void doAGWBeacon()
char ports[80]; char ports[80];
char * ptr, * context; char * ptr, * context;
int DataLen = (int)strlen(AGWBeaconMsg); int DataLen;
strcpy(ports, AGWBeaconPorts); // strtok changes it strcpy(ports, AGWBeaconPorts); // strtok changes it
@ -282,8 +282,9 @@ void doAGWBeacon()
{ {
while (ptr) while (ptr)
{ {
AGW_frame_header(Msg, atoi(ptr) - 1, 'M', 240, AGWTermCall, AGWBeaconDest, DataLen); DataLen = (int)strlen(AGWBeaconMsg);
AGW_frame_header(Msg, atoi(ptr) - 1, 'M', 240, AGWTermCall, AGWBeaconDest, DataLen);
memcpy(&Msg[AGWHDDRRLEN], AGWBeaconMsg, DataLen); memcpy(&Msg[AGWHDDRRLEN], AGWBeaconMsg, DataLen);
DataLen += AGWHDDRRLEN; DataLen += AGWHDDRRLEN;
AGWSock->write((char *)Msg, DataLen); AGWSock->write((char *)Msg, DataLen);
@ -587,7 +588,7 @@ void QtTermTCP::onAGWSocketStateChanged(QAbstractSocket::SocketState socketState
if (Sess) if (Sess)
{ {
AGWUsers->MonSess = Sess; AGWUsers->MonSess = Sess;
Sess->AGWSession = sender; // Flag as in use // Sess->AGWSession = sender; // Flag as in use
if (TermMode == MDI) if (TermMode == MDI)
Sess->setWindowTitle("AGW Monitor Window"); Sess->setWindowTitle("AGW Monitor Window");
@ -864,7 +865,8 @@ void Send_AGW_Ds_Frame(void * Sess)
UCHAR Msg[512]; UCHAR Msg[512];
AGW_frame_header(Msg, AGW->port, 'd', 240, AGW->corrcall, AGW->mycall, 0); AGW_frame_header(Msg, AGW->port, 'd', 240, AGW->corrcall, AGW->mycall, 0);
AGW->socket->write((char *)Msg, AGWHDDRRLEN); if (AGW->socket)
AGW->socket->write((char *)Msg, AGWHDDRRLEN);
} }
@ -1036,9 +1038,9 @@ void on_AGW_C_frame(AGWUser * AGW, struct AGWHeader * Frame, byte * Msg)
Sess = newWindow((QObject *)mythis, Listen, ""); Sess = newWindow((QObject *)mythis, Listen, "");
} }
} }
else else if (TermMode == Tabbed)
{ {
// Single or Tabbed - look for free session // Single Tabbed - look for free session
for (i = 0; i < _sessions.size(); ++i) for (i = 0; i < _sessions.size(); ++i)
@ -1051,13 +1053,31 @@ void on_AGW_C_frame(AGWUser * AGW, struct AGWHeader * Frame, byte * Msg)
break; break;
} }
} }
}
else
{
// Single - Only one available
S = _sessions.at(0);
if (Sess == NULL) if (S->clientSocket == NULL && S->AGWSession == NULL && S->KISSSession == NULL)
{ Sess = S;
// Clear connection }
return; if (Sess == NULL)
} {
// Clear connection by sendinf d fraame
UCHAR Msg[512];
int snd_ch = Frame->Port;
char * CallFrom = Frame->callfrom;
char * CallTo = Frame->callto;
AGW_frame_header(Msg, Frame->Port, 'd', 240, Frame->callto, Frame->callfrom, 0);
if (AGW->socket)
AGW->socket->write((char *)Msg, AGWHDDRRLEN);
return;
} }
if (Sess) if (Sess)

View file

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>432</width> <width>432</width>
<height>319</height> <height>399</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -17,7 +17,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>40</x> <x>40</x>
<y>262</y> <y>360</y>
<width>351</width> <width>351</width>
<height>33</height> <height>33</height>
</rect> </rect>
@ -58,7 +58,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>120</y> <y>168</y>
<width>401</width> <width>401</width>
<height>57</height> <height>57</height>
</rect> </rect>
@ -140,7 +140,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>70</y> <y>118</y>
<width>411</width> <width>411</width>
<height>51</height> <height>51</height>
</rect> </rect>
@ -202,7 +202,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>12</x> <x>12</x>
<y>12</y> <y>10</y>
<width>149</width> <width>149</width>
<height>21</height> <height>21</height>
</rect> </rect>
@ -215,7 +215,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>158</x> <x>158</x>
<y>10</y> <y>9</y>
<width>23</width> <width>23</width>
<height>25</height> <height>25</height>
</rect> </rect>
@ -231,7 +231,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>214</x> <x>214</x>
<y>13</y> <y>11</y>
<width>61</width> <width>61</width>
<height>17</height> <height>17</height>
</rect> </rect>
@ -243,7 +243,7 @@
<widget class="QLineEdit" name="MYCALL"> <widget class="QLineEdit" name="MYCALL">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>286</x> <x>292</x>
<y>10</y> <y>10</y>
<width>91</width> <width>91</width>
<height>22</height> <height>22</height>
@ -254,7 +254,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>25</x> <x>25</x>
<y>192</y> <y>240</y>
<width>47</width> <width>47</width>
<height>13</height> <height>13</height>
</rect> </rect>
@ -267,7 +267,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>98</x> <x>98</x>
<y>189</y> <y>240</y>
<width>47</width> <width>47</width>
<height>22</height> <height>22</height>
</rect> </rect>
@ -277,7 +277,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>213</x> <x>213</x>
<y>192</y> <y>240</y>
<width>66</width> <width>66</width>
<height>16</height> <height>16</height>
</rect> </rect>
@ -290,7 +290,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>288</x> <x>288</x>
<y>189</y> <y>240</y>
<width>47</width> <width>47</width>
<height>22</height> <height>22</height>
</rect> </rect>
@ -300,9 +300,9 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>25</x> <x>25</x>
<y>226</y> <y>270</y>
<width>47</width> <width>47</width>
<height>13</height> <height>20</height>
</rect> </rect>
</property> </property>
<property name="text"> <property name="text">
@ -313,7 +313,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>98</x> <x>98</x>
<y>223</y> <y>270</y>
<width>36</width> <width>36</width>
<height>22</height> <height>22</height>
</rect> </rect>
@ -323,7 +323,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>213</x> <x>213</x>
<y>225</y> <y>273</y>
<width>47</width> <width>47</width>
<height>13</height> <height>13</height>
</rect> </rect>
@ -336,7 +336,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>288</x> <x>288</x>
<y>222</y> <y>270</y>
<width>36</width> <width>36</width>
<height>22</height> <height>22</height>
</rect> </rect>
@ -346,7 +346,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>12</x> <x>12</x>
<y>38</y> <y>35</y>
<width>149</width> <width>149</width>
<height>21</height> <height>21</height>
</rect> </rect>
@ -359,7 +359,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>158</x> <x>158</x>
<y>38</y> <y>34</y>
<width>23</width> <width>23</width>
<height>21</height> <height>21</height>
</rect> </rect>
@ -371,6 +371,132 @@
<string/> <string/>
</property> </property>
</widget> </widget>
<widget class="QCheckBox" name="KISSChecksum">
<property name="geometry">
<rect>
<x>160</x>
<y>60</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QLabel" name="label_16">
<property name="geometry">
<rect>
<x>12</x>
<y>60</y>
<width>141</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Enable checksum</string>
</property>
</widget>
<widget class="QCheckBox" name="KISSACKMODE">
<property name="geometry">
<rect>
<x>160</x>
<y>84</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
<widget class="QLabel" name="label_17">
<property name="geometry">
<rect>
<x>12</x>
<y>85</y>
<width>141</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Enable ACKMODE</string>
</property>
</widget>
<widget class="QCheckBox" name="SetTXDelay">
<property name="geometry">
<rect>
<x>150</x>
<y>300</y>
<width>111</width>
<height>21</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Set TXDelay</string>
</property>
</widget>
<widget class="QLineEdit" name="TXDELAY">
<property name="geometry">
<rect>
<x>99</x>
<y>300</y>
<width>36</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_29">
<property name="geometry">
<rect>
<x>26</x>
<y>302</y>
<width>71</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>TXDelay</string>
</property>
</widget>
<widget class="QLabel" name="label_18">
<property name="geometry">
<rect>
<x>200</x>
<y>80</y>
<width>151</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Open MH Window</string>
</property>
</widget>
<widget class="QCheckBox" name="KISSMH">
<property name="geometry">
<rect>
<x>390</x>
<y>83</y>
<width>20</width>
<height>20</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections> <connections>

View file

@ -1,6 +1,8 @@
// Qt Version of BPQTermTCP // Qt Version of BPQTermTCP
#define VersionString "0.0.0.73" // Application icon design by Red PE1RRR
#define VersionString "0.0.0.79"
// .12 Save font weight // .12 Save font weight
@ -8,7 +10,7 @@
// .14 Add YAPP and Listen Mode // .14 Add YAPP and Listen Mode
// .15 Reuse windows in Listen Mode // .15 Reuse windows in Listen Mode
// .17 MDI Version 7/1/20 // .17 MDI Version 7/1/20
// .18 Fix input window losing focus when data arrives on other window // .18 Fix input window losing focus when data arrivn other window
// .19 Fix Scrollback // .19 Fix Scrollback
// .20 WinXP compatibility changes // .20 WinXP compatibility changes
// .21 Save Window Positions // .21 Save Window Positions
@ -104,7 +106,26 @@
// .73 November 2023 // .73 November 2023
// Raise RTS on KISS serial port // Raise RTS on KISS serial port
// .74 April 2024
// Support BPQKISS TNCs with CHECKSUM and/or ACKMODE enabled
// .75 May 2024
// Flush Monitor log file every minute
// .76 August 2024
// Fix using digs in KISS UI mode.
// Add option to send TXDELAY to KISS TNC
// .77
// Support multichannel KISS TNCs (Beta 1)
// Fix using AGW listen in single terminal mode
// .78
// Fix restoring monitor flags when connecting to current host
// .79
// Add KISS MHEARD Window (Feb 2025)
#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS
@ -126,6 +147,7 @@
#include <QActionGroup> #include <QActionGroup>
#include <QtWidgets> #include <QtWidgets>
#include <QColor> #include <QColor>
#include <QClipboard>
#ifdef USESERIAL #ifdef USESERIAL
#include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo> #include <QtSerialPort/QSerialPortInfo>
@ -308,12 +330,23 @@ extern "C" int KISSMonEnable;
extern "C" int KISSLocalTime; extern "C" int KISSLocalTime;
extern "C" int KISSMonNodes; extern "C" int KISSMonNodes;
extern "C" int KISSListen; extern "C" int KISSListen;
extern "C" int KISSChecksum;
extern "C" int KISSAckMode;
extern "C" int KISSMH;
extern "C" short txtail[5];
extern "C" short txdelay[5];
extern "C" int sendTXDelay[4];
char SerialPort[80] = ""; char SerialPort[80] = "";
char KISSHost[128] = "127.0.0.1"; char KISSHost[128] = "127.0.0.1";
int KISSPortNum = 1000; int KISSPortNum = 1000;
int KISSBAUD = 19200; int KISSBAUD = 19200;
char MYCALL[32]; char KISSMYCALL[32];
char KISSVia[128]; // Digi String
extern "C" UCHAR axMYCALL[7]; // Mycall in ax.25 extern "C" UCHAR axMYCALL[7]; // Mycall in ax.25
int KISSMode = 0; // Connected (0) or UI (1) int KISSMode = 0; // Connected (0) or UI (1)
@ -531,6 +564,7 @@ void AGWMonWindowClosing(Ui_ListenSession *Sess);
void AGWWindowClosing(Ui_ListenSession *Sess); void AGWWindowClosing(Ui_ListenSession *Sess);
extern "C" void KISSDataReceived(void * socket, unsigned char * data, int length); extern "C" void KISSDataReceived(void * socket, unsigned char * data, int length);
void closeSerialPort(); void closeSerialPort();
int newMHWindow(QObject * parent, int Type, const char * Label);
extern void initUTF8(); extern void initUTF8();
int checkUTF8(unsigned char * Msg, int Len, unsigned char * out); int checkUTF8(unsigned char * Msg, int Len, unsigned char * out);
@ -708,12 +742,39 @@ void DoTermResize(Ui_ListenSession * Sess)
} }
} }
extern "C" Ui_ListenSession * MHWindow;
bool QtTermTCP::eventFilter(QObject* obj, QEvent *event) bool QtTermTCP::eventFilter(QObject* obj, QEvent *event)
{ {
// See if from a Listening Session // See if from a Listening Session
Ui_ListenSession * Sess; Ui_ListenSession * Sess;
if (obj == MHWindow)
{
if (event->type() == QEvent::Resize)
{
QRect r = MHWindow->rect();
int H, Width, Border = 3;
Width = r.width() - 6;
H = r.height() - 6;
MHWindow->monWindow->setGeometry(QRect(Border, Border, Width, H));
return true;
}
if (event->type() == QEvent::Close)
{
QSettings mysettings(GetConfPath(), QSettings::IniFormat);
mysettings.setValue("MHgeometry", MHWindow->saveGeometry());
SaveSettings();
MHWindow = 0;
}
}
for (int i = 0; i < _sessions.size(); ++i) for (int i = 0; i < _sessions.size(); ++i)
{ {
Sess = _sessions.at(i); Sess = _sessions.at(i);
@ -874,6 +935,14 @@ bool QtTermTCP::eventFilter(QObject* obj, QEvent *event)
if (k->button() == Qt::RightButton) if (k->button() == Qt::RightButton)
{ {
// Get clipboard data and process a line at a time
QClipboard *clipboard = QGuiApplication::clipboard();
QString Text = clipboard->text();
QByteArray ba = Text.toLocal8Bit();
char * Msg = ba.data();
Sess->inputWindow->paste(); Sess->inputWindow->paste();
return true; return true;
} }
@ -986,9 +1055,9 @@ Ui_ListenSession * newWindow(QObject * parent, int Type, const char * Label)
QSettings settings(GetConfPath(), QSettings::IniFormat); QSettings settings(GetConfPath(), QSettings::IniFormat);
#ifdef ANDROID #ifdef ANDROID
QFont font = QFont(settings->value("FontFamily", "Driod Sans Mono").value<QString>(), QFont font = QFont(settings.value("FontFamily", "Driod Sans Mono").value<QString>(),
settings->value("PointSize", 12).toInt(), settings.value("PointSize", 12).toInt(),
settings->value("Weight", 50).toInt()); settings.value("Weight", 50).toInt());
#else #else
QFont font = QFont(settings.value("FontFamily", "Courier New").value<QString>(), QFont font = QFont(settings.value("FontFamily", "Courier New").value<QString>(),
settings.value("PointSize", 10).toInt(), settings.value("PointSize", 10).toInt(),
@ -1300,6 +1369,12 @@ QtTermTCP::QtTermTCP(QWidget *parent) : QMainWindow(parent)
updateWindowMenu(); updateWindowMenu();
if (KISSEnable && KISSMH)
{
newMHWindow(this, 0, "KISS MH");
MHWindow->restoreGeometry(mysettings.value("MHgeometry").toByteArray());
}
connectMenu = mymenuBar->addMenu(tr("&Connect")); connectMenu = mymenuBar->addMenu(tr("&Connect"));
actHost[16] = new QAction("AGW Connect", this); actHost[16] = new QAction("AGW Connect", this);
@ -1642,6 +1717,10 @@ QtTermTCP::QtTermTCP(QWidget *parent) : QMainWindow(parent)
connect(timer2, SIGNAL(timeout()), this, SLOT(KISSTimerSlot())); connect(timer2, SIGNAL(timeout()), this, SLOT(KISSTimerSlot()));
timer2->start(100); timer2->start(100);
QTimer *timer3 = new QTimer(this);
connect(timer3, SIGNAL(timeout()), this, SLOT(SlowTimerSlot()));
timer3->start(60000);
// Run timer now to connect to AGW if configured // Run timer now to connect to AGW if configured
MyTimerSlot(); MyTimerSlot();
@ -1657,7 +1736,7 @@ QtTermTCP::QtTermTCP(QWidget *parent) : QMainWindow(parent)
OpenPTTPort(); OpenPTTPort();
memset(axMYCALL, 0, 7); memset(axMYCALL, 0, 7);
ConvToAX25(MYCALL, axMYCALL); ConvToAX25(KISSMYCALL, axMYCALL);
// Do any autoconnects // Do any autoconnects
@ -2726,7 +2805,8 @@ void QtTermTCP::LreturnPressed(Ui_ListenSession * Sess)
strcpy(Msg, Msgptr); strcpy(Msg, Msgptr);
strcat(Msg, "\r"); strcat(Msg, "\r");
Send_UI(0, 0xF0, MYCALL, Sess->UIDEST, (unsigned char *)Msg, (int)strlen(Msg));
Send_UI(Sess->UIPORT, 0xF0, KISSMYCALL, Sess->UIDEST, Sess->UIPATH, (unsigned char *)Msg, (int)strlen(Msg));
WritetoOutputWindowEx(Sess, (unsigned char *)Msg, (int)strlen(Msg), WritetoOutputWindowEx(Sess, (unsigned char *)Msg, (int)strlen(Msg),
Sess->termWindow, &Sess->OutputSaveLen, Sess->OutputSave, EchoText); // Black Sess->termWindow, &Sess->OutputSaveLen, Sess->OutputSave, EchoText); // Black
@ -2818,7 +2898,8 @@ void QtTermTCP::LreturnPressed(Ui_ListenSession * Sess)
strcat(Msg, "\r"); strcat(Msg, "\r");
Sess->clientSocket->write(Msg); Sess->clientSocket->write(Msg);
Sess->clientSocket->flush();
// QThread::msleep(1500); // Try to force as separate packets
WritetoOutputWindowEx(Sess, (unsigned char *)Msg, (int)strlen(Msg), WritetoOutputWindowEx(Sess, (unsigned char *)Msg, (int)strlen(Msg),
Sess->termWindow, &Sess->OutputSaveLen, Sess->OutputSave, EchoText); // Black Sess->termWindow, &Sess->OutputSaveLen, Sess->OutputSave, EchoText); // Black
@ -2853,6 +2934,23 @@ void QtTermTCP::LreturnPressed(Ui_ListenSession * Sess)
connect(Sess->clientSocket, SIGNAL(readyRead()), this, SLOT(readyRead())); connect(Sess->clientSocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(Sess->clientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState))); connect(Sess->clientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
// Set Monitor Params for this host
sscanf(MonParams[Sess->CurrentHost], "%llx %x %x %x %x %x",
&Sess->portmask, &Sess->mtxparam, &Sess->mcomparam,
&Sess->MonitorNODES, &Sess->MonitorColour, &Sess->monUI);
Sess->mlocaltime = (Sess->mtxparam >> 7);
Sess->mtxparam &= 1;
MonLocalTime->setChecked(Sess->mlocaltime);
MonTX->setChecked(Sess->mtxparam);
MonSup->setChecked(Sess->mcomparam);
MonUI->setChecked(Sess->monUI);
MonNodes->setChecked(Sess->MonitorNODES);
MonColour->setChecked(Sess->MonitorColour);
Sess->clientSocket->connectToHost(&Host[Sess->CurrentHost][0], Port[Sess->CurrentHost]); Sess->clientSocket->connectToHost(&Host[Sess->CurrentHost][0], Port[Sess->CurrentHost]);
} }
@ -3450,6 +3548,8 @@ void getAX25Params(int chan)
void GetPortSettings(int Chan) void GetPortSettings(int Chan)
{ {
txdelay[Chan] = getAX25Param("TXDelay", 250).toInt();
sendTXDelay[Chan] = getAX25Param("sendTXDelay", 0).toInt();
maxframe[Chan] = getAX25Param("Maxframe", 4).toInt(); maxframe[Chan] = getAX25Param("Maxframe", 4).toInt();
fracks[Chan] = getAX25Param("Retries", 10).toInt(); fracks[Chan] = getAX25Param("Retries", 10).toInt();
frack_time[Chan] = getAX25Param("FrackTime", 8).toInt(); frack_time[Chan] = getAX25Param("FrackTime", 8).toInt();
@ -3541,10 +3641,14 @@ void GetSettings()
KISSMonNodes = settings->value("KISSMonNodes", 0).toInt(); KISSMonNodes = settings->value("KISSMonNodes", 0).toInt();
KISSListen = settings->value("KISSListen", 1).toInt(); KISSListen = settings->value("KISSListen", 1).toInt();
strcpy(MYCALL, settings->value("MYCALL", "").toString().toUtf8()); KISSChecksum = settings->value("KISSChecksum", 0).toInt();
KISSAckMode = settings->value("KISSAckMode", 0).toInt();
KISSMH = settings->value("KISSMH", 1).toInt();
strcpy(KISSMYCALL, settings->value("MYCALL", "").toString().toUtf8());
strcpy(KISSHost, settings->value("KISSHost", "127.0.0.1").toString().toUtf8()); strcpy(KISSHost, settings->value("KISSHost", "127.0.0.1").toString().toUtf8());
KISSPortNum = settings->value("KISSPort", 8100).toInt(); KISSPortNum = settings->value("KISSPort", 8100).toInt();
KISSMode = settings->value("KISSMode", 0).toInt(); KISSMode = settings->value("KISSMode", 0).toInt();
strcpy(KISSVia, settings->value("KISSVia", "").toString().toUtf8());
strcpy(SerialPort, settings->value("KISSSerialPort", "None").toString().toUtf8()); strcpy(SerialPort, settings->value("KISSSerialPort", "None").toString().toUtf8());
KISSBAUD = settings->value("KISSBAUD", 19200).toInt(); KISSBAUD = settings->value("KISSBAUD", 19200).toInt();
@ -3647,7 +3751,8 @@ void saveAX25Params(int chan)
void SavePortSettings(int Chan) void SavePortSettings(int Chan)
{ {
saveAX25Param("Retries", fracks[Chan]); saveAX25Param("TXDelay", txdelay[Chan]);
saveAX25Param("sendTXDelay", sendTXDelay[Chan]);
saveAX25Param("Maxframe", maxframe[Chan]); saveAX25Param("Maxframe", maxframe[Chan]);
saveAX25Param("Paclen", kisspaclen[Chan]); saveAX25Param("Paclen", kisspaclen[Chan]);
saveAX25Param("FrackTime", frack_time[Chan]); saveAX25Param("FrackTime", frack_time[Chan]);
@ -3770,12 +3875,17 @@ extern "C" void SaveSettings()
settings->setValue("KISSMonNodes", KISSMonNodes); settings->setValue("KISSMonNodes", KISSMonNodes);
settings->setValue("KISSListen", KISSListen); settings->setValue("KISSListen", KISSListen);
settings->setValue("MYCALL", MYCALL); settings->setValue("KISSChecksum", KISSChecksum);
settings->setValue("KISSAckMode", KISSAckMode);
settings->setValue("KISSMH", KISSMH);
settings->setValue("MYCALL", KISSMYCALL);
settings->setValue("KISSHost", KISSHost); settings->setValue("KISSHost", KISSHost);
settings->setValue("KISSMode", KISSMode); settings->setValue("KISSMode", KISSMode);
settings->setValue("KISSPort", KISSPortNum); settings->setValue("KISSPort", KISSPortNum);
settings->setValue("KISSSerialPort", SerialPort); settings->setValue("KISSSerialPort", SerialPort);
settings->setValue("KISSBAUD", KISSBAUD); settings->setValue("KISSBAUD", KISSBAUD);
settings->setValue("KISSVia", KISSVia);
saveAX25Params(0); saveAX25Params(0);
settings->setValue("VARAEnable", VARAEnable); settings->setValue("VARAEnable", VARAEnable);
@ -3852,6 +3962,10 @@ void QtTermTCP::closeEvent(QCloseEvent *event)
#endif #endif
if (process) if (process)
process->close(); process->close();
if (MHWindow)
MHWindow->close();
} }
} }
@ -3893,6 +4007,11 @@ QtTermTCP::~QtTermTCP()
mysettings.setValue("geometry", saveGeometry()); mysettings.setValue("geometry", saveGeometry());
mysettings.setValue("windowState", saveState()); mysettings.setValue("windowState", saveState());
if (MHWindow)
{
mysettings.setValue("MHgeometry", MHWindow->saveGeometry());
MHWindow->close();
}
SaveSettings(); SaveSettings();
} }
@ -3958,6 +4077,27 @@ void QtTermTCP::MyTimerSlot()
} }
void QtTermTCP::SlowTimerSlot()
{
// Runs every 60 S
Ui_ListenSession * Sess;
for (int i = 0; i < _sessions.size(); ++i)
{
Sess = _sessions.at(i);
if (Sess->monLogfile)
{
Sess->monLogfile->close();
Sess->monLogfile = nullptr;
}
}
}
extern "C" void myBeep(QString * WAV) extern "C" void myBeep(QString * WAV)
{ {
if (useBeep) if (useBeep)
@ -4025,7 +4165,13 @@ void QtTermTCP::KISSSlot()
deviceUI = &UI; deviceUI = &UI;
KISS->KISSEnable->setChecked(KISSEnable); KISS->KISSEnable->setChecked(KISSEnable);
KISS->KISSListen->setChecked(KISSListen); KISS->KISSListen->setChecked(KISSListen);
KISS->MYCALL->setText(MYCALL); KISS->KISSChecksum->setChecked(KISSChecksum);
KISS->KISSACKMODE->setChecked(KISSAckMode);
KISS->KISSMH->setChecked(KISSMH);
KISS->MYCALL->setText(KISSMYCALL);
KISS->TXDELAY->setText(QString::number(txdelay[0]));
KISS->SetTXDelay->setChecked(sendTXDelay[0]);
// connect(KISS->SerialPort, SIGNAL(currentIndexChanged(int)), this, SLOT(PTTPortChanged(int))); // connect(KISS->SerialPort, SIGNAL(currentIndexChanged(int)), this, SLOT(PTTPortChanged(int)));
@ -4079,12 +4225,15 @@ void QtTermTCP::KISSaccept()
KISSEnable = KISS->KISSEnable->isChecked(); KISSEnable = KISS->KISSEnable->isChecked();
KISSListen = KISS->KISSListen->isChecked(); KISSListen = KISS->KISSListen->isChecked();
KISSChecksum = KISS->KISSChecksum->isChecked();
KISSAckMode = KISS->KISSACKMODE->isChecked();
KISSMH = KISS->KISSMH->isChecked();
actHost[18]->setVisible(KISSEnable); // Show KISS Connect Line actHost[18]->setVisible(KISSEnable); // Show KISS Connect Line
strcpy(MYCALL, KISS->MYCALL->text().toUtf8().toUpper()); strcpy(KISSMYCALL, KISS->MYCALL->text().toUtf8().toUpper());
memset(axMYCALL, 0, 7); memset(axMYCALL, 0, 7);
ConvToAX25(MYCALL, axMYCALL); ConvToAX25(KISSMYCALL, axMYCALL);
Q = KISS->Port->text(); Q = KISS->Port->text();
KISSPortNum = Q.toInt(); KISSPortNum = Q.toInt();
@ -4106,8 +4255,11 @@ void QtTermTCP::KISSaccept()
Q = KISS->Retries->text(); Q = KISS->Retries->text();
fracks[0] = Q.toInt(); fracks[0] = Q.toInt();
myStatusBar->setVisible(AGWEnable | VARAEnable | KISSEnable); Q = KISS->TXDELAY->text();
txdelay[0] = Q.toInt();
sendTXDelay[0] = KISS->SetTXDelay->isChecked();
myStatusBar->setVisible(AGWEnable | VARAEnable | KISSEnable);
if (KISSEnable != OldEnable || KISSPortNum != OldPort || if (KISSEnable != OldEnable || KISSPortNum != OldPort ||
strcmp(oldHost, KISSHost) != 0 || strcmp(oldHost, KISSHost) != 0 ||
@ -4131,6 +4283,26 @@ void QtTermTCP::KISSaccept()
} }
} }
if (KISSEnable == 0 && MHWindow)
{
MHWindow->close();
MHWindow = 0;
}
if (KISSEnable && KISSMH && MHWindow == 0)
{
newMHWindow(this, 0, "KISS MH");
QSettings mysettings(GetConfPath(), QSettings::IniFormat);
MHWindow->restoreGeometry(mysettings.value("MHgeometry").toByteArray());
}
if (!KISSMH && MHWindow)
{
MHWindow->close();
MHWindow = 0;
}
delete(KISS); delete(KISS);
SaveSettings(); SaveSettings();
deviceUI->accept(); deviceUI->accept();
@ -4602,10 +4774,15 @@ void QtTermTCP::onNewConnection()
datas.chop(2); datas.chop(2);
datas.truncate(10); // Just in case! datas.truncate(10); // Just in case!
strlop(datas.data(), 13);
if (datas.data()[0] == 0)
datas.append("UNKNOWN\0");
datas.append('\0'); datas.append('\0');
sprintf(Title, "Inward Connect from %s:%d Call " + datas, sprintf(Title, "Inward Connect from %s:%d Call %s",
Host.data(), clientSocket->peerPort()); Host.data(), clientSocket->peerPort(), datas.data());
if (TermMode == MDI) if (TermMode == MDI)
{ {
@ -6349,6 +6526,7 @@ void ClosePTTPort()
#endif #endif
} }
#ifndef ANDRIOD
void CM108_set_ptt(int PTTState) void CM108_set_ptt(int PTTState)
{ {
@ -6413,7 +6591,7 @@ void CM108_set_ptt(int PTTState)
} }
#endif
void QtTermTCP::RadioPTT(bool PTTState) void QtTermTCP::RadioPTT(bool PTTState)
{ {
@ -6652,6 +6830,16 @@ void QtTermTCP::onKISSSocketStateChanged(QAbstractSocket::SocketState socketStat
KISS_add_stream(sender); KISS_add_stream(sender);
// send TXDelay if enabled
if (sendTXDelay[0])
{
unsigned char Msg[5] = { FEND, 1, 25 , FEND };
Msg[2] = txdelay[0] / 10;
KISSSock->write((char *)Msg, 4);
}
// Attach a Monitor Window if available // Attach a Monitor Window if available
Ui_ListenSession * Sess = NULL; Ui_ListenSession * Sess = NULL;
@ -6923,6 +7111,16 @@ int QtTermTCP::openSerialPort()
KISS_add_stream(m_serial); KISS_add_stream(m_serial);
// send TXDelay if enabled
if (sendTXDelay[0])
{
unsigned char Msg[5] = { FEND, 1, 25 , FEND };
Msg[2] = txdelay[0] / 10;
m_serial->write((char *)Msg, 4);
}
// Attach a Monitor Window if available // Attach a Monitor Window if available
Ui_ListenSession * Sess = NULL; Ui_ListenSession * Sess = NULL;
@ -6937,7 +7135,7 @@ int QtTermTCP::openSerialPort()
S = _sessions.at(i); S = _sessions.at(i);
// for (Ui_ListenSession * S: _sessions) // for (Ui_ListenSession * S: _sessions)
// { //
if ((S->SessionType == Mon) && S->clientSocket == NULL && S->KISSSession == NULL) if ((S->SessionType == Mon) && S->clientSocket == NULL && S->KISSSession == NULL)
{ {
Sess = S; Sess = S;
@ -7831,7 +8029,7 @@ void WriteMonitorLog(Ui_ListenSession * Sess, char * Msg)
Sess->monLogfile = new QFile(FN); Sess->monLogfile = new QFile(FN);
if (Sess->monLogfile) if (Sess->monLogfile)
Sess->monLogfile->open(QIODevice::WriteOnly | QIODevice::Text); Sess->monLogfile->open(QIODevice::Append);
else else
return; return;
} }
@ -7862,3 +8060,106 @@ void WriteMonitorLog(Ui_ListenSession * Sess, char * Msg)
} }
// Create MH Window
int newMHWindow(QObject * parent, int Type, const char * Label)
{
Ui_ListenSession * Sess = new(Ui_ListenSession);
MHWindow = Sess;
// Need to explicity initialise on Qt4
Sess->termWindow = NULL;
Sess->monWindow = NULL;
Sess->inputWindow = NULL;
Sess->StackIndex = 0;
Sess->InputMode = 0;
Sess->SlowTimer = 0;
Sess->MonData = 0;
Sess->OutputSaveLen = 0;
Sess->MonSaveLen = 0;
Sess->PortMonString[0] = 0;
Sess->portmask = 0;
Sess->portmask = 1;
Sess->mtxparam = 1;
Sess->mlocaltime = 0;
Sess->mcomparam = 1;
Sess->monUI = 0;
Sess->MonitorNODES = 0;
Sess->MonitorColour = 1;
Sess->CurrentHost = 0;
Sess->SessionType = Type;
Sess->clientSocket = NULL;
Sess->AGWSession = NULL;
Sess->AGWMonSession = NULL;
Sess->KISSSession = NULL;
Sess->KISSMode = 0;
Sess->TTActive = 0;
Sess->TTFlashToggle = 0;
Sess->pageBuffer[0] = 0;
Sess->Tab = 0;
Sess->LogMonitor = false;
Sess->monSpan = (char *) "<span style=white-space:pre>";
Sess->monLogfile = nullptr;
Sess->sessNo = sessNo++;
QSettings settings(GetConfPath(), QSettings::IniFormat);
#ifdef ANDROID
QFont font = QFont(settings.value("FontFamily", "Driod Sans Mono").value<QString>(),
settings.value("PointSize", 12).toInt(),
settings.value("Weight", 50).toInt());
#else
QFont font = QFont(settings.value("FontFamily", "Courier New").value<QString>(),
settings.value("PointSize", 10).toInt(),
settings.value("Weight", 50).toInt());
#endif
Sess->monWindow = new QTextEdit(Sess);
Sess->monWindow->setReadOnly(1);
Sess->monWindow->document()->setMaximumBlockCount(10000);
Sess->monWindow->setFont(font);
Sess->monWindow->setStyleSheet(monStyleSheet);
Sess->setWindowTitle(Label);
Sess->installEventFilter(mythis);
Sess->show();
Sess->monWindow->setGeometry(QRect(2, 2, 400, 400));
Sess->setGeometry(QRect(400, 400, 400, 400));
QSize Size(800, 602); // Not actually used, but Event constructor needs it
QResizeEvent event(Size, Size);
QApplication::sendEvent(Sess, &event); // Resize Widgets to fix Window
return true;
}
extern "C" void WritetoMHWindow(char * Buffer)
{
unsigned char Copy[8192];
unsigned char * ptr1, *ptr2;
unsigned char Line[8192];
unsigned char out[8192];
int outlen;
int num;
if (MHWindow == NULL || MHWindow->monWindow == NULL)
return;
MHWindow->monWindow->setText(Buffer);
}

View file

@ -100,6 +100,7 @@ public:
void * AGWMonSession; void * AGWMonSession;
void * KISSSession; void * KISSSession;
int KISSMode; // Connected or UI int KISSMode; // Connected or UI
int UIPORT;
char UIDEST[32]; char UIDEST[32];
char UIPATH[128]; char UIPATH[128];
@ -159,6 +160,7 @@ private slots:
void LDisconnect(Ui_ListenSession * LUI); void LDisconnect(Ui_ListenSession * LUI);
void SetupHosts(); void SetupHosts();
void MyTimerSlot(); void MyTimerSlot();
void SlowTimerSlot();
void KISSTimerSlot(); void KISSTimerSlot();
void ListenSlot(); void ListenSlot();
void AGWSlot(); void AGWSlot();

View file

@ -49,4 +49,6 @@ RESOURCES += QtTermTCP.qrc
RC_ICONS = QtTermTCP.ico RC_ICONS = QtTermTCP.ico
ICONS = QtTermTCP.icns
QMAKE_LFLAGS += -no-pie QMAKE_LFLAGS += -no-pie

View file

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.11.1, 2022-12-03T18:22:04. --> <!-- Written by QtCreator 11.0.3, 2024-12-31T18:44:43. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>
<value type="QByteArray">{49a2cf38-2251-47e3-97df-4ecaa9d41931}</value> <value type="QByteArray">{6e41d268-43e9-43ac-b8fa-a3c083d547a3}</value>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.ActiveTarget</variable> <variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value> <value type="qlonglong">0</value>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.EditorSettings</variable> <variable>ProjectExplorer.Project.EditorSettings</variable>
@ -28,7 +28,7 @@
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap> </valuemap>
</valuemap> </valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value> <value type="int" key="EditorConfiguration.IndentSize">4</value>
@ -37,6 +37,7 @@
<value type="bool" key="EditorConfiguration.MouseHiding">true</value> <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value> <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</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.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value> <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
@ -45,6 +46,7 @@
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value> <value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</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="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value> <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
@ -52,6 +54,7 @@
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value> <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value> <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value> <value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
</valuemap> </valuemap>
</data> </data>
<data> <data>
@ -59,6 +62,7 @@
<valuemap type="QVariantMap"> <valuemap type="QVariantMap">
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks"> <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
<value type="bool" key="AutoTest.Framework.Boost">true</value> <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.Catch">true</value>
<value type="bool" key="AutoTest.Framework.GTest">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.QtQuickTest">true</value>
@ -67,15 +71,12 @@
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/> <valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
<value type="int" key="AutoTest.RunAfterBuild">0</value> <value type="int" key="AutoTest.RunAfterBuild">0</value>
<value type="bool" key="AutoTest.UseGlobal">true</value> <value type="bool" key="AutoTest.UseGlobal">true</value>
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
<value type="QString">-fno-delayed-template-parsing</value>
</valuelist>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
<value type="QString" key="ClangCodeModel.WarningConfigId">Builtin.Questionable</value>
<valuemap type="QVariantMap" key="ClangTools"> <valuemap type="QVariantMap" key="ClangTools">
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value> <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value> <value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
<value type="int" key="ClangTools.ParallelJobs">3</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.SelectedDirs"/>
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/> <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/> <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
@ -87,35 +88,28 @@
<variable>ProjectExplorer.Project.Target.0</variable> <variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap"> <valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value> <value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MSVC2015 64bit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.15.10 (5.15.10_1)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MSVC2015 64bit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 5.15.10 (5.15.10_1)</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win64_msvc2015_64_kit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{6c3e99da-2293-4df8-901e-49e24d493aeb}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="bool">true</value>
<value type="int" key="EnableQmlDebugging">0</value> <value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\John\OneDrive\Dev\Source\QT\build-QtTermTCP-Desktop_Qt_5_14_2_MSVC2015_64bit-Debug</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Volumes/Source/QT/build-QtTermTCP-Qt_5_15_10_5_15_10_1-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/John/OneDrive/Dev/Source/QT/build-QtTermTCP-Desktop_Qt_5_14_2_MSVC2015_64bit-Debug</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Volumes/Source/QT/build-QtTermTCP-Qt_5_15_10_5_15_10_1-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</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.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
@ -124,13 +118,9 @@
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</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.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
@ -138,36 +128,27 @@
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="int" key="QtQuickCompiler">2</value>
<value type="int" key="SeparateDebugInfo">2</value>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="bool">true</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Volumes/Source/QT/build-QtTermTCP-Qt_5_15_10_5_15_10_1-Release</value>
<value type="int" key="EnableQmlDebugging">2</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Volumes/Source/QT/build-QtTermTCP-Qt_5_15_10_5_15_10_1-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\John\OneDrive\Dev\Source\QT\build-QtTermTCP-Desktop_Qt_5_14_2_MSVC2015_64bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/John/OneDrive/Dev/Source/QT/build-QtTermTCP-Desktop_Qt_5_14_2_MSVC2015_64bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</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.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
@ -176,13 +157,9 @@
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</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.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
@ -190,36 +167,29 @@
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="int" key="QtQuickCompiler">0</value> <value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">2</value>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="bool">true</value>
<value type="int" key="EnableQmlDebugging">0</value> <value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\John\OneDrive\Dev\Source\QT\build-QtTermTCP-Desktop_Qt_5_14_2_MSVC2015_64bit-Profile</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/Volumes/Source/QT/build-QtTermTCP-Qt_5_15_10_5_15_10_1-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/John/OneDrive/Dev/Source/QT/build-QtTermTCP-Desktop_Qt_5_14_2_MSVC2015_64bit-Profile</value> <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">/Volumes/Source/QT/build-QtTermTCP-Qt_5_15_10_5_15_10_1-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/> <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
</valuemap> </valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</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.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
@ -228,13 +198,9 @@
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</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.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
@ -242,6 +208,7 @@
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
@ -249,10 +216,10 @@
<value type="int" key="QtQuickCompiler">0</value> <value type="int" key="QtQuickCompiler">0</value>
<value type="int" key="SeparateDebugInfo">0</value> <value type="int" key="SeparateDebugInfo">0</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</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.DisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
@ -262,89 +229,28 @@
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value> <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value> <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<valuelist type="QVariantList" key="CustomOutputParsers"/> <valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value> <value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/John/OneDrive/Dev/Source/QT/QtTermTCP/QtTermTCP.pro</value> <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">C:/Users/John/OneDrive/Dev/Source/QT/QtTermTCP/QtTermTCP.pro</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/Volumes/Source/QT/QtTermTCP2/QtTermTCP.pro</value>
<value type="QString" key="RunConfiguration.Arguments"></value> <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/Volumes/Source/QT/QtTermTCP2/QtTermTCP.pro</value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value> <value type="QString" key="RunConfiguration.WorkingDirectory.default">/Volumes/Source/QT/build-QtTermTCP-Qt_5_15_10_5_15_10_1-Debug/QtTermTCP.app/Contents/MacOS</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">C:/Users/John/OneDrive/Dev/Source/QT/build-QtTermTCP-Desktop_Qt_5_14_2_MSVC2015_64bit-Debug</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap> </valuemap>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.TargetCount</variable> <variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value> <value type="qlonglong">1</value>
</data> </data>
<data> <data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable> <variable>ProjectExplorer.Project.Updater.FileVersion</variable>

View file

@ -114,7 +114,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<QtInstall>5.14.2</QtInstall> <QtInstall>5.14.2</QtInstall>
<QtModules>core;network;gui;widgets;serialport</QtModules> <QtModules>core;network;gui;widgets;serialport;multimedia</QtModules>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings">
<QtInstall>5.14.2_msvc2017</QtInstall> <QtInstall>5.14.2_msvc2017</QtInstall>
@ -122,7 +122,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<QtInstall>5.14.2</QtInstall> <QtInstall>5.14.2</QtInstall>
<QtModules>core;network;gui;widgets;serialport</QtModules> <QtModules>core;network;gui;widgets;serialport;multimedia</QtModules>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
<QtInstall>5.14.2_msvc2017_64</QtInstall> <QtInstall>5.14.2_msvc2017_64</QtInstall>
@ -153,7 +153,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalDependencies>shell32.lib;setupapi.lib;C:\Qt\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Multimedia.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>shell32.lib;setupapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\opensslx86\lib;C:\Utils\my_sql\mysql-5.7.25-win32\lib;C:\Utils\postgresqlx86\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>C:\opensslx86\lib;C:\Utils\my_sql\mysql-5.7.25-win32\lib;C:\Utils\postgresqlx86\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>-no-pie "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>-no-pie "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
<DataExecutionPrevention>true</DataExecutionPrevention> <DataExecutionPrevention>true</DataExecutionPrevention>
@ -279,7 +279,7 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalDependencies>shell32.lib;setupapi.lib;%(AdditionalDependencies);C:\Qt\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Multimediad.lib</AdditionalDependencies> <AdditionalDependencies>shell32.lib;setupapi.lib;%(AdditionalDependencies);</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\opensslx86\lib;C:\Utils\my_sql\mysql-5.7.25-win32\lib;C:\Utils\postgresqlx86\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>C:\opensslx86\lib;C:\Utils\my_sql\mysql-5.7.25-win32\lib;C:\Utils\postgresqlx86\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>-no-pie "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>-no-pie "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
<DataExecutionPrevention>true</DataExecutionPrevention> <DataExecutionPrevention>true</DataExecutionPrevention>

View file

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerWorkingDirectory>$(APPDATA)</LocalDebuggerWorkingDirectory> <LocalDebuggerWorkingDirectory>C:\DevProgs\BPQ32\Release</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommand>C:\Dev\Msdev2005\Projects\QtTermTCP\Win32\Debug\QtTermTCP.exe</LocalDebuggerCommand>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LocalDebuggerWorkingDirectory>..\..\..\..\..\DevProgs\BPQ32</LocalDebuggerWorkingDirectory> <LocalDebuggerWorkingDirectory>C:\DevProgs\BPQ32\Release</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerCommand>C:\Dev\Msdev2005\Projects\QtTermTCP\Win32\Debug\QtTermTCP.exe</LocalDebuggerCommand>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QtLastBackgroundBuild>2022-05-19T07:28:47.9186341Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2022-05-19T07:28:47.9186341Z</QtLastBackgroundBuild>
@ -15,15 +17,15 @@
<QtLastBackgroundBuild>2022-05-19T07:28:58.9302359Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2022-05-19T07:28:58.9302359Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<QtLastBackgroundBuild>2023-10-14T13:14:56.5532991Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2025-02-19T10:20:19.7224236Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
<QtLastBackgroundBuild>2023-10-14T13:14:56.7231497Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2025-02-19T10:20:19.9860750Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<QtLastBackgroundBuild>2023-10-14T13:14:55.9367569Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2025-02-19T10:20:19.2704826Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="QtSettings">
<QtLastBackgroundBuild>2023-10-14T13:14:56.2561805Z</QtLastBackgroundBuild> <QtLastBackgroundBuild>2025-02-19T10:20:19.4132585Z</QtLastBackgroundBuild>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View file

@ -56,7 +56,7 @@ extern char UserName[MAXHOSTS + 1][80];
extern char Password[MAXHOSTS + 1][80]; extern char Password[MAXHOSTS + 1][80];
extern char SessName[MAXHOSTS + 1][80]; extern char SessName[MAXHOSTS + 1][80];
extern char MYCALL[32]; extern char KISSMYCALL[32];
QLineEdit *TermCall; QLineEdit *TermCall;
QGroupBox *groupBox; QGroupBox *groupBox;
@ -114,6 +114,7 @@ extern char * AGWPortList;
extern QStringList AGWToCalls; extern QStringList AGWToCalls;
extern int KISSMode; extern int KISSMode;
extern char KISSVia[128]; // Digi String
extern Ui_ListenSession * ActiveSession; extern Ui_ListenSession * ActiveSession;
@ -470,7 +471,7 @@ KISSConnect::KISSConnect(QWidget *parent) : QDialog(parent)
scrollArea = new QScrollArea(this); scrollArea = new QScrollArea(this);
scrollArea->setObjectName(QString::fromUtf8("scrollArea")); scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
scrollArea->setGeometry(QRect(5, 5, 250, 200)); scrollArea->setGeometry(QRect(5, 5, 260, 200));
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setWidgetResizable(false); scrollArea->setWidgetResizable(false);
@ -503,6 +504,13 @@ KISSConnect::KISSConnect(QWidget *parent) : QDialog(parent)
layout->addSpacing(10); layout->addSpacing(10);
layout->addLayout(formLayout2); layout->addLayout(formLayout2);
Chan = new QComboBox();
Chan->setEditable(false);
Chan->setInsertPolicy(QComboBox::NoInsert);
Chan->addItems(QStringList() << "A" << "B" << "C" << "D");
formLayout2->addRow(new QLabel("Modem Channel"), Chan);
wCallTo = new QComboBox(); wCallTo = new QComboBox();
wCallTo->setEditable(true); wCallTo->setEditable(true);
wCallTo->setInsertPolicy(QComboBox::NoInsert); wCallTo->setInsertPolicy(QComboBox::NoInsert);
@ -510,6 +518,7 @@ KISSConnect::KISSConnect(QWidget *parent) : QDialog(parent)
formLayout2->addRow(new QLabel("Call To"), wCallTo); formLayout2->addRow(new QLabel("Call To"), wCallTo);
Digis = new QLineEdit(); Digis = new QLineEdit();
formLayout2->addRow(new QLabel("Digis"), Digis); formLayout2->addRow(new QLabel("Digis"), Digis);
layout->addSpacing(2); layout->addSpacing(2);
@ -523,6 +532,9 @@ KISSConnect::KISSConnect(QWidget *parent) : QDialog(parent)
wCallTo->addItems(AGWToCalls); wCallTo->addItems(AGWToCalls);
Digis->setText(KISSVia);
Digis->resize(400, 20);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(myaccept()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(myreject()));
} }
@ -544,16 +556,20 @@ void KISSConnect::myaccept()
{ {
QVariant Q; QVariant Q;
char CallTo[32]; char CallTo[128];;
char Via[128]; char Port[3];
strcpy(CallTo, wCallTo->currentText().toUpper().toUtf8()); strcpy(CallTo, wCallTo->currentText().toUpper().toUtf8());
strcpy(Via, Digis->text().toUpper().toUtf8()); strcpy(KISSVia, Digis->text().toUpper().toUtf8());
memcpy(Port, Chan->currentText().toUpper().toUtf8(), 1);
int PortNo = Port[0] - 'A';
TAX25Port * AX25Sess = 0; TAX25Port * AX25Sess = 0;
// Check for duplicate session // Check for duplicate session
AX25Sess = get_user_port_by_calls(0, MYCALL, CallTo); AX25Sess = get_user_port_by_calls(0, KISSMYCALL, CallTo);
if (AX25Sess) if (AX25Sess)
{ {
@ -561,7 +577,7 @@ void KISSConnect::myaccept()
char Msg[256]; char Msg[256];
int Len = sprintf(Msg, "You already have a session between %s and %s so can't connect\r", MYCALL, CallTo); int Len = sprintf(Msg, "You already have a session between %s and %s so can't connect\r", KISSMYCALL, CallTo);
WritetoOutputWindow(ActiveSession, (unsigned char *)Msg, Len); WritetoOutputWindow(ActiveSession, (unsigned char *)Msg, Len);
// KISSConnect::accept(); // KISSConnect::accept();
@ -581,7 +597,7 @@ void KISSConnect::myaccept()
if (KISSMode == 0) if (KISSMode == 0)
{ {
ActiveSession->KISSSession = KISSConnectOut(ActiveSession, MYCALL, CallTo, Via, 0, (void *)KISSSock); ActiveSession->KISSSession = KISSConnectOut(ActiveSession, KISSMYCALL, CallTo, KISSVia, PortNo, (void *)KISSSock);
WritetoOutputWindow(ActiveSession, (unsigned char *)"Connecting...\r", 14); WritetoOutputWindow(ActiveSession, (unsigned char *)"Connecting...\r", 14);
discAction->setEnabled(true); discAction->setEnabled(true);
} }
@ -597,7 +613,8 @@ void KISSConnect::myaccept()
ActiveSession->KISSSession = (void *)&DummyPort; // Dummy marker to show session in use ActiveSession->KISSSession = (void *)&DummyPort; // Dummy marker to show session in use
strcpy(ActiveSession->UIDEST, CallTo); strcpy(ActiveSession->UIDEST, CallTo);
strcpy(ActiveSession->UIPATH, Via); strcpy(ActiveSession->UIPATH, KISSVia);
ActiveSession->UIPORT = PortNo;
if (TermMode == Tabbed) if (TermMode == Tabbed)
Len = sprintf(Msg, "UI %s", CallTo); Len = sprintf(Msg, "UI %s", CallTo);

View file

@ -146,6 +146,7 @@ public:
public: public:
QLineEdit * wCallFrom; QLineEdit * wCallFrom;
QComboBox * wCallTo; QComboBox * wCallTo;
QComboBox * Chan;
QLineEdit * Digis; QLineEdit * Digis;
QLineEdit * UIDest; QLineEdit * UIDest;
QListWidget * RadioPorts; QListWidget * RadioPorts;

299
ax25.c
View file

@ -20,9 +20,13 @@ 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
// This is a simplified version for QtTermTCP
#include "ax25.h" #include "ax25.h"
#include <stdarg.h> #include <stdarg.h>
extern int KISSChecksum;
#ifdef WIN32 #ifdef WIN32
__declspec(dllimport) unsigned short __stdcall htons(__in unsigned short hostshort); __declspec(dllimport) unsigned short __stdcall htons(__in unsigned short hostshort);
@ -40,7 +44,7 @@ void decode_frame(Byte * frame, int len, Byte * path, string * data,
void SetSessLabel(void * Sess, char * label); void SetSessLabel(void * Sess, char * label);
void setMenus(int State); void setMenus(int State);
void MHPROC(unsigned char * Packet, int Len);
/* /*
unit ax25; unit ax25;
@ -224,6 +228,8 @@ Byte users[4] = { 0,0,0,0 };
short txtail[5] = { 50, 50, 50, 50, 50 }; short txtail[5] = { 50, 50, 50, 50, 50 };
short txdelay[5] = { 400, 400, 400, 400, 400 }; short txdelay[5] = { 400, 400, 400, 400, 400 };
int sendTXDelay[4] = { 0, 0, 0, 0 };
short modem_def[5] = { 1, 1, 1, 1, 1 }; short modem_def[5] = { 1, 1, 1, 1, 1 };
@ -861,7 +867,7 @@ int get_addr(char * Calls, UCHAR * AXCalls)
char * ptr, *Context; char * ptr, *Context;
int n = 8; // Max digis int n = 8; // Max digis
memset(AXCalls, 0, 70); memset(AXCalls, 0, 72);
ptr = strtok_s(Calls, " ,", &Context); ptr = strtok_s(Calls, " ,", &Context);
@ -877,7 +883,7 @@ int get_addr(char * Calls, UCHAR * AXCalls)
ptr = strtok_s(NULL, " ,", &Context); ptr = strtok_s(NULL, " ,", &Context);
if (ConvToAX25(ptr, axptr) == 0) if (ptr == 0 || ConvToAX25(ptr, axptr) == 0)
return FALSE; return FALSE;
axptr += 7; axptr += 7;
@ -2495,6 +2501,7 @@ void KISSDataReceived(void * socket, unsigned char * data, int length)
void analiz_frame(int snd_ch, string * frame, void * socket, boolean fecflag); void analiz_frame(int snd_ch, string * frame, void * socket, boolean fecflag);
void KISSSendtoServer(void * Socket, char * Data, int Length);
void ProcessKISSFrame(void * socket, UCHAR * Msg, int Len) void ProcessKISSFrame(void * socket, UCHAR * Msg, int Len)
{ {
@ -2505,8 +2512,6 @@ void ProcessKISSFrame(void * socket, UCHAR * Msg, int Len)
int Chan; int Chan;
int Opcode; int Opcode;
string * TXMSG; string * TXMSG;
unsigned short CRC;
UCHAR CRCString[2];
ptr1 = ptr2 = Msg; ptr1 = ptr2 = Msg;
@ -2564,46 +2569,65 @@ void ProcessKISSFrame(void * socket, UCHAR * Msg, int Len)
if (Chan > 3) if (Chan > 3)
return; return;
// This is a lot simpler than QtSM, as frames will always be immediately processed locally, so ack mode isn't needed.
// but if enabled ack can be sent immediately
// checksum if needed
switch (Opcode) switch (Opcode)
{ {
case KISS_ACKMODE: case KISS_ACKMODE:
{
// send ack
// How best to do ACKMODE?? I think pass whole frame including CMD and ack bytes to all_frame_buf unsigned char ACK[16];
unsigned char * ackptr = ACK;
// But ack should only be sent to client that sent the message - needs more thought! *ackptr++ = FEND;
*ackptr++ = Msg[0]; // opcode and channel
TXMSG = newString(); *ackptr++ = Msg[1];
stringAdd(TXMSG, &Msg[0], Len); // include Control *ackptr++ = Msg[2]; // ACK Bytes
*ackptr++ = FEND;
CRC = get_fcs(&Msg[3], Len - 3); // exclude control and ack bytes KISSSendtoServer(socket, ACK, 5);
CRCString[0] = CRC & 0xff; // remove ack bytes
CRCString[1] = CRC >> 8;
stringAdd(TXMSG, CRCString, 2); memmove(&Msg[1], &Msg[3], Len - 2);
// Ackmode needs to know where to send ack back to, so save socket on end of data // drop through to KISS Data
stringAdd(TXMSG, (unsigned char *)&socket, sizeof(socket));
// if KISS Optimise see if frame is really needed
if (!KISS_opt[Chan])
Add(&KISS.buffer[Chan], TXMSG);
else
{
if (add_raw_frames(Chan, TXMSG, &KISS.buffer[Chan]))
Add(&KISS.buffer[Chan], TXMSG);
}
return;
Len -= 2;
}
case KISS_DATA: case KISS_DATA:
if (KISSChecksum)
{
// SUM MESSAGE, AND IF DUFF DISCARD. IF OK DECREMENT COUNT TO REMOVE SUM
int sumlen = Len;
char * ptr = &Msg[0];
UCHAR sum = 0;
while (sumlen--)
{
sum ^= *(ptr++);
}
if (sum)
{
Debugprintf("KISS Checksum Error");
return;
}
Len--; // Remove Checksum
}
TXMSG = newString(); TXMSG = newString();
stringAdd(TXMSG, &Msg[1], Len - 1); // include Control stringAdd(TXMSG, &Msg[1], Len - 1); // include Control
MHPROC(TXMSG->Data, TXMSG->Length);
analiz_frame(Chan, TXMSG, socket, 0); analiz_frame(Chan, TXMSG, socket, 0);
free(TXMSG); free(TXMSG);
@ -2702,7 +2726,7 @@ TAX25Port * KISSConnectOut(void * Sess, char * CallFrom, char * CallTo, char * D
strcpy((char *)AX25Sess->Path, (char *)axpath); strcpy((char *)AX25Sess->Path, (char *)axpath);
reverse_addr(axpath, AX25Sess->ReversePath, AX25Sess->pathLen); reverse_addr(axpath, AX25Sess->ReversePath, AX25Sess->pathLen);
set_link(AX25Sess, AX25Sess->Path); set_link(AX25Sess, AX25Sess->Path); // Sends SABM
return AX25Sess; return AX25Sess;
} }
return 0; return 0;
@ -2997,6 +3021,221 @@ char * frame_monitor(string * frame, char * code, int tx_stat)
return FrameData; return FrameData;
} }
typedef struct _MHSTRUC
{
UCHAR MHCALL[7];
UCHAR MHDIGIS[7][8];
time_t MHTIME;
int MHCOUNT;
unsigned char MHDIGI;
char MHFreq[12];
char MHLocator[6];
} MHSTRUC, *PMHSTRUC;
#define MHENTRIES 30
MHSTRUC MHEARD[(MHENTRIES + 1) * sizeof(MHSTRUC)] = { 0 };
int CompareCalls(UCHAR * c1, UCHAR * c2)
{
// COMPARE AX25 CALLSIGNS IGNORING EXTRA BITS IN SSID
if (memcmp(c1, c2, 6))
return FALSE; // No Match
if ((c1[6] & 0x1e) == (c2[6] & 0x1e))
return TRUE;
return FALSE;
}
static char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
void * MHWindow = 0;
void WritetoMHWindow(char * Buffer);
int KISSMH = 0;
char * FormatMH(PMHSTRUC MH)
{
struct tm * TM;
static char MHTime[50];
time_t szClock;
char LOC[7];
memcpy(LOC, MH->MHLocator, 6);
LOC[6] = 0;
szClock = MH->MHTIME;
// else
// szClock = time(NULL) - MH->MHTIME;
TM = gmtime(&szClock);
sprintf(MHTime, "%s %02d %.2d:%.2d:%.2d %s %s",
month[TM->tm_mon], TM->tm_mday, TM->tm_hour, TM->tm_min, TM->tm_sec, MH->MHFreq, LOC);
return MHTime;
}
void MHPROC(unsigned char * Packet, int Len)
{
PMHSTRUC MH = &MHEARD[0];
PMHSTRUC MHBASE = MH;
int i;
int OldCount = 0;
char Freq[64] = "";
char DIGI = '*';
MESSAGE Frame;
MESSAGE * Buffer = &Frame;
memcpy(Buffer->DEST, Packet, Len);
// if port has a freq associated with it use it
// if (Buffer->ORIGIN[6] & 1)
DIGI = 0; // Don't think we want to do this
// See if in list
for (i = 0; i < MHENTRIES; i++)
{
if ((MH->MHCALL[0] == 0) || (CompareCalls(Buffer->ORIGIN, MH->MHCALL) && MH->MHDIGI == DIGI)) // Spare or our entry
{
OldCount = MH->MHCOUNT;
goto DoMove;
}
MH++;
}
// TABLE FULL AND ENTRY NOT FOUND - MOVE DOWN ONE, AND ADD TO TOP
i = MHENTRIES - 1;
// Move others down and add at front
DoMove:
if (i != 0) // First
memmove(MHBASE + 1, MHBASE, i * sizeof(MHSTRUC));
memcpy(MHBASE->MHCALL, Buffer->ORIGIN, 7 * 9); // Save Digis
MHBASE->MHDIGI = DIGI;
MHBASE->MHTIME = time(NULL);
MHBASE->MHCOUNT = ++OldCount;
strcpy(MHBASE->MHFreq, Freq);
MHBASE->MHLocator[0] = 0;
if (MHWindow)
{
int count = MHENTRIES;
int n;
char Normcall[20];
char From[10];
char DigiList[100];
char * Output;
int len;
char Digi = 0;
char MHPage[MHENTRIES * 100];
char * Bufferptr = MHPage;
unsigned char * ptr;
MH = &MHEARD[0];
// Note that the MHDIGIS field may contain rubbish. You have to check End of Address bit to find
// how many digis there are
Bufferptr += sprintf(Bufferptr, "Callsign Last heard Pkts RX via Digi\r");
Bufferptr += sprintf(Bufferptr, "\r");
while (count--)
{
if (MH->MHCALL[0] == 0)
break;
Digi = 0;
len = ConvFromAX25(MH->MHCALL, Normcall);
Normcall[len++] = MH->MHDIGI;
Normcall[len++] = 0;
n = 8; // Max number of digi-peaters
ptr = &MH->MHCALL[6]; // End of Address bit
Output = &DigiList[0];
if ((*ptr & 1) == 0)
{
// at least one digi
strcpy(Output, "via ");
Output += 4;
while ((*ptr & 1) == 0)
{
// MORE TO COME
From[ConvFromAX25(ptr + 1, From)] = 0;
Output += sprintf((char *)Output, "%s", From);
ptr += 7;
n--;
if (n == 0)
break;
// See if digi actioned - put a * on last actioned
if (*ptr & 0x80)
{
if (*ptr & 1) // if last address, must need *
{
*(Output++) = '*';
Digi = '*';
}
else
if ((ptr[7] & 0x80) == 0) // Repeased by next?
{
*(Output++) = '*'; // No, so need *
Digi = '*';
}
}
*(Output++) = ',';
}
*(--Output) = 0; // remove last comma
}
else
*(Output) = 0;
// if we used a digi set * on call and display via string
if (Digi)
Normcall[len++] = Digi;
else
DigiList[0] = 0; // Dont show list if not used
Normcall[len++] = 0;
ptr = FormatMH(MH);
Bufferptr += sprintf(Bufferptr, "%-10s %-10s %-10d %-30s\r", Normcall, ptr, MH->MHCOUNT, DigiList);
MH++;
}
WritetoMHWindow(MHPage);
}
return;
}

4
ax25.h
View file

@ -228,7 +228,7 @@ extern "C" void WriteDebugLog(char * Mess);
extern "C" void SendtoTerm(Ui_ListenSession * Sess, char * Msg, int Len); extern "C" void SendtoTerm(Ui_ListenSession * Sess, char * Msg, int Len);
extern "C" void ClearSessLabel(Ui_ListenSession * Sess); extern "C" void ClearSessLabel(Ui_ListenSession * Sess);
extern "C" void rst_timer(TAX25Port * AX25Sess); extern "C" void rst_timer(TAX25Port * AX25Sess);
extern "C" void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, Byte * Msg, int MsgLen); extern "C" void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, char * Via, Byte * Msg, int MsgLen);
#else #else
void monitor_frame(int snd_ch, string * frame, char * code, int tx, int excluded); void monitor_frame(int snd_ch, string * frame, char * code, int tx, int excluded);
void SendtoTerm(void * Sess, char * Msg, int Len); void SendtoTerm(void * Sess, char * Msg, int Len);
@ -236,7 +236,7 @@ void ClearSessLabel(void * Sess);
void WriteDebugLog(char * Mess); void WriteDebugLog(char * Mess);
void AX25_disc(TAX25Port * AX25Sess, Byte mode); void AX25_disc(TAX25Port * AX25Sess, Byte mode);
void rst_timer(TAX25Port * AX25Sess); void rst_timer(TAX25Port * AX25Sess);
void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, Byte * Msg, int MsgLen); void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, char * via, Byte * Msg, int MsgLen);
#endif #endif
BOOL ConvToAX25(char * callsign, unsigned char * ax25call); BOOL ConvToAX25(char * callsign, unsigned char * ax25call);

View file

@ -20,12 +20,18 @@ 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
// This is a simplified version for QtTermTCP
#include "ax25.h" #include "ax25.h"
UCHAR TimerEvent = TIMER_EVENT_OFF; UCHAR TimerEvent = TIMER_EVENT_OFF;
extern int busy; extern int busy;
int listenEnable; int listenEnable;
int KISSListen = 1; int KISSListen = 1;
int KISSChecksum = 0;
int KISSAckMode = 0;
void * KISSSockCopy[4]; void * KISSSockCopy[4];
extern UCHAR axMYCALL[7] = ""; // Mycall in ax.25 extern UCHAR axMYCALL[7] = ""; // Mycall in ax.25
@ -301,6 +307,32 @@ int KISS_encode(UCHAR * KISSBuffer, int port, string * frame)
(*ptr2++) = c; (*ptr2++) = c;
} }
} }
// Add checksum if needed
if (KISSChecksum)
{
c = TXCCC;
// We don't support TNCX with Checksum
switch (c)
{
case FEND:
(*ptr2++) = FESC;
(*ptr2++) = TFEND;
break;
case FESC:
(*ptr2++) = FESC;
(*ptr2++) = TFESC;
break;
default:
(*ptr2++) = c;
}
}
(*ptr2++) = FEND; (*ptr2++) = FEND;
return (int)(ptr2 - KISSBuffer); return (int)(ptr2 - KISSBuffer);
@ -317,23 +349,13 @@ void add_pkt_buf(TAX25Port * AX25Sess, string * data)
// ? Don't we just send to TNC? // ? Don't we just send to TNC?
Length = KISS_encode(KISSBuffer, 0, data); Length = KISS_encode(KISSBuffer, AX25Sess->snd_ch, data);
KISSSendtoServer(AX25Sess->socket, KISSBuffer, Length); KISSSendtoServer(AX25Sess->socket, KISSBuffer, Length);
monitor_frame(0, data, "", 1, 0); // Monitor monitor_frame(0, data, "", 1, 0); // Monitor
freeString(data); freeString(data);
// while (i < AX25Sess->frame_buf.Count && !found)
// {
// found = compareStrings(Strings(&AX25Sess->frame_buf, i++), data);
// }
// if (found)
// freeString(data);
// else
// Add(&AX25Sess->frame_buf, data);
} }
void add_I_FRM(TAX25Port * AX25Sess) void add_I_FRM(TAX25Port * AX25Sess)
@ -1227,20 +1249,9 @@ void timer_event()
for (snd_ch = 0; snd_ch < 4; snd_ch++) for (snd_ch = 0; snd_ch < 4; snd_ch++)
{ {
//reset the slottime timer //reset the slottime timer
if (dyn_frack[snd_ch])
{
UpdateActiveConnects(snd_ch);
if (users[snd_ch] > 0)
active = users[snd_ch] - 1;
else
active = 0;
frack = frack_time[snd_ch] + frack_time[snd_ch] * active * 0.5; frack = frack_time[snd_ch];
}
else
frack = frack_time[snd_ch];
//
for (port = 0; port < port_num; port++) for (port = 0; port < port_num; port++)
{ {
AX25Sess = &AX25Port[snd_ch][port]; AX25Sess = &AX25Port[snd_ch][port];
@ -1703,10 +1714,12 @@ void analiz_frame(int snd_ch, string * frame, void * socket, boolean fecflag)
int get_addr(char * Calls, UCHAR * AXCalls); int get_addr(char * Calls, UCHAR * AXCalls);
void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, Byte * Msg, int MsgLen) void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, char * via, Byte * Msg, int MsgLen)
{ {
Byte path[80]; char Addrs[256];
char Calls[80]; Byte path[256];
int destlen = 0;
string * Data = newString(); string * Data = newString();
string * Frame; string * Frame;
@ -1715,17 +1728,19 @@ void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, Byte * Msg, int
stringAdd(Data, Msg, MsgLen); stringAdd(Data, Msg, MsgLen);
sprintf(Calls, "%s,%s", CallTo, CallFrom); // We Need Dest, Source, Digis in path, with end of address bit set appropriately.
get_addr(Calls, path); sprintf(Addrs, "%s %s %s", CallTo, CallFrom, via);
destlen = get_addr(Addrs, path);
Frame = make_frame(Data, path, PID, 0, 0, U_FRM, U_UI, FALSE, SET_F, SET_C); Frame = make_frame(Data, path, PID, 0, 0, U_FRM, U_UI, FALSE, SET_F, SET_C);
// ? Don't we just send to TNC? // ? Don't we just send to TNC?
Length = KISS_encode(KISSBuffer, 0, Frame); Length = KISS_encode(KISSBuffer, port, Frame);
KISSSendtoServer(KISSSockCopy[port], KISSBuffer, Length); KISSSendtoServer(KISSSockCopy[0], KISSBuffer, Length);
monitor_frame(0, Frame, "", 1, 0); // Monitor monitor_frame(0, Frame, "", 1, 0); // Monitor
freeString(Frame); freeString(Frame);

View file

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

View file

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