updated to 9.4.4

master
Ahmet Inan 2020-09-30 14:30:56 +02:00
rodzic 69118d5b1b
commit 31a4e71c45
410 zmienionych plików z 15181 dodań i 31412 usunięć

Wyświetl plik

@ -1,5 +1,5 @@
For the full manual please go to
http://users.telenet.be/on4qz/qsstv_9/manual/index.html
http://users.telenet.be/on4qz/qsstv/manual/index.html
There you'll find the complete installation instructions wich is part of the user manual.

Wyświetl plik

@ -16,6 +16,9 @@ using namespace std; /* Because of the library: "complex" */
#define DOWNSAMPLESIZE (SUBSAMPLINGFACTOR*RXSTRIPE)
#define SAMPLERATE (BASESAMPLERATE/SUBSAMPLINGFACTOR)
#undef DISABLENARROW
typedef double DSPFLOAT;
typedef unsigned char byte;

Wyświetl plik

@ -5,9 +5,9 @@
#include <QCursor>
const QString MAJORVERSION = "9.2";
const QString MAJORVERSION = "9.4";
const QString CONFIGVERSION = "9.0";
const QString MINORVERSION = ".6";
const QString MINORVERSION = ".4";
const QString LOGVERSION = ("qsstv."+MAJORVERSION+MINORVERSION+".log");
const QString ORGANIZATION = "ON4QZ";
const QString APPLICATION = ("qsstv_" +CONFIGVERSION);
@ -24,10 +24,13 @@ logFile *logFilePtr;
configDialog *configDialogPtr;
ftpInterface *notifyRXIntf;
ftpInterface *hybridTxIntf;
ftpInterface *notifyTXIntf;
ftpInterface *onlineStatusIntf;
ftpThread *notifyRXIntfPtr;
ftpThread *hybridTxIntfPtr;
ftpThread *notifyTXIntfPtr;
ftpThread *onlineStatusIntfPtr;
ftpThread *hybridRxIntfPtr;
ftpThread *saveImageIntfPtr;
@ -42,7 +45,11 @@ xmlInterface *xmlIntfPtr;
logBook *logBookPtr;
fileWatcher *fileWatcherPtr;
int fftNumBlocks=2;
bool useHybrid;
bool inStartup;
@ -78,6 +85,7 @@ void globalInit()
void globalEnd(void)
{
logFilePtr->writeSettings();
logFilePtr->close();
}

Wyświetl plik

@ -15,7 +15,7 @@ class xmlInterface;
class logBook;
class dispatcher;
class fileWatcher;
class ftpInterface;
class ftpThread;
enum etransmissionMode {TRXSSTV,TRXDRM,TRXNOMODE};
@ -50,18 +50,23 @@ extern xmlInterface *xmlIntfPtr;
extern configDialog *configDialogPtr;
extern logBook *logBookPtr;
extern int fftNumBlocks;
extern QPixmap *greenPXMPtr;
extern QPixmap *redPXMPtr;
extern logFile *logFilePtr;
extern bool useHybrid;
extern bool inStartup;
extern ftpInterface *notifyRXIntf;
extern ftpInterface *hybridTxIntf;
extern ftpInterface *notifyTXIntf;
extern ftpInterface *onlineStatusIntf;
extern ftpThread *notifyRXIntfPtr;
extern ftpThread *hybridTxIntfPtr;
extern ftpThread *notifyTXIntfPtr;
extern ftpThread *onlineStatusIntfPtr;
extern ftpThread *hybridRxIntfPtr;
extern ftpThread *saveImageIntfPtr;
extern etransmissionMode transmissionModeIndex; // SSTV , DRM

Wyświetl plik

@ -1,3 +1,24 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "baseconfig.h"
baseConfig::baseConfig(QWidget *parent):QWidget(parent)

Wyświetl plik

@ -4,7 +4,7 @@
#include <QString>
#include <QWidget>
#include <QSettings>
#include "utils/supportfunctions.h"
#include "supportfunctions.h"
class baseConfig: public QWidget
{

Wyświetl plik

@ -1,3 +1,23 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "configdialog.h"
#include "ui_configdialog.h"
#include "gallerywidget.h"
@ -28,7 +48,6 @@ void configDialog::readSettings()
ui->ftpWidget->readSettings();
ui->guiWidget->readSettings();
ui->hybridWidget->readSettings();
ui->hybridNotifyWidget->readSettings();
ui->operatorWidget->readSettings();
ui->repeaterWidget->readSettings();
ui->catWidget->readSettings();
@ -47,7 +66,6 @@ void configDialog::writeSettings()
ui->ftpWidget->writeSettings();
ui->repeaterWidget->writeSettings();
ui->hybridWidget->writeSettings();
ui->hybridNotifyWidget->writeSettings();
ui->drmProfilesWidget->writeSettings();
ui->cwWidget->writeSettings();
ui->waterfallWidget->writeSettings();

Wyświetl plik

@ -32,7 +32,7 @@
<item>
<widget class="QTabWidget" name="configTabWidget">
<property name="currentIndex">
<number>2</number>
<number>10</number>
</property>
<widget class="QWidget" name="operatorTab">
<attribute name="title">
@ -284,31 +284,6 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="notifyTab">
<attribute name="title">
<string>Notifications</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_11a">
<property name="spacing">
<number>1</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="hybridNotifyConfig" name="hybridNotifyWidget" native="true"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="profilesTab">
<attribute name="title">
<string>DRM Profiles</string>
@ -446,12 +421,6 @@
<header>frequencyselectwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>hybridNotifyConfig</class>
<extends>QWidget</extends>
<header>hybridnotifyconfig.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>

Wyświetl plik

@ -7,7 +7,6 @@
#include "ftpconfig.h"
#include "guiconfig.h"
#include "hybridconfig.h"
#include "hybridnotifyconfig.h"
#include "operatorconfig.h"
#include "repeaterconfig.h"
#include "rigconfig.h"

Wyświetl plik

@ -1,3 +1,24 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "cwconfig.h"
#include "ui_cwconfig.h"

Wyświetl plik

@ -1,3 +1,24 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "directoriesconfig.h"
#include "ui_directoriesconfig.h"
@ -39,10 +60,10 @@ void directoriesConfig::readSettings()
rxSSTVImagesPath=qSettings.value("rxSSTVImagesPath",QString(getenv("HOME"))+"/qsstv/rx_sstv/").toString();
rxDRMImagesPath=qSettings.value("rxDRMImagesPath",QString(getenv("HOME"))+"/qsstv/rx_drm/").toString();
txSSTVImagesPath=qSettings.value("txSSTVImagesPath",QString(getenv("HOME"))+"/qsstv/tx_sstv/").toString();
txDRMImagesPath=qSettings.value("txDRMImagesPath",QString(getenv("HOME"))+"/tx_drm/").toString();
txStockImagesPath=qSettings.value("txStockImagesPath",QString(getenv("HOME"))+"/tx_stock/").toString();
templatesPath=qSettings.value("templatesPath",QString(getenv("HOME"))+"/templates/").toString();
audioPath=qSettings.value("audioPath",QString(getenv("HOME"))+"/audio/").toString();
txDRMImagesPath=qSettings.value("txDRMImagesPath",QString(getenv("HOME"))+"/qsstv/tx_drm/").toString();
txStockImagesPath=qSettings.value("txStockImagesPath",QString(getenv("HOME"))+"/qsstv/tx_stock/").toString();
templatesPath=qSettings.value("templatesPath",QString(getenv("HOME"))+"/qsstv/templates/").toString();
audioPath=qSettings.value("audioPath",QString(getenv("HOME"))+"/qsstv/audio/").toString();
docURL=qSettings.value("docURL","http://users.telenet.be/on4qz/qsstv/manual").toString();
saveTXimages=qSettings.value("saveTXimages",false).toBool();
qSettings.endGroup();

Wyświetl plik

@ -1,6 +1,27 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "drmprofileconfig.h"
#include "ui_drmprofileconfig.h"
#include "utils/supportfunctions.h"
#include "supportfunctions.h"
#include "configparams.h"
sprofile drmPFArray[NUMBEROFPROFILES];
@ -173,6 +194,7 @@ bool drmProfileConfig::getDRMParams(int idx,drmTxParams &d)
return false;
}
d=drmPFArray[idx].params;
d.callsign=myCallsign;
return true;
}

Wyświetl plik

@ -1,6 +1,6 @@
#ifndef DRMPROFILECONFIG_H
#define DRMPROFILECONFIG_H
#include "drmtx/drmparams.h"
#include "drmparams.h"
#include "baseconfig.h"

Wyświetl plik

@ -135,10 +135,7 @@
</item>
<item row="0" column="3">
<widget class="QComboBox" name="drmPF1BandwidthComboBox">
<property name="currentText">
<string>2.2 kHz</string>
</property>
<item>
<item>
<property name="text">
<string>2.2 kHz</string>
</property>
@ -404,10 +401,7 @@
</item>
<item row="0" column="3">
<widget class="QComboBox" name="drmPF2BandwidthComboBox">
<property name="currentText">
<string>2.2 kHz</string>
</property>
<item>
<item>
<property name="text">
<string>2.2 kHz</string>
</property>
@ -673,10 +667,7 @@
</item>
<item row="0" column="3">
<widget class="QComboBox" name="drmPF3BandwidthComboBox">
<property name="currentText">
<string>2.2 kHz</string>
</property>
<item>
<item>
<property name="text">
<string>2.2 kHz</string>
</property>

Wyświetl plik

@ -1,9 +1,31 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "frequencyselectwidget.h"
#include "ui_frequencyselectwidget.h"
QStringList freqList;
QStringList modeList;
QStringList sbModeList;
QStringList passBandList;
QString additionalCommand;
bool additionalCommandHex;
@ -12,9 +34,9 @@ frequencySelectWidget::frequencySelectWidget(QWidget *parent) :baseConfig(parent
{
ui->setupUi(this);
QStringList sl;
sl<<"Frequencyy"<<"Mode"<<"Modulation";
sl<<"Frequencyy"<<"Mode"<<"Modulation"<<"Passband";
ui->tableWidget->setAlternatingRowColors (false);
ui->tableWidget->setColumnCount(3);
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setHorizontalHeaderLabels(sl);
connect(ui->tableWidget,SIGNAL(itemChanged(QTableWidgetItem *)),this,SLOT(slotItemChanged()));
connect(ui->tableWidget,SIGNAL(cellClicked(int,int)),this,SLOT(slotCellClicked(int,int)));
@ -34,19 +56,31 @@ frequencySelectWidget::~frequencySelectWidget()
void frequencySelectWidget::readSettings()
{
int i;
QSettings qSettings;
qSettings.beginGroup("FREQSELECT");
freqList=qSettings.value("frequencyList",QStringList()).toStringList();
modeList=qSettings.value("modeList",QStringList()).toStringList();
sbModeList=qSettings.value("sbModeList",QStringList()).toStringList();
passBandList=qSettings.value("passBandList",QStringList()).toStringList();
additionalCommand=qSettings.value("additionalCommand",QString()).toString();
additionalCommandHex=qSettings.value("additionalCommandHex",false).toBool();
if(passBandList.count()!=freqList.count())
{
passBandList.clear();
for(i=0;i<freqList.count();i++)
{
passBandList<<"Normal";
}
}
if(modeList.count()!=freqList.count() || sbModeList.count()!=freqList.count())
{
// invalid config
freqList.clear();
modeList.clear();
sbModeList.clear();
passBandList.clear();
}
setParams();
qSettings.endGroup();
@ -60,6 +94,7 @@ void frequencySelectWidget::writeSettings()
qSettings.setValue("frequencyList",freqList);
qSettings.setValue("modeList",modeList);
qSettings.setValue("sbModeList",sbModeList);
qSettings.setValue("passBandList",passBandList);
qSettings.setValue("additionalCommand",additionalCommand);
qSettings.setValue("additionalCommandHex",additionalCommandHex);
qSettings.endGroup();
@ -85,6 +120,7 @@ void frequencySelectWidget::constructTable()
freqList.takeAt(i);
modeList.takeAt(i);
sbModeList.takeAt(i);
passBandList.takeAt(i);
ui->tableWidget->setRowCount(freqList.count());
}
}
@ -97,6 +133,8 @@ void frequencySelectWidget:: getParams()
freqList.clear();
modeList.clear();
sbModeList.clear();
passBandList.clear();
for(i=0;i<ui->tableWidget->rowCount();i++)
{
ui->tableWidget->item(i,0)->text().toDouble(&ok);
@ -111,6 +149,7 @@ void frequencySelectWidget:: getParams()
freqList.append(ui->tableWidget->item(i,0)->text());
modeList.append(((QComboBox *)ui->tableWidget->cellWidget(i,1))->currentText());
sbModeList.append(((QComboBox *)ui->tableWidget->cellWidget(i,2))->currentText());
passBandList.append(((QComboBox *)ui->tableWidget->cellWidget(i,3))->currentText());
}
getValue(additionalCommand,ui->additionalCommandLineEdit);
getValue(additionalCommandHex,ui->additionalCommandHexCheckBox);
@ -134,6 +173,7 @@ void frequencySelectWidget::slotFreqAdd()
freqList.append("");
modeList.append("SSTV");
sbModeList.append("LSB");
passBandList.append("Normal");
createEntry(freqList.count()-1);
}
@ -199,7 +239,7 @@ void frequencySelectWidget::slotFreqDown()
void frequencySelectWidget::createEntry(int row)
{
QComboBox *cb, *sb;
QComboBox *cb, *sb, *pb;
QTableWidgetItem *ct;
if(row>(ui->tableWidget->rowCount()-1))
{
@ -223,10 +263,23 @@ void frequencySelectWidget::createEntry(int row)
sb->addItem("USB");
sb->addItem("FM");
sb->addItem("AM");
sb->addItem("PKTLSB");
sb->addItem("PKTUSB");
sb->addItem("PKTFM");
// sb->setCurrentText(sbModeList.at(row));
setValue(sbModeList.at(row),sb);
ui->tableWidget->setCellWidget(row,2,sb);
pb=new QComboBox(this);
pb->addItem("Normal");
pb->addItem("Wide");
pb->addItem("Narrow");
// sb->setCurrentText(sbModeList.at(row));
setValue(passBandList.at(row),pb);
ui->tableWidget->setCellWidget(row,3,pb);
connect(cb,SIGNAL(currentIndexChanged(int)),SLOT(slotItemChanged()));
connect(sb,SIGNAL(currentIndexChanged(int)),SLOT(slotItemChanged()));
ui->tableWidget->blockSignals(false);

Wyświetl plik

@ -7,6 +7,7 @@
extern QStringList freqList;
extern QStringList modeList;
extern QStringList sbModeList;
extern QStringList passBandList;
extern QString additionalCommand;
extern bool additionalCommandHex;

Wyświetl plik

@ -127,8 +127,10 @@
<property name="plainText">
<string>Enter the frequency in MHz and select the mode.
Example:
14.230 SSTV USB
7.058 DRM LSB</string>
14.230 SSTV USB Wide
7.058 DRM PKTUSB Normal
Passband is not used when PKTxxx is selected (at least not on ICOM)</string>
</property>
</widget>
</item>

Wyświetl plik

@ -1,9 +1,32 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "ftpconfig.h"
#include "appglobal.h"
#include "ui_ftpconfig.h"
#include "ftp.h"
#include "ftpfunctions.h"
#include <QImageWriter>
#include <QMessageBox>
#include <QDebug>
bool enableFTP;
@ -16,6 +39,7 @@ QString ftpPassword;
QString ftpDefaultImageFormat;
eftpSaveFormat ftpSaveFormat;
int ftpNumImages;
bool addExtension;
ftpConfig::ftpConfig(QWidget *parent) : baseConfig (parent), ui(new Ui::ftpConfig)
{
@ -47,7 +71,9 @@ void ftpConfig::readSettings()
ftpDefaultImageFormat=qSettings.value("ftpDefaultImageFormat","png").toString();
ftpSaveFormat=(eftpSaveFormat)qSettings.value("ftpSaveFormat",0).toInt();
ftpNumImages=qSettings.value("ftpNumImages",30).toInt();
addExtension=qSettings.value("addExtension",false).toBool();
qSettings.endGroup();
setParams();
}
@ -66,6 +92,8 @@ void ftpConfig::writeSettings()
qSettings.setValue("ftpDefaultImageFormat",ftpDefaultImageFormat);
qSettings.setValue("ftpSaveFormat",(int)ftpSaveFormat);
qSettings.setValue("ftpNumImages",ftpNumImages);
qSettings.setValue("addExtension",addExtension);
qSettings.endGroup();
}
@ -91,13 +119,14 @@ void ftpConfig::getParams()
getValue(ftpLogin,ui->ftpLoginLineEdit);
getValue(ftpPassword,ui->ftpPasswordLineEdit);
getValue(ftpDefaultImageFormat,ui->ftpDefaultImageFormatComboBox);
getValue(addExtension,ui->addExtensionCheckBox);
if(ui->imageRadioButton->isChecked())
{
ftpSaveFormat=FTPIM;
ftpSaveFormat=FTPIMAGESEQUENCE;
}
else
{
ftpSaveFormat=FTPFILE;
ftpSaveFormat=FTPFILENAME;
}
changed=false;
if(enableFTPCopy!=enableFTP
@ -122,7 +151,7 @@ void ftpConfig::setParams()
setValue(ftpRemoteDRMDirectory,ui->remoteDRMDirectoryLineEdit);
setValue(ftpLogin,ui->ftpLoginLineEdit);
setValue(ftpPassword,ui->ftpPasswordLineEdit);
if(ftpSaveFormat==FTPIM)
if(ftpSaveFormat==FTPIMAGESEQUENCE)
{
ui->imageRadioButton->setChecked(true);
}
@ -131,23 +160,31 @@ void ftpConfig::setParams()
ui->filenameRadioButton->setChecked(true);
}
setValue(ftpDefaultImageFormat,ui->ftpDefaultImageFormatComboBox);
setValue(addExtension,ui->addExtensionCheckBox);
}
void ftpConfig::slotTestFTPPushButton()
{
QString r1,r2;
eftpError result;
ftpFunctions ff;
QString resultSSTVStr;
QString resultDRMStr;
QApplication::setOverrideCursor(Qt::WaitCursor);
ftpInterface fInt("TestUploadConnection");
ui->testFTPPushButton->setDisabled(true);
getParams();
fInt.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteSSTVDirectory);
r1=fInt.execFTPTest();
fInt.init();
fInt.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteDRMDirectory);
r2=fInt.execFTPTest();
ff.test("Ftp Test sstvdir",ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteSSTVDirectory,true);
result=ff.getLastErrorStr(resultSSTVStr);
if(result==FTPOK)
{
// qDebug() << "secondTest()";
ff.test("Ftp Test drmdir",ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteDRMDirectory,false);
ff.getLastErrorStr(resultDRMStr);
}
QApplication::restoreOverrideCursor();
ui->testFTPPushButton->setDisabled(false);
QMessageBox::information(this,"Testing Connection","",QString("SSTV: %1\nDRM: %2").arg(r1).arg(r2));
QMessageBox::information(this,"FTP Site Test",resultSSTVStr+"\n"+resultDRMStr,QMessageBox::Ok);
}

Wyświetl plik

