mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	Reverse API: RTL-SDR input changes (1)
This commit is contained in:
		
							parent
							
								
									6f81f4a7d7
								
							
						
					
					
						commit
						2b69d48c75
					
				| @ -477,6 +477,18 @@ void RTLSDRGui::on_lowSampleRate_toggled(bool checked) | ||||
| void RTLSDRGui::openDeviceSettingsDialog(const QPoint& p) | ||||
| { | ||||
|     BasicDeviceSettingsDialog dialog(this); | ||||
|     dialog.setUseReverseAPI(m_settings.m_useReverseAPI); | ||||
|     dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); | ||||
|     dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); | ||||
|     dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); | ||||
| 
 | ||||
|     dialog.move(p); | ||||
|     dialog.exec(); | ||||
| 
 | ||||
|     m_settings.m_useReverseAPI = dialog.useReverseAPI(); | ||||
|     m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); | ||||
|     m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); | ||||
|     m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); | ||||
| 
 | ||||
|     sendSettings(); | ||||
| } | ||||
|  | ||||
| @ -15,10 +15,13 @@ | ||||
| // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | ||||
| ///////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| #include <QDebug> | ||||
| #include <string.h> | ||||
| #include <errno.h> | ||||
| 
 | ||||
| #include <QDebug> | ||||
| #include <QNetworkReply> | ||||
| #include <QBuffer> | ||||
| 
 | ||||
| #include "SWGDeviceSettings.h" | ||||
| #include "SWGRtlSdrSettings.h" | ||||
| #include "SWGDeviceState.h" | ||||
| @ -351,9 +354,12 @@ bool RTLSDRInput::handleMessage(const Message& message) | ||||
| bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| { | ||||
|     bool forwardChange = false; | ||||
|     QList<QString> reverseAPIKeys; | ||||
| 
 | ||||
|     if ((m_settings.m_agc != settings.m_agc) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("agc"); | ||||
| 
 | ||||
|         if (rtlsdr_set_agc_mode(m_dev, settings.m_agc ? 1 : 0) < 0) | ||||
|         { | ||||
|             qCritical("RTLSDRInput::applySettings: could not set AGC mode %s", settings.m_agc ? "on" : "off"); | ||||
| @ -367,6 +373,7 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_gain != settings.m_gain) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("gain"); | ||||
|         m_settings.m_gain = settings.m_gain; | ||||
| 
 | ||||
|         if(m_dev != 0) | ||||
| @ -384,6 +391,8 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_dcBlock != settings.m_dcBlock) || (m_settings.m_iqImbalance != settings.m_iqImbalance) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("dcBlock"); | ||||
|         reverseAPIKeys.append("iqImbalance"); | ||||
|         m_settings.m_dcBlock = settings.m_dcBlock; | ||||
|         m_settings.m_iqImbalance = settings.m_iqImbalance; | ||||
|         m_deviceAPI->configureCorrections(m_settings.m_dcBlock, m_settings.m_iqImbalance); | ||||
| @ -394,6 +403,8 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_loPpmCorrection != settings.m_loPpmCorrection) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("loPpmCorrection"); | ||||
| 
 | ||||
|         if (m_dev != 0) | ||||
|         { | ||||
|             if (rtlsdr_set_freq_correction(m_dev, settings.m_loPpmCorrection) < 0) | ||||
| @ -410,6 +421,7 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("devSampleRate"); | ||||
|         m_settings.m_devSampleRate = settings.m_devSampleRate; | ||||
|         forwardChange = true; | ||||
| 
 | ||||
| @ -429,6 +441,7 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_log2Decim != settings.m_log2Decim) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("log2Decim"); | ||||
|         forwardChange = true; | ||||
| 
 | ||||
