From b835d07573bf30355dbe8c9f4f4daf4c0c13e9cb Mon Sep 17 00:00:00 2001 From: AlexandreRouma Date: Thu, 7 Nov 2024 17:39:52 +0100 Subject: [PATCH] finish custom offset definitions and fix bug in source selection --- core/src/core.cpp | 31 ++++--- core/src/gui/menus/source.cpp | 147 ++++++++++++++++++++++------------ 2 files changed, 109 insertions(+), 69 deletions(-) diff --git a/core/src/core.cpp b/core/src/core.cpp index 5478f0f2..73c1ccbe 100644 --- a/core/src/core.cpp +++ b/core/src/core.cpp @@ -232,22 +232,15 @@ int sdrpp_main(int argc, char* argv[]) { defConfig["modules"] = json::array(); - defConfig["offsets"] = json::array(); - defConfig["offsets"][0]["name"] = "SpyVerter"; - defConfig["offsets"][0]["offset"] = 120000000; - defConfig["offsets"][1]["name"] = "Ham-It-Up"; - defConfig["offsets"][1]["offset"] = 125000000; - defConfig["offsets"][2]["name"] = "MMDS S-band (1998MHz)"; - defConfig["offsets"][2]["offset"] = -1998000000; - defConfig["offsets"][3]["name"] = "DK5AV X-Band"; - defConfig["offsets"][3]["offset"] = -6800000000; - defConfig["offsets"][4]["name"] = "Ku LNB (9750MHz)"; - defConfig["offsets"][4]["offset"] = -9750000000; - defConfig["offsets"][5]["name"] = "Ku LNB (10700MHz)"; - defConfig["offsets"][5]["offset"] = -10700000000; + defConfig["offsets"]["SpyVerter"] = 120000000.0; + defConfig["offsets"]["Ham-It-Up"] = 125000000.0; + defConfig["offsets"]["MMDS S-band (1998MHz)"] = -1998000000.0; + defConfig["offsets"]["DK5AV X-Band"] = -6800000000.0; + defConfig["offsets"]["Ku LNB (9750MHz)"] = -9750000000.0; + defConfig["offsets"]["Ku LNB (10700MHz)"] = -10700000000.0; - defConfig["offsetMode"] = (int)0; // Off - defConfig["offset"] = 0.0; + defConfig["selectedOffset"] = "None"; + defConfig["manualOffset"] = 0.0; defConfig["showMenu"] = true; defConfig["showWaterfall"] = true; defConfig["source"] = ""; @@ -332,12 +325,18 @@ int sdrpp_main(int argc, char* argv[]) { // Remove unused elements auto items = core::configManager.conf.items(); + auto newConf = core::configManager.conf; + bool configCorrected = false; for (auto const& item : items) { if (!defConfig.contains(item.key())) { flog::info("Unused key in config {0}, repairing", item.key()); - core::configManager.conf.erase(item.key()); + newConf.erase(item.key()); + configCorrected = true; } } + if (configCorrected) { + core::configManager.conf = newConf; + } // Update to new module representation in config if needed for (auto [_name, inst] : core::configManager.conf["moduleInstances"].items()) { diff --git a/core/src/gui/menus/source.cpp b/core/src/gui/menus/source.cpp index 77cd5c03..ac2f2cb7 100644 --- a/core/src/gui/menus/source.cpp +++ b/core/src/gui/menus/source.cpp @@ -9,22 +9,24 @@ #include namespace sourcemenu { - int offsetMode = 0; int sourceId = 0; - double customOffset = 0.0; - double effectiveOffset = 0.0; + EventHandler sourcesChangedHandler; + EventHandler sourceUnregisterHandler; + OptionList sources; + std::string selectedSource; + int decimId = 0; + OptionList decimations; + bool iqCorrection = false; bool invertIQ = false; - EventHandler sourcesChangedHandler; - EventHandler sourceUnregisterHandler; - - OptionList sources; - std::string selectedSource; - OptionList offsets; - std::vector customOffsets; - OptionList decimations; + int offsetId = 0; + double manualOffset = 0.0; + std::string selectedOffset; + double effectiveOffset = 0.0; + OptionList offsets; + std::map namedOffsets; bool showAddOffsetDialog = false; char newOffsetName[1024]; @@ -33,23 +35,24 @@ namespace sourcemenu { bool showDelOffsetDialog = false; std::string delOffsetName = ""; + // Offset IDs enum { - OFFSET_MODE_NONE, - OFFSET_MODE_MANUAL, - OFFSET_MODE_CUSTOM_BASE + OFFSET_ID_NONE, + OFFSET_ID_MANUAL, + OFFSET_ID_CUSTOM_BASE }; void updateOffset() { // Compute the effective offset - switch (offsetMode) { - case OFFSET_MODE_NONE: + switch (offsetId) { + case OFFSET_ID_NONE: effectiveOffset = 0; break; - case OFFSET_MODE_MANUAL: - effectiveOffset = customOffset; + case OFFSET_ID_MANUAL: + effectiveOffset = manualOffset; break; default: - effectiveOffset = customOffsets[offsetMode - OFFSET_MODE_CUSTOM_BASE]; + effectiveOffset = namedOffsets[offsets.name(offsetId)]; break; } @@ -57,6 +60,26 @@ namespace sourcemenu { sigpath::sourceManager.setTuningOffset(effectiveOffset); } + void selectOffsetById(int id) { + // Update the offset mode + offsetId = id; + selectedOffset = offsets.name(id); + + // Update the offset + updateOffset(); + } + + void selectOffsetByName(const std::string& name) { + // If the name doesn't exist, select 'None' + if (!offsets.nameExists(name)) { + selectOffsetById(OFFSET_ID_NONE); + return; + } + + // Select using the ID associated with the name + selectOffsetById(offsets.nameId(name)); + } + void refreshSources() { // Get sources auto sourceNames = sigpath::sourceManager.getSourceNames(); @@ -83,7 +106,7 @@ namespace sourcemenu { } // Update the GUI variables - sourceId = sources.valueExists(name); + sourceId = sources.valueId(name); selectedSource = name; // Select the source module @@ -104,23 +127,22 @@ namespace sourcemenu { // TODO: Stop everything } - void loadOffsets() { + void reloadOffsets() { // Clear list offsets.clear(); - customOffsets.clear(); + namedOffsets.clear(); // Define special offset modes - offsets.define("None", 0); - offsets.define("Manual", 1); + offsets.define("None", OFFSET_ID_NONE); + offsets.define("Manual", OFFSET_ID_MANUAL); // Acquire the config file core::configManager.acquire(); // Load custom offsets - std::vector offsetList = core::configManager.conf["offsets"]; - for (auto& o : offsetList) { - customOffsets.push_back(o["offset"]); - offsets.define(o["name"], offsets.size()); + namedOffsets = (std::map)core::configManager.conf["offsets"]; + for (auto& [name, offset] : namedOffsets) { + offsets.define(name, offsets.size()); } // Release the config file @@ -129,7 +151,7 @@ namespace sourcemenu { void init() { // Load offset modes - loadOffsets(); + reloadOffsets(); // Define decimation values decimations.define(1, "None", 1); @@ -144,9 +166,9 @@ namespace sourcemenu { core::configManager.acquire(); // Load other settings - std::string selected = core::configManager.conf["source"]; - customOffset = core::configManager.conf["offset"]; - offsetMode = core::configManager.conf["offsetMode"]; + std::string selectedSource = core::configManager.conf["source"]; + manualOffset = core::configManager.conf["manualOffset"]; + std::string selectedOffset = core::configManager.conf["selectedOffset"]; iqCorrection = core::configManager.conf["iqCorrection"]; invertIQ = core::configManager.conf["invertIQ"]; int decimation = core::configManager.conf["decimation"]; @@ -159,13 +181,13 @@ namespace sourcemenu { // Select the source module refreshSources(); - selectSource(selected); + selectSource(selectedSource); // Update frontend settings sigpath::iqFrontEnd.setDCBlocking(iqCorrection); sigpath::iqFrontEnd.setInvertIQ(invertIQ); - updateOffset(); sigpath::iqFrontEnd.setDecimation(decimations.value(decimId)); + selectOffsetByName(selectedOffset); // Register handlers sourcesChangedHandler.handler = onSourcesChanged; @@ -180,23 +202,33 @@ namespace sourcemenu { core::configManager.acquire(); // Define a new offset - auto newOffsetObj = json::object(); - newOffsetObj["name"] = newOffsetName; - newOffsetObj["offset"] = newOffset; - core::configManager.conf["offsets"].push_back(newOffsetObj); + core::configManager.conf["offsets"][name] = offset; // Acquire the config file core::configManager.release(true); // Reload the offsets - loadOffsets(); + reloadOffsets(); - // Re-select the same one - // TODO: Switch from an array to a map, because two can't have the same name anyway and it'll just make things easier...+ + // Attempt to re-select the same one + selectOffsetByName(selectedOffset); } void delOffset(const std::string& name) { - + // Acquire the config file + core::configManager.acquire(); + + // Define a new offset + core::configManager.conf["offsets"].erase(name); + + // Acquire the config file + core::configManager.release(true); + + // Reload the offsets + reloadOffsets(); + + // Attempt to re-select the same one + selectOffsetByName(selectedOffset); } bool addOffsetDialog() { @@ -217,7 +249,16 @@ namespace sourcemenu { ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX()); ImGui::InputDouble("##sdrpp_add_offset_offset", &newOffset); - bool denyApply = !newOffsetName[0] || offsets.nameExists(newOffsetName); + bool nameExists = offsets.nameExists(newOffsetName); + bool reservedName = !strcmp(newOffsetName, "None") || !strcmp(newOffsetName, "Manual"); + bool denyApply = !newOffsetName[0] || nameExists || reservedName; + + if (nameExists) { + ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "An offset with the given name already exists."); + } + else if (reservedName) { + ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "The given name is reserved."); + } if (denyApply) { style::beginDisabled(); } if (ImGui::Button("Apply")) { @@ -271,20 +312,20 @@ namespace sourcemenu { ImGui::LeftLabel("Offset mode"); ImGui::SetNextItemWidth(itemWidth - ImGui::GetCursorPosX() - 2.0f*(lineHeight + 1.5f*spacing)); - if (ImGui::Combo("##_sdrpp_offset_mode", &offsetMode, offsets.txt)) { - updateOffset(); + if (ImGui::Combo("##_sdrpp_offset", &offsetId, offsets.txt)) { + selectOffsetById(offsetId); core::configManager.acquire(); - core::configManager.conf["offsetMode"] = offsetMode; + core::configManager.conf["selectedOffset"] = offsets.key(offsetId); core::configManager.release(true); } ImGui::SameLine(); ImGui::SetCursorPosX(ImGui::GetCursorPosX() - spacing); - if (offsetMode < OFFSET_MODE_CUSTOM_BASE) { ImGui::BeginDisabled(); } + if (offsetId < OFFSET_ID_CUSTOM_BASE) { ImGui::BeginDisabled(); } if (ImGui::Button("-##_sdrpp_offset_del_", ImVec2(lineHeight + 0.5f*spacing, 0))) { - delOffsetName = "TEST"; + delOffsetName = selectedOffset; showDelOffsetDialog = true; } - if (offsetMode < OFFSET_MODE_CUSTOM_BASE) { ImGui::EndDisabled(); } + if (offsetId < OFFSET_ID_CUSTOM_BASE) { ImGui::EndDisabled(); } ImGui::SameLine(); ImGui::SetCursorPosX(ImGui::GetCursorPosX() - spacing); if (ImGui::Button("+##_sdrpp_offset_add_", ImVec2(lineHeight + 0.5f*spacing, 0))) { @@ -294,7 +335,7 @@ namespace sourcemenu { // Offset delete confirmation if (ImGui::GenericDialog("sdrpp_del_offset_confirm", showDelOffsetDialog, GENERIC_DIALOG_BUTTONS_YES_NO, []() { - ImGui::Text("Deleting offset named \"%s\". Are you sure?", delOffsetName); + ImGui::Text("Deleting offset named \"%s\". Are you sure?", delOffsetName.c_str()); }) == GENERIC_DIALOG_BUTTON_YES) { delOffset(delOffsetName); } @@ -304,11 +345,11 @@ namespace sourcemenu { ImGui::LeftLabel("Offset"); ImGui::FillWidth(); - if (offsetMode == OFFSET_MODE_MANUAL) { - if (ImGui::InputDouble("##freq_offset", &customOffset, 1.0, 100.0)) { + if (offsetId == OFFSET_ID_MANUAL) { + if (ImGui::InputDouble("##freq_offset", &manualOffset, 1.0, 100.0)) { updateOffset(); core::configManager.acquire(); - core::configManager.conf["offset"] = customOffset; + core::configManager.conf["offset"] = manualOffset; core::configManager.release(true); } }