@ -7,7 +7,7 @@
#define NUMFTPRXIMAGES 30
enum eftpSaveFormat {FTPIM,FTPFILE};
enum eftpSaveFormat {FTPIMAGESEQUENCE,FTPFILENAME};
extern bool enableFTP;
extern int ftpPort;
@ -19,6 +19,8 @@ extern QString ftpPassword;
extern QString ftpFilename;
extern QString ftpDefaultImageFormat;
extern eftpSaveFormat ftpSaveFormat;
extern bool addExtension;
extern int ftpNumImages;

Wyświetl plik

@ -501,6 +501,13 @@
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="addExtensionCheckBox">
<property name="text">
<string>add image format extension</string>
</property>
</widget>
</item>
</layout>
</item>
<item>

Wyświetl plik

@ -1,3 +1,24 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "guiconfig.h"
#include "ui_guiconfig.h"
#include <QImageWriter>
@ -11,6 +32,8 @@ QColor backGroundColor;
QColor imageBackGroundColor;
bool slowCPU;
bool lowRes;
bool confirmDeletion;
bool confirmClose;
guiConfig::guiConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::guiConfig)
{
@ -32,10 +55,12 @@ void guiConfig::readSettings()
galleryRows=qSettings.value("galleryRows",4).toInt();
galleryColumns=qSettings.value("galleryColumns",4).toInt();
imageStretch=qSettings.value("imageStretch",true).toBool();
backGroundColor=qSettings.value("backGroundColor",QColor(128,128,128)).value<QColor>();
imageBackGroundColor=qSettings.value("imageBackGroundColor",QColor(0,0,128)).value<QColor>();
backGroundColor=qSettings.value("backGroundColor",QColor(0,86,230)).value<QColor>();
imageBackGroundColor=qSettings.value("imageBackGroundColor",QColor(128,128,128)).value<QColor>();
slowCPU=qSettings.value("slowCPU",false).toBool();
lowRes=qSettings.value("lowRes",false).toBool();
confirmDeletion=qSettings.value("confirmDeletion",true).toBool();
confirmClose=qSettings.value("confirmClose",true).toBool();
qSettings.endGroup();
setParams();
}
@ -52,6 +77,10 @@ void guiConfig::writeSettings()
qSettings.setValue("imageBackGroundColor",imageBackGroundColor);
qSettings.setValue("slowCPU",slowCPU);
qSettings.setValue("lowRes",lowRes);
qSettings.setValue("confirmDeletion",confirmDeletion);
qSettings.setValue("confirmClose",confirmClose);
qSettings.endGroup();
}
@ -67,6 +96,10 @@ void guiConfig::getParams()
getValue(imageStretch,ui->stretchCheckBox);
getValue(slowCPU,ui->slowCPUCheckBox);
getValue(lowRes,ui->lowResCheckBox);
getValue(confirmDeletion,ui->confirmDeletionCheckBox);
getValue(confirmClose,ui->confirmCloseCheckBox);
}
void guiConfig::setParams()
@ -78,6 +111,8 @@ void guiConfig::setParams()
setColorLabel(imageBackGroundColor,true);
setValue(slowCPU,ui->slowCPUCheckBox);
setValue(lowRes,ui->lowResCheckBox);
setValue(confirmDeletion,ui->confirmDeletionCheckBox);
setValue(confirmClose,ui->confirmCloseCheckBox);
}

Wyświetl plik