|         if (m_rtlSDRThread != 0) | ||||
| @ -446,6 +459,13 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
|         || (m_settings.m_transverterMode != settings.m_transverterMode) | ||||
|         || (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("centerFrequency"); | ||||
|         reverseAPIKeys.append("fcPos"); | ||||
|         reverseAPIKeys.append("log2Decim"); | ||||
|         reverseAPIKeys.append("devSampleRate"); | ||||
|         reverseAPIKeys.append("transverterMode"); | ||||
|         reverseAPIKeys.append("transverterDeltaFrequency"); | ||||
| 
 | ||||
|         qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency( | ||||
|                 settings.m_centerFrequency, | ||||
|                 settings.m_transverterDeltaFrequency, | ||||
| @ -485,6 +505,7 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_noModMode != settings.m_noModMode) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("noModMode"); | ||||
|         m_settings.m_noModMode = settings.m_noModMode; | ||||
|         qDebug() << "RTLSDRInput::applySettings: set noModMode to " << m_settings.m_noModMode; | ||||
| 
 | ||||
| @ -498,11 +519,13 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_lowSampleRate != settings.m_lowSampleRate) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("lowSampleRate"); | ||||
|         m_settings.m_lowSampleRate = settings.m_lowSampleRate; | ||||
|     } | ||||
| 
 | ||||
