mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-03 17:35:23 -04:00
LO ppm now adjusts the primary clock in the hackrf one instead of offsetting the freq in software. The offset adjusts all clocks except the CPU which currently uses it's own crystal. There is room for improvement but I tried to keep it simple and keep the user interface the same for now.
171 lines
5.3 KiB
C++
171 lines
5.3 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2015 Edouard Griffiths, F4EXB //
|
|
// //
|
|
// 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 as version 3 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 V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef INCLUDE_HACKRFINPUT_H
|
|
#define INCLUDE_HACKRFINPUT_H
|
|
|
|
#include <QString>
|
|
#include <QByteArray>
|
|
#include <QNetworkRequest>
|
|
|
|
#include "libhackrf/hackrf.h"
|
|
#include "dsp/devicesamplesource.h"
|
|
#include "hackrf/devicehackrf.h"
|
|
#include "hackrf/devicehackrfparam.h"
|
|
#include "hackrfinputsettings.h"
|
|
|
|
class QNetworkAccessManager;
|
|
class QNetworkReply;
|
|
class DeviceAPI;
|
|
class HackRFInputThread;
|
|
|
|
class HackRFInput : public DeviceSampleSource {
|
|
Q_OBJECT
|
|
public:
|
|
|
|
class MsgConfigureHackRF : public Message {
|
|
MESSAGE_CLASS_DECLARATION
|
|
|
|
public:
|
|
const HackRFInputSettings& getSettings() const { return m_settings; }
|
|
bool getForce() const { return m_force; }
|
|
|
|
static MsgConfigureHackRF* create(const HackRFInputSettings& settings, bool force = false)
|
|
{
|
|
return new MsgConfigureHackRF(settings, force);
|
|
}
|
|
|
|
private:
|
|
HackRFInputSettings m_settings;
|
|
bool m_force;
|
|
|
|
MsgConfigureHackRF(const HackRFInputSettings& settings, bool force) :
|
|
Message(),
|
|
m_settings(settings),
|
|
m_force(force)
|
|
{ }
|
|
};
|
|
|
|
class MsgReportHackRF : public Message {
|
|
MESSAGE_CLASS_DECLARATION
|
|
|
|
public:
|
|
|
|
static MsgReportHackRF* create()
|
|
{
|
|
return new MsgReportHackRF();
|
|
}
|
|
|
|
protected:
|
|
|
|
MsgReportHackRF() :
|
|
Message()
|
|
{ }
|
|
};
|
|
|
|
class MsgStartStop : public Message {
|
|
MESSAGE_CLASS_DECLARATION
|
|
|
|
public:
|
|
bool getStartStop() const { return m_startStop; }
|
|
|
|
static MsgStartStop* create(bool startStop) {
|
|
return new MsgStartStop(startStop);
|
|
}
|
|
|
|
protected:
|
|
bool m_startStop;
|
|
|
|
MsgStartStop(bool startStop) :
|
|
Message(),
|
|
m_startStop(startStop)
|
|
{ }
|
|
};
|
|
|
|
HackRFInput(DeviceAPI *deviceAPI);
|
|
virtual ~HackRFInput();
|
|
virtual void destroy();
|
|
|
|
virtual void init();
|
|
virtual bool start();
|
|
virtual void stop();
|
|
|
|
virtual QByteArray serialize() const;
|
|
virtual bool deserialize(const QByteArray& data);
|
|
|
|
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
|
virtual const QString& getDeviceDescription() const;
|
|
virtual int getSampleRate() const;
|
|
virtual void setSampleRate(int sampleRate) { (void) sampleRate; }
|
|
virtual quint64 getCenterFrequency() const;
|
|
virtual void setCenterFrequency(qint64 centerFrequency);
|
|
|
|
virtual bool handleMessage(const Message& message);
|
|
|
|
virtual int webapiSettingsGet(
|
|
SWGSDRangel::SWGDeviceSettings& response,
|
|
QString& errorMessage);
|
|
|
|
virtual int webapiSettingsPutPatch(
|
|
bool force,
|
|
const QStringList& deviceSettingsKeys,
|
|
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
|
QString& errorMessage);
|
|
|
|
virtual int webapiRunGet(
|
|
SWGSDRangel::SWGDeviceState& response,
|
|
QString& errorMessage);
|
|
|
|
virtual int webapiRun(
|
|
bool run,
|
|
SWGSDRangel::SWGDeviceState& response,
|
|
QString& errorMessage);
|
|
|
|
static void webapiFormatDeviceSettings(
|
|
SWGSDRangel::SWGDeviceSettings& response,
|
|
const HackRFInputSettings& settings);
|
|
|
|
static void webapiUpdateDeviceSettings(
|
|
HackRFInputSettings& settings,
|
|
const QStringList& deviceSettingsKeys,
|
|
SWGSDRangel::SWGDeviceSettings& response);
|
|
|
|
private:
|
|
DeviceAPI *m_deviceAPI;
|
|
QMutex m_mutex;
|
|
HackRFInputSettings m_settings;
|
|
struct hackrf_device* m_dev;
|
|
HackRFInputThread* m_hackRFThread;
|
|
QString m_deviceDescription;
|
|
DeviceHackRFParams m_sharedParams;
|
|
bool m_running;
|
|
QNetworkAccessManager *m_networkManager;
|
|
QNetworkRequest m_networkRequest;
|
|
|
|
bool openDevice();
|
|
void closeDevice();
|
|
bool applySettings(const HackRFInputSettings& settings, bool force);
|
|
void setDeviceCenterFrequency(quint64 freq);
|
|
void webapiReverseSendSettings(QList<QString>& deviceSettingsKeys, const HackRFInputSettings& settings, bool force);
|
|
void webapiReverseSendStartStop(bool start);
|
|
|
|
private slots:
|
|
void networkManagerFinished(QNetworkReply *reply);
|
|
};
|
|
|
|
#endif // INCLUDE_HACKRFINPUT_H
|