@ -12,6 +12,8 @@ extern QColor backGroundColor;
extern QColor imageBackGroundColor;
extern bool slowCPU;
extern bool lowRes;
extern bool confirmDeletion;
extern bool confirmClose;
namespace Ui
{

Wyświetl plik

@ -171,7 +171,7 @@
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Exit and restart QSSTV If slow CPU or Low Resolution has changed.</string>
<string>Exit and restart QSSTV If slow CPU or Low Resolution have changed.</string>
</property>
</widget>
</item>
@ -247,6 +247,20 @@
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="confirmDeletionCheckBox">
<property name="text">
<string>Ask for confirmation when deleting file </string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="confirmCloseCheckBox">
<property name="text">
<string>Ask for confirmation when closing QSSTV</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">

Wyświetl plik

@ -1,6 +1,27 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "hybridconfig.h"
#include "ui_hybridconfig.h"
#include "ftp.h"
#include "ftpfunctions.h"
#include "hybridcrypt.h"
#include <QMessageBox>
@ -14,108 +35,139 @@ QString hybridFtpLogin;
QString hybridFtpPassword;
QString hybridFtpHybridFilesDirectory;
bool enableHybridNotify;
QString hybridNotifyDir;
QString onlineStatusDir;
hybridConfig::hybridConfig(QWidget *parent) :baseConfig(parent), ui(new Ui::hybridConfig)
{
ui->setupUi(this);
// connect(testFTPPushButton,SIGNAL(clicked()),SLOT(slotTestFTPPushButton()));
connect(ui->testHybridPushButton,SIGNAL(clicked()),SLOT(slotTestHybridPushButton()));
ui->setupUi(this);
// connect(testFTPPushButton,SIGNAL(clicked()),SLOT(slotTestFTPPushButton()));
connect(ui->testHybridPushButton,SIGNAL(clicked()),SLOT(slotTestHybridPushButton()));
}
hybridConfig::~hybridConfig()
{
delete ui;
delete ui;
}
void hybridConfig::readSettings()
{
QSettings qSettings;
qSettings.beginGroup("HYBRID");
enableHybridRx=qSettings.value("enableHybridRx",true).toBool();
// enableSpecialServer=qSettings.value("enableSpecialServer",false).toBool();
hybridFtpPort=qSettings.value("hybridFtpPort",21).toInt();
hybridFtpRemoteHost=qSettings.value("hybridFtpRemoteHost","").toString();
hybridFtpRemoteDirectory=qSettings.value("hybridFtpRemoteDirectory","").toString();
hybridFtpLogin=qSettings.value("hybridFtpLogin","").toString();
hybridFtpPassword=qSettings.value("hybridFtpPassword","").toString();
hybridFtpHybridFilesDirectory=qSettings.value("hybridFtpHybridFilesDirectory","HybridFiles1").toString();
QSettings qSettings;
qSettings.beginGroup("HYBRID");
enableHybridRx=qSettings.value("enableHybridRx",true).toBool();
hybridFtpPort=qSettings.value("hybridFtpPort",21).toInt();
hybridFtpRemoteHost=qSettings.value("hybridFtpRemoteHost","").toString();
hybridFtpRemoteDirectory=qSettings.value("hybridFtpRemoteDirectory","").toString();
hybridFtpLogin=qSettings.value("hybridFtpLogin","").toString();
hybridFtpPassword=qSettings.value("hybridFtpPassword","").toString();
hybridFtpHybridFilesDirectory=qSettings.value("hybridFtpHybridFilesDirectory","HybridFiles1").toString();
hybridNotifyDir=qSettings.value("hybridNotifyDirectory","RxOkNotifications1").toString();
onlineStatusDir=qSettings.value("onlineStatusDirectory","OnlineCallsigns1").toString();
enableHybridNotify=qSettings.value("enableHybridNotify",true).toBool();
qSettings.endGroup();
setParams();
qSettings.endGroup();
setParams();
}
void hybridConfig::writeSettings()
{
QSettings qSettings;
getParams();
qSettings.beginGroup("HYBRID");
qSettings.setValue("enableHybridRx",enableHybridRx);
// qSettings.setValue("enableSpecialServer",enableSpecialServer);
qSettings.setValue("hybridFtpPort",hybridFtpPort);
qSettings.setValue("hybridFtpRemoteHost",hybridFtpRemoteHost);
qSettings.setValue("hybridFtpRemoteDirectory",hybridFtpRemoteDirectory);
qSettings.setValue("hybridFtpLogin",hybridFtpLogin);
qSettings.setValue("hybridFtpPassword",hybridFtpPassword);
qSettings.setValue("hybridFtpHybridFilesDirectory",hybridFtpHybridFilesDirectory);
qSettings.endGroup();
QSettings qSettings;
getParams();
qSettings.beginGroup("HYBRID");
qSettings.setValue("enableHybridRx",enableHybridRx);
qSettings.setValue("hybridFtpPort",hybridFtpPort);
qSettings.setValue("hybridFtpRemoteHost",hybridFtpRemoteHost);
qSettings.setValue("hybridFtpRemoteDirectory",hybridFtpRemoteDirectory);
qSettings.setValue("hybridFtpLogin",hybridFtpLogin);
qSettings.setValue("hybridFtpPassword",hybridFtpPassword);
qSettings.setValue("hybridFtpHybridFilesDirectory",hybridFtpHybridFilesDirectory);
qSettings.setValue("enableHybridNotify",enableHybridNotify);
qSettings.setValue("hybridNotifyDir",hybridNotifyDir);
qSettings.setValue("onlineStatusDir",onlineStatusDir);
qSettings.endGroup();
}
void hybridConfig::getParams()
{
bool enableHybridRxCopy=enableHybridRx;
// bool enableSpecialServerCopy=enableSpecialServer;
int hybridFtpPortCopy=hybridFtpPort;
QString hybridFtpRemoteHostCopy=hybridFtpRemoteHost;
QString hybridFtpRemoteDirectoryCopy=hybridFtpRemoteDirectory;
QString hybridFtpLoginCopy=hybridFtpLogin;
QString hybridFtpPasswordCopy=hybridFtpPassword;
getValue(enableHybridRx,ui->enableHybridRxCheckBox);
// getValue(enableSpecialServer,ui->enableSpecialServerCheckBox);
getValue(hybridFtpPort,ui->hybridFtpPortSpinBox);
getValue(hybridFtpRemoteHost,ui->hybridRemoteHostLineEdit);
getValue(hybridFtpRemoteDirectory,ui->hybridRemoteDirectoryLineEdit);
getValue(hybridFtpLogin,ui->hybridFtpLoginLineEdit);
getValue(hybridFtpPassword,ui->hybridFtpPasswordLineEdit);
getValue(hybridFtpHybridFilesDirectory,ui->hybridFilesDirectoryLineEdit);
changed=false;
if( enableHybridRxCopy!=enableHybridRx
// || enableSpecialServerCopy!=enableSpecialServer
|| hybridFtpPortCopy!=hybridFtpPort
|| hybridFtpRemoteHostCopy!=hybridFtpRemoteHost
|| hybridFtpRemoteDirectoryCopy!=hybridFtpRemoteDirectory
|| hybridFtpLoginCopy!=hybridFtpLogin
|| hybridFtpPasswordCopy!=hybridFtpPassword)
changed=true;
bool enableHybridRxCopy=enableHybridRx;
bool enableHybridNotifyCopy=enableHybridNotify;
int hybridFtpPortCopy=hybridFtpPort;
QString hybridFtpRemoteHostCopy=hybridFtpRemoteHost;
QString hybridFtpRemoteDirectoryCopy=hybridFtpRemoteDirectory;
QString hybridFtpLoginCopy=hybridFtpLogin;
QString hybridFtpPasswordCopy=hybridFtpPassword;
QString hybridNotifyDirCopy=hybridNotifyDir;
QString onlineStatusDirCopy=onlineStatusDir;
getValue(enableHybridRx,ui->enableHybridRxCheckBox);
getValue(hybridFtpPort,ui->hybridFtpPortSpinBox);
getValue(hybridFtpRemoteHost,ui->hybridRemoteHostLineEdit);
getValue(hybridFtpRemoteDirectory,ui->hybridRemoteDirectoryLineEdit);
getValue(hybridFtpLogin,ui->hybridFtpLoginLineEdit);
getValue(hybridFtpPassword,ui->hybridFtpPasswordLineEdit);
getValue(hybridFtpHybridFilesDirectory,ui->hybridFilesDirectoryLineEdit);
getValue(enableHybridNotify,ui->enableHybridNotifyCheckBox);
getValue(hybridNotifyDir,ui->hybridNotifyDirLineEdit);
getValue(onlineStatusDir,ui->onlineStatusDirLineEdit);
changed=false;
if( enableHybridRxCopy!=enableHybridRx
// || enableSpecialServerCopy!=enableSpecialServer
|| hybridFtpPortCopy!=hybridFtpPort
|| hybridFtpRemoteHostCopy!=hybridFtpRemoteHost
|| hybridFtpRemoteDirectoryCopy!=hybridFtpRemoteDirectory
|| hybridFtpLoginCopy!=hybridFtpLogin
|| hybridFtpPasswordCopy!=hybridFtpPassword
|| enableHybridNotifyCopy!=enableHybridNotify
|| hybridNotifyDirCopy!=hybridNotifyDir
|| onlineStatusDirCopy!=onlineStatusDir
)
changed=true;
}
void hybridConfig::setParams()
{
setValue(enableHybridRx,ui->enableHybridRxCheckBox);
// setValue(enableSpecialServer,ui->enableSpecialServerCheckBox);
setValue(hybridFtpPort,ui->hybridFtpPortSpinBox);
setValue(hybridFtpRemoteHost,ui->hybridRemoteHostLineEdit);
setValue(hybridFtpRemoteDirectory,ui->hybridRemoteDirectoryLineEdit);
setValue(hybridFtpLogin,ui->hybridFtpLoginLineEdit);
setValue(hybridFtpPassword,ui->hybridFtpPasswordLineEdit);
setValue(hybridFtpHybridFilesDirectory,ui->hybridFilesDirectoryLineEdit);
setValue(enableHybridRx,ui->enableHybridRxCheckBox);
setValue(hybridFtpPort,ui->hybridFtpPortSpinBox);
setValue(hybridFtpRemoteHost,ui->hybridRemoteHostLineEdit);
setValue(hybridFtpRemoteDirectory,ui->hybridRemoteDirectoryLineEdit);
setValue(hybridFtpLogin,ui->hybridFtpLoginLineEdit);
setValue(hybridFtpPassword,ui->hybridFtpPasswordLineEdit);
setValue(hybridFtpHybridFilesDirectory,ui->hybridFilesDirectoryLineEdit);
setValue(enableHybridNotify,ui->enableHybridNotifyCheckBox);
setValue(hybridNotifyDir,ui->hybridNotifyDirLineEdit);
setValue(onlineStatusDir,ui->onlineStatusDirLineEdit);
}
void hybridConfig::slotTestHybridPushButton()
{
QString msg;
ftpInterface fInt("TestHybridConnection");
ui->testHybridPushButton->setDisabled(true);
getParams();
fInt.setupConnection(hybridFtpRemoteHost,hybridFtpPort,hybridFtpLogin,hybridFtpPassword,hybridFtpRemoteDirectory+"/"+hybridFtpHybridFilesDirectory);
// fInt.setupConnection(hc.host(),hc.port(),hc.user(),hc.passwd(),hc.dir()+"/"+hybridFtpHybridFilesDirectory);
msg=fInt.execFTPTest();
ui->testHybridPushButton->setDisabled(false);
QMessageBox::information(this,"Test Connection",msg);
ftpFunctions ff;
QString resultStr1;
QString resultStr2;
QString resultStr3;
QApplication::setOverrideCursor(Qt::WaitCursor);
ui->testHybridPushButton->setDisabled(true);
getParams();
ff.test("Hybrid Ftp Test",hybridFtpRemoteHost,hybridFtpPort,hybridFtpLogin,hybridFtpPassword,hybridFtpRemoteDirectory+"/"+hybridFtpHybridFilesDirectory,true);
ff.getLastErrorStr(resultStr1);
ff.test("Notify Ftp Test",hybridFtpRemoteHost,hybridFtpPort,hybridFtpLogin,hybridFtpPassword,hybridFtpRemoteDirectory+"/"+hybridNotifyDir,false);
ff.getLastErrorStr(resultStr2);
ff.test("OnlineStus Ftp Test",hybridFtpRemoteHost,hybridFtpPort,hybridFtpLogin,hybridFtpPassword,hybridFtpRemoteDirectory+"/"+onlineStatusDir,false);
ff.getLastErrorStr(resultStr3);
QApplication::restoreOverrideCursor();
ui->testHybridPushButton->setDisabled(false);
QMessageBox::information(this,"FTP Site Test",QString("%1\n%2\n%3").arg(resultStr1).arg(resultStr2).arg(resultStr3),QMessageBox::Ok);
}

Wyświetl plik

@ -4,7 +4,7 @@
#include "baseconfig.h"
extern bool enableHybridRx;
//extern bool enableSpecialServer;
extern int hybridFtpPort;
extern QString hybridFtpRemoteHost;
extern QString hybridFtpRemoteDirectory;
@ -12,6 +12,10 @@ extern QString hybridFtpLogin;
extern QString hybridFtpPassword;
extern QString hybridFtpHybridFilesDirectory;
extern bool enableHybridNotify;
extern QString hybridNotifyDir;
extern QString onlineStatusDir;
namespace Ui {
class hybridConfig;

Wyświetl plik

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>730</width>
<height>372</height>
<width>681</width>
<height>573</height>
</rect>
</property>
<property name="windowTitle">
@ -15,70 +15,69 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="enableHybridRxCheckBox">
<property name="text">
<string>Enable Reception in Hybrid Mode </string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QCheckBox" name="enableHybridRxCheckBox">
<property name="text">
<string>Enable Reception in Hybrid Mode </string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="ftpPortLabel_2">
<property name="text">
<string>FTP Port</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="hybridFtpPortSpinBox">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="enableHybridNotifyCheckBox">
<property name="text">
<string>Send RX Notifications in Hybrid Mode</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="ftpPortLabel_2">
<property name="text">
<string>FTP Port</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="hybridFtpPortSpinBox">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<width>40</width>
<height>20</height>
</size>
</property>
@ -87,293 +86,192 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_2">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="4,2">
<item>
<widget class="QLabel" name="hybridRemoteHostLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Host</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
<layout class="QGridLayout" name="gridLayout">
<item row="5" column="0">
<widget class="QLabel" name="hybridNotifyDirLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Notifications Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="hybridNotifyDirLineEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="hybridFtpLoginLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Login</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="hybridFtpLoginLineEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="hybridPasswordLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Password</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="hybridFtpPasswordLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="hybridRemoteDirectoryLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="hybridRemoteDirectoryLineEdit"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="hybridFilesRemoteDirectoryLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Hybrid Files Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="hybridFilesDirectoryLineEdit"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="hybridRemoteHostLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Host</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="hybridRemoteHostLineEdit"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="hybridNotifyDirLabel_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Online Status Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="onlineStatusDirLineEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QLineEdit" name="hybridRemoteHostLineEdit"/>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_7">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridFtpLoginLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Login</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridFtpLoginLineEdit"/>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_6">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridPasswordLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Password</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridFtpPasswordLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_8">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridRemoteDirectoryLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridRemoteDirectoryLineEdit"/>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_9">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridRemoteDirectoryLabel_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Hybrid Files Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridFilesDirectoryLineEdit"/>
</item>
<item>
<spacer>
<spacer name="spacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>

Wyświetl plik

@ -1,123 +0,0 @@
#include "hybridnotifyconfig.h"
#include "ui_hybridnotifyconfig.h"
#include "ftp.h"
#include <QMessageBox>
bool enableHybridNotify;
bool enableHybridNotifySnoop;
int hybridNotifyPort;
QString hybridNotifyRemoteHost;
QString hybridNotifyRemoteDir;
QString hybridNotifyLogin;
QString hybridNotifyPassword;
QString hybridNotifyDir;
hybridNotifyConfig::hybridNotifyConfig(QWidget *parent) :baseConfig(parent), ui(new Ui::hybridNotifyConfig)
{
ui->setupUi(this);
// connect(testFTPPushButton,SIGNAL(clicked()),SLOT(slotTestFTPPushButton()));
connect(ui->testNotifyPushButton,SIGNAL(clicked()),SLOT(slotTestNotifyPushButton()));
}
hybridNotifyConfig::~hybridNotifyConfig()
{
delete ui;
}
void hybridNotifyConfig::readSettings()
{
QSettings qSettings;
qSettings.beginGroup("HYBRID_NOTIFY");
enableHybridNotify=qSettings.value("enableHybridNotify",true).toBool();
enableHybridNotifySnoop=qSettings.value("enableHybridNotifySnoop",true).toBool();
hybridNotifyPort=qSettings.value("hybridNotifyPort",21).toInt();
hybridNotifyRemoteHost=qSettings.value("hybridNotifyRemoteHost","").toString();
hybridNotifyRemoteDir=qSettings.value("hybridNotifyRemoteDir","").toString();
hybridNotifyLogin=qSettings.value("hybridNotifyLogin","").toString();
hybridNotifyPassword=qSettings.value("hybridNotifyPassword","").toString();
hybridNotifyDir=qSettings.value("hybridNotifyDirectory","RxOkNotifications1").toString();
qSettings.endGroup();
setParams();
}
void hybridNotifyConfig::writeSettings()
{
QSettings qSettings;
getParams();
qSettings.beginGroup("HYBRID_NOTIFY");
qSettings.setValue("enableHybridNotify",enableHybridNotify);
qSettings.setValue("enableHybridNotifySnoop",enableHybridNotifySnoop);
qSettings.setValue("hybridNotifyPort",hybridNotifyPort);
qSettings.setValue("hybridNotifyRemoteHost",hybridNotifyRemoteHost);
qSettings.setValue("hybridNotifyRemoteDir",hybridNotifyRemoteDir);
qSettings.setValue("hybridNotifyLogin",hybridNotifyLogin);
qSettings.setValue("hybridNotifyPassword",hybridNotifyPassword);
qSettings.setValue("hybridNotifyDir",hybridNotifyDir);
qSettings.endGroup();
}
void hybridNotifyConfig::getParams()
{
bool enableHybridNotifyCopy=enableHybridNotify;
bool enableHybridNotifySnoopCopy=enableHybridNotifySnoop;
int hybridNotifyPortCopy=hybridNotifyPort;
QString hybridNotifyRemoteHostCopy=hybridNotifyRemoteHost;
QString hybridNotifyRemoteDirCopy=hybridNotifyRemoteDir;
QString hybridNotifyDirCopy=hybridNotifyDir;
QString hybridNotifyLoginCopy=hybridNotifyLogin;
QString hybridNotifyPasswordCopy=hybridNotifyPassword;
getValue(enableHybridNotify,ui->enableHybridNotifyCheckBox);
getValue(enableHybridNotifySnoop,ui->enableHybridNotifySnoopCheckBox);
getValue(hybridNotifyPort,ui->hybridNotifyPortSpinBox);
getValue(hybridNotifyRemoteHost,ui->hybridNotifyRemoteHostLineEdit);
getValue(hybridNotifyRemoteDir,ui->hybridNotifyRemoteDirLineEdit);
getValue(hybridNotifyLogin,ui->hybridNotifyLoginLineEdit);
getValue(hybridNotifyPassword,ui->hybridNotifyPasswordLineEdit);
getValue(hybridNotifyDir,ui->hybridNotifyDirLineEdit);
changed=false;
if( enableHybridNotifyCopy!=enableHybridNotify
|| enableHybridNotifySnoopCopy!=enableHybridNotifySnoop
|| hybridNotifyPortCopy!=hybridNotifyPort
|| hybridNotifyRemoteHostCopy!=hybridNotifyRemoteHost
|| hybridNotifyRemoteDirCopy!=hybridNotifyRemoteDir
|| hybridNotifyDirCopy!=hybridNotifyDir
|| hybridNotifyLoginCopy!=hybridNotifyLogin
|| hybridNotifyPasswordCopy!=hybridNotifyPassword)
changed=true;
}
void hybridNotifyConfig::setParams()
{
setValue(enableHybridNotify,ui->enableHybridNotifyCheckBox);
setValue(enableHybridNotifySnoop,ui->enableHybridNotifySnoopCheckBox);
setValue(hybridNotifyPort,ui->hybridNotifyPortSpinBox);
setValue(hybridNotifyRemoteHost,ui->hybridNotifyRemoteHostLineEdit);
setValue(hybridNotifyRemoteDir,ui->hybridNotifyRemoteDirLineEdit);
setValue(hybridNotifyLogin,ui->hybridNotifyLoginLineEdit);
setValue(hybridNotifyPassword,ui->hybridNotifyPasswordLineEdit);
setValue(hybridNotifyDir,ui->hybridNotifyDirLineEdit);
}
void hybridNotifyConfig::slotTestNotifyPushButton()
{
QString msg;
ftpInterface fInt("TestNotifyConnection");
ui->testNotifyPushButton->setDisabled(true);
getParams();
fInt.setupConnection(hybridNotifyRemoteHost,hybridNotifyPort,
hybridNotifyLogin,hybridNotifyPassword,hybridNotifyRemoteDir+"/"+hybridNotifyDir);
msg=fInt.execFTPTest();
ui->testNotifyPushButton->setDisabled(false);
QMessageBox::information(this,"Test Connection",msg);
}

Wyświetl plik

@ -1,38 +0,0 @@
#ifndef HYBRIDNOTIFYCONFIG_H
#define HYBRIDNOTIFYCONFIG_H
#include "baseconfig.h"
extern bool enableHybridNotify;
extern bool enableHybridNotifySnoop;
extern int hybridNotifyPort;
extern QString hybridNotifyRemoteHost;
extern QString hybridNotifyRemoteDir;
extern QString hybridNotifyLogin;
extern QString hybridNotifyPassword;
extern QString hybridNotifyDir;
namespace Ui {
class hybridNotifyConfig;
}
class hybridNotifyConfig : public baseConfig
{
Q_OBJECT
public:
explicit hybridNotifyConfig(QWidget *parent = 0);
~hybridNotifyConfig();
void readSettings();
void writeSettings();
void getParams();
void setParams();
private slots:
void slotTestNotifyPushButton();
private:
Ui::hybridNotifyConfig *ui;
};
#endif // HYBRIDNOTIFYCONFIG_H

Wyświetl plik

@ -1,469 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>hybridNotifyConfig</class>
<widget class="QWidget" name="hybridNotifyConfig">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>806</width>
<height>388</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>1</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="enableHybridNotifyCheckBox">
<property name="text">
<string>Send RX Notifications in Hybrid Mode</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="enableHybridNotifySnoopCheckBox">
<property name="text">
<string>Check who else got it</string>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>28</width>
<height>24</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="ftpPortLabel_2">
<property name="text">
<string>FTP Port</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="hybridNotifyPortSpinBox">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_2">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridNotifyRemoteHostLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Host</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridNotifyRemoteHostLineEdit"/>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_7">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridNotifyLoginLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Login</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridNotifyLoginLineEdit"/>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_6">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridNotifyPasswordLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Password</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridNotifyPasswordLineEdit">
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_8">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridNotifyRemoteDirLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridNotifyRemoteDirLineEdit"/>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_9">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="hybridNotifyDirLabel_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>145</width>
<height>25</height>
</size>
</property>
<property name="text">
<string>Notifications Directory</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="hybridNotifyDirLineEdit"/>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,0,0">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="testNotifyPushButton">
<property name="text">
<string>Test connection</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="spacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>38</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

Wyświetl plik

@ -1,3 +1,24 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "operatorconfig.h"
#include "ui_operatorconfig.h"
@ -10,9 +31,13 @@ QString lastReceivedCall;
bool onlineStatusEnabled;
QString onlineStatusText;
operatorConfig::operatorConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::operatorConfig)
{
ui->setupUi(this);
QRegExp rx("^\\w*$");
QValidator *validator = new QRegExpValidator(rx, this);
ui->onlineStatusText->setValidator(validator);
}
operatorConfig::~operatorConfig()
@ -66,6 +91,11 @@ void operatorConfig::getParams()
getValue(myQth,ui->qthLineEdit);
getValue(myLocator,ui->locatorLineEdit);
getValue(onlineStatusText,ui->onlineStatusText);
getValue(onlineStatusEnabled,ui->onlineStatusCheckbox);
changed=false;

Wyświetl plik

@ -7,28 +7,13 @@
<x>0</x>
<y>0</y>
<width>680</width>
<height>272</height>
<height>279</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>1</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="_4">
<item>
@ -281,6 +266,13 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Use only a-z A_Z 0-9 and _ no spaces and no special characters</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
@ -296,7 +288,7 @@
<number>120</number>
</property>
<property name="placeholderText">
<string>antenna, radio, operating freq or other info</string>
<string>e.g. locator_antenna_power</string>
</property>
</widget>
</item>

Wyświetl plik

@ -1,21 +1,63 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "repeaterconfig.h"
#include "ui_repeaterconfig.h"
#include "directoriesconfig.h"
#include "drmparams.h"
bool repeaterEnable;
bool repeaterEnabled;
int repeaterImageInterval;
esstvMode repeaterTxMode;
esstvMode repeaterIdleTxMode;
QString repeaterImage1;
QString repeaterImage2;
QString repeaterImage3;
QString repeaterImage4;
QString repeaterAcknowledge;
QString repeaterTemplate;
QString idleTemplate;
QString repeaterIdleTemplate;
int repeaterTxDelay;
int repeaterImageSize; // in kB
repeaterConfig::repeaterConfig(QWidget *parent) : baseConfig(parent), ui(new Ui::repeaterConfig)
{
int i;
ui->setupUi(this);
ui->repeaterTxModeComboBox->addItem("Same as RX");
for(i=0;i<NUMSSTVMODES ;i++)
{
ui->repeaterTxModeComboBox->addItem(SSTVTable[i].name);
ui->repeaterIdleTxModeComboBox->addItem(SSTVTable[i].name);
}
connect(ui->rp1BrowseButton,SIGNAL(clicked()),SLOT(slotRp1Browse()));
connect(ui->rp2BrowseButton,SIGNAL(clicked()),SLOT(slotRp2Browse()));
connect(ui->rp3BrowseButton,SIGNAL(clicked()),SLOT(slotRp3Browse()));
connect(ui->rp4BrowseButton,SIGNAL(clicked()),SLOT(slotRp4Browse()));
connect(ui->repeaterIdleTemplateBrowseButton,SIGNAL(clicked()),SLOT(slotRepeaterIdleTemplateBrowse()));
connect(ui->repeaterTemplateBrowseButton,SIGNAL(clicked()),SLOT(slotRepeaterTemplateBrowse()));
ui->txDRMImageSizeSpinBox->setMinimum(MINDRMSIZE/1000);
ui->txDRMImageSizeSpinBox->setMaximum(MAXDRMSIZE/1000);
}
repeaterConfig::~repeaterConfig()
@ -28,15 +70,18 @@ void repeaterConfig::readSettings()
QSettings qSettings;
qSettings.beginGroup("REPEATER");
repeaterImageInterval=qSettings.value("repeaterImageInterval",10).toInt();
repeaterEnable=qSettings.value("repeaterEnable",false).toBool();
repeaterEnabled=qSettings.value("repeaterEnabled",false).toBool();
repeaterTxMode=(esstvMode)qSettings.value("repeaterTxMode",0).toInt();
repeaterIdleTxMode=(esstvMode)qSettings.value("repeaterIdleTxMode",0).toInt();
repeaterImage1=qSettings.value("repeaterImage1","").toString();
repeaterImage2=qSettings.value("repeaterImage2","").toString();
repeaterImage3=qSettings.value("repeaterImage3","").toString();
repeaterImage4=qSettings.value("repeaterImage4","").toString();
repeaterAcknowledge=qSettings.value("repeaterAcknowledge","").toString();
repeaterTemplate=qSettings.value("repeaterTemplate","").toString();
idleTemplate=qSettings.value("idleTemplate","").toString();
repeaterIdleTemplate=qSettings.value("repeaterIdleTemplate","").toString();
repeaterTxDelay=qSettings.value("repeaterTxDelay",5).toInt();
repeaterImageSize=qSettings.value("repeaterImageSize",10).toInt();
qSettings.endGroup();
setParams();
}
@ -47,64 +92,112 @@ void repeaterConfig::writeSettings()
getParams();
qSettings.beginGroup("REPEATER");
qSettings.setValue("repeaterImageInterval",repeaterImageInterval);
qSettings.setValue("repeaterEnable",repeaterEnable);
qSettings.setValue("repeaterEnabled",repeaterEnabled);
qSettings.setValue("repeaterTxMode",repeaterTxMode);
qSettings.setValue("repeaterIdleTxMode",repeaterIdleTxMode);
qSettings.setValue("repeaterImage1",repeaterImage1);
qSettings.setValue("repeaterImage2",repeaterImage2);
qSettings.setValue("repeaterImage3",repeaterImage3);
qSettings.setValue("repeaterImage4",repeaterImage4);
qSettings.setValue("repeaterAcknowledge",repeaterAcknowledge);
qSettings.setValue("repeaterTemplate",repeaterTemplate);
qSettings.setValue("idleTemplate",idleTemplate);
qSettings.setValue("repeaterIdleTemplate",repeaterIdleTemplate);
qSettings.setValue("repeaterTxDelay",repeaterTxDelay);
qSettings.setValue("repeaterImageSize",repeaterImageSize);
qSettings.endGroup();
}
void repeaterConfig::getParams()
{
int temp;
bool repeaterEnableCopy=repeaterEnable;
bool repeaterEnabledCopy=repeaterEnabled;
int repeaterImageIntervalCopy=repeaterImageInterval;
esstvMode repeaterTxModeCopy=repeaterTxMode;
esstvMode repeaterIdleTxModeCopy=repeaterIdleTxMode;
QString repeaterImage1Copy=repeaterImage1;
QString repeaterImage2Copy=repeaterImage2;
QString repeaterImage3Copy=repeaterImage3;
QString repeaterImage4Copy=repeaterImage4;
QString repeaterAcknowledgeCopy=repeaterAcknowledge;
QString repeaterTemplateCopy=repeaterTemplate;
QString idleTemplateCopy=idleTemplate;
QString repeaterIdleTemplateCopy=repeaterIdleTemplate;
int repeaterTxDelayCopy=repeaterTxDelay;
int repeaterImageSizeCopy=repeaterImageSize;
getValue(repeaterImageInterval,ui->imageIntervalSpinBox);
getValue(repeaterEnable,ui->repeaterEnableCheckBox);
getValue(repeaterEnabled,ui->repeaterEnabledCheckBox);
getIndex(temp,ui->repeaterTxModeComboBox);
repeaterTxMode=(esstvMode)temp;
getIndex(temp,ui->repeaterIdleTxModeComboBox);
getValue(repeaterTxDelay,ui->txDelaySpinBox);
getValue(repeaterImageSize,ui->txDRMImageSizeSpinBox);
repeaterIdleTxMode=(esstvMode)temp;
getValue(repeaterImage1,ui->repeaterImage1LineEdit);
getValue(repeaterImage2,ui->repeaterImage2LineEdit);
getValue(repeaterImage3,ui->repeaterImage3LineEdit);
getValue(repeaterImage4,ui->repeaterImage4LineEdit);
getValue(idleTemplate,ui->idleTemplateLineEdit);
getValue(repeaterIdleTemplate,ui->repeaterIdleTemplateLineEdit);
getValue(repeaterTemplate,ui->repeaterTemplateLineEdit);
changed=false;
if( repeaterEnableCopy!=repeaterEnable
if( repeaterEnabledCopy!=repeaterEnabled
|| repeaterImageIntervalCopy!=repeaterImageInterval
|| repeaterTxModeCopy!=repeaterTxMode
|| repeaterIdleTxModeCopy!=repeaterIdleTxMode
|| repeaterImage1Copy!=repeaterImage1
|| repeaterImage2Copy!=repeaterImage2
|| repeaterImage3Copy!=repeaterImage3
|| repeaterImage4Copy!=repeaterImage4
|| repeaterAcknowledgeCopy!=repeaterAcknowledge
|| repeaterTemplateCopy!=repeaterTemplate
|| idleTemplateCopy!=idleTemplate)
|| repeaterTxDelayCopy!=repeaterTxDelay
|| repeaterImageSizeCopy!=repeaterImageSize
|| repeaterIdleTemplateCopy!=repeaterIdleTemplate)
changed=true;
}
void repeaterConfig::setParams()
{;
setValue(repeaterImageInterval,ui->imageIntervalSpinBox);
setValue(repeaterEnable,ui->repeaterEnableCheckBox);
setValue(repeaterEnabled,ui->repeaterEnabledCheckBox);
setIndex(repeaterTxMode,ui->repeaterTxModeComboBox);
setIndex(repeaterIdleTxMode,ui->repeaterIdleTxModeComboBox);
setValue(repeaterImage1,ui->repeaterImage1LineEdit);
setValue(repeaterImage2,ui->repeaterImage2LineEdit);
setValue(repeaterImage3,ui->repeaterImage3LineEdit);
setValue(repeaterImage4,ui->repeaterImage4LineEdit);
setValue(idleTemplate,ui->idleTemplateLineEdit);
setValue(repeaterIdleTemplate,ui->repeaterIdleTemplateLineEdit);
setValue(repeaterTemplate,ui->repeaterTemplateLineEdit);
setValue(repeaterTxDelay,ui->txDelaySpinBox);
setValue(repeaterImageSize,ui->txDRMImageSizeSpinBox);
}
void repeaterConfig::slotRp1Browse()
{
browseGetFile(ui->repeaterImage1LineEdit,txStockImagesPath);
}
void repeaterConfig::slotRp2Browse()
{
browseGetFile(ui->repeaterImage2LineEdit,txStockImagesPath);
}
void repeaterConfig::slotRp3Browse()
{
browseGetFile(ui->repeaterImage3LineEdit,txStockImagesPath);
}
void repeaterConfig::slotRp4Browse()
{
browseGetFile(ui->repeaterImage4LineEdit,txStockImagesPath);
}
void repeaterConfig::slotRepeaterIdleTemplateBrowse()
{
browseGetFile(ui->repeaterIdleTemplateLineEdit ,templatesPath);
}
void repeaterConfig::slotRepeaterTemplateBrowse()
{
browseGetFile(ui->repeaterTemplateLineEdit,templatesPath);
}

Wyświetl plik

