From e877844768234a1d3b239b542b684d5f47f78e9a Mon Sep 17 00:00:00 2001 From: Ryzerth Date: Mon, 19 Jul 2021 22:23:03 +0200 Subject: [PATCH] More spyserver bugfix --- spyserver_source/src/main.cpp | 30 ++++++++++++++--------- spyserver_source/src/spyserver_client.cpp | 15 ++++++++---- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/spyserver_source/src/main.cpp b/spyserver_source/src/main.cpp index 71f36c16..3b771e9a 100644 --- a/spyserver_source/src/main.cpp +++ b/spyserver_source/src/main.cpp @@ -120,10 +120,10 @@ private: return; } - int digiGain = 0; + _this->digiGain = 0; int srvBits = streamFormatsBitCount[_this->iqType]; if (srvBits < _this->client->devInfo.Resolution) { - digiGain = std::ceil(((double)_this->client->devInfo.Resolution - (double)srvBits)*6.02); + _this->digiGain = std::ceil(((double)_this->client->devInfo.Resolution - (double)srvBits)*6.02); } _this->client->setSetting(SPYSERVER_SETTING_IQ_FORMAT, streamFormats[_this->iqType]); @@ -131,11 +131,11 @@ private: _this->client->setSetting(SPYSERVER_SETTING_IQ_FREQUENCY, _this->freq); _this->client->setSetting(SPYSERVER_SETTING_STREAMING_MODE, SPYSERVER_STREAM_MODE_IQ_ONLY); _this->client->setSetting(SPYSERVER_SETTING_GAIN, _this->gain); - _this->client->setSetting(SPYSERVER_SETTING_IQ_DIGITAL_GAIN, digiGain); + _this->client->setSetting(SPYSERVER_SETTING_IQ_DIGITAL_GAIN, _this->digiGain); _this->client->startStream(); _this->running = true; - spdlog::info("AirspyHFSourceModule '{0}': Start with gain {1} !", _this->name, digiGain); + spdlog::info("AirspyHFSourceModule '{0}': Start with gain {1} !", _this->name, _this->digiGain); } static void stop(void* ctx) { @@ -253,14 +253,14 @@ private: ImGui::SameLine(); ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX()); if (ImGui::Combo("##spyserver_source_type", &_this->iqType, streamFormatStr)) { - int digiGain = 0; + _this->digiGain = 0; int srvBits = streamFormatsBitCount[_this->iqType]; if (srvBits < _this->client->devInfo.Resolution) { - digiGain = std::ceil(((double)_this->client->devInfo.Resolution - (double)srvBits)*6.02); - spdlog::info("Switched the digital gain to {0}dB", digiGain); + _this->digiGain = std::ceil(((double)_this->client->devInfo.Resolution - (double)srvBits)*6.02); + spdlog::info("Switched the digital gain to {0}dB", _this->digiGain); } _this->client->setSetting(SPYSERVER_SETTING_IQ_FORMAT, streamFormats[_this->iqType]); - _this->client->setSetting(SPYSERVER_SETTING_IQ_DIGITAL_GAIN, digiGain); + _this->client->setSetting(SPYSERVER_SETTING_IQ_DIGITAL_GAIN, _this->digiGain); config.acquire(); config.conf["devices"][_this->devRef]["sampleBitDepthId"] = _this->iqType; @@ -269,13 +269,20 @@ private: if (_this->client->devInfo.MaximumGainIndex) { ImGui::SetNextItemWidth(menuWidth); - if (ImGui::SliderInt("##spyserver_source_gain", &_this->gain, 0, _this->client->devInfo.MaximumGainIndex)) { + if (ImGui::SliderInt("##spyserver_source_gain", (int*)&_this->gain, 0, _this->client->devInfo.MaximumGainIndex)) { _this->client->setSetting(SPYSERVER_SETTING_GAIN, _this->gain); config.acquire(); config.conf["devices"][_this->devRef]["gainId"] = _this->gain; config.release(true); } - } + } + + ImGui::Text("Digital Gain"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX()); + if (ImGui::InputInt("##spyserver_source_dgain", (int*)&_this->digiGain, 1, 10)) { + _this->client->setSetting(SPYSERVER_SETTING_IQ_DIGITAL_GAIN, _this->digiGain); + } ImGui::Text("Status:"); ImGui::SameLine(); @@ -302,7 +309,8 @@ private: std::vector sampleRates; std::string sampleRatesTxt; - int gain = 0; + uint32_t gain = 0; + uint32_t digiGain = 0; std::string devRef = ""; diff --git a/spyserver_source/src/spyserver_client.cpp b/spyserver_source/src/spyserver_client.cpp index d8ee0736..48825d9f 100644 --- a/spyserver_source/src/spyserver_client.cpp +++ b/spyserver_source/src/spyserver_client.cpp @@ -102,9 +102,10 @@ namespace spyserver { return; } - //printf("MSG Proto: 0x%08X, MsgType: 0x%08X, StreamType: 0x%08X, Seq: 0x%08X, Size: %d\n", _this->receivedHeader.ProtocolID, _this->receivedHeader.MessageType, _this->receivedHeader.StreamType, _this->receivedHeader.SequenceNumber, _this->receivedHeader.BodySize); + printf("MSG Proto: 0x%08X, MsgType: 0x%08X, StreamType: 0x%08X, Seq: 0x%08X, Size: %d\n", _this->receivedHeader.ProtocolID, _this->receivedHeader.MessageType, _this->receivedHeader.StreamType, _this->receivedHeader.SequenceNumber, _this->receivedHeader.BodySize); int mtype = _this->receivedHeader.MessageType & 0xFFFF; + int mflags = (_this->receivedHeader.MessageType & 0xFFFF0000) >> 16; if (mtype == SPYSERVER_MSG_TYPE_DEVICE_INFO) { { @@ -117,15 +118,18 @@ namespace spyserver { } else if (mtype == SPYSERVER_MSG_TYPE_UINT8_IQ) { int sampCount = _this->receivedHeader.BodySize / (sizeof(uint8_t)*2); + float gain = pow(10, (double)mflags / 20.0); + float scale = 1.0f / (gain * 128.0f); for (int i = 0; i < sampCount; i++) { - _this->output->writeBuf[i].re = ((float)_this->readBuf[(2*i)] / 128.0f)-1.0f; - _this->output->writeBuf[i].im = ((float)_this->readBuf[(2*i)+1] / 128.0f)-1.0f; + _this->output->writeBuf[i].re = ((float)_this->readBuf[(2*i)] - 128.0f) * scale; + _this->output->writeBuf[i].im = ((float)_this->readBuf[(2*i)+1] - 128.0f) * scale; } _this->output->swap(sampCount); } else if (mtype == SPYSERVER_MSG_TYPE_INT16_IQ) { int sampCount = _this->receivedHeader.BodySize / (sizeof(int16_t)*2); - volk_16i_s32f_convert_32f((float*)_this->output->writeBuf, (int16_t*)_this->readBuf, 32768.0, sampCount*2); + float gain = pow(10, (double)mflags / 20.0); + volk_16i_s32f_convert_32f((float*)_this->output->writeBuf, (int16_t*)_this->readBuf, 32768.0 * gain, sampCount*2); _this->output->swap(sampCount); } else if (mtype == SPYSERVER_MSG_TYPE_INT24_IQ) { @@ -134,7 +138,8 @@ namespace spyserver { } else if (mtype == SPYSERVER_MSG_TYPE_FLOAT_IQ) { int sampCount = _this->receivedHeader.BodySize / sizeof(dsp::complex_t); - memcpy(_this->output->writeBuf, _this->readBuf, _this->receivedHeader.BodySize); + float gain = pow(10, (double)mflags / 20.0); + volk_32f_s32f_multiply_32f((float*)_this->output->writeBuf, (float*)_this->readBuf, gain, sampCount*2); _this->output->swap(sampCount); }