|     if ((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("rfBandwidth"); | ||||
|         m_settings.m_rfBandwidth = settings.m_rfBandwidth; | ||||
| 
 | ||||
|         if (m_dev != 0) | ||||
| @ -517,6 +540,7 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
| 
 | ||||
|     if ((m_settings.m_offsetTuning != settings.m_offsetTuning) || force) | ||||
|     { | ||||
|         reverseAPIKeys.append("offsetTuning"); | ||||
|         m_settings.m_offsetTuning = settings.m_offsetTuning; | ||||
| 
 | ||||
|         if (m_dev != 0) | ||||
| @ -537,6 +561,15 @@ bool RTLSDRInput::applySettings(const RTLSDRSettings& settings, bool force) | ||||
|         m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif); | ||||
|     } | ||||
| 
 | ||||
|     if (settings.m_useReverseAPI) | ||||
|     { | ||||
|         bool fullUpdate = ((m_settings.m_useReverseAPI != settings.m_useReverseAPI) && settings.m_useReverseAPI) || | ||||
|                 (m_settings.m_reverseAPIAddress != settings.m_reverseAPIAddress) || | ||||
|                 (m_settings.m_reverseAPIPort != settings.m_reverseAPIPort) || | ||||
|                 (m_settings.m_reverseAPIDeviceIndex != settings.m_reverseAPIDeviceIndex); | ||||
|         webapiReverseSendSettings(reverseAPIKeys, settings, fullUpdate || force); | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| @ -703,4 +736,90 @@ void RTLSDRInput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& respons | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void RTLSDRInput::webapiReverseSendSettings(QList<QString>& deviceSettingsKeys, const RTLSDRSettings& settings, bool force) | ||||
| { | ||||
|     SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings(); | ||||
|     swgDeviceSettings->setTx(0); | ||||
|     swgDeviceSettings->setDeviceHwType(new QString("RTLSDR")); | ||||
|     swgDeviceSettings->setRtlSdrSettings(new SWGSDRangel::SWGRtlSdrSettings()); | ||||
|     SWGSDRangel::SWGRtlSdrSettings *swgRtlSdrSettings = swgDeviceSettings->getRtlSdrSettings(); | ||||
| 
 | ||||
|     // transfer data that has been modified. When force is on transfer all data except reverse API data
 | ||||
| 
 | ||||
|     if (deviceSettingsKeys.contains("agc") || force) { | ||||
|         swgRtlSdrSettings->setAgc(settings.m_agc ? 1 : 0); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("centerFrequency")) { | ||||
|         swgRtlSdrSettings->setCenterFrequency(settings.m_centerFrequency); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("dcBlock")) { | ||||
|         swgRtlSdrSettings->setDcBlock(settings.m_dcBlock ? 1 : 0); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("devSampleRate")) { | ||||
|         swgRtlSdrSettings->setDevSampleRate(settings.m_devSampleRate); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("fcPos")) { | ||||
|         swgRtlSdrSettings->setFcPos(settings.m_fcPos); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("gain")) { | ||||
|         swgRtlSdrSettings->setGain(settings.m_gain); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("iqImbalance")) { | ||||
|         swgRtlSdrSettings->setIqImbalance(settings.m_iqImbalance ? 1 : 0); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("loPpmCorrection")) { | ||||
|         swgRtlSdrSettings->setLoPpmCorrection(settings.m_loPpmCorrection); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("log2Decim")) { | ||||
|         swgRtlSdrSettings->setLog2Decim(settings.m_log2Decim); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("lowSampleRate")) { | ||||
|         swgRtlSdrSettings->setLowSampleRate(settings.m_lowSampleRate); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("noModMode")) { | ||||
|         swgRtlSdrSettings->setNoModMode(settings.m_noModMode ? 1 : 0); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("offsetTuning")) { | ||||
|         swgRtlSdrSettings->setOffsetTuning(settings.m_offsetTuning ? 1 : 0); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("transverterDeltaFrequency")) { | ||||
|         swgRtlSdrSettings->setTransverterDeltaFrequency(settings.m_transverterDeltaFrequency); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("transverterMode")) { | ||||
|         swgRtlSdrSettings->setTransverterMode(settings.m_transverterMode ? 1 : 0); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("rfBandwidth")) { | ||||
|         swgRtlSdrSettings->setRfBandwidth(settings.m_rfBandwidth); | ||||
|     } | ||||
|     if (deviceSettingsKeys.contains("fileRecordName")) { | ||||
|         swgRtlSdrSettings->setFileRecordName(new QString(settings.m_fileRecordName)); | ||||
|     } | ||||
| 
 | ||||
|     QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/settings") | ||||
|             .arg(settings.m_reverseAPIAddress) | ||||
|             .arg(settings.m_reverseAPIPort) | ||||
|             .arg(settings.m_reverseAPIDeviceIndex); | ||||
|     m_networkRequest.setUrl(QUrl(channelSettingsURL)); | ||||
| 
 | ||||
|     QBuffer *buffer=new QBuffer(); | ||||
|     buffer->open((QBuffer::ReadWrite)); | ||||
|     buffer->write(swgDeviceSettings->asJson().toUtf8()); | ||||
|     buffer->seek(0); | ||||
| 
 | ||||
|     // Always use PATCH to avoid passing reverse API settings
 | ||||
|     m_networkManager->sendCustomRequest(m_networkRequest, "PATCH", buffer); | ||||
| 
 | ||||
|     delete swgDeviceSettings; | ||||
| } | ||||
| 
 | ||||
| void RTLSDRInput::networkManagerFinished(QNetworkReply *reply) | ||||
| { | ||||
|     if (reply->error()) | ||||
|     { | ||||
|         qDebug() << "RTLSDRInput::networkManagerFinished: error: " << reply->errorString(); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     QString answer = reply->readAll(); | ||||
|     qDebug("RTLSDRInput::networkManagerFinished: reply:\n%s", answer.toStdString().c_str()); | ||||
| } | ||||
|  | ||||
| @ -20,6 +20,7 @@ | ||||
| 
 | ||||
| #include <QString> | ||||
| #include <QByteArray> | ||||
| #include <QNetworkRequest> | ||||
| 
 | ||||
| #include <dsp/devicesamplesource.h> | ||||
| #include "rtlsdrsettings.h" | ||||
| @ -28,6 +29,8 @@ | ||||
| class DeviceSourceAPI; | ||||
| class RTLSDRThread; | ||||
| class FileRecord; | ||||
| class QNetworkAccessManager; | ||||
| class QNetworkReply; | ||||
| 
 | ||||
| class RTLSDRInput : public DeviceSampleSource { | ||||
| public: | ||||
| @ -156,12 +159,18 @@ private: | ||||
| 	QString m_deviceDescription; | ||||
| 	std::vector<int> m_gains; | ||||
| 	bool m_running; | ||||
|     QNetworkAccessManager *m_networkManager; | ||||
|     QNetworkRequest m_networkRequest; | ||||
| 
 | ||||
| 	bool openDevice(); | ||||
| 	void closeDevice(); | ||||
| 	bool applySettings(const RTLSDRSettings& settings, bool force); | ||||
| 	void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const RTLSDRSettings& settings); | ||||
|     void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response); | ||||
|     void webapiReverseSendSettings(QList<QString>& deviceSettingsKeys, const RTLSDRSettings& settings, bool force); | ||||
| 
 | ||||
| private slots: | ||||
|     void networkManagerFinished(QNetworkReply *reply); | ||||
| }; | ||||
| 
 | ||||
| #endif // INCLUDE_RTLSDRINPUT_H
 | ||||
|  | ||||
| @ -41,6 +41,10 @@ void RTLSDRSettings::resetToDefaults() | ||||
| 	m_rfBandwidth = 2500 * 1000; // Hz
 | ||||
| 	m_fileRecordName = ""; | ||||
| 	m_offsetTuning = false; | ||||
|     m_useReverseAPI = false; | ||||
|     m_reverseAPIAddress = "127.0.0.1"; | ||||
|     m_reverseAPIPort = 8888; | ||||
|     m_reverseAPIDeviceIndex = 0; | ||||
| } | ||||
| 
 | ||||