@ -2,19 +2,22 @@
#define REPEATERCONFIG_H
#include "baseconfig.h"
#include "sstv/sstvparam.h"
#include "sstvparam.h"
extern bool repeaterEnable;
extern bool repeaterEnabled;
extern int repeaterImageInterval;
extern esstvMode repeaterTxMode;
extern esstvMode repeaterIdleTxMode;
extern QString repeaterImage1;
extern QString repeaterImage2;
extern QString repeaterImage3;
extern QString repeaterImage4;
extern QString repeaterAcknowledge;
extern QString repeaterTemplate;
extern QString idleTemplate;
extern QString repeaterIdleTemplate;
extern int repeaterTxDelay;
extern int repeaterImageSize; // in kB
namespace Ui {
class repeaterConfig;
@ -31,6 +34,14 @@ public:
void writeSettings();
void getParams();
void setParams();
private slots:
void slotRp1Browse();
void slotRp2Browse();
void slotRp3Browse();
void slotRp4Browse();
void slotRepeaterIdleTemplateBrowse();
void slotRepeaterTemplateBrowse();
private:
Ui::repeaterConfig *ui;

Wyświetl plik

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>624</width>
<height>474</height>
<width>721</width>
<height>554</height>
</rect>
</property>
<property name="windowTitle">
@ -15,9 +15,9 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="_2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="repeaterEnableCheckBox">
<widget class="QCheckBox" name="repeaterEnabledCheckBox">
<property name="text">
<string>Enable Repeater</string>
</property>
@ -69,7 +69,10 @@
<item>
<widget class="QSpinBox" name="imageIntervalSpinBox">
<property name="minimum">
<number>5</number>
<number>1</number>
</property>
<property name="maximum">
<number>1440</number>
</property>
</widget>
</item>
@ -91,24 +94,13 @@
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<layout class="QHBoxLayout" name="_4">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="repeaterTxModeLabel">
<property name="text">
<string>Repeater TX mode</string>
@ -118,31 +110,72 @@
</property>
</widget>
</item>
<item>
<item row="0" column="1" rowspan="2">
<widget class="QComboBox" name="repeaterTxModeComboBox"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Tx Delay (sec)</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QSpinBox" name="txDelaySpinBox"/>
</item>
<item row="1" column="3" rowspan="2">
<widget class="QSpinBox" name="txDRMImageSizeSpinBox">
<property name="minimum">
<number>4</number>
</property>
<property name="maximum">
<number>100</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="repeaterTxModeLabel_2">
<property name="text">
<string>Idle Image TX mode</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="repeaterIdleTxModeComboBox"/>
</item>
<item row="2" column="2">
<widget class="QLabel" name="trxDRMImageSizeLabel">
<property name="text">
<string>DRM Image Size (kB)</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="spacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_6">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="rep1Label">
<property name="text">
<string>Idle Image 1</string>
@ -152,14 +185,14 @@
</property>
</widget>
</item>
<item>
<item row="0" column="1">
<widget class="QLineEdit" name="repeaterImage1LineEdit">
<property name="modified">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<item row="0" column="2">
<widget class="QPushButton" name="rp1BrowseButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -172,26 +205,7 @@
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_5">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<item row="1" column="0">
<widget class="QLabel" name="rp2Label">
<property name="text">
<string>Idle Image 2</string>
@ -201,14 +215,14 @@
</property>
</widget>
</item>
<item>
<item row="1" column="1">
<widget class="QLineEdit" name="repeaterImage2LineEdit">
<property name="modified">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<item row="1" column="2">
<widget class="QPushButton" name="rp2BrowseButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -221,26 +235,7 @@
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="_7">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<item row="2" column="0">
<widget class="QLabel" name="rp3Label">
<property name="text">
<string>Idle Image 3</string>
@ -250,14 +245,14 @@
</property>
</widget>
</item>
<item>
<item row="2" column="1">
<widget class="QLineEdit" name="repeaterImage3LineEdit">
<property name="modified">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<item row="2" column="2">
<widget class="QPushButton" name="rp3BrowseButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -270,26 +265,7 @@
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<item row="3" column="0">
<widget class="QLabel" name="rp4Label">
<property name="text">
<string>Idle Image 4</string>
@ -299,14 +275,14 @@
</property>
</widget>
</item>
<item>
<item row="3" column="1">
<widget class="QLineEdit" name="repeaterImage4LineEdit">
<property name="modified">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<item row="3" column="2">
<widget class="QPushButton" name="rp4BrowseButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -319,11 +295,7 @@
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<item row="4" column="0">
<widget class="QLabel" name="Label">
<property name="text">
<string>Idle Template</string>
@ -333,11 +305,11 @@
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="idleTemplateLineEdit"/>
<item row="4" column="1">
<widget class="QLineEdit" name="repeaterIdleTemplateLineEdit"/>
</item>
<item>
<widget class="QPushButton" name="idleTemplateBrowseButton">
<item row="4" column="2">
<widget class="QPushButton" name="repeaterIdleTemplateBrowseButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -349,11 +321,7 @@
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<item row="5" column="0">
<widget class="QLabel" name="ackLabel">
<property name="text">
<string>Repeater Template</string>
@ -363,10 +331,10 @@
</property>
</widget>
</item>
<item>
<item row="5" column="1">
<widget class="QLineEdit" name="repeaterTemplateLineEdit"/>
</item>
<item>
<item row="5" column="2">
<widget class="QPushButton" name="repeaterTemplateBrowseButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">

Wyświetl plik

@ -1,8 +1,29 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "rigconfig.h"
#include "ui_rigconfig.h"
#include "appglobal.h"
#include "configparams.h"
#include "utils/supportfunctions.h"
#include "supportfunctions.h"
#include "rigcontrol.h"
#include <QSettings>
#include <QMessageBox>

Wyświetl plik

@ -1,5 +1,5 @@
/**************************************************************************
* Copyright (C) 2000-2012 by Johan Maes *
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
@ -18,6 +18,7 @@
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "soundconfig.h"
#include "ui_soundconfig.h"
#include "configparams.h"

Wyświetl plik

@ -1,3 +1,24 @@
/**************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "waterfallconfig.h"
#include "ui_waterfallconfig.h"
#include <QFont>
@ -9,6 +30,8 @@ QString fixWF;
QString bsrWF;
QString startBinWF;
QString endBinWF;
QString startRepeaterWF;
QString endRepeaterWF;
QString wfFont;
int wfFontSize;
bool wfBold;
@ -38,6 +61,10 @@ void waterfallConfig::readSettings()
bsrWF=qSettings.value("bsrWF","BSR").toString();
startBinWF=qSettings.value("startBinWF","START BIN").toString();
endBinWF=qSettings.value("endBinWF","END BIN").toString();
startRepeaterWF=qSettings.value("startRepeaterWF","START RPT").toString();
endRepeaterWF=qSettings.value("endRepeaterWF","END RPT").toString();
wfFont=qSettings.value("wfFont","Arial").toString();
wfFontSize=qSettings.value("wfFontSize",12).toInt();
wfBold=qSettings.value("wfBold",false).toBool();
@ -57,6 +84,8 @@ void waterfallConfig::writeSettings()
qSettings.setValue("bsrWF",bsrWF);
qSettings.setValue("startBinWF",startBinWF);
qSettings.setValue("endBinWF",endBinWF);
qSettings.setValue("startRepeaterWF",startRepeaterWF);
qSettings.setValue("endRepeaterWF",endRepeaterWF);
qSettings.setValue("wfFont",wfFont);
qSettings.setValue("wfFontSize",wfFontSize);
qSettings.setValue("wfBold",wfBold);
@ -73,6 +102,8 @@ void waterfallConfig::getParams()
getValue(bsrWF,ui->bsrTextEdit);
getValue(startBinWF,ui->startBinTextEdit);
getValue(endBinWF,ui->endBinTextEdit);
getValue(startRepeaterWF,ui->startRepeaterTextEdit);
getValue(endRepeaterWF,ui->endRepeaterTextEdit);
getValue(wfFont,ui->fontComboBox);
getValue(wfFontSize,ui->sizeSpinBox);
getValue(wfBold,ui->boldCheckBox);
@ -87,6 +118,8 @@ void waterfallConfig::setParams()
setValue(bsrWF,ui->bsrTextEdit);
setValue(startBinWF,ui->startBinTextEdit);
setValue(endBinWF,ui->endBinTextEdit);
setValue(startRepeaterWF,ui->startRepeaterTextEdit);
setValue(endRepeaterWF,ui->endRepeaterTextEdit);
ui->fontComboBox->blockSignals(true);
ui->sizeSpinBox->blockSignals(true);
setValue(sampleString,ui->sampleLineEdit);

Wyświetl plik

@ -10,6 +10,8 @@ extern QString bsrWF;
extern QString startBinWF;
extern QString endBinWF;
extern QString wfFont;
extern QString startRepeaterWF;
extern QString endRepeaterWF;
extern int wfFontSize;
extern bool wfBold;

Wyświetl plik

@ -6,31 +6,72 @@
<rect>
<x>0</x>
<y>0</y>
<width>683</width>
<height>437</height>
<width>744</width>
<height>558</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0,0">
<property name="spacing">
<number>1</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0" columnstretch="0,1" columnminimumwidth="0,0">
<layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0,0,0" columnstretch="0,1" columnminimumwidth="0,0">
<item row="5" column="0">
<widget class="QLabel" name="binLabel_2">
<property name="text">
<string>End Binary</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPlainTextEdit" name="endPicTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPlainTextEdit" name="startPicTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="lineWidth">
<number>2</number>
</property>
<property name="midLineWidth">
<number>1</number>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="binLabel_3">
<property name="text">
<string>Start Repeater</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPlainTextEdit" name="bsrTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="fixLabel">
<property name="minimumSize">
@ -47,6 +88,22 @@
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPlainTextEdit" name="startBinTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="binLabel_1">
<property name="text">
@ -80,16 +137,6 @@
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPlainTextEdit" name="endPicTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="pictureLabel_2">
<property name="minimumSize">
@ -106,8 +153,47 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPlainTextEdit" name="startPicTextEdit">
<item row="5" column="1">
<widget class="QPlainTextEdit" name="endBinTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="pictureLabel">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Start Picture</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="binLabel_4">
<property name="text">
<string>End Repeater</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QPlainTextEdit" name="startRepeaterTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
@ -128,68 +214,25 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="pictureLabel">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Start Picture</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QPlainTextEdit" name="bsrTextEdit">
<item row="7" column="1">
<widget class="QPlainTextEdit" name="endRepeaterTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPlainTextEdit" name="startBinTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<property name="maximumSize">
<size>
<width>0</width>
<height>0</height>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="binLabel_2">
<property name="text">
<string>End Binary</string>
<property name="lineWidth">
<number>2</number>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPlainTextEdit" name="endBinTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
<property name="midLineWidth">
<number>1</number>
</property>
</widget>
</item>
@ -260,8 +303,6 @@
</layout>
</item>
</layout>
<zorder>fontLabel</zorder>
<zorder>fontLabel</zorder>
</widget>
<resources/>
<connections/>

Wyświetl plik

@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2000-2008 by Johan Maes *
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
@ -18,6 +18,7 @@
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/*!
The dispatcher is the central system that routes all messages from the different threads.
It also starts, stops and synchronizes the threads.
@ -29,22 +30,19 @@ It also starts, stops and synchronizes the threads.
#include "rxwidget.h"
#include "txwidget.h"
#include "gallerywidget.h"
#include "widgets/spectrumwidget.h"
#include "widgets/vumeter.h"
#include "spectrumwidget.h"
#include "vumeter.h"
#include "rxfunctions.h"
#include "mainwindow.h"
#include "utils/ftp.h"
#include "rigcontrol.h"
#include "logbook/logbook.h"
#include "logbook.h"
#include "dirdialog.h"
#include "ftpfunctions.h"
#include <QSettings>
#include <QMessageBox>
/*!
creates dispatcher instance
*/
/*! creates dispatcher instance */
dispatcher::dispatcher()
{
@ -54,9 +52,7 @@ dispatcher::dispatcher()
prTimerIndex=0;
}
/*!
delete dispatcher instance
*/
/*! delete dispatcher instance */
dispatcher::~dispatcher()
{
@ -66,33 +62,9 @@ void dispatcher::init()
{
editorActive=false;
infoTextPtr=new textDisplay(mainWindowPtr);
mainWindowPtr->spectrumFramePtr->init(RXSTRIPE,1,BASESAMPLERATE/SUBSAMPLINGFACTOR);
mainWindowPtr->spectrumFramePtr->init(RXSTRIPE,fftNumBlocks,BASESAMPLERATE/SUBSAMPLINGFACTOR);
infoTextPtr->hide();
setOnlineStatus(true, onlineStatusText);
connect(notifyRXIntf, SIGNAL(notification(QString)), this, SLOT(slotRXNotification(QString)));
connect(notifyTXIntf, SIGNAL(notification(QString)), this, SLOT(slotTXNotification(QString)));
connect(hybridTxIntf, SIGNAL(commandsDone(bool)), this, SLOT(slotHybridTxDone(bool)));
}
void dispatcher::setOnlineStatus(bool online, QString info)
{
txWidgetPtr->functionsPtr()->setOnlineStatus(online, info);
// TODO: move to rxWidget->functions->?
if (!online && enableFTP)
{
ftpInterface rxftp("RX Image Cleanup");
rxftp.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteSSTVDirectory);
rxftp.uploadToRXServer(""); // mark SSTV offline
rxftp.changePath(ftpRemoteDRMDirectory);
rxftp.uploadToRXServer(""); // mark DSSTV/DRM offline
}
}
void dispatcher::who()
{
txWidgetPtr->functionsPtr()->who();
connect(&ff,SIGNAL(listingDone(bool)),SLOT(slotRenameListing(bool)));
}
@ -103,58 +75,62 @@ void dispatcher::who()
void dispatcher::customEvent( QEvent * e )
{
dispatchEventType type;
ftpInterface * iPtr;
QString fn;
type=(dispatchEventType)e->type();
addToLog(((baseEvent*)e)->description,LOGDISPATCH);
if((type!=displayFFT)
&& (type!=displaySync)
&& (type!=rxSSTVStatus)
&& (type!=lineDisplay)
&& (type!=displayDRMInfo)
&& (type!=displayDRMStat)
)
{
addToLog(((baseEvent*)e)->description,LOGDISPATCH);
}
switch(type)
{
case displayFFT:
addToLog("dispatcher: displayFFT",LOGDISPATCH);
mainWindowPtr->spectrumFramePtr->realFFT(((displayFFTEvent*)e)->data());
rxWidgetPtr->vMeterPtr()->setValue(soundIOPtr->getVolumeDb());
// addToLog(QString::number(soundIOPtr->getVolumeDb()),LOGALL);
break;
break;
case displaySync:
// addToLog("dispatcher: displaySync",LOGDISPATCH);
uint s;
((displaySyncEvent*)e)->getInfo(s);
rxWidgetPtr->sMeterPtr()->setValue((double)s);
break;
break;
case rxSSTVStatus:
rxWidgetPtr->setSSTVStatusText(((rxSSTVStatusEvent*)e)->getStr());
break;
break;
case startImageRX:
addToLog("dispatcher: clearing RxImage",LOGDISPATCH);
// rxWidgetPtr->getImageViewerPtr()->createImage( ((startImageRXEvent*)e)->getSize(),QColor(0,0,128),imageStretch);
rxWidgetPtr->getImageViewerPtr()->createImage( ((startImageRXEvent*)e)->getSize(),imageBackGroundColor,imageStretch);
lastCallsign="";
break;
break;
case lineDisplay:
{
rxWidgetPtr->getImageViewerPtr()->displayImage();
}
break;
break;
case endSSTVImageRX:
if(autoSave)
{
addToLog("dispatcher:endImage savingRxImage",LOGDISPATCH);
saveRxSSTVImage(((endImageSSTVRXEvent*)e)->getModeName());
saveRxSSTVImage(((endImageSSTVRXEvent*)e)->getMode());
}
break;
break;
case rxDRMStatus:
rxWidgetPtr->setDRMStatusText(((rxDRMStatusEvent*)e)->getStr());
break;
break;
case statusBarMsg:
statusBarPtr->showMessage(((statusBarMsgEvent*)e)->getStr());
break;
break;
case callEditor:
if(editorActive) break;
editorActive=true;
@ -164,23 +140,17 @@ void dispatcher::customEvent( QEvent * e )
addToLog (QString(" callEditorEvent imageViewPtr: %1").arg(QString::number((ulong)iv,16)),LOGDISPATCH);
addToLog(QString("editor: filename %1").arg(((callEditorEvent*)e)->getFilename()),LOGDISPATCH);
ed->openFile(((callEditorEvent*)e)->getFilename());
break;
break;
case rxDRMNotify:
rxWidgetPtr->setDRMNotifyText(((rxDRMNotifyEvent*)e)->getStr());
break;
case rxDRMNotifyAppend:
rxWidgetPtr->appendDRMNotifyText(((rxDRMNotifyAppendEvent*)e)->getStr());
break;
case txDRMNotify:
txWidgetPtr->setDRMNotifyText(((txDRMNotifyEvent*)e)->getStr());
break;
break;
case txDRMNotifyAppend:
txWidgetPtr->appendDRMNotifyText(((txDRMNotifyAppendEvent*)e)->getStr());
break;
break;
case txPrepareComplete:
txWidgetPtr->prepareTxComplete(((txPrepareCompleteEvent *)e)->ok());
break;
break;
case editorFinished:
if(!editorActive) break;
@ -191,22 +161,22 @@ void dispatcher::customEvent( QEvent * e )
}
editorActive=false;
delete ed;
break;
break;
case templatesChanged:
galleryWidgetPtr->changedMatrix(imageViewer::TEMPLATETHUMB);
txWidgetPtr->setupTemplatesComboBox();
break;
break;
case progressTX:
txTimeCounter=0;
addToLog(QString("dispatcher: progress duration=%1").arg(((progressTXEvent*)e)->getInfo()),LOGDISPATCH);
prTimerIndex=startTimer(((progressTXEvent*)e)->getInfo()*10); // time in seconds -> times 1000 for msec,divide by 100 for progress
break;
break;
case stoppingTX:
addToLog("dispatcher: endTXImage",LOGDISPATCH);
break;
break;
case endImageTX:
//addToLog("dispatcher: endTXImage",LOGDISPATCH);
@ -215,8 +185,9 @@ void dispatcher::customEvent( QEvent * e )
qApp->processEvents();
}
addToLog("dispatcher: endTXImage",LOGDISPATCH);
startRX();
break;
txWidgetPtr->slotStop();
// startRX();
break;
case displayDRMInfo:
if(!slowCPU)
@ -225,32 +196,34 @@ void dispatcher::customEvent( QEvent * e )
rxWidgetPtr->facWdg()->setConstellation(FAC);
}
rxWidgetPtr->statusWdg()->setStatus();
break;
break;
case displayDRMStat:
DSPFLOAT s1;
((displayDRMStatEvent*)e)->getInfo(s1);
rxWidgetPtr->sMeterPtr()->setValue(s1);
break;
break;
case loadRXImage:
{
QString fn=((loadRXImageEvent *)e)->getFilename();
rxWidgetPtr->getImageViewerPtr()->openImage(fn,false,false,false);
rxWidgetPtr->getImageViewerPtr()->openImage(fn,false,false,false,true);
}
break;
break;
case moveToTx:
{
addToLog(QString("moveToTx: %1").arg(((moveToTxEvent *)e)->getFilename()),LOGDISPATCH);
txWidgetPtr->setImage(((moveToTxEvent *)e)->getFilename());
}
break;
break;
case saveDRMImage:
{
QString info;
((saveDRMImageEvent*)e)->getFilename(fn);
((saveDRMImageEvent*)e)->getInfo(info);
if(!rxWidgetPtr->getImageViewerPtr()->openImage(fn,false,false,false))
if(!rxWidgetPtr->getImageViewerPtr()->openImage(fn,false,false,false,false))
{
// simply save the file if it is not an image file
if(mbox==NULL) delete mbox;
mbox = new QMessageBox(mainWindowPtr);
mbox->setWindowTitle("Received file");
@ -260,19 +233,23 @@ void dispatcher::customEvent( QEvent * e )
break;
}
saveImage(fn, info);
if(repeaterEnabled)
{
txWidgetPtr->sendRepeaterImage();
}
}
break;
break;
case prepareFix:
addToLog("prepareFix",LOGDISPATCH);
startDRMFIXTx( ((prepareFixEvent*)e)->getData());
break;
break;
case displayText:
infoTextPtr->clear();
infoTextPtr->setWindowTitle(QString("Received from %1").arg(drmCallsign));
infoTextPtr->append(((displayTextEvent*)e)->getStr());
infoTextPtr->show();
break;
break;
case displayMBox:
if(mbox==NULL) delete mbox;
@ -281,7 +258,7 @@ void dispatcher::customEvent( QEvent * e )
mbox->setText(((displayMBoxEvent*)e)->getStr());
mbox->show();
QTimer::singleShot(4000, mbox, SLOT(hide()));
break;
break;
case displayProgressFTP:
{
@ -299,60 +276,18 @@ void dispatcher::customEvent( QEvent * e )
progressFTP->setMaximum(((displayProgressFTPEvent*)e)->getTotal());
progressFTP->setValue(((displayProgressFTPEvent*)e)->getBytes());
}
break;
case ftpSetup:
iPtr=((ftpSetupEvent*)e)->getFtpIntfPtr();
if(iPtr==notifyRXIntf)
{
notifyRXDone=DFTPWAITING;
}
else if(iPtr==hybridTxIntf)
{
hybridTxDone=DFTPWAITING;
}
else if(iPtr==notifyTXIntf)
{
notifyTxDone=DFTPWAITING;
}
iPtr->setupConnection(
((ftpSetupEvent*)e)->getHost(),
((ftpSetupEvent*)e)->getPort(),
((ftpSetupEvent*)e)->getUser(),
((ftpSetupEvent*)e)->getPassword(),
((ftpSetupEvent*)e)->getDir());
break;
case ftpUploadFile:
((ftpUploadFileEvent*)e)->getFtpIntfPtr()->uploadFile(
((ftpUploadFileEvent*)e)->getSrcFn(),
((ftpUploadFileEvent*)e)->getDstFn(),
((ftpUploadFileEvent*)e)->getReconnect()
);
break;
case notifyAction:
notifyRXIntf->mremove(((notifyActionEvent*)e)->getToRemove());
notifyRXIntf->uploadData(((notifyActionEvent*)e)->getMsg().toLatin1(), ((notifyActionEvent*)e)->getFilename());
break;
break;
// case notifyAction: // sends notification after reception of hybrid image
// // todo notifyRXIntfPtr->mremove(((notifyActionEvent*)e)->getToRemove());
// // notifyRXIntfPtr->uploadData(((notifyActionEvent*)e)->getMsg().toLatin1(), ((notifyActionEvent*)e)->getFilename());
// break;
case notifyCheck:
iPtr=((ftpSetupEvent*)e)->getFtpIntfPtr();
iPtr->startNotifyCheck(
((notifyCheckEvent*)e)->getFilename(),
((notifyCheckEvent*)e)->getInterval(),
((notifyCheckEvent*)e)->getRepeats(),
((notifyCheckEvent*)e)->getToRemove()
);
break;
txWidgetPtr->startNotifyCheck(((notifyCheckEvent*)e)->getFilename());
break;
default:
addToLog(QString("unsupported event: %1").arg(((baseEvent*)e)->description), LOGALL);
break;
addToLogDebug(QString("unsupported event: %1").arg(((baseEvent*)e)->description), LOGALL);
break;
}
((baseEvent *)e)->setDone();
}
@ -387,10 +322,6 @@ void dispatcher::startTX(txFunctions::etxState state)
txWidgetPtr->functionsPtr()->startTX(state);
}
void dispatcher::prepareTX(txFunctions::etxState state)
{
txWidgetPtr->functionsPtr()->prepareTX(state);
}
void dispatcher::startDRMFIXTx(QByteArray ba)
{
@ -402,6 +333,8 @@ void dispatcher::startDRMTxBinary()
{
//TODO: this whole thing should probably live in txWidget::slotBinary
QFileInfo finfo;
int sizeOfFile;
QString sizeStr;
int txtime=0;
QMessageBox mbox(mainWindowPtr);
QPushButton *sendButton;
@ -419,8 +352,22 @@ void dispatcher::startDRMTxBinary()
mbox.setWindowTitle("TX Binary File");
mbox.setText(QString("'%1'").arg(filename));
mbox.setInformativeText(QString("The file is %1Kb and will take %2 seconds on air to send").
arg(finfo.size()/1000.0,0,'f',0).arg(txtime));
sizeOfFile=finfo.size();
if(sizeOfFile<1000)
{
sizeStr=QString("%1 bytes").arg(sizeOfFile);
}
else if(sizeOfFile<10000)
{
sizeStr=QString("%1 kB").arg(sizeOfFile/1000.0,3,'f',2);
}
else
{
sizeStr=QString("%1 kB").arg(sizeOfFile/1000.0,3,'f',1);
}
mbox.setInformativeText(QString("The file is %1 and will take %2 seconds on air to send").
arg(sizeStr).arg(txtime));
if (useHybrid)
sendButton = mbox.addButton(tr("Upload ready to transmit"), QMessageBox::AcceptRole);
@ -460,17 +407,24 @@ void dispatcher::logSSTV(QString call,bool fromFSKID)
}
void dispatcher::saveRxSSTVImage(QString shortModeName)
void dispatcher::saveRxSSTVImage(esstvMode mode)
{
QString info,s,fileName;
QString shortModeName=getSSTVModeNameShort(mode);
QTemporaryFile tfn;
int m;
QDateTime dt(QDateTime::currentDateTime().toUTC()); //this is compatible with QT 4.6
dt.setTimeSpec(Qt::UTC);
if (shortModeName.isEmpty())
if (mode==NOTVALID)
{
lastFileName.clear();
return;
}
if(repeaterEnabled)
{
txWidgetPtr->sendRepeaterImage(mode);
}
if(!autoSave)
{
lastFileName=shortModeName;
@ -500,6 +454,7 @@ void dispatcher::saveRxSSTVImage(QString shortModeName)
void dispatcher::saveImage(QString fileName, QString infotext)
{
// filename is the name of the original file in hybrid mode
QFileInfo info(fileName);
QString fn="/tmp/"+info.baseName()+"."+ftpDefaultImageFormat;
galleryWidgetPtr->putRxImage(fileName);
@ -509,7 +464,8 @@ void dispatcher::saveImage(QString fileName, QString infotext)
QImage *imp = rxWidgetPtr->getImageViewerPtr()->getImagePtr();
QImage im;
if (imp && imp->width()) {
if (imp && imp->width())
{
// the original source image is available, possibly in higher quality
// than the displayed image. Only for DRM Images.
im = QImage(imp->convertToFormat(QImage::Format_RGB32));
@ -524,27 +480,22 @@ void dispatcher::saveImage(QString fileName, QString infotext)
QPainter p;
double freq=0;
int pixelSize, height, width;
rigControllerPtr->getFrequency(freq);
text = QString("%1 UTC %2 kHz ").arg(QDateTime::currentDateTime().toUTC().toString("hh:mm ddd MMM d, yyyy")).arg(freq/1000,1,'f',0);
text = QString("%1 UTC %2 kHz ").
arg(QDateTime::currentDateTime().toUTC().toString("hh:mm ddd MMM d, yyyy")).
arg(freq/1000,1,'f',0);
if (transmissionModeIndex==TRXSSTV) {
if (transmissionModeIndex==TRXSSTV)
{
remoteDir = ftpRemoteSSTVDirectory;
}
else {
else
{
remoteDir = ftpRemoteDRMDirectory;
}
if (!infotext.isEmpty()) text += " "+infotext;
// Limit uploaded size
if ((im.width() > 960) || (im.height() > 768)) {
im = im.scaled(960,768, Qt::KeepAspectRatio);
}
// Stamp text over the top left of the image
// and keep it the same portion, unless the
// font would be unreadable
@ -553,10 +504,8 @@ void dispatcher::saveImage(QString fileName, QString infotext)
if (pixelSize<8) pixelSize=8;
font.setPixelSize(pixelSize);
QFontMetrics fontm(font);
width = fontm.width(text) + 6;
height= fontm.height() + 2;
p.begin(&im);
p.setPen(Qt::black);
p.fillRect(0,0,width,height, Qt::black);
@ -564,52 +513,89 @@ void dispatcher::saveImage(QString fileName, QString infotext)
p.setBrush(Qt::white);
p.setFont(font);
p.drawText(2,height-fontm.descent()-1, text);
im.save(fn, ftpDefaultImageFormat.toUpper().toLatin1().data());
im.save( fn, ftpDefaultImageFormat.toUpper().toLatin1().data());
p.end();
uploadToRXServer(remoteDir, fn);
QFile::remove(fn);
}
}
void dispatcher::uploadToRXServer(QString remoteDir, QString fn)
{
displayMBoxEvent *stmb=0;
eftpError ftpResult;
// todo ftp
QString uploadDestinationFile=fn;
uploadSourceFile=fn;
if(ff.isBusy()) return;
ff.setupFtp("FTP Upload to server",ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,remoteDir);
ftpInterface ftpIntf("Save RX Image");
ftpIntf.setupConnection(ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,remoteDir);
ftpResult=ftpIntf.uploadToRXServer(fn);
switch(ftpResult)
QImage im(1,QDateTime::currentDateTime().time().minute(),QImage::Format_RGB32);
im.fill(Qt::black);
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
im.save(&buffer, "JPG");
ff.uploadData(ba,"checknew.jpg",false,false);
if(ftpSaveFormat==FTPIMAGESEQUENCE)
{
case FTPOK:
break;
case FTPERROR:
stmb= new displayMBoxEvent("FTP Error",QString("Host: %1: %2").arg(ftpRemoteHost).arg(ftpIntf.getLastError()));
break;
case FTPNAMEERROR:
stmb= new displayMBoxEvent("FTP Error",QString("Host: %1, Error in filename").arg(ftpRemoteHost));
break;
case FTPCANCELED:
stmb= new displayMBoxEvent("FTP Error",QString("Connection to %1 Canceled").arg(ftpRemoteHost));
break;
case FTPTIMEOUT:
stmb= new displayMBoxEvent("FTP Error",QString("Connection to %1 timed out").arg(ftpRemoteHost));
break;
default:
stmb= new displayMBoxEvent("FTP Error",QString("Unknown FTP error: %1").arg(ftpResult));
break;
ff.listFiles("image*",false);
}
if(ftpResult!=FTPOK)
else
{
QApplication::postEvent( dispatcherPtr, stmb ); // Qt will delete it when done
ff.uploadFile(uploadSourceFile,uploadDestinationFile,false,true);
}
}
void dispatcher::slotRenameListing(bool err)
{
int i;
if(err) return;
QList <QUrlInfo> images;
QString extension="";
if(addExtension) extension="."+ftpDefaultImageFormat.toLower();
images=ff.getListing();
QString src,dst;
for(i=ftpNumImages;i>1;i--)
{
src=QString("image%1%2").arg(i-1).arg(extension);
dst=QString("image%1%2").arg(i).arg(extension);
if(inList(images,src))
{
ff.rename(src,dst,false,false);
}
}
ff.uploadFile(uploadSourceFile,"image1"+extension,false,true);
}
bool dispatcher::inList(QList <QUrlInfo> lst,QString fn)
{
int i;
for(i=0;i<lst.count();i++)
{
if(lst.at(i).name()==fn) return true;
}
return false;
}
void dispatcher::showOffLine()
{
if(!enableFTP) return;
ff.setupFtp("FTP Show Offline",ftpRemoteHost,ftpPort,ftpLogin,ftpPassword,ftpRemoteSSTVDirectory);
QImage im(2,QDateTime::currentDateTime().time().minute(),QImage::Format_RGB32);
im.fill(Qt::black);
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
im.save(&buffer, "JPG");
ff.uploadData(ba,"checknew.jpg",true,false);
ff.changePath("/"+ftpRemoteDRMDirectory,true);
ff.uploadData(ba,"checknew.jpg",true,true);
}
void dispatcher::timerEvent(QTimerEvent *event)
{
@ -629,13 +615,7 @@ void dispatcher::timerEvent(QTimerEvent *event)
}
}
void dispatcher::slotRXNotification(QString info)
{
if (info != "")
{
rxWidgetPtr->appendDRMNotifyText(info);
}
}
void dispatcher::slotTXNotification(QString info)
{
@ -644,19 +624,3 @@ void dispatcher::slotTXNotification(QString info)
txWidgetPtr->appendDRMNotifyText(info);
}
}
void dispatcher::slotHybridTxDone(bool error)
{
if(error)
{
hybridTxDone=DFTPERROR;
}
else
{
hybridTxDone=DFTPOK;
}
}

Wyświetl plik

@ -1,32 +1,15 @@
/***************************************************************************
* Copyright (C) 2000-2008 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef DISPATCHER_H
#ifndef DISPATCHER_H
#define DISPATCHER_H
#include "dispatchevents.h"
#include "appglobal.h"
#include <QByteArray>
#include "textdisplay.h"
#include "txfunctions.h"
#include "ftpfunctions.h"
class editor;
class imageViewer;
#include <QProgressDialog>
enum eftpResult {DFTPWAITING,DFTPOK,DFTPERROR};
@ -46,7 +29,6 @@ public:
void idleAll();
void startRX();
void startTX(txFunctions::etxState state);
void prepareTX(txFunctions::etxState state);
void readSettings();
void writeSettings();
void customEvent( QEvent * e );
@ -58,22 +40,21 @@ public:
void saveImage(QString fileName, QString infotext);
void uploadToRXServer(QString remoteDir, QString fn);
void logSSTV(QString call, bool fromFSKID);
void setOnlineStatus(bool online, QString info="");
void who();
eftpResult notifyRXDone;
eftpResult hybridTxDone;
eftpResult notifyTxDone;
void showOffLine();
// eftpResult notifyRXDone;
// eftpResult hybridTxDone;
// eftpResult hybridRxDone;
// eftpResult notifyTxDone;
private slots:
void slotRXNotification(QString info);
// void slotRXNotification(QString info);
void slotTXNotification(QString);
// void slotWhoResult();
void slotHybridTxDone(bool error);
void slotRenameListing(bool err);
private:
void saveRxSSTVImage(QString shortModeName);
void saveRxSSTVImage(esstvMode mode);
bool inList(QList <QUrlInfo> lst,QString fn);
void timerEvent(QTimerEvent *event);
bool editorActive;
editor *ed;
@ -87,6 +68,8 @@ private:
QString lastFileName;
QString lastCallsign;
QDateTime saveTimeStamp;
ftpFunctions ff;
QString uploadSourceFile;
};
#endif

Wyświetl plik

@ -1,31 +1,13 @@
/***************************************************************************
* Copyright (C) 2000-2008 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef DISPATCHEVENT_H
#define DISPATCHEVENT_H
#include <QEvent>
#include "widgets/imageviewer.h"
#include "imageviewer.h"
#include "appdefs.h"
#include "hybridcrypt.h"
#include <unistd.h>
#include "sstvparam.h"
class ftpInterface;
class ftpThread;
/** dispatch events are used to communicate with the different threads */
@ -46,14 +28,9 @@ enum dispatchEventType
endImageTX,
stoppingTX,
progressTX,
// verticalRetrace,
// syncLost,
outOfSync,
// statusMsg, //!< display status message
rxSSTVStatus, //! shows message in sstv tab
rxDRMStatus, //! shows message in drm tab
rxDRMNotify, //! shows text in rx notifications box
rxDRMNotifyAppend,
txDRMNotify, //! shows text in tx notifications box
txDRMNotifyAppend,
txPrepareComplete, //!< tx preparations (uploading etc) complete
@ -62,8 +39,8 @@ enum dispatchEventType
templatesChanged,
editorFinished,
changeRXFilter,
startAutoRepeater,
startRepeater,
// startAutoRepeater,
// startRepeater,
stopRxTx,
loadRXImage,
saveDRMImage,
@ -72,7 +49,7 @@ enum dispatchEventType
displayMBox,
displayProgressFTP,
moveToTx,
notifyAction,
// notifyAction,
ftpSetup,
notifyCheck,
ftpUploadFile,
@ -143,7 +120,7 @@ public:
private:
uint sync;
DSPFLOAT vol;
// DSPFLOAT vol;
};
class displayDRMStatEvent : public baseEvent
@ -161,38 +138,25 @@ private:
DSPFLOAT snr;
};
//class statusMsgEvent : public baseEvent
//{
//public:
// /** create event */
// statusMsgEvent(QString t):baseEvent( (QEvent::Type)statusMsg ), str(t)
// {
// description="statusMsgEvent";
// }
// /** returns info string from the event */
// QString getStr() const { return str; }
//private:
// QString str;
//};
class ftpSetupEvent : public baseEvent
{
public:
/** create event */
ftpSetupEvent(ftpInterface * ftpIntf,QString h,int p,QString u,QString pwd,QString d)
ftpSetupEvent(ftpThread * ftpIntf,QString h,int p,QString u,QString pwd,QString d)
:baseEvent( (QEvent::Type)ftpSetup ),ftpIntfPtr(ftpIntf), host(h),port(p),user(u),password(pwd),dir(d)
{
description="ftpSetupEvent";
}
/** returns settings from the event */
ftpInterface *getFtpIntfPtr() const { return ftpIntfPtr; }
ftpThread *getFtpIntfPtr() const { return ftpIntfPtr; }
QString getHost() const { return host; }
int getPort() const { return port; }
QString getUser() const { return user; }
QString getPassword() const { return password; }
QString getDir() const { return dir; }
private:
ftpInterface *ftpIntfPtr;
ftpThread *ftpIntfPtr;
QString host;
int port;
QString user;
@ -204,18 +168,18 @@ class ftpUploadFileEvent : public baseEvent
{
public:
/** create event */
ftpUploadFileEvent(ftpInterface * ftpIntf,QString srcFn,QString dstFn,bool recon)
ftpUploadFileEvent(ftpThread * ftpIntf,QString srcFn,QString dstFn,bool recon)
:baseEvent( (QEvent::Type)ftpUploadFile ),ftpIntfPtr(ftpIntf),sourceFilename(srcFn), destFilename(dstFn),reconnect(recon)
{
description="ftpUploadFileEvent";
}
/** returns settings from the event */
ftpInterface *getFtpIntfPtr() const { return ftpIntfPtr; }
ftpThread *getFtpIntfPtr() const { return ftpIntfPtr; }
QString getSrcFn() const { return sourceFilename; }
QString getDstFn() const { return destFilename; }
bool getReconnect() const { return reconnect; }
private:
ftpInterface *ftpIntfPtr;
ftpThread *ftpIntfPtr;
QString sourceFilename;
QString destFilename;
bool reconnect;
@ -223,47 +187,39 @@ private:
class notifyActionEvent : public baseEvent
{
public:
/** create event */
notifyActionEvent(QString toRem,QString message,QString fn)
:baseEvent( (QEvent::Type)notifyAction ), toRemove(toRem),msg(message),filename(fn)
{
description="notifyActionEvent";
}
/** returns settings from the event */
QString getToRemove() const { return toRemove; }
QString getMsg() const { return msg; }
QString getFilename() const { return filename; }
private:
QString toRemove;
QString msg;
QString filename;
};
//class notifyActionEvent : public baseEvent
//{
//public:
// /** create event */
// notifyActionEvent(hybridCrypt thc,QString toRem,QString message,QString fn)
// :baseEvent( (QEvent::Type)notifyAction ),hc(thc), toRemove(toRem),msg(message),filename(fn)
// {
// description="notifyActionEvent";
// }
// /** returns settings from the event */
// hybridCrypt getHybridCrypt() const { return hc; }
// QString getToRemove() const { return toRemove; }
// QString getMsg() const { return msg; }
// QString getFilename() const { return filename; }
//private:
// hybridCrypt hc;
// QString toRemove;
// QString msg;
// QString filename;
//};
class notifyCheckEvent : public baseEvent
{
public:
/** create event */
notifyCheckEvent(ftpInterface * ftpIntf,QString fn,int intv, int rp, bool rm)
:baseEvent( (QEvent::Type)notifyCheck),ftpIntfPtr(ftpIntf), filename(fn),interval(intv),repeats(rp),remove(rm)
notifyCheckEvent(QString fn):baseEvent( (QEvent::Type)notifyCheck),filename(fn)
{
description="notifyCheckEvent";
}
/** returns settings from the event */
ftpInterface *getFtpIntfPtr() const { return ftpIntfPtr; }
QString getFilename() const { return filename; }
int getInterval() const { return interval; }
int getRepeats() const { return repeats; }
bool getToRemove() const { return remove; }
private:
ftpInterface *ftpIntfPtr;
QString filename;
int interval;
int repeats;
bool remove;
};
@ -296,33 +252,7 @@ private:
QString str;
};
class rxDRMNotifyEvent : public baseEvent
{
public:
/** create event */
rxDRMNotifyEvent(QString t):baseEvent( (QEvent::Type)rxDRMNotify ), str(t)
{
description="rxDRMNotifyEvent";
}
/** returns info string from the event */
QString getStr() const { return str; }
private:
QString str;
};
class rxDRMNotifyAppendEvent : public baseEvent
{
public:
/** create event */
rxDRMNotifyAppendEvent(QString t):baseEvent( (QEvent::Type)rxDRMNotifyAppend ), str(t)
{
description="rxDRMNotifyAppendEvent";
}
/** returns info string from the event */
QString getStr() const { return str; }
private:
QString str;
};
class txDRMNotifyEvent : public baseEvent
{
@ -403,25 +333,25 @@ public:
}
};
class startAutoRepeaterEvent: public baseEvent
{
public:
/** create event */
startAutoRepeaterEvent():baseEvent( (QEvent::Type)startAutoRepeater )
{
description="startAutoRepeaterEvent";
}
};
//class startAutoRepeaterEvent: public baseEvent
//{
//public:
// /** create event */
// startAutoRepeaterEvent():baseEvent( (QEvent::Type)startAutoRepeater )
// {
// description="startAutoRepeaterEvent";
// }
//};
class startRepeaterEvent: public baseEvent
{
public:
/** create event */
startRepeaterEvent():baseEvent( (QEvent::Type)startRepeater )
{
description="startRepeaterEvent";
}
};
//class startRepeaterEvent: public baseEvent
//{
//public:
// /** create event */
// startRepeaterEvent():baseEvent( (QEvent::Type)startRepeater )
// {
// description="startRepeaterEvent";
// }
//};
class createModeEvent : public baseEvent
@ -500,13 +430,13 @@ class endImageSSTVRXEvent : public baseEvent
{
public:
/** create event */
endImageSSTVRXEvent(QString mn):baseEvent( (QEvent::Type)endSSTVImageRX ),modeName(mn)
endImageSSTVRXEvent(esstvMode md):baseEvent( (QEvent::Type)endSSTVImageRX ),mode(md)
{
description="endImageSSTVRXEvent";
}
QString getModeName() {return modeName;}
esstvMode getMode() {return mode;}
private:
QString modeName;
esstvMode mode;
};
class endImageTXEvent : public baseEvent
@ -530,25 +460,6 @@ public:
}
};
//class verticalRetraceEvent : public baseEvent
//{
//public:
// /** create event */
// verticalRetraceEvent():baseEvent( (QEvent::Type) verticalRetrace )
// {
// description="verticalRetraceEvent";
// }
//};
//class syncLostEvent : public baseEvent
//{
//public:
// /** create event */
// syncLostEvent():baseEvent( (QEvent::Type) syncLost )
// {
// description="syncLostEvent";
// }
//};

