='0' and c<='9')
{
s2+=c;
}
}
s2=s2.left(10);
return s2.toDouble();
}
void MainWindow::EnableControls()
{
FCDMODEENUM fme;
/* clear status string */
ui->fcdStatusLine->clear();
/*
{
struct hid_device_info *devs,*cur_dev;
devs=hid_enumerate(0x04D8,0xFB56);
cur_dev=devs;
while (cur_dev)
{
ui->plainTextEdit->appendPlainText(QString::number(cur_dev->vendor_id,16));
ui->plainTextEdit->appendPlainText(QString::number(cur_dev->product_id,16));
ui->plainTextEdit->appendPlainText(QString::fromAscii(cur_dev->path));
if (cur_dev->serial_number==NULL)
{
ui->plainTextEdit->appendPlainText("NULL");
}
else
{
ui->plainTextEdit->appendPlainText(QString::fromWCharArray(cur_dev->serial_number));
}
ui->plainTextEdit->appendPlainText(QString::fromWCharArray(cur_dev->manufacturer_string));
ui->plainTextEdit->appendPlainText(QString::fromWCharArray(cur_dev->product_string));
cur_dev=cur_dev->next;
}
hid_free_enumeration(devs);
}
*/
fme=FCDGetMode();
switch (fme)
{
case FME_APP:
{
QPalette p=ui->fcdStatusLine->palette();
p.setColor(QPalette::Base, QColor(0,255,0));//green color
ui->fcdStatusLine->setPalette(p);
}
ui->fcdStatusLine->setText("FCD is active");
break;
case FME_BL:
{
QPalette p=ui->fcdStatusLine->palette();
p.setColor(QPalette::Base, QColor(255,191,0));//amber color
ui->fcdStatusLine->setPalette(p);
}
ui->fcdStatusLine->setText("FCD bootloader");
break;
case FME_NONE:
{
QPalette p=ui->fcdStatusLine->palette();
p.setColor(QPalette::Base, QColor(255,0,0));//red color
ui->fcdStatusLine->setPalette(p);
}
ui->fcdStatusLine->setText("No FCD detected");
break;
}
ui->pushButtonUpdateFirmware->setEnabled(fme==FME_BL);
ui->pushButtonVerifyFirmware->setEnabled(fme==FME_BL);
ui->pushButtonBLReset->setEnabled(fme==FME_BL);
ui->pushButtonAppReset->setEnabled(fme==FME_APP);
ui->lineEditFreq->setEnabled(fme==FME_APP);
ui->lineEditStep->setEnabled(fme==FME_APP);
ui->pushButtonUp->setEnabled(fme==FME_APP);
ui->pushButtonDown->setEnabled(fme==FME_APP);
ui->spinBoxCorr->setEnabled(fme==FME_APP);
}
void MainWindow::on_pushButtonAppReset_clicked()
{
/* stop timeout while FCD is reconfiguring */
timer->stop();
FCDAppReset();
timer->start(1000);
}
void MainWindow::on_pushButtonBLReset_clicked()
{
/* stop timeout while FCD is reconfiguring */
timer->stop();
FCDBLReset();
timer->start(1000);
}
void MainWindow::on_pushButtonUpdateFirmware_clicked()
{
QString fileName = QFileDialog::getOpenFileName
(
this,
tr("Open FCD firmware"),
QDir::currentPath(),
tr("FCD firmware files (*.bin)")
);
if( !fileName.isNull() )
{
QFile qf(fileName);
qint64 qn64size=qf.size();
char *buf=new char[qn64size];
qDebug() << fileName;
if (buf==NULL)
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Unable to allocate memory for firmware image")
);
return;
}
if (!qf.open(QIODevice::ReadOnly))
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Unable to open file")
);
delete buf;
return;
}
else
{
if (qf.read(buf,qn64size)!=qn64size)
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Unable to read file")
);
delete buf;
qf.close();
return;
}
}
qf.close();
if (FCDBLErase()!=FME_BL)
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Flash erase failed")
);
delete buf;
return;
}
if (FCDBLWriteFirmware(buf,(int64_t)qn64size)!=FME_BL)
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Write firmware failed")
);
delete buf;
return;
}
delete buf;
QMessageBox::information
(
this,
tr("FCD"),
tr("Firmware successfully written!")
);
}
}
void MainWindow::on_pushButtonVerifyFirmware_clicked()
{
QString fileName = QFileDialog::getOpenFileName
(
this,
tr("Open FCD firmware"),
QDir::currentPath(),
tr("FCD firmware files (*.bin)")
);
if( !fileName.isNull() )
{
QFile qf(fileName);
qint64 qn64size=qf.size();
char *buf=new char[qn64size];
qDebug() << fileName;
if (buf==NULL)
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Unable to allocate memory for firmware image")
);
return;
}
if (!qf.open(QIODevice::ReadOnly))
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Unable to open file")
);
delete buf;
return;
}
else
{
if (qf.read(buf,qn64size)!=qn64size)
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Unable to read file")
);
delete buf;
qf.close();
return;
}
}
qf.close();
if (FCDBLVerifyFirmware(buf,(int64_t)qn64size)!=FME_BL)
{
QMessageBox::critical
(
this,
tr("FCD"),
tr("Verify firmware failed")
);
delete buf;
return;
}
delete buf;
QMessageBox::information
(
this,
tr("FCD"),
tr("Firmware successfully verified!")
);
}
}
void MainWindow::on_lineEditFreq_textChanged(QString s)
{
double d=StrToDouble(s);
int nCursor=ui->lineEditFreq->cursorPosition();
QString s2=QLocale(QLocale()).toString(d,'f',0);
nCursor-=s.mid(0,nCursor).count(QLocale().groupSeparator());
nCursor+=s2.mid(0,nCursor).count(QLocale().groupSeparator());
ui->lineEditFreq->setText(s2);
ui->lineEditFreq->setCursorPosition(nCursor);
if (d<50000000.0 || d>2100000000.0)
{
QPalette p=ui->lineEditFreq->palette();
p.setColor(QPalette::Base, QColor(255,0,0));//red color
ui->lineEditFreq->setPalette(p);
}
else
{
QPalette p=ui->lineEditFreq->palette();
p.setColor(QPalette::Base, QColor(0,255,0));//green color
ui->lineEditFreq->setPalette(p);
}
d*=1.0+ui->spinBoxCorr->value()/1000000.0;
FCDAppSetFreqkHz((int)(d/1000.0));
}
void MainWindow::on_lineEditStep_textChanged(QString s)
{
double d=StrToDouble(s);
int nCursor=ui->lineEditStep->cursorPosition();
QString s2=QLocale(QLocale()).toString(d,'f',0);
nCursor-=s.mid(0,nCursor).count(QLocale().groupSeparator());
nCursor+=s2.mid(0,nCursor).count(QLocale().groupSeparator());
ui->lineEditStep->setText(s2);
ui->lineEditStep->setCursorPosition(nCursor);
if (d<1.0 || d>1000000000.0)
{
QPalette p=ui->lineEditStep->palette();
p.setColor(QPalette::Base, QColor(255,0,0));//red color
ui->lineEditStep->setPalette(p);
}
else
{
QPalette p=ui->lineEditStep->palette();
p.setColor(QPalette::Base, QColor(0,255,0));//green color
ui->lineEditStep->setPalette(p);
}
}
void MainWindow::on_pushButtonUp_clicked()
{
double dStep=StrToDouble(ui->lineEditStep->text());
double dFreq=StrToDouble(ui->lineEditFreq->text());
dFreq+=dStep;
if (dFreq<0.0)
{
dFreq=0.0;
}
if (dFreq>2000000000.0)
{
dFreq=2000000000.0;
}
ui->lineEditFreq->setText(QLocale(QLocale()).toString(dFreq,'f',0));
}
void MainWindow::on_pushButtonDown_clicked()
{
double dStep=StrToDouble(ui->lineEditStep->text());
double dFreq=StrToDouble(ui->lineEditFreq->text());
dFreq-=dStep;
if (dFreq<0.0)
{
dFreq=0.0;
}
if (dFreq>2000000000.0)
{
dFreq=2000000000.0;
}
ui->lineEditFreq->setText(QLocale(QLocale()).toString(dFreq,'f',0));
}
void MainWindow::on_spinBoxCorr_valueChanged(int n)
{
double d=StrToDouble(ui->lineEditFreq->text());
d*=1.0+n/1000000.0;
FCDAppSetFreqkHz((int)(d/1000.0));
}
/** \brief Action: About Qthid
*
* This slot is called when the user activates the
* Help|About menu item (or Qthid|About on Mac)
*/
void MainWindow::on_actionAbout_triggered()
{
QMessageBox::about(this, tr("About Qthid"),
tr("Qthid is a simple controller application for the Funcube Dongle "
"software defined radio receiver for 64 MHz - 1.7 GHz.
"
"Qthid can "
"be used to upload new firmware and to set various parameters "
"such as frequency, gain, filters, etc.
"
"Qthid is written using the Qt toolkit (see About Qt) and is avaialble "
"for Linux, Mac and Windows. You can download the latest version from the "
"Qthid website."
"
"
""
"Funcube Dongle website
"
"Information about Funcube"
"
"));
}
/** \brief Action: About Qt
*
* This slot is called when the user activates the
* Help|About Qt menu item (or Qthid|About Qt on Mac)
*/
void MainWindow::on_actionAboutQt_triggered()
{
QMessageBox::aboutQt(this, tr("About Qt"));
}
qthid-2.2/main.cpp 0000664 0001750 0001750 00000002441 11532171633 013075 0 ustar alexc alexc /***************************************************************************
* This file is part of Qthid.
*
* Copyright (C) 2010 Howard Long, G6LVB
*
* Qthid is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Qthid 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 Qthid. If not, see .
*
***************************************************************************/
#include
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QCoreApplication::setOrganizationName("Hanlincrest Ltd");
QCoreApplication::setOrganizationDomain("hanlincrest.com");
QCoreApplication::setApplicationName("FUNcube Dongle controller");
QCoreApplication::setApplicationVersion("2.2");
MainWindow win;
win.show();
return app.exec();
}
qthid-2.2/images/qthid.png 0000664 0001750 0001750 00000224434 11532171633 014541 0 ustar alexc alexc PNG
IHDR x sRGB bKGD pHYs
B(x tIME
E; IDATxyt\}'}k+
w7Q+Erdylˉc;ętY}{Ntg'sfYږc;ؖQdɒ,ɢ(J(nE Kr*
"W[~{}DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDtn""k>zc\)yQ@٧X֡Ç3 Xn{B /I'-yz e ""F+~sA'n+ @DD4uɼe_hjFhd """ """b """ """4n""g|CPDX@.G!G6C.E6;,
lٰ,e,Ree nT#Z[P.P*/f1 |PQ*Q*˗
r " @DD @DDD DDD @DDD DDD @DDD DDD @DDD3Q]{c_渟T*K)DT
pf ""ER/vNXV\-?OѼw"u\1e^şgt- DD`X\yB ͕L?aXm;3FB o3Jegߕe3 _`+C.0 M!.dul! ̛Q DD4'~4#|U2:|zӜ̡C:~B28v e ÷yF@x])Wށ̷m @DDs=rO d_nݾQ!0g@J֡6:O-B DDD DDD @DDD DDD @DDD DDD @DDD DDD @DDD DDD @DDD DDD @DDD DDD @DDD DDD @DDD DDD DDD @DDD DDD @DDD DDD @DDD DDD @DDD DDD @DDD DDD44n""knͱ@F;)a.ߛ?w%)^9r $ GAa eVRa" H!qˎ]W|75=OќxGUKGt^E/ر:N9o!qY0% ""j}$ݲgO+ 6|r,w| DD4W3~yYMWg>Hc ""MQ=/3ŽxBfrV}*a ""ϚmiM1t
q!6D@DD4?[Ɔ$ZSh[r h!D._d ""7ߏr8"4
m ^i?0C0 D6_՞4 d|ZTfaLK.T*(/0ϖs սP(ukM8OQ(
K -BXbzS@ DD@$qAOA hhllF` "Mn """b """ """b ""ILʶ;ۥ+v6rb- *w3!D] .RwI sk. yfC/C\8De2E`""yGDZ^@u <!:tZ`5>
ȆjhH Ww{>x|7mooۺcߩB}Wc5FH)No_`{C;wɵwk 8Y3hϨB=ݾs6o}U_
H9 :/єtH9՟}Ν;c l!ܟB`-'QMֻRԾ}M ػw־cWODD4mR]裏3 ߈fį<{}u 6oll >ȽEDD4s#l;۷o@Q x@ dX~ (ʰ,eqn4th!Xn\UP,.?4'u3({&t)%Jr7G߇sݷnZT*B|t zzfb>T ;vG x#ϱtI3n۶W.G4+Wq~,:!e亮ae2]ՆM"//ZqpݳxY{lՇ,(XkVkzul\|pgd֯Ǿg2xyzm\2 uɜvץ!ijs.45_?;g:DDܶmn۶Wvŗ^ñxΝ=x9 w4Biܨ1?KZkz+x筷O豓Mx4ΜH.^ƓO=i~i^R؉wq{ؽs{Tu~{,y'N945G<k[rKҽ S M>l[w!R⧯?= uȇއ˖ࡷg^u]t
q O|yTfKx/CoD7mǎ;|SC~`Lf };8vy?~