diff --git a/.gitignore b/.gitignore index 017a1a37c..6615edfb7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,20 @@ -CMakeLists.txt.user* -build* -qtbuild/* -sdriq/* -presets/* -LOCAL/* -sdrangelove.supp -.cproject -.project -.settings/ -*.cs -*.pro.user -.idea/* -debian/sdrangel/* -debian/sdrangel.substvars -debian/files -debian/sdrangel.debhelper.log -debian/debhelper-build-stamp -obj-x86_64-linux-gnu/* +CMakeLists.txt.user* +build* +qtbuild/* +sdriq/* +presets/* +LOCAL/* +sdrangelove.supp +.cproject +.project +.pydevproject +.settings/ +*.cs +*.pro.user +.idea/* +debian/sdrangel/* +debian/sdrangel.substvars +debian/files +debian/sdrangel.debhelper.log +debian/debhelper-build-stamp +obj-x86_64-linux-gnu/* diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp index b100c1aab..96060bca3 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp @@ -488,3 +488,39 @@ int RTLSDRInput::webapiSettingsGet( return 200; } +int RTLSDRInput::webapiSettingsPutPatch( + bool force, + SWGSDRangel::SWGDeviceSettings& response, // query + response + QString& errorMessage) +{ + RTLSDRSettings settings; + settings.m_agc = response.getRtlSdrSettings()->getAgc() != 0; + settings.m_centerFrequency = response.getRtlSdrSettings()->getCenterFrequency(); + settings.m_dcBlock = response.getRtlSdrSettings()->getDcBlock() != 0; + settings.m_devSampleRate = response.getRtlSdrSettings()->getDevSampleRate(); + settings.m_fcPos = (RTLSDRSettings::fcPos_t) response.getRtlSdrSettings()->getFcPos(); + settings.m_gain = response.getRtlSdrSettings()->getGain(); + settings.m_iqImbalance = response.getRtlSdrSettings()->getIqImbalance() != 0; + settings.m_loPpmCorrection = response.getRtlSdrSettings()->getLoPpmCorrection(); + settings.m_log2Decim = response.getRtlSdrSettings()->getLog2Decim(); + settings.m_lowSampleRate = response.getRtlSdrSettings()->getLowSampleRate() != 0; + settings.m_noModMode = response.getRtlSdrSettings()->getNoModMode() != 0; + settings.m_transverterDeltaFrequency = response.getRtlSdrSettings()->getTransverterDeltaFrequency(); + settings.m_transverterMode = response.getRtlSdrSettings()->getTransverterMode() != 0; + + if (applySettings(settings, force)) + { + if (m_guiMessageQueue) // forward to GUI if any + { + MsgConfigureRTLSDR *msg = MsgConfigureRTLSDR::create(settings, force); + m_guiMessageQueue->push(msg); + } + + return 200; + } + else + { + errorMessage = "RTLSDRInput::webapiSettingsPutPatch: error applying settings"; + return 500; + } +} diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.h b/plugins/samplesource/rtlsdr/rtlsdrinput.h index 9ef7b3194..ea75fd307 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.h +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.h @@ -110,6 +110,11 @@ public: SWGSDRangel::SWGDeviceSettings& response, QString& errorMessage); + virtual int webapiSettingsPutPatch( + bool force, + SWGSDRangel::SWGDeviceSettings& response, // query + response + QString& errorMessage); + const std::vector& getGains() const { return m_gains; } void set_ds_mode(int on); diff --git a/sdrbase/webapi/webapirequestmapper.cpp b/sdrbase/webapi/webapirequestmapper.cpp index 08e8811db..498b21e77 100644 --- a/sdrbase/webapi/webapirequestmapper.cpp +++ b/sdrbase/webapi/webapirequestmapper.cpp @@ -210,8 +210,9 @@ void WebAPIRequestMapper::instanceLoggingService(qtwebapp::HttpRequest& request, else if (request.getMethod() == "PUT") { QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { normalResponse.fromJson(jsonStr); int status = m_adapter->instanceLoggingPut(normalResponse, errorResponse); @@ -252,8 +253,9 @@ void WebAPIRequestMapper::instanceAudioService(qtwebapp::HttpRequest& request, q { SWGSDRangel::SWGAudioDevicesSelect normalResponse; QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { normalResponse.fromJson(jsonStr); int status = m_adapter->instanceAudioPatch(normalResponse, errorResponse); @@ -294,8 +296,9 @@ void WebAPIRequestMapper::instanceLocationService(qtwebapp::HttpRequest& request { SWGSDRangel::SWGLocationInformation normalResponse; QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { normalResponse.fromJson(jsonStr); int status = m_adapter->instanceLocationPut(normalResponse, errorResponse); @@ -367,8 +370,9 @@ void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, SWGSDRangel::SWGPresetTransfer query; SWGSDRangel::SWGPresetIdentifier normalResponse; QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { query.fromJson(jsonStr); @@ -397,8 +401,9 @@ void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, SWGSDRangel::SWGPresetTransfer query; SWGSDRangel::SWGPresetIdentifier normalResponse; QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { query.fromJson(jsonStr); @@ -427,8 +432,9 @@ void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, SWGSDRangel::SWGPresetTransfer query; SWGSDRangel::SWGPresetIdentifier normalResponse; QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { query.fromJson(jsonStr); @@ -456,8 +462,9 @@ void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, { SWGSDRangel::SWGPresetIdentifier normalResponse; QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { normalResponse.fromJson(jsonStr); @@ -588,8 +595,9 @@ void WebAPIRequestMapper::devicesetDeviceService(const std::string& indexStr, qt { SWGSDRangel::SWGDeviceListItem normalResponse; QString jsonStr = request.getBody(); + QJsonObject jsonObject; - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { normalResponse.fromJson(jsonStr); @@ -629,11 +637,13 @@ void WebAPIRequestMapper::devicesetDeviceSettingsService(const std::string& inde if ((request.getMethod() == "PUT") || (request.getMethod() == "PATCH")) { QString jsonStr = request.getBody(); + QJsonObject jsonObject; + qDebug("WebAPIRequestMapper::devicesetDeviceSettingsService: %s", qPrintable(jsonStr)); - if (parseJsonBody(jsonStr, response)) + if (parseJsonBody(jsonStr, jsonObject, response)) { SWGSDRangel::SWGDeviceSettings normalResponse; - resetDeviceSettings(normalResponse); + //resetDeviceSettings(normalResponse); normalResponse.fromJson(jsonStr); if (validateDeviceSettings(normalResponse)) @@ -688,7 +698,7 @@ void WebAPIRequestMapper::devicesetDeviceSettingsService(const std::string& inde } } -bool WebAPIRequestMapper::parseJsonBody(QString& jsonStr, qtwebapp::HttpResponse& response) +bool WebAPIRequestMapper::parseJsonBody(QString& jsonStr, QJsonObject& jsonObject, qtwebapp::HttpResponse& response) { SWGSDRangel::SWGErrorResponse errorResponse; @@ -698,7 +708,11 @@ bool WebAPIRequestMapper::parseJsonBody(QString& jsonStr, qtwebapp::HttpResponse QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(jsonBytes, &error); - if (error.error != QJsonParseError::NoError) + if (error.error == QJsonParseError::NoError) + { + jsonObject = doc.object(); + } + else { QString errorMsg = QString("Input JSON error: ") + error.errorString() + QString(" at offset ") + QString::number(error.offset); errorResponse.init(); @@ -737,7 +751,7 @@ bool WebAPIRequestMapper::validatePresetIdentifer(SWGSDRangel::SWGPresetIdentifi return (presetIdentifier.getGroupName() && presetIdentifier.getName() && presetIdentifier.getType()); } -bool WebAPIRequestMapper::validateDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings) +bool WebAPIRequestMapper::validateDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings, QJsonObject& jsonObject) { QString *deviceHwType = deviceSettings.getDeviceHwType(); diff --git a/sdrbase/webapi/webapirequestmapper.h b/sdrbase/webapi/webapirequestmapper.h index f898d42a1..b4d93c1c9 100644 --- a/sdrbase/webapi/webapirequestmapper.h +++ b/sdrbase/webapi/webapirequestmapper.h @@ -61,9 +61,9 @@ private: bool validatePresetTransfer(SWGSDRangel::SWGPresetTransfer& presetTransfer); bool validatePresetIdentifer(SWGSDRangel::SWGPresetIdentifier& presetIdentifier); - bool validateDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings); + bool validateDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings, QJsonObject& jsonObject); - bool parseJsonBody(QString& jsonStr, qtwebapp::HttpResponse& response); + bool parseJsonBody(QString& jsonStr, QJsonObject& jsonObject, qtwebapp::HttpResponse& response); void resetDeviceSettings(SWGSDRangel::SWGDeviceSettings& deviceSettings); }; diff --git a/swagger/sdrangel/examples/rtlsdr_settings.py b/swagger/sdrangel/examples/rtlsdr_settings.py new file mode 100644 index 000000000..e86f6c109 --- /dev/null +++ b/swagger/sdrangel/examples/rtlsdr_settings.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python +import requests, json + +base_url = "http://10.0.2.2:8091/sdrangel" + +requests_methods = { + "GET": requests.get, + "PATCH": requests.patch, + "POST": requests.post, + "PUT": requests.put, + "DELETE": requests.delete +} + +def getHwType(): + r = requests.get(url=base_url+"/deviceset/0") + if r.status_code == 200: + rj = r.json() + devj = rj.get('samplingDevice', None) + if devj is not None: + return devj.get('hwType' ,None) + else: + return None + else: + return None + +def selectRtlSdr(): + r = requests.put(url=base_url+"/deviceset/0/device", json={"hwType": "RTLSDR"}) + if r.status_code == 200: + print json.dumps(r.json(), indent=4, sort_keys=True) + return True + else: + return False + +def getRtlSdrSettings(): + r = requests.get(url=base_url+"/deviceset/0/device/settings") + if r.status_code == 200: + rj = r.json() + hwType = rj.get('deviceHwType', None) + if hwType is not None and hwType == "RTLSDR": + settings = rj.get('rtlSdrSettings', None) + return settings + else: + return None + else: + return None + +def patchRtlSdrSettings(settings): + new_settings = {"deviceHwType": "RTLSDR", "tx": 0, "rtlSdrSettings": settings} + r = requests.patch(url=base_url+"/deviceset/0/device/settings", json=new_settings) + if r.status_code == 200: + print json.dumps(r.json(), indent=4, sort_keys=True) + else: + print "Error HTTP:", r.status_code + + +def main(): + hwType = getHwType() + if hwType and hwType != "RTLSDR": + if not selectRtlSdr(): + return + settings = getRtlSdrSettings() + if settings is not None: + settings["agc"] = 1 + patchRtlSdrSettings(settings) + + + +if __name__ == "__main__": + main() \ No newline at end of file