| QByteArray RTLSDRSettings::serialize() const | ||||
| @ -61,6 +65,10 @@ QByteArray RTLSDRSettings::serialize() const | ||||
|     s.writeS64(13, m_transverterDeltaFrequency); | ||||
|     s.writeU32(14, m_rfBandwidth); | ||||
|     s.writeBool(15, m_offsetTuning); | ||||
|     s.writeBool(16, m_useReverseAPI); | ||||
|     s.writeString(17, m_reverseAPIAddress); | ||||
|     s.writeU32(18, m_reverseAPIPort); | ||||
|     s.writeU32(19, m_reverseAPIDeviceIndex); | ||||
| 
 | ||||
| 	return s.final(); | ||||
| } | ||||
| @ -78,6 +86,7 @@ bool RTLSDRSettings::deserialize(const QByteArray& data) | ||||
| 	if (d.getVersion() == 1) | ||||
| 	{ | ||||
| 		int intval; | ||||
| 		uint32_t utmp; | ||||
| 
 | ||||
| 		d.readS32(2, &m_gain, 0); | ||||
| 		d.readS32(3, &m_loPpmCorrection, 0); | ||||
| @ -94,6 +103,18 @@ bool RTLSDRSettings::deserialize(const QByteArray& data) | ||||
|         d.readS64(13, &m_transverterDeltaFrequency, 0); | ||||
|         d.readU32(4, &m_rfBandwidth, 2500 * 1000); | ||||
|         d.readBool(15, &m_offsetTuning, false); | ||||
|         d.readBool(16, &m_useReverseAPI, false); | ||||
|         d.readString(17, &m_reverseAPIAddress, "127.0.0.1"); | ||||
|         d.readU32(18, &utmp, 0); | ||||
| 
 | ||||
|         if ((utmp > 1023) && (utmp < 65535)) { | ||||
|             m_reverseAPIPort = utmp; | ||||
|         } else { | ||||
|             m_reverseAPIPort = 8888; | ||||
|         } | ||||
| 
 | ||||
|         d.readU32(19, &utmp, 0); | ||||
|         m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp; | ||||
| 
 | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| @ -42,6 +42,10 @@ struct RTLSDRSettings { | ||||
| 	quint32 m_rfBandwidth; //!< RF filter bandwidth in Hz
 | ||||
| 	QString m_fileRecordName; | ||||
| 	bool m_offsetTuning; | ||||
|     bool m_useReverseAPI; | ||||
|     QString m_reverseAPIAddress; | ||||
|     uint16_t m_reverseAPIPort; | ||||
|     uint16_t m_reverseAPIDeviceIndex; | ||||
| 
 | ||||
| 	RTLSDRSettings(); | ||||
| 	void resetToDefaults(); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user