86 fft_plot = std::make_shared<widgets::FFTPlot>(fft_vec.data(), 8, -150, 150, 10);
124 std::scoped_lock l(fm);
125 available_devices = bkd->get_cfg(
"available_devices");
126 current_device = bkd->get_cfg(
"current_device");
128 dev_opt_disp.clear();
129 dev_opt_disp.add_options(bkd->get_cfg(
"dev/list"));
130 dev_opt_disp.set_values(bkd->get_cfg(
"dev/cfg"));
132 fft_size = bkd->get_cfg(
"fft/size");
133 fft_rate = bkd->get_cfg(
"fft/rate");
134 fft_avg_num = bkd->get_cfg(
"fft/avg_num");
137 is_started = bkd->get_cfg(
"started");
139 buffer_usage = bkd->get_cfg(
"buffer_usage");
141 recording = bkd->get_cfg(
"recording");
142 rec_size = bkd->get_cfg(
"rec_size");
150 if (ImGui::CollapsingHeader(
"Source", ImGuiTreeNodeFlags_DefaultOpen))
153 style::beginDisabled();
154 if (ImGui::BeginCombo(
"Device##devicebox", current_device.name.c_str()))
156 for (
auto &d : available_devices)
158 if (ImGui::Selectable(d.name.c_str(), d == current_device))
163 std::scoped_lock l(fm);
164 bkd->set_cfg(
"current_device", (nlohmann::json)d);
166 dev_opt_disp.clear();
167 dev_opt_disp.add_options(bkd->get_cfg(
"dev/list"));
168 dev_opt_disp.set_values(bkd->get_cfg(
"dev/cfg"));
176 style::endDisabled();
178 nlohmann::json changed = dev_opt_disp.draw();
180 if (changed.size() > 0)
185 std::scoped_lock l(fm);
186 auto r = bkd->set_cfg(
"dev/cfg", changed);
187 if (r >= RemoteHandlerBackend::RES_LISTUPD)
189 dev_opt_disp.clear();
190 dev_opt_disp.add_options(bkd->get_cfg(
"dev/list"));
191 dev_opt_disp.set_values(bkd->get_cfg(
"dev/cfg"));
198 if (ImGui::Button(
"Start"))
203 std::scoped_lock l(fm);
204 bkd->set_cfg(
"started",
true);
210 if (ImGui::Button(
"Stop"))
215 std::scoped_lock l(fm);
216 bkd->set_cfg(
"started",
false);
221 ImGui::ProgressBar(buffer_usage);
224 if (ImGui::CollapsingHeader(
"FFT", ImGuiTreeNodeFlags_DefaultOpen))
226 widgets::SteppedSliderFloat(
"FFT Max", &fft_plot->scale_max, -160, 150);
227 widgets::SteppedSliderFloat(
"FFT Min", &fft_plot->scale_min, -160, 150);
231 if (ImGui::InputInt(
"Size##fftsize", &fft_size))
236 std::scoped_lock l(fm);
237 bkd->set_cfg(
"fft/size", fft_size);
241 if (ImGui::InputInt(
"Rate##fftrate", &fft_rate))
245 std::scoped_lock l(fm);
246 bkd->set_cfg(
"fft/rate", fft_rate);
249 if (ImGui::InputInt(
"Avg Num##fftavg", &fft_avg_num))
253 std::scoped_lock l(fm);
254 bkd->set_cfg(
"fft/avg_num", fft_avg_num);
258 if (ImGui::CollapsingHeader(
"Recording", ImGuiTreeNodeFlags_DefaultOpen))
261 style::beginDisabled();
265 if (ImGui::Button(
"Rec Start"))
270 std::scoped_lock l(fm);
271 bkd->set_cfg(
"recording",
true);
277 ImGui::Text(
"Size : %lu", rec_size);
279 if (ImGui::Button(
"Rec Stop"))
284 std::scoped_lock l(fm);
285 bkd->set_cfg(
"recording",
false);
291 style::endDisabled();
297 float right_width = win_size.x;
298 float wf_size = win_size.y;
299 bool show_waterfall =
true;
300 float waterfall_ratio = 0.3;
301 float left_width = ImGui::GetCursorPosX() - 9;
303 ImGui::BeginChild(
"RecorderFFT", {right_width, wf_size},
false, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse);
305 float fft_height = wf_size * (show_waterfall ? waterfall_ratio : 1.0);
306 float wf_height = wf_size * (1 - waterfall_ratio) + 15 * ui_scale;
307 float wfft_widht = right_width - 9 * ui_scale;
314 ImGui::SetNextWindowSizeConstraints(ImVec2((right_width + offset * ui_scale), 50), ImVec2((right_width + offset * ui_scale), wf_size));
315 ImGui::SetNextWindowSize(ImVec2((right_width + offset * ui_scale), show_waterfall ? waterfall_ratio * wf_size : wf_size));
316 ImGui::SetNextWindowPos(ImVec2(left_width, 25 * ui_scale));
317 if (ImGui::Begin(
"#fft", &t,
318 ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoScrollbar |
319 ImGuiWindowFlags_NoScrollWithMouse))
321 ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 9 * ui_scale);
322 fft_plot->draw({float(wfft_widht), fft_height});
323 if (show_waterfall && ImGui::IsMouseDragging(ImGuiMouseButton_Left))
324 waterfall_ratio = ImGui::GetWindowHeight() / wf_size;
329 ImGui::SetCursorPosY(ImGui::GetCursorPosY() - 15 * ui_scale);
330 ImGui::SetCursorPosX(9 * ui_scale);
331 waterfall_plot->draw({wfft_widht, wf_height},
true);