Plik diff jest za duży Load Diff

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 925 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 631 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 74 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 15 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 13 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 34 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 52 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 60 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 58 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 42 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 42 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 62 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 71 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 81 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 83 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 51 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 61 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 80 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 77 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 76 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 75 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 31 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 31 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 54 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 92 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 71 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 72 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 34 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 52 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 36 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 48 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.2 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 9.8 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 38 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 34 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 277 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 395 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 487 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 807 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 18 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 85 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 18 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 523 KiB

Wyświetl plik

@ -32,7 +32,7 @@ PROJECT_NAME = QSSTV
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = 9.2
PROJECT_NUMBER = 9.4
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer
@ -860,7 +860,7 @@ GENERATE_HTML = YES
# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = manual
HTML_OUTPUT = manual_html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
# each generated HTML page (for example: .htm,.php,.asp). If it is left blank

Wyświetl plik

@ -1,5 +1,5 @@
n/***************************************************************************
* Copyright (C) 2000-2011 by Johan Maes *
/***************************************************************************
* Copyright (C) 2000-2019 by Johan Maes *
* on4qz@telenet.be *
* http://users.telenet.be/on4qz *
* *
@ -19,33 +19,40 @@ n/***************************************************************************
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/** \file */
// Documentation
/*! \mainpage QSSTV 9.2
/*! \mainpage QSSTV 9.3 and 9.4
\author Johan Maes ON4QZ
\section intro_sec Introduction
QSSTV 9 is a program for receiving and transmitting SSTV and HAMDRM (sometimes called DSSTV). It is compatible with most of MMSSTV and EasyPal<br>
QSSTV is a program for receiving and transmitting SSTV and HAMDRM (sometimes called DSSTV). It is compatible with most of MMSSTV and EasyPal<br>
!!! ALSO READ THE FAQ AT http://users.telenet.be/on4qz/qsstv_9/faq.html !!!
!!! ALSO READ THE FAQ AT http://users.telenet.be/on4qz/qsstv/faq.html !!!
This manual is divided in the following sections:
- \subpage whatsnew
- \subpage changelog
- \subpage installation
- \subpage gettingstarted
- \subpage config
- \subpage volume
- \subpage calib
- \subpage statusbar
- \subpage imagepopup
- \subpage RXSSTV
- \subpage TXSSTV
- \subpage RXDRM
- \subpage TXDRM
- \subpage drmmodes
- \subpage fixdrm
- \subpage spectrumwf
- \subpage gallery
- \subpage editor
- \subpage editor93
- \subpage editor94
- \subpage macros Macro Text
- \subpage repeater
- \subpage externalprog
- \subpage todo1
- \subpage credits
@ -56,9 +63,20 @@ Johan ON4QZ
\page whatsnew What's New
QSSTV 9.4.x has the following new features compared to QSSTV 9.3.x
- improved template editor
(PLease run all your templates through the new editor to allign items correctly and save them again as a template with the same name)
QSSTV 9.3.x has the following new features compared to QSSTV 9.2.x
- Repeater functions are implemented now (both SSTV and DRM).
- Improved FFT waterfall
- Hamlib interface with PKTLSB, PKTUSB and PKTFM
- bug fixes
QSSTV 9.2.x has the following new features compared to QSSTV 8.2.x
- Build on top QT 5.x ( and also compatible with Qt 4.8)
- Build on top QT 5.x (dropped testing QT4 compatibility)
- Better synchronization in SSTV mode
- New SSTV narrow band modes (MP73-N,MP110-N,MP140-N,MC110-N,MC140-N,MC180-N)
- Changed GUI layout
@ -71,11 +89,62 @@ QSSTV 9.2.x has the following new features compared to QSSTV 8.2.x
- Editor/templates: multi-line inputs for x,y and z
- Pulse audio direct interface
\page changelog Change log
\li 20190804 QSSTV 9.4.4
- removed auto declaration in basicgraphicitem.cpp (needs C++11)
\li 20190803 QSSTV 9.4.3
- added -Wno-implicit-fallthrough to qsstv.pro
- macro text \%s (SNR) is now supported in template
- change in Test FTP Connections
- improved sync detection in SSTV mode
- documentation update
- lowered audio level of WF ID
- a number of small bug fixes
\li 20190506 QSSTV 9.4.2
- replaced [[fallthrough]] statements for older compilers.
\li 20190505 QSSTV 9.4.1
- redesign of the template editor
- fixed template image corruption when image Fit mode was selected.
- use of transparent images fixed (imageBackgroundColor (see Config GUI) is used to process transparency)
- removed c++11 Config option in qsstv.pro. Eliminated dependencies on c++11 to commpile with older compilers.
\li 20190418 QSSTV 9.3.3
- fixed api documentation generation
\li 20190418 QSSTV 9.3.2
- complete rewrite of the FTP interfaces. They now run in a seperate thread
- removed Hybrid notify config. All hybrid configurations are in one tab: Hybrid
- size of recorded wav files was internally set to 0, fixed.
- tx audio to wav file was output in mono with half the samples -> fixed
- scaling of images in sstv tx mode -> fixed
- show image with template when loading new image ->fixed
- callsign was not set/send in DRM tx
- new FFT implementation
- compression in DRM now based on size in stead of ratio
- fix error in Reed-Solomon decode when no erasures found
- repeater functions implemented
- fixed bug in AVT24-AVT90-AVT94
- removed use VIS option in SSTV (now when a VIS code is detected, the mode is restricted to that VIS mode)
- added confirmation options for delete files and program exit in gui configuration
- more testing on raspberry Pi 3 model B. (compilation and execution OK)
- added PKTLSB, PKTUSB and PKTFM in frequency config modulation
- added passband to frequency settings
- minor bug fixes
\li 20181226 QSSTV 9.2.8
- pulse audio selection had some bugs -> fixed
\li 20180504 QSSTV 9.2.7
- Right clicking in Galery window on empty image segfaults: fixed
- updated some documentation typo's (Thanks Marinus DJ0MBA)
- compiler warnings cleanup
\li 20170817 QSSTV 9.2.6
- Changed the .pro file for autodetecing correct libopenjpg2 (DL1JBE -Tom)
- ftp transfer - initialize bug fix (VK6MN- Mike)
@ -85,8 +154,6 @@ QSSTV 9.2.x has the following new features compared to QSSTV 8.2.x
- fixed audio loopback use
- fixed transmission after stop, image was not restarted at top
\li 20161022 QSSTV 9.2.5
- Screen size reduced for use with smaller screens-fixed.
- rig control - added capabilities test.
@ -105,8 +172,6 @@ QSSTV 9.2.x has the following new features compared to QSSTV 8.2.x
- Added new features (such a save waterfall image) implmented by Mike, VK6M
- Todo: update the documentation !
\li 20160929 QSSTV 9.2.2
- added CTRL_F keyboard shortcut to switch to and from full screen. This is mainly used on low resolution screens where the top and/or
bottom taskbars are masking part of the QSSTV window.
@ -116,7 +181,6 @@ bottom taskbars are masking part of the QSSTV window.
- changed SSTV sync detection
- some minor bug fixes
\li 20160703 QSSTV 9.1.8
- The program uses jp2 files for sending images in DRM mode. The file extensions were not correct. ->fixed
- changes of the configuration do not need a restart of the program anymore (adding templates, stock images, DRM Profiles)
@ -126,7 +190,6 @@ bottom taskbars are masking part of the QSSTV window.
- Screen size reduced to 791x684 for use with smaller screens.
- Added voice/data port selection for PTT (thanks to David VK3DCU)
\li 20160701 QSSTV 9.1.7
- Normally the audio is generated on the left channel. There is now an option in the soundconfig
to swap left and right channel. Some radios like the TS590 are using the right audio channel via USB (test done by PE1DFQ - Gerard).
@ -135,7 +198,6 @@ bottom taskbars are masking part of the QSSTV window.
- Fixed bug: Waterfall font size was not correctly saved.
- Added "Bold" option for Waterfall font.
\li 20160628 QSSTV 9.1.6
- ftp transfer crashes when transmitting in hybrid mode-> solved
@ -187,7 +249,6 @@ bottom taskbars are masking part of the QSSTV window.
- first release
\page installation Installation
Warning: from version 9.1.1 and higher, Jasper library is dropped and openjpeg is used
@ -197,7 +258,7 @@ We need openjpeg2 (e.g. libopenjpeg2.1 or higher) and not libopenjpeg 1.5
Before you can compile QSSTV make sure that you have installed the following software
- g++
- libfftw3-dev
- qt5-default (qt4-default)
- qt5-default
- hamlib-dev
- libasound2-dev
- libpulse-dev
@ -205,13 +266,10 @@ Before you can compile QSSTV make sure that you have installed the following sof
- libopenjp2-7-dev
- libv4l-dev
QSSTV is compatible with Qt 4.8.6 but mostly tested on Qt 5.4.x or higher
<p>On Ubuntu, Debian or Mint you can type:
<pre>sudo apt-get install g++ libfftw3-dev qt5-default libpulse-dev</pre>
<pre>sudo apt-get install hamlib-dev libasound-dev libv4l-dev</pre>
<pre>sudo apt-get install hamlib-dev libasound2-dev libv4l-dev</pre>
<pre>sudo apt-get install libopenjp2-7 libopenjp2-7-dev</pre>
If you don't find libopenjp2-7 you can download it with the follwing commands if you're running a Debian derived distribution:
@ -227,7 +285,7 @@ First install the library and then the development package. This is the case for
For specific instructions on installation on different distributions: have a look at the FAQ
html http://users.telenet.be/on4qz/qsstv_9/faq.html
html http://users.telenet.be/on4qz/qsstv/faq.html
\section step2 Step 2: Getting the software
@ -236,11 +294,11 @@ Download the latest tar file to a local directory (e.g. ~/Downloads)
\section step3 Step 3: Compile and Install the software
Go to the directory you have chosen and extract the tar file.
Note: replace the 9.1.1 with the appropriate version you have downloaded
Note: replace the 9.4.2 with the appropriate version you have downloaded
<pre>
>cd ~/Downloads
>tar -xvzf qsstv_9.1.1.tar.gz
>cd qsstv_9.1.1
>tar -xvzf qsstv_9.4.2.tar.gz
>cd qsstv_9.4.2
>qmake
>make
>sudo make install
@ -249,26 +307,30 @@ Note: replace the 9.1.1 with the appropriate version you have downloaded
You can now run the program by typing qsstv at the prompt of a terminal session, or make a short cut on your desktop.
<pre>>qsstv</pre>
If you have problems compiling the software, please give as much information as possible but at least:
- Linux Distribution (e.g. Ubuntu 12.10)
- Linux Distribution (e.g. Ubuntu 18.04)
- QT Version (e.g Qt 5.4.1)
- Dump of the compile process showing the error
\page gettingstarted Getting Started
The program is build around 3 windows
- Receive window: Receive functions and configuration
- Transmit window: Transmit functions and camera control
- Receive window: Receive functions for SSTV and DRM
- Transmit window: Transmit functions for SSTV and DRM and camera control
- Gallery window: History of received images, transmit images and templates
<br>
The program will remember the last position and the size of each window on restart.
\section config Configuration
Start the program and follow the configuation and calibration instructions below.
Before we can use QSSTV you need to do some configuration.
\page config Configuration
Before we can use QSSTV you need to set some configuration options.
\image html config.png
The configuration tool is accessed through the "Options" menu in the receive window.
The following tabs are available
<br><br>
\li Personal Settings
\anchor operator
\li Operator Settings
<br><br>
\image html config1.png
<br><br>
@ -277,8 +339,10 @@ The following tabs are available
- Last Name
- QTH
- Locator (Grid Square)
<br>This information can also be used in templates (see also \ref editor)
<br><br>
<br>The above information can also be used in templates (see also \ref editor93 \ref editor94)
<br>
- Allow other users to see your online status via the notification server
<br>The text will be added to the notification send to the hybrid server<br>
\li Directories
<br><br>
@ -289,6 +353,7 @@ The following tabs are available
- TX Images: directory for images to transmit
- Templates: directory where the template files are stored
- Audio Records: directory for audio files (where you save/read recorded audio files)
- Save TX images in TX SSTV or TX DRM directory: if selected the TX image will be saved
- Documentation: URL of the user manual (if you copied the manual locally then you can point to it with e.g. file:///usr/share/doc/qsstv/manual
<br><br>
@ -305,6 +370,8 @@ Push the push button to select the colour selector.
- Low Resolution: Select this option if your display is for example 800x480. This options sets the maximum vertical resolution of QSSTV to less than 480 lines. It therefore removes some features
from the receive window (Rx Notification Window in DRM) and the transmit window (Image replay Preview and TX Notifications in DRM mode).
You can toggle to and from full screen by using the CTRL_F key combination.
- Ask for confirmation when deleting file: When you delete a file from the gallery it will ask for confirmation before deleting the file, otherwise it will simply delete the file.
- Ask for confirmation when closing QSSTV: if checked, ask: "Are you sure to exit QSSTV" before closing the program
<br><br>
@ -312,11 +379,12 @@ You can toggle to and from full screen by using the CTRL_F key combination.
\li Audio
<br><br>
\image html config4.png
<br><br>
<br>
See also \ref volume
<br>
- ALSA Input Audio Device : depending on your hardware (e.g. default,hw:0,0)
- ALSA Output Audio Device : depending on your hardware (e.g. default,hw:0,0)
- PulseAudio: native pulse audio interface
<br>Note: <b> Most distributions use Pulse Audio interface.. You can select the audio card settings through the audio applet by right clicking on the Speaker icon and selecting the Sound Preferences</b>
- RX Clock frequency : clock used while receiving SSTV images,(see also \ref calib)
- TX Clock frequency : clock used while transmitting SSTV images,(see also \ref calib)
- Sound Input routing
@ -363,16 +431,27 @@ Example: IC-706MKIIG via a cat interface such as interfaceOne.
\anchor flrigconfig
- Enable XMLRPC
This allows you to connect to the Flrig program using the XMLRPC protocol. Flrig will handle all the communication with the transceiver (including PTT).
The Flrig version must be lower then 1.3.4x
- TX Delay: The program will wait for the selected delay before transmitting any audio.
Note: The option Enable XMLRPC excludes the use of hamlib.
A sample set-up of Flrig is shown below.
A sample set-up of Flrig (version <1.3.4x)is shown below.
<br><br>
\image html flrig1.png
<br><br>
You can now also connect via Hamlib to Flrig (model number 4).
There are two prerequisites
- Hamlib version 3
- Flrig 1.3.4x or higher
\image html cat_flrig.png
<br>
@ -388,16 +467,24 @@ A sample set-up of Flrig is shown below.
\li Repeater
<br><br>
<br>
\anchor repAnchor
<br>
\image html config7.png
<br><br>
- Enable repeater: enable repeater operation
- Image Interval (min): interval time before sending one of the Idle Images
- Repeater TX mode: the mode the repeater will use to send the images
- Tx Delay(sec): Wait x seconds after reception of an valid image before repeating the image
- DRM Image Size (kB) : The maximum size of the image used in DRM mode
- Idle Image[1-4]: images send by the repeater if there is no activity for more than the interval time
- Idle Template:template that will be super-imposed on the idle images
- Repeater Template: template that will be super-imposed on the repeated(received) images
See also \ref repeater
\li FTP
<br><br>
\image html config8.png
@ -405,15 +492,16 @@ A sample set-up of Flrig is shown below.
This is used to save the received images to an FTP server. The images will also still be saved in the local rx folder.
- Enable FTP: enable ftp operation
- FTP Port: default 21
- Default Image Format: select the image format from the drop down bow (used only in SSTV)
- Default Image Format: select the image format from the drop down box
- Remote Hostname: hostname of the ftp server (e.g. myftp.home.net or 192.168.0.1)
- Remote directory:the ftp server directory where you'll store the images
- FTP Login name: your login name on the server (can be anonymous)
- FTP Password: if you need one, otherwise leave blank
- Image store:
- Image1 - image30: The files will be saved under the generic name imageXX, where xx ranges from 1 to 30. When a new image arrives, the old images are shifted down
image1 to image30: The files will be saved under the generic name imageXX, where xx ranges from 1 to 30. When a new image arrives, the old images are shifted down
(i.e. image29 becomes image30, image28 becomes image 29 etc ..) and the new one is stored as image1.
-file name: the image (or other type of file) is stored with a file name derived from the mode (SSTV) or from the file name transmitted in DRM.
- add image format extension: if checked, the xetension is added to the filename (e.g. image2.png)
- file name: the image (or other type of file) is stored with a file name derived from the mode (SSTV) or from the file name transmitted in DRM.
Note: This FTP server is unrelated to the FTP server for Hybrid Mode.
@ -431,37 +519,43 @@ You will either see a pop-up with "Connection OK" or an error message showing th
- End Pic: Waterfall text to send at the end of a DRM transmission
- FIX: Waterfall text to send at the beginning of a DRM retransmission
- BSR: Waterfall text to send at the beginning of a DRM request for retransmission
<br> Note: you can also use %%m. This will be replaced by your call sign
<br> Note: you can also use macros (e.g. %m, %q ...) in the text (see \ref macros "macros")
\li Hybrid
<br><br>
\image html config10.png
<br><br>
- Enable Reception in Hybrid Mode: allows reception of hamDRM in hybrid mode. If this is not enabled, hybrid mode files will not be shown or stored.
- Enable Reception in Hybrid Mode: allows reception of hamDRM in hybrid mode. If not enabled, hybrid mode files will not be shown or stored.
- FTP Port: default 21 (cannot be modified at this moment for compatibility with EasyPal)
- Remote Hostname: hostname of your ftp server
- Remote directory:the ftp server directory where the stored images are
- FTP Login name: the login name on the server
- FTP Password: will be encrypted
- Send RX Notifications in Hybrid mode: The notifications will be send to the server used by the sender
- Host: hostname of the ftp server you will use
- Host: the ftp server where the hybrid images will be send to.
- Login: the login name on the server
- Password: will be encrypted
- Directory: default empty
Login name, password,hostname and directories will be encrypted before being sent on the air.
If you want to use the special server, the directories to store images is relative to the directory HybridFiles1. So first create a top level directory HybridFiles1.
If you leave the Remote Directory empty, then the files will be placed in the directory HybridFiles1.
If you put for example "testdir" in the Remote Directory (as shown in the above screen shot), then you need to create testdir under HybridFiles (HybridFiles1/testdir).
The directories on the FTP server must be created at root level.
- HybridFiles1 -- where the hybrid files are uploaded
- RxOkNotifications1 -- where the notification are sent when receiving an DRM image
- OnlineCallsigns1 -- where the call sign and info text is sent
If a directory is specified (e.g test) then the following directories must be cretaed:
- test/HybridFiles1
- test/RxOkNotifications1
- test/OnlineCallsigns1
QSSTV will not create those directories for you.
EasyPal also use two other directories on the same level as HybridFiles1
- OnlineCallsigns1
- RxOkNotifications1
You can create them on your server but they are not used by QSSTV at this moment.
You can test the connection by clicking the Test connection button. It will setup a connection to the server and send a test file to check if all parameters are correct.
You will either see a pop-up with "Connection OK" or an error message showing the reason of the fail.
There are some public servers you can use.
Have a look at http://www.easypal.org/
\li DRM Profiles
<br><br>
\image html config11.png
@ -470,16 +564,17 @@ Used for quick selection of the most common settings you use in DRM.
Choose a short name for the profile and make a selection for all the parameters.
The name will appear in the Profiles drop-down box in the Transmit window for DRM.
See
\li Frequencies
\anchor configFreq
<br><br>
\image html config12.png
<br><br>
- List of selectable frequencies. Click Add to add a new combo frequency/mode/modulation. Enter the frequency and select the mode and modulation type.<br>
To move a frequency/mode/modulation up or down the list, click first on the entry in the table and then click on one of the arrow buttons.
- Hamlib Data Command: (only used with Hamlib) As far a I know Hamlib does not support switching the Icomxxx to data mode.
As a result, if you for example selected USB-D1 on a Icom 7600,changing the frequency will switch the rig back to the regular USB (data mode off).<br>
- List of selectable frequencies. Click Add to add a new combo frequency/mode/modulation/passband. Enter the frequency and select the mode,modulation and passband type.<br>
To move a frequency/mode/modulation/passband up or down the list, click first on the entry in the table and then click on one of the arrow buttons.
- Filter 1 will be selected if PKTxxx is used on ICOM (hamlib limitation).
- Hamlib Data Command: (only used with Hamlib)
Hamlib Data Command allows you to send a "raw command" that will be executed when you change frequencies.
- Example: FEFE7AE01A060101FD and Hex button checked: will put the Icom in data mode D1 (LSB, USB or FM) and the Filter 1.
@ -490,19 +585,32 @@ Hamlib Data Command allows you to send a "raw command" that will be executed whe
- Note 2: Flrig does not support FM data modes.
\page volume Volume Settings
You will not find a volume setting within QSSTV.<br>
The volume (audio out and audio in) are handled by the OS.<br>
Most distributions use Pulseaudio interface.<br>
You can select the audio card settings through the audio applet by right clicking on the Speaker icon and selecting the Sound Preferences.<br>
Pulseaudio is the easiest to setup because the audio levels can be set per application.<br>
Use <b>pavucontrol</b> to setup playback and recording levels.
\image html pavu_playback.png
\image html pavu_rec.png
\page calib SSTV Calibration
Calibration is only needed for SSTV mode.
\section calib Calibration
Note: Calibration is only needed for SSTV mode
All SSTV applications need an accurate and stable clock. The accuracy of a PC clock is not always correct.
Therefore it's necessary to execute some sort of calibration.
You need to synchronize your PC with an network time server via the ntp protocol.
Every Linux distribution has some configuration tool that allows you to install the ntp client. Be sure it's active.
You can check it with:
<pre>
>ntpdc -p
>ntpq -p
</pre>
The selected ntp server should have an asterisk in the first column.
<pre>
remote local st poll reach delay offset disp
@ -510,6 +618,26 @@ remote local st poll reach delay offset disp
*stratum1dc1.bc 10.119.37.19 2 64 377 0.00386 0.036853 0.06850
</pre>
Newer sytems default install timesyncd instead of ntpd.
timesyncd connects to the same time servers and works in roughly the same way,
but is more lightweight and more integrated with systemd.
The status of timesyncd can be checked by running timedatectl with no arguments.
<pre>
>timedatectl
</pre>
The output should look like:
<pre>
timedatectl
Local time: do 2019-03-14 02:06:04 CET
Universal time: do 2019-03-14 01:06:04 UTC
RTC time: do 2019-03-14 01:06:04
Time zone: Europe/Brussels (CET, +0100)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
</pre>
You can now launch the Calibration.<br><br>
<b>It will take several minutes to complete. Be sure to wait long enough, the progress is extremely slow</b>
<br><br>
@ -521,7 +649,7 @@ When RX and TX calibration is finished, press the OK button to accept the new va
\page statusbar Statusbar
\image html statusbar.png
- Radio Frequency: the current frequency of the radio (only if CAT interface is enabled)
- Radio Frequency: the current frequency of the radio (only if CAT interface is enabled and there is a connection with the radio, else "No Rig" will be displayed )
- Drop down menu to set the radio on the selected frequency (only if CAT interface is enabled) (see also \ref configFreq Config freq)
- WF Text: gives you a selection of user defined text you can send to appear as waterfall text.
<br><br>
@ -559,8 +687,6 @@ By right clicking on the images, a pop-up window appears that can have one or mo
- Properties: displays the image and file properties if available
\page RXSSTV Receive SSTV Window
\image html rxwidget1.png
Menu toolbar:
@ -593,7 +719,7 @@ You may notice a momentary freeze of the image build-up while the program is rec
- Mode: you can either select AUTO or one of the supported SSTV modes.
When AUTO is selected, the program will try to determine the mode of the image it is receiving.
If a specific mode is selected the program will reject all images except if they are transmitted in the selected mode.
- Signals: Normal and DX.
- Sensitivity: Low, Normal, High and DX.
When the Sensitivity is set to DX the signal will run until the end of the image before resynchronization.
@ -654,10 +780,9 @@ The text inputs correspond to the following macros:
\li x %%x - comment1
\li y %%y - comment2
\li z %%z - comment3
\n see also \ref editor
\n see also \ref editor93 \ref editor94
- The last received image is displayed at the bottom right. It will be updated automatically as
new images are received. They can be inserted if you use a template containing an "image replay object" see also \ref editor
new images are received. They can be inserted if you use a template containing an "image replay object" see also \ref editor93 \ref editor94
<br>
Right clicking on this image also allows you to load other images for insertion. Use the refresh button to update the main window if necessary.
@ -714,9 +839,14 @@ If the data stream is a text file it will be displayed in a separate window. Jus
\image html waterfall.png
Spectrum:<br>
You can select the spectrum or the waterfall by clicking in this window. In DRM the waterfall gives you better view.
<br>
The three markers above the waterfall indicate the position of the pilot frequencies. This helps tuning the radio to the correct frequency.
<br><br>
(8) see \ref RXSSTV
<br>
Who is On?
Information about other station on the hybrid server. There are some
- The stations must enable : Allow other users to see youtr online status ... see \ref operator configuration
see \ref RXSSTV
\page TXDRM Transmit DRM Window
@ -743,7 +873,7 @@ Mode Selection
- Interleave (Short or Long)
- Protection (Normal or High)
- QAM (4,16 or 64)
- Reed Solomon: (rs1, rs2, rs3 or rs4).File encoder for forward error correction. On HF it is recommended to always use Reed Solomon. The most often used is rs2.
- Reed-Solomon: (rs1, rs2, rs3 or rs4).File encoder for forward error correction. On HF it is recommended to always use Reed-Solomon. The most often used is rs2.
The higher the number, the more protection but also the more overhead.
- Profile: quick selection of a profile (i.e. settings of mode,QAM ...) as defined in the Options->Configuration->DRM Profiles)
<br>
@ -754,7 +884,7 @@ The TX progress-bar indicates the progress of the transmission.
see also \ref Control under SSTV TX
- Last received image will be updated automatically as
new images are received. They can be inserted if you use a template containing an "image replay object" see also \ref editor
new images are received. They can be inserted if you use a template containing an "image replay object" see also \ref editor93 \ref editor94
<br>
- Compression
<br><br>
@ -765,6 +895,41 @@ You can drag the slider to compress the image before it is sent (the original im
<br>
Note: This does not include the overhead of the RS-encoding.
\page drmmodes Mode Settings for DRM
Settings for HF and VHF/UHF are very different.
General rules of thumb:<br>
Mode A: most demanding, used on VHF/UHF<br>
Mode B: use on HF/VHF/UHF<br>
MODE E: least demanding, used on HF<br>
QAM 64 : most demanding, used on VHF/UHF in really good conditions<br>
QAM 16 : used on VHF/UHF in fairly good conditions sometime also on HF<br>
QAM 4 : least demanding, used on HF <br>
Bandwith:
- 2.5 kHz: VHF/UHF
- 2.2 kHz; HF
Protection:
- Depends on the conditions, leave it on High
Interleave:
- leave it on Long on all bands
Reed-Solomon:<br>
Reed-Solomon provides Forward Error Correction by adding redundant bytes per block of 255 bytes.<br>
More errors can be corrected when more redundant bytes are used.<br>
This adds overhead to the transmission.
- RS1 increased by 13%
- RS2 increased by 33% most often used
- RS3 increased by 60%
- RS4 increased by 99%
Always use Reed-Solomon encoding on HF bands.
\page fixdrm Sending FIX in DRM
\image html fix.png
@ -774,6 +939,19 @@ You can either send the fix or cancel.<br>
If the BSR is not for you then the following window will pop-up for a few seconds.
\image html bsr_nfy.png
\page spectrumwf Spectrum and Waterfall Display
\image html spectrum_wf.png
Note: the settings Max dB, Range and AVG do not influence in any way the sensitivity of the reception in SSTV or DRM.
\image html spectrum1.png
Max dB:
- defines the audio level at the top of the spectrum display
Range
- defines the dynamic range in dB to display
Avg:
- this is the integration factor to smooth the spectrum display. Values are between 0.6 and 1 (0.88 is a good value).
\page gallery Gallery
@ -796,7 +974,7 @@ Some examles
\page editor Editor
\page editor93 Editor version 9.2 and 9.3
The editor can be used for regular image editing and for the creation and editing of template images.
Template images are used as overlays. They will be dynamically adapted when you select the template in the TX-window.
While in edit mode, you can change all the attributes (such as size, position, colours etc ...). If you save the canvas as an
@ -811,6 +989,22 @@ If you hoover over the object you will see the cursor change to a hand-icon (in
The attributes (line colour, fill colour, gradients etc ..) that are active in the top menu will be used to create the item.
Object have also a z-component, i.e they can be in front our behind another object. This can be changed by right clicking on the item and use the Arrange selection.
\li File Menu
- New: Create a new file
- Open: Open an existing file. If the canvas already contains items, new items will be added to the existing ones this allows combining templates. You can use the Clear All function from the Edit Menu
to clear the canvas first.
- Save file ..: Save the file under the same name
- Save Image file ..: Create an normal image file. All items will be rendered (flattened) to create one single image.
- Save Template ..: Create template file. All items will be editable when the file is loaded again.
- Quit Exit the editor
\li Edit Menu
- Delete: Delete the selected items
- Copy: Copy the selected items
- Paste: Paste the copied items.
- Clear all: Clear the canvas completely
\image html editor_1.png
\li Top menu 1
@ -876,6 +1070,121 @@ Here's an example of the editor using macros and the result in the transmitter.<
<br><br>
\image html transmitdrm.png
See also \ref macros
\page editor94 Editor version 9.4
The editor can be used for regular image editing and for the creation and editing of template images.
Template images are used as overlays. They will be dynamically adapted when you select the template in the TX-window.
While in edit mode, you can change all the attributes (such as size, position, colours etc ...). If you save the canvas as an
image, the scene will be rendered (i.e. flattened) and become a single image object. If you save the canvas as a template, all objects
will be accessible again when loaded.
\li File Menu
- New: Create a new file
- Open: Open an existing file. If the canvas already contains items, new items will be added to the existing ones this allows combining templates. You can use the Clear All function from the Edit Menu
to clear the canvas first.
- Save file: Save the file under the same name
- Save as Image: Create an normal image file. All items will be rendered (flattened) to create one single image.
- Save as Template: Create template file. All items will be editable when the file is loaded again.
- Quit Exit the editor
\li Edit Menu
- Delete: Delete the selected items
- Copy: Copy the selected items
- Paste: Paste the copied items.
- Clear all: Clear the canvas completely
<br>
To create an object, click on the left menu to select the type of object (e.g circle) and then click on the canvas where you want the object positioned.
Just click on an item to select it. A outline of the item will be shown by highlighting the item.
If you hoover over the object you will see the cursor change to an arrow_forbidden icon if the item is locked;
<br>
A selected item will be highlighted and resizing handles and rotate handle are shown.
Text items only have the rotate handle. Resizing of text is only done through the font settings.
- resize
\image html editor_resize.png
- rotate
\image html editor_rotate.png
\image html editor_rotate2.png
- rotate text
\image html editor_text_rotate.png
The attributes (line colour, fill colour, gradients etc ..) that are active in the top menu will be used to create the item.
Object have also a z-component, i.e they can be in front our behind another object. This can be changed by right clicking on the item and use the Arrange selection.
\image html editor_1b.png
\li Top menu 1
- Image Size: Select the size of the image: the outline of the image will be shown on the canvas.
\image html editor_image_sizeb.png
- Font: drop down box where you can select the text font
- Font size: text size
- Bold : bold text
- Italic: italic text
- Underline: underlined text
- Pen width: width of lines in number of pixels (used with borders and text outline)
\li Top menu 2
- Fill: Fill colour drop down menu
- Line: Line colour drop down menu
- Gradient: Gradient selection menu
\li Left menu
- \image html fcircle.png
create filled circle/ellipse
- \image html frect.png
create filled rectangle
-\image html line.png
create line
-\image html camera.png
insert image
-\image html replay.png
insert replay image place-holder. When the template will be loaded in the TX-window, this place-holder will replaced by the last received image
-\image html text.png
create text. When you select this option a window will pop-up to enter text.
<br>
-\image html entertextb.png
<br>You can enter multiple lines of text. Click OK, the window will be hidden and you can click on the canvas to position the text.
The text will appear on the canvas.
-\image html multilineb.png
<br>
\li Bottom menu
- Horizontal Shear: shear selected object horizontally
\li Right menu
- Vertical Shear: shear selected object vertically
<p>
If you right click on an object then the following pop-up menu will be shown:</p>
\li Arrange
- Forward - one level forward
- Backward - one level backward
- Bring to Front - all the way to the front
- Sent to Back - all the way to the back
\li Change text - change the text of a text object
\li Delete - remove selected object from the canvas
\li Expand - object will expand horizontally and vertically to fill the complete canvas
\li Lock - lock items so that they can not be moved or resized
\li Unlock - unlock selected items
<p> We need some sort of macro's to enable variable text when transmitting images. The editor uses predefined strings that will be replaced by
the "actual content" when the template is processed just before transmission.<br>
Here's an example of the editor using macros and the result in the transmitter.</p>
<br>
\image html editor_2b.png
<br><br>
\image html transmitdrmb.png
For the use of macro's see \ref macros
\page macros Macro Text
You can use macros to expand text add runtime. When layouting templates remember that % macros will be replaced by the final text.
<br> Example: %v will expand to QSSTV.9.4.3.
So leave enough room to place the final text.
Following macro's are supported:<br>
Macro's where the value is defined in the configuration
@ -899,8 +1208,32 @@ Macro's where the value is defined by the system
\li %%t - time in hours:minutes format
\li %%d - date in year/month/day format
\li %%v - qsstv_version
\li %%s - SNR - only to be used for DRM in the WF Text see also \ref statusbar
\li %%s - SNR only in DRM mode
- in version 9.3 only used in the WF Text see also \ref statusbar
- in version 9.4 and higher used in the WF Text and in the template images
\page repeater Repeater
This feature allows you to repeat images in both SSTV and DRM mode.
see also \ref repAnchor "Repeater Configuration"
It will first receive an image and after decoding it will retransmit the processed image.
The repeater acts like a parrot, it is not just retransmitting the audio.
When the repeater is inactief for a time (idle time) specified in the repeater configuration, 1 of 4 images will be transmitted.
The overlay can be specified in the configuration.
The retransmitted images are send in the mode selected in the Transmit window.
For SSTV the mode can be the same as the mode of the received image.
The repeater does not allow for cross-mode (i.e SSTV repeated in DRM or vice versa)
Images will only be repeated if:
- For DRM: the image was received without errors or after correction.
- For SSTV: the image was received and the Complete precentage has been met.
In DRM the repeater will never use Hybrid mode to repeat the image.
\page credits Credits

Wyświetl plik

@ -1,77 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>QSSTV: Copying</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="qsstv.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">QSSTV
&#160;<span id="projectnumber">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('Copying.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">Copying </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>This software uses Qt for Linux: see <a href="http://qt.digia.com/">http://qt.digia.com/</a> The application is released under GPLv3 </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="index.html">QSSTV 9.2</a></li>
<li class="footer">Generated on Thu Nov 16 2017 18:16:13 for QSSTV by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 925 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 568 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 96 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 180 KiB

Wyświetl plik

@ -1,138 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>QSSTV: Receive DRM Window</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="qsstv.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">QSSTV
&#160;<span id="projectnumber">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('RXDRM.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">Receive DRM Window </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="image">
<img src="receivedrm.png" alt="receivedrm.png"/>
</div>
<p>SNR (vu-meter S):</p><ul>
<li>SNR in dB</li>
</ul>
<p>Volume (vu-meter V):</p><ul>
<li>adjust your recording level to half scale (better too low than too high).</li>
</ul>
<p>Received segments: </p><div class="image">
<img src="rxdrm_segments.png" alt="rxdrm_segments.png"/>
</div>
<ul>
<li>green: correctly received segments</li>
<li>red: missing segments</li>
</ul>
<p>Constellation: </p><div class="image">
<img src="rxdrm_constellation.png" alt="rxdrm_constellation.png"/>
</div>
<ul>
<li>FAC constellation (always QAM 4)</li>
<li>MSC constellation.</li>
</ul>
<p>Receive status </p><div class="image">
<img src="rxdrm_status.png" alt="rxdrm_status.png"/>
</div>
<ul>
<li>Mode (A,B or E)</li>
<li>Bandwidth (2.2 kHz or 2.5 kHz)</li>
<li>Interleave (Short or Long)</li>
<li>Protection (Normal or High)</li>
<li>QAM (4,16 or 64)</li>
<li>SNR (should be above 6 dBm)</li>
<li>Offset (0 Hz if no frequency offset)</li>
<li>Total Segm.: total number of segments in the file</li>
<li>RX Sgmnts.: number of correctly received segment</li>
<li>Cur. Sgmnt.: segment currently transmitted</li>
<li>Transp. ID; unique identifier for the current stream.</li>
<li>Callsign from the transmitting station</li>
</ul>
<div class="image">
<img src="statusleds.png" alt="statusleds.png"/>
</div>
<ul>
<li>TIME: green if time sync else red</li>
<li>FRAME: green if frame sync else red</li>
<li>FAC: green if FAC correctly received else red</li>
<li>MSC:<ul>
<li>red: incorrectly received</li>
<li>green: correctly received</li>
<li>yellow: already received</li>
</ul>
</li>
</ul>
<p>When an data stream is received , the program will try to decode it and save it in the receive image directory. If the data stream is a text file it will be displayed in a separate window. Just click OK to close it.</p>
<div class="image">
<img src="waterfall.png" alt="waterfall.png"/>
</div>
<p> Spectrum:<br />
You can select the spectrum or the waterfall by clicking in this window. In DRM the waterfall gives you better view. The three markers above the waterfall indicate the position of the pilot frequencies. This helps tuning the radio to the correct frequency. <br />
<br />
(8) see <a class="el" href="RXSSTV.html">Receive SSTV Window</a> </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="index.html">QSSTV 9.2</a></li>
<li class="footer">Generated on Thu Nov 16 2017 18:16:13 for QSSTV by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>

Wyświetl plik

@ -1,121 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>QSSTV: Receive SSTV Window</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="qsstv.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">QSSTV
&#160;<span id="projectnumber">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('RXSSTV.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">Receive SSTV Window </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="image">
<img src="rxwidget1.png" alt="rxwidget1.png"/>
</div>
<p> Menu toolbar: </p><ul>
<li><div class="image">
<img src="start.png" alt="start.png"/>
</div>
start receiving images </li>
<li><div class="image">
<img src="stop.png" alt="stop.png"/>
</div>
stop receiving images </li>
<li><div class="image">
<img src="replay.png" alt="replay.png"/>
</div>
force a restart (e.g. when you see a wrong synchronization then click the restart button). </li>
<li><div class="image">
<img src="filesave.png" alt="filesave.png"/>
</div>
save the image at any time using the save button. You will probably want to use this if the Auto-save is not selected. Note only active in SSTV mode. </li>
<li><div class="image">
<img src="eraser.png" alt="eraser.png"/>
</div>
erase the screen</li>
</ul>
<p>Sync Indicator (vu-meter S):</p><ul>
<li>sync quality ranging from 0-10</li>
</ul>
<p>Volume (vu-meter V):</p><ul>
<li>adjust your recording level to half scale.</li>
</ul>
<p>SSTV tab:</p><ul>
<li>Use VIS Code: the reception will only start if a correct VIS code is received. If left unchecked, QSSTV will auto-detect the modes (this is the most used method).</li>
<li>Auto-slant: A lot of times the receive clock of the local station is not equal to the transmit clock of the sending station. The result is a slanted image. If The auto-slant is activated, the program will automatically try to compensate for those clock differences. You may notice a momentary freeze of the image build-up while the program is recalculating the image.</li>
<li>Auto-save: When the program detect the end of the image, the image will be saved to disk.</li>
<li>Save if Complete %: Auto-save if the image is at least completed for the indicated percentage.</li>
<li>Mode: you can either select AUTO or one of the supported SSTV modes. When AUTO is selected, the program will try to determine the mode of the image it is receiving. If a specific mode is selected the program will reject all images except if they are transmitted in the selected mode.</li>
<li>Signals: Normal and DX. When the Sensitivity is set to DX the signal will run until the end of the image before resynchronization.</li>
</ul>
<p>Spectrum and Waterfall:<br />
There are three markers for SSTV (red lines):</p><ul>
<li>1200: Sync frequency</li>
<li>1500: Lower video frequency</li>
<li>2300: Upper video frequency In DRM, the markers indicate the 3 unmodulated carrier frequencies </li>
</ul>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="index.html">QSSTV 9.2</a></li>
<li class="footer">Generated on Thu Nov 16 2017 18:16:13 for QSSTV by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>

Wyświetl plik

@ -1,124 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>QSSTV: Transmit DRM Window</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="qsstv.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">QSSTV
&#160;<span id="projectnumber">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('TXDRM.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">Transmit DRM Window </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="image">
<img src="transmitdrm.png" alt="transmitdrm.png"/>
</div>
<p>see also <a class="el" href="TXSSTV.html#sstvMenu">sstvMenu</a> under SSTV TX</p>
<ul>
<li><div class="image">
<img src="binary.png" alt="binary.png"/>
</div>
Click here to send a binary file (basically any file will do)</li>
<li><div class="image">
<img src="hybrid_checkbox.png" alt="hybrid_checkbox.png"/>
</div>
When this check-box is checked, the image is transmitted in hybrid mode.</li>
</ul>
<p>For the other icons and actions see also <a class="el" href="TXSSTV.html">Transmit SSTV Window</a> <br />
<br />
Mode Selection </p><div class="image">
<img src="txdrm_options.png" alt="txdrm_options.png"/>
</div>
<p> <br />
</p><ul>
<li>Mode (A,B or E)</li>
<li>Bandwidth (2.2 kHz or 2.5 kHz)</li>
<li>Interleave (Short or Long)</li>
<li>Protection (Normal or High)</li>
<li>QAM (4,16 or 64)</li>
<li>Reed Solomon: (rs1, rs2, rs3 or rs4).File encoder for forward error correction. On HF it is recommended to always use Reed Solomon. The most often used is rs2. The higher the number, the more protection but also the more overhead.</li>
<li>Profile: quick selection of a profile (i.e. settings of mode,QAM ...) as defined in the Options-&gt;Configuration-&gt;DRM Profiles) <br />
</li>
</ul>
<div class="image">
<img src="txdrm_status.png" alt="txdrm_status.png"/>
</div>
<p>The TX progress-bar indicates the progress of the transmission.</p>
<p>see also <a class="el" href="TXSSTV.html#Control">Control</a> under SSTV TX</p><ul>
<li>Last received image will be updated automatically as new images are received. They can be inserted if you use a template containing an "image replay object" see also <a class="el" href="editor.html">Editor</a> <br />
</li>
<li>Compression <br />
<br />
</li>
</ul>
<div class="image">
<img src="txdrm_compression.png" alt="txdrm_compression.png"/>
</div>
<p> <br />
Avoid to send huge images (especially if you're not in hybrid mode).<br />
You can drag the slider to compress the image before it is sent (the original image is not modified). The file size is shown on the right. You can see the result in the image frame when you release the handle. <br />
Note: This does not include the overhead of the RS-encoding. </p>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="index.html">QSSTV 9.2</a></li>
<li class="footer">Generated on Thu Nov 16 2017 18:16:13 for QSSTV by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>

Wyświetl plik

@ -1,149 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>QSSTV: Transmit SSTV Window</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="qsstv.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">QSSTV
&#160;<span id="projectnumber">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('TXSSTV.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">Transmit SSTV Window </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="image">
<img src="txwidget1.png" alt="txwidget1.png"/>
</div>
<p>The TX progress-bar indicates the progress of the transmission. <br />
<br />
<a class="anchor" id="sstvMenu"></a>Menu toolbar: </p><ul>
<li><div class="image">
<img src="start.png" alt="start.png"/>
</div>
start transmitting images </li>
<li><div class="image">
<img src="stop.png" alt="stop.png"/>
</div>
stop transmitting images </li>
<li><div class="image">
<img src="tone.png" alt="tone.png"/>
</div>
sends a repeater tone of 1750 Hz </li>
<li><div class="image">
<img src="fileopen.png" alt="fileopen.png"/>
</div>
loads a file in the transmit window </li>
<li><div class="image">
<img src="edit.png" alt="edit.png"/>
</div>
opens the image editor </li>
<li><div class="image">
<img src="camera.png" alt="camera.png"/>
</div>
takes a snapshot if there is a camera installed that is supported by v4l2 </li>
<li><div class="image">
<img src="binary.png" alt="binary.png"/>
</div>
only used in DRM mode </li>
<li><div class="image">
<img src="doubletone.png" alt="doubletone.png"/>
</div>
let you select frequency and duration of a tone to send </li>
<li><div class="image">
<img src="sweep.png" alt="sweep.png"/>
</div>
let you select the sweep frequencies and duration to send </li>
<li><div class="image">
<img src="hybrid_dis_checkbox.png" alt="hybrid_dis_checkbox.png"/>
</div>
This check-box is disabled in SSTV mode </li>
<li><div class="image">
<img src="refreshbutton.png" alt="refreshbutton.png"/>
</div>
You can refresh the content of the replay image by clicking the Refresh button (e.g. when you have loaded a new image in the preview image window).</li>
</ul>
<ul>
<li>Select the transmission mode (Martin 1, Scottie etc.).</li>
</ul>
<p><a class="anchor" id="Control"></a></p><ul>
<li>Select CW if you want to append a morse message after the image (the message is set in Options-&gt;Configuration-&gt;CW) .</li>
<li>If the VOX check-box is set a tone will be sent before the actual image is sent so that you can use the VOX on your transceiver (if you do not have PTT control).</li>
<li>Select the template (or none) you want as an overlay (see <a class="el" href="gallery.html">Gallery</a>). Only the templates that are in the Gallery will be available.</li>
</ul>
<p>The text inputs correspond to the following macros:</p>
<ul>
<li>TO: %c - call of the contacted station </li>
<li>RSV %r - RSV (radio-strength-video best is 595) </li>
<li>Op: %o - name of the operator of the contacted station </li>
<li>x %x - comment1 </li>
<li>y %y - comment2 </li>
<li>z %z - comment3 <br />
see also <a class="el" href="editor.html">Editor</a></li>
</ul>
<ul>
<li>The last received image is displayed at the bottom right. It will be updated automatically as new images are received. They can be inserted if you use a template containing an "image replay object" see also <a class="el" href="editor.html">Editor</a> <br />
Right clicking on this image also allows you to load other images for insertion. Use the refresh button to update the main window if necessary. </li>
</ul>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="index.html">QSSTV 9.2</a></li>
<li class="footer">Generated on Thu Nov 16 2017 18:16:13 for QSSTV by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 298 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 246 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 229 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 676 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 147 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 189 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 8.2 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 29 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 17 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 1.6 KiB

Wyświetl plik

@ -1,242 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.11"/>
<title>QSSTV: Change log</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
$(window).load(resizeHeight);
</script>
<link href="qsstv.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">QSSTV
&#160;<span id="projectnumber">9.2</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.11 -->
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
</ul>
</div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('changelog.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<div class="title">Change log </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><ul>
<li>20170817 QSSTV 9.2.6<ul>
<li>Changed the .pro file for autodetecing correct libopenjpg2 (DL1JBE -Tom)</li>
<li>ftp transfer - initialize bug fix (VK6MN- Mike)</li>
<li>Help manual -&gt; path correction and corrected some typo's (DJ0MBA- Marinus)</li>
<li>SSTV initialize bug fix (Adrian)</li>
<li>Camera support for Raspberry PI Cam</li>
<li>fixed audio loopback use</li>
<li>fixed transmission after stop, image was not restarted at top</li>
</ul>
</li>
</ul>
<ul>
<li>20161022 QSSTV 9.2.5<ul>
<li>Screen size reduced for use with smaller screens-fixed.</li>
<li>rig control - added capabilities test.</li>
</ul>
</li>
</ul>
<ul>
<li>20161022 QSSTV 9.2.4<ul>
<li>some minor bugfixing</li>
<li>eliminated online status setting in Config Notication tab (doubled with setting in Operator settings)</li>
<li>bug fix: incremental counter on filename wih hybrid mode</li>
<li>added filename to statusbar when sending DRM image</li>
</ul>
</li>
</ul>
<ul>
<li>20161021 QSSTV 9.2.3<ul>
<li>bug fix: memory leak in tx DRM when loading/resizing images</li>
<li>faster compression of tx images</li>
<li>bug-fix: hybrid mode saved images with wrong file extension. Receivers tried downloading wrong file.</li>
<li>Added all the patches (more then 20) from Mike, VK6M: rx/tx notifications and a large number of patches for image handling</li>
<li>Added new features (such a save waterfall image) implmented by Mike, VK6M</li>
<li>Todo: update the documentation !</li>
</ul>
</li>
</ul>
<ul>
<li>20160929 QSSTV 9.2.2<ul>
<li>added CTRL_F keyboard shortcut to switch to and from full screen. This is mainly used on low resolution screens where the top and/or bottom taskbars are masking part of the QSSTV window.</li>
</ul>
</li>
</ul>
<ul>
<li>20160929 QSSTV 9.2.1<ul>
<li>added low Resolution mode</li>
<li>changed SSTV sync detection</li>
<li>some minor bug fixes</li>
</ul>
</li>
</ul>
<ul>
<li>20160703 QSSTV 9.1.8<ul>
<li>The program uses jp2 files for sending images in DRM mode. The file extensions were not correct. -&gt;fixed</li>
<li>changes of the configuration do not need a restart of the program anymore (adding templates, stock images, DRM Profiles)</li>
<li>images in the gallery are now resized.</li>
<li>added menu option To Tx in Gallery Images RX and TX.</li>
<li>image in viewer is zoomed when resized while keeping aspect ratio.</li>
<li>Screen size reduced to 791x684 for use with smaller screens.</li>
<li>Added voice/data port selection for PTT (thanks to David VK3DCU)</li>
</ul>
</li>
</ul>
<ul>
<li>20160701 QSSTV 9.1.7<ul>
<li>Normally the audio is generated on the left channel. There is now an option in the soundconfig to swap left and right channel. Some radios like the TS590 are using the right audio channel via USB (test done by PE1DFQ - Gerard).</li>
<li>On request from Michael DL3YAP: Added CW ID button to manually send the CW ID as specified in the CW config.</li>
<li>Name of ID button in the lower status bar changed to WF ID (waterfall ID) to avoid confusion with CW ID.</li>
<li>Fixed bug: Waterfall font size was not correctly saved.</li>
<li>Added "Bold" option for Waterfall font.</li>
</ul>
</li>
</ul>
<ul>
<li>20160628 QSSTV 9.1.6<ul>
<li>ftp transfer crashes when transmitting in hybrid mode-&gt; solved</li>
</ul>
</li>
</ul>
<ul>
<li>20160416 QSSTV 9.1.5<ul>
<li>upload received images to ftp server (sstv and drm) gave file error -&gt; solved</li>
</ul>
</li>
</ul>
<ul>
<li>20160415 QSSTV 9.1.4<ul>
<li>rx image save button was not working -&gt; fixed</li>
</ul>
</li>
</ul>
<ul>
<li>20160410 QSSTV 9.1.3<ul>
<li>fixing compiler error: missing function cleanupcache in release mode</li>
</ul>
</li>
</ul>
<ul>
<li>20160409 QSSTV 9.1.2<ul>
<li>implementation of image cache for faster image display in the gallery</li>
<li>bug fix ,race condition for RxNotification</li>
</ul>
</li>
</ul>
<ul>
<li>20160408 QSSTV 9.1.1<ul>
<li>replaced jpeg2000 library Jasper with openjpeg because some distros won't support Jasper anymore. Jasper has not been maintained for more than 10 years.</li>
</ul>
</li>
</ul>
<ul>
<li>20151130 QSSTV 9.0.9<ul>
<li>directories are auto-created if they don't exist</li>
<li>additional CAT command now also works with rigctld</li>
</ul>
</li>
</ul>
<ul>
<li>20150930 QSSTV 9.0.8<ul>
<li>fix DRM status update</li>
</ul>
</li>
</ul>
<ul>
<li>20150929 QSSTV 9.0.7<ul>
<li>fixed hang on exit</li>
</ul>
</li>
</ul>
<ul>
<li>20150928 QSSTV 9.0.6<ul>
<li>performace optimization (especially for Raspberry Pi 2)</li>
</ul>
</li>
</ul>
<ul>
<li>20150926 QSSTV 9.0.4<ul>
<li>added option for slow cpu (see Options -&gt;GUI) This makes it possible to run QSSTV running on a Raspberry Pi 2.</li>
<li>minor change to ALSA sound interface.</li>
<li>some more bug fixing</li>
</ul>
</li>
</ul>
<ul>
<li>20150910 QSSTV 9.0.3<ul>
<li>xmlrpc bug fix (persistent connections)</li>
<li>manual (a lot of) spelling corrections</li>
<li>compatibility with Qt 4.8</li>
</ul>
</li>
</ul>
<ul>
<li>20150907 QSSTV 9.0.2<ul>
<li>changed configuration frequencies to allow for data modes on Icom</li>
<li>changed Editor, you may need to check/re-edit your template files (text offsets may have changed)</li>
</ul>
</li>
</ul>
<ul>
<li>20150831 QSSTV 9.0.1<ul>
<li>first release </li>
</ul>
</li>
</ul>
</div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="index.html">QSSTV 9.2</a></li>
<li class="footer">Generated on Thu Nov 16 2017 18:16:13 for QSSTV by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.11 </li>
</ul>
</div>
</body>
</html>

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 132 B

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 15 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 34 KiB

Some files were not shown because too many files have changed in this diff Show More