Fixed sample rate bug

This commit is contained in:
Ryzerth 2020-11-28 23:24:45 +01:00
parent eac0a7a13f
commit b3d1eabbad
17 changed files with 645 additions and 19 deletions

View File

@ -72,7 +72,7 @@ float* volume = &dummyVolume;
float fftMin = -70.0; float fftMin = -70.0;
float fftMax = 0.0; float fftMax = 0.0;
watcher<double> offset(0.0, true); watcher<double> offset(0.0, true);
watcher<float> bw(8000000.0, true); float bw = 8000000;
bool playing = false; bool playing = false;
watcher<bool> dcbias(false, false); watcher<bool> dcbias(false, false);
bool showCredits = false; bool showCredits = false;
@ -101,6 +101,10 @@ void windowInit() {
gui::menu.registerEntry("Display", displaymenu::draw, NULL); gui::menu.registerEntry("Display", displaymenu::draw, NULL);
gui::freqSelect.init(); gui::freqSelect.init();
// Set default values for waterfall in case no source init's it
gui::waterfall.setBandwidth(8000000);
gui::waterfall.setViewBandwidth(8000000);
fft_in = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * fftSize); fft_in = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * fftSize);
fft_out = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * fftSize); fft_out = (fftwf_complex*) fftwf_malloc(sizeof(fftwf_complex) * fftSize);
@ -146,9 +150,7 @@ void windowInit() {
gui::freqSelect.frequencyChanged = false; gui::freqSelect.frequencyChanged = false;
sigpath::sourceManager.tune(frequency); sigpath::sourceManager.tune(frequency);
gui::waterfall.setCenterFrequency(frequency); gui::waterfall.setCenterFrequency(frequency);
gui::waterfall.setBandwidth(8000000); bw = gui::waterfall.getBandwidth();
gui::waterfall.setViewBandwidth(8000000);
bw.val = 8000000;
gui::waterfall.vfoFreqChanged = false; gui::waterfall.vfoFreqChanged = false;
gui::waterfall.centerFreqMoved = false; gui::waterfall.centerFreqMoved = false;
gui::waterfall.selectFirstVFO(); gui::waterfall.selectFirstVFO();
@ -446,7 +448,10 @@ void drawWindow() {
ImGui::SetCursorPosX((ImGui::GetWindowSize().x / 2.0) - (ImGui::CalcTextSize("Zoom").x / 2.0)); ImGui::SetCursorPosX((ImGui::GetWindowSize().x / 2.0) - (ImGui::CalcTextSize("Zoom").x / 2.0));
ImGui::Text("Zoom"); ImGui::Text("Zoom");
ImGui::SetCursorPosX((ImGui::GetWindowSize().x / 2.0) - 10); ImGui::SetCursorPosX((ImGui::GetWindowSize().x / 2.0) - 10);
ImGui::VSliderFloat("##_7_", ImVec2(20.0, 150.0), &bw.val, gui::waterfall.getBandwidth(), 1000.0, ""); if (ImGui::VSliderFloat("##_7_", ImVec2(20.0, 150.0), &bw, gui::waterfall.getBandwidth(), 1000.0, "")) {
gui::waterfall.setViewBandwidth(bw);
gui::waterfall.setViewOffset(vfo->centerOffset); // center vfo on screen
}
ImGui::NewLine(); ImGui::NewLine();
@ -474,11 +479,6 @@ void drawWindow() {
ImGui::EndChild(); ImGui::EndChild();
if (bw.changed()) {
gui::waterfall.setViewBandwidth(bw.val);
gui::waterfall.setViewOffset(vfo->centerOffset);
}
gui::waterfall.setFFTMin(fftMin); gui::waterfall.setFFTMin(fftMin);
gui::waterfall.setFFTMax(fftMax); gui::waterfall.setFFTMax(fftMax);
gui::waterfall.setWaterfallMin(fftMin); gui::waterfall.setWaterfallMin(fftMin);
@ -490,4 +490,8 @@ void drawWindow() {
if (showCredits) { if (showCredits) {
credits::show(); credits::show();
} }
}
void setViewBandwidthSlider(float bandwidth) {
bw = bandwidth;
} }

View File

@ -4,4 +4,5 @@
#define WINDOW_FLAGS ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground #define WINDOW_FLAGS ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground
void windowInit(); void windowInit();
void drawWindow(); void drawWindow();
void setViewBandwidthSlider(float bandwidth);

View File

@ -0,0 +1,7 @@
{
"broadcast": "#0000FFFF",
"amateur": "#FF0000FF",
"aviation": "#00FF00FF",
"marine": "#00FFFFFF",
"military": "#FFFF00FF"
}

View File

@ -0,0 +1,267 @@
{
"name": "General",
"country_name": "Worldwide",
"country_code": "--",
"author_name": "Ryzerth",
"author_url": "https://github.com/AlexandreRouma",
"bands": [
{
"name": "Long Wave",
"type": "broadcast",
"start": 148500,
"end": 283500
},
{
"name": "Medium Wave",
"type": "broadcast",
"start": 526500,
"end": 1606500
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 2300000,
"end": 2468000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 3200000,
"end": 3400000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 3950000,
"end": 4000000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 4750000,
"end": 4995000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 5005000,
"end": 5060000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 5900000,
"end": 6200000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 7200000,
"end": 7450000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 9400000,
"end": 9900000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 11600000,
"end": 12100000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 13570000,
"end": 13870000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 15100000,
"end": 15800000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 17480000,
"end": 17900000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 18900000,
"end": 19020000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 21450000,
"end": 21850000
},
{
"name": "Shortwave Broadcast",
"type": "broadcast",
"start": 25670000,
"end": 26100000
},
{
"name": "FM Broadcast",
"type": "broadcast",
"start": 87500000,
"end": 108000000
},
{
"name": "Air Band VOR/ILS",
"type": "aviation",
"start": 108000000,
"end": 118000000
},
{
"name": "Air Band Voice",
"type": "aviation",
"start": 118000000,
"end": 137000000
},
{
"name": "160m Ham Band",
"type": "amateur",
"start": 1800000,
"end": 2000000
},
{
"name": "80m Ham Band",
"type": "amateur",
"start": 3500000,
"end": 3950000
},
{
"name": "60m Ham Band",
"type": "amateur",
"start": 5351500,
"end": 5366500
},
{
"name": "40m Ham Band",
"type": "amateur",
"start": 7000000,
"end": 7200000
},
{
"name": "30m Ham Band",
"type": "amateur",
"start": 10100000,
"end": 10150000
},
{
"name": "20m Ham Band",
"type": "amateur",
"start": 14000000,
"end": 14350000
},
{
"name": "17m Ham Band",
"type": "amateur",
"start": 18068000,
"end": 18168000
},
{
"name": "15m Ham Band",
"type": "amateur",
"start": 21000000,
"end": 21450000
},
{
"name": "12m Ham Band",
"type": "amateur",
"start": 24890000,
"end": 24990000
},
{
"name": "CB",
"type": "amateur",
"start": 26960000,
"end": 27410000
},
{
"name": "10m Ham Band",
"type": "amateur",
"start": 28000000,
"end": 29750000
},
{
"name": "6m Ham Band",
"type": "amateur",
"start": 50000000,
"end": 54000000
},
{
"name": "2m Ham Band",
"type": "amateur",
"start": 144000000,
"end": 148000000
},
{
"name": "Marine",
"type": "marine",
"start": 156000000,
"end": 162025000
},
{
"name": "1.25m Ham Band",
"type": "amateur",
"start": 222000000,
"end": 225000000
},
{
"name": "Military Air",
"type": "military",
"start": 225000000,
"end": 380000000
},
{
"name": "Military Sat",
"type": "military",
"start": 240000000,
"end": 270000000
},
{
"name": "70cm Ham Band",
"type": "amateur",
"start": 420000000,
"end": 450000000
},
{
"name": "PMR446",
"type": "amateur",
"start": 446000000,
"end": 446200000
},
{
"name": "33cm Ham Band",
"type": "amateur",
"start": 902000000,
"end": 928000000
},
{
"name": "23cm Ham Band",
"type": "amateur",
"start": 1240000000,
"end": 1300000000
},
{
"name": "13cm Ham Band",
"type": "amateur",
"start": 2300000000,
"end": 2310000000
},
{
"name": "13cm Ham Band",
"type": "amateur",
"start": 2390000000,
"end": 2450000000
}
]
}

View File

@ -0,0 +1,141 @@
{
"name": "Germany",
"country_name": "Germany",
"country_code": "DE",
"author_name": "Tobias Mädel",
"author_url": "https://tbspace.de",
"bands": [
{
"name": "LW",
"type": "amateur",
"start": 135700,
"end": 137800
},
{
"name": "630m",
"type": "amateur",
"start": 472000,
"end": 479000
},
{
"name": "160m",
"type": "amateur",
"start": 1810000,
"end": 2000000
},
{
"name": "80m",
"type": "amateur",
"start": 3500000,
"end": 3800000
},
{
"name": "60m",
"type": "amateur",
"start": 5351500,
"end": 5366500
},
{
"name": "40m",
"type": "amateur",
"start": 7000000,
"end": 7200000
},
{
"name": "30m",
"type": "amateur",
"start": 10100000,
"end": 10150000
},
{
"name": "20m",
"type": "amateur",
"start": 14000000,
"end": 14350000
},
{
"name": "17m",
"type": "amateur",
"start": 18068000,
"end": 18168000
},
{
"name": "15m",
"type": "amateur",
"start": 21000000,
"end": 21450000
},
{
"name": "12m",
"type": "amateur",
"start": 24890000,
"end": 24990000
},
{
"name": "CB",
"type": "other",
"start": 26565000,
"end": 27405000
},
{
"name": "10m",
"type": "amateur",
"start": 28000000,
"end": 29700000
},
{
"name": "6m",
"type": "amateur",
"start": 50030000,
"end": 51000000
},
{
"name": "4m",
"type": "amateur",
"start": 70150000,
"end": 70200000
},
{
"name": "FM",
"type": "broadcast",
"start": 87500000,
"end": 108000000
},
{
"name": "2m",
"type": "amateur",
"start": 144000000,
"end": 146000000
},
{
"name": "Freenet",
"type": "other",
"start": 149025000,
"end": 149115625
},
{
"name": "70cm",
"type": "amateur",
"start": 430000000,
"end": 440000000
},
{
"name": "PMR446",
"type": "other",
"start": 446006250,
"end": 446196875
},
{
"name": "23cm",
"type": "amateur",
"start": 1240000000,
"end": 1300000000
},
{
"name": "13cm",
"type": "amateur",
"start": 2320000000,
"end": 2450000000
}
]
}

View File

@ -0,0 +1,135 @@
{
"name": "Russia",
"country_name": "Russia",
"country_code": "RU",
"author_name": "Raov",
"author_url": "https://twitter.com/raov_birbtog",
"bands": [
{
"name": "160m CW",
"type": "amateur",
"start": 1810000,
"end": 1838000
},
{
"name": "160m NB",
"type": "amateur",
"start": 1838000,
"end": 1840000
},
{
"name": "160m + Digi",
"type": "amateur",
"start": 1840000,
"end": 1843000
},
{
"name": "160m",
"type": "amateur",
"start": 1843000,
"end": 2000000
},
{
"name": "80m CW",
"type": "amateur",
"start": 3500000,
"end": 3510000
},
{
"name": "80m CW Contest",
"type": "amateur",
"start": 3510000,
"end": 3560000
},
{
"name": "80m CW",
"type": "amateur",
"start": 3560000,
"end": 3570000
},
{
"name": "80m NB, Digi 200Hz",
"type": "amateur",
"start": 3570000,
"end": 3580000
},
{
"name": "80m NB, Digi 500Hz",
"type": "amateur",
"start": 3580000,
"end": 3600000
},
{
"name": "80m SSB Contest",
"type": "amateur",
"start": 3600000,
"end": 3650000
},
{
"name": "80m",
"type": "amateur",
"start": 3650000,
"end": 3700000
},
{
"name": "80m SSB Contest",
"type": "amateur",
"start": 3700000,
"end": 3800000
},
{
"name": "60m CW 200Hz",
"type": "amateur",
"start": 5351500,
"end": 5354000
},
{
"name": "60m USB",
"type": "amateur",
"start": 5354000,
"end": 5366000
},
{
"name": "60m CW 20Hz",
"type": "amateur",
"start": 5356000,
"end": 5366500
},
{
"name": "40m CW",
"type": "amateur",
"start": 7000000,
"end": 7040000
},
{
"name": "40m NB, Digi 500Hz",
"type": "amateur",
"start": 7040000,
"end": 7050000
},
{
"name": "40m",
"type": "amateur",
"start": 7050000,
"end": 7060000
},
{
"name": "40m SSB Contest",
"type": "amateur",
"start": 7060000,
"end": 7100000
},
{
"name": "40m",
"type": "amateur",
"start": 7100000,
"end": 7130000
},
{
"name": "40m SSB Contest",
"type": "amateur",
"start": 7130000,
"end": 7200000
}
]
}

View File

@ -0,0 +1,31 @@
{
"audio": {
"Radio": {
"device": "Speakers (Realtek High Definiti",
"sampleRate": 48000.0,
"volume": 0.69921875
}
},
"bandPlan": "General",
"bandPlanEnabled": true,
"defaultSink": "Audio",
"fftHeight": 296,
"frequency": 99000000,
"max": 0.0,
"maximized": false,
"menuOrder": [
"Source",
"Radio",
"Recorder",
"Audio",
"Band Plan",
"Display"
],
"menuWidth": 300,
"min": -70.0,
"showWaterfall": true,
"windowSize": {
"h": 720,
"w": 1280
}
}

View File

@ -0,0 +1,7 @@
{
"Radio": "./modules/radio.dll",
"Recorder": "./modules/recorder.dll",
"Soapy": "./modules/soapy.dll",
"RTLTCPSource": "./modules/rtl_tcp_source.dll",
"PlutoSDRSource": "./modules/plutosdr_source.dll"
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -23,12 +23,20 @@ const char* gainModes[] = {
const char* gainModesTxt = "Manual\0Fast Attack\0Slow Attack\0Hybrid\0"; const char* gainModesTxt = "Manual\0Fast Attack\0Slow Attack\0Hybrid\0";
ConfigManager config;
class PlutoSDRSourceModule { class PlutoSDRSourceModule {
public: public:
PlutoSDRSourceModule(std::string name) { PlutoSDRSourceModule(std::string name) {
this->name = name; this->name = name;
sampleRate = 4000000.0; config.aquire();
std::string _ip = config.conf["IP"];
strcpy(&ip[3], _ip.c_str());
sampleRate = config.conf["sampleRate"];
gainMode = config.conf["gainMode"];
gain = config.conf["gain"];
config.release();
handler.ctx = this; handler.ctx = this;
handler.selectHandler = menuSelected; handler.selectHandler = menuSelected;
@ -136,7 +144,11 @@ private:
ImGui::Text("IP"); ImGui::Text("IP");
ImGui::SameLine(); ImGui::SameLine();
ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX()); ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX());
ImGui::InputText(CONCAT("##_pluto_ip_", _this->name), &_this->ip[3], 16); if (ImGui::InputText(CONCAT("##_pluto_ip_", _this->name), &_this->ip[3], 16)) {
config.aquire();
config.conf["IP"] = &_this->ip[3];
config.release(true);
}
ImGui::Text("Samplerate"); ImGui::Text("Samplerate");
ImGui::SameLine(); ImGui::SameLine();
@ -144,6 +156,9 @@ private:
if (_this->running) { style::beginDisabled(); } if (_this->running) { style::beginDisabled(); }
if (ImGui::InputFloat(CONCAT("##_samplerate_select_", _this->name), &_this->sampleRate, 1, 1000, 0)) { if (ImGui::InputFloat(CONCAT("##_samplerate_select_", _this->name), &_this->sampleRate, 1, 1000, 0)) {
core::setInputSampleRate(_this->sampleRate); core::setInputSampleRate(_this->sampleRate);
config.aquire();
config.conf["sampleRate"] = _this->sampleRate;
config.release(true);
} }
if (_this->running) { style::endDisabled(); } if (_this->running) { style::endDisabled(); }
@ -154,6 +169,9 @@ private:
if (_this->running) { if (_this->running) {
iio_channel_attr_write(iio_device_find_channel(_this->phy, "voltage0", false), "gain_control_mode", gainModes[_this->gainMode]); iio_channel_attr_write(iio_device_find_channel(_this->phy, "voltage0", false), "gain_control_mode", gainModes[_this->gainMode]);
} }
config.aquire();
config.conf["gainMode"] = _this->gainMode;
config.release(true);
} }
ImGui::Text("PGA Gain"); ImGui::Text("PGA Gain");
@ -162,9 +180,11 @@ private:
if (_this->gainMode) { style::beginDisabled(); } if (_this->gainMode) { style::beginDisabled(); }
if (ImGui::SliderFloat(CONCAT("##_gain_select_", _this->name), &_this->gain, 0, 76)) { if (ImGui::SliderFloat(CONCAT("##_gain_select_", _this->name), &_this->gain, 0, 76)) {
if (_this->running) { if (_this->running) {
// SET PLUTO GAIN HERE
iio_channel_attr_write_longlong(iio_device_find_channel(_this->phy, "voltage0", false),"hardwaregain", round(_this->gain)); iio_channel_attr_write_longlong(iio_device_find_channel(_this->phy, "voltage0", false),"hardwaregain", round(_this->gain));
} }
config.aquire();
config.conf["gain"] = _this->gain;
config.release(true);
} }
if (_this->gainMode) { style::endDisabled(); } if (_this->gainMode) { style::endDisabled(); }
} }
@ -218,13 +238,19 @@ private:
bool ipMode = true; bool ipMode = true;
double freq; double freq;
char ip[1024] = "ip:192.168.2.1"; char ip[1024] = "ip:192.168.2.1";
int port = 1234;
int gainMode = 0; int gainMode = 0;
float gain = 0; float gain = 0;
}; };
MOD_EXPORT void _INIT_() { MOD_EXPORT void _INIT_() {
// Do your one time init here json defConf;
defConf["IP"] = "192.168.2.1";
defConf["sampleRate"] = 4000000.0f;
defConf["gainMode"] = 0;
defConf["gain"] = 0.0f;
config.setPath(ROOT_DIR "/plutosdr_source_config.json");
config.load(defConf);
config.enableAutoSave();
} }
MOD_EXPORT void* _CREATE_INSTANCE_(std::string name) { MOD_EXPORT void* _CREATE_INSTANCE_(std::string name) {
@ -236,5 +262,6 @@ MOD_EXPORT void _DELETE_INSTANCE_(void* instance) {
} }
MOD_EXPORT void _STOP_() { MOD_EXPORT void _STOP_() {
// Do your one shutdown here config.disableAutoSave();
config.save();
} }

View File

@ -3,7 +3,7 @@
"Radio": { "Radio": {
"device": "Speakers (Realtek High Definiti", "device": "Speakers (Realtek High Definiti",
"sampleRate": 48000.0, "sampleRate": 48000.0,
"volume": 0.546875 "volume": 0.4609375
}, },
"Radio 1": { "Radio 1": {
"device": "Speakers (Realtek High Definition Audio)", "device": "Speakers (Realtek High Definition Audio)",
@ -20,7 +20,7 @@
"bandPlanEnabled": true, "bandPlanEnabled": true,
"defaultSink": "Audio", "defaultSink": "Audio",
"fftHeight": 296, "fftHeight": 296,
"frequency": 1090020000, "frequency": 99000000,
"max": 0.0, "max": 0.0,
"maximized": false, "maximized": false,
"menuOrder": [ "menuOrder": [

View File

@ -0,0 +1,6 @@
{
"IP": "192.168.2.1",
"gain": 0.0,
"gainMode": 2,
"sampleRate": 4000000.0
}