diff --git a/main.cpp b/main.cpp index c9a372e..05ae250 100644 --- a/main.cpp +++ b/main.cpp @@ -24,14 +24,17 @@ namespace net = std::experimental::net; void fft_mag(std::complex* in, float* out, size_t len); +static const size_t block_len = 16384; +static const int wf_width = 1000; +static const int wf_height = 2000; + + static std::atomic terminate_dsp; -struct bladerf* bladerf_dev; +static struct bladerf* bladerf_dev; -static std::mutex waterfall_data_mutex; -static int waterfall_width = 1000; -static int waterfall_height = 2000; -static unsigned int waterfall_data[1000*2000]; +static std::mutex wf_data_mutex; +static unsigned int wf_data[wf_width*wf_height]; static std::atomic freq_setpoint; static std::atomic freq_peak; @@ -41,35 +44,35 @@ static std::atomic tec_current; static std::atomic fps; -static void dsp_thread() { +static void dsp_thread() +{ using namespace std::literals::chrono_literals; net::io_context io_context; net::ip::tcp::socket tec_socket(io_context); tec_socket.connect(net::ip::tcp::endpoint(net::ip::make_address("192.168.1.27"), 23)); - size_t len = 16384; - std::vector> frames(len); - std::vector> frames_f(len); - std::vector frames_mag(len); + std::vector> frames(block_len); + std::vector> frames_f(block_len); + std::vector frames_mag(block_len); int iterations = 0; auto last_second = std::chrono::steady_clock::now(); auto last_tec = std::chrono::steady_clock::now(); while(!terminate_dsp) { int status; - if((status = bladerf_sync_rx(bladerf_dev, frames.data(), len, NULL, 0)) != 0) { + if((status = bladerf_sync_rx(bladerf_dev, frames.data(), block_len, NULL, 0)) != 0) { std::cerr << "failed to receive samples from bladeRF: " << bladerf_strerror(status) << std::endl; break; } - fft_mag(frames_f.data(), frames_mag.data(), len); + fft_mag(frames_f.data(), frames_mag.data(), block_len); // stabilize laser bool tick = false; if((std::chrono::steady_clock::now() - last_tec) >= 100ms) { float freq_peak_local; - freq_peak_local = 40.0f*float(distance(frames_mag.begin(), max_element(frames_mag.begin(), frames_mag.end())))/float(len); + freq_peak_local = 40.0f*float(distance(frames_mag.begin(), max_element(frames_mag.begin(), frames_mag.end())))/float(block_len); freq_peak = freq_peak_local; float freq_error = freq_peak_local - freq_setpoint; float tec_current_local = std::max(tec_bias+tec_p*freq_error, 0.0f); @@ -91,16 +94,16 @@ static void dsp_thread() { // update waterfall { - std::lock_guard guard(waterfall_data_mutex); - std::memmove(&waterfall_data[waterfall_width], &waterfall_data[0], sizeof(int)*waterfall_width*(waterfall_height - 1)); - for(int i=0;i guard(wf_data_mutex); + std::memmove(&wf_data[wf_width], &wf_data[0], sizeof(int)*wf_width*(wf_height - 1)); + for(int i=0;i guard(waterfall_data_mutex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, waterfall_width, waterfall_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, waterfall_data); + std::lock_guard guard(wf_data_mutex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wf_width, wf_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, wf_data); } ImGui_ImplOpenGL3_NewFrame(); @@ -253,7 +256,7 @@ int main(int argc, char* argv[]) exit = true; ImGui::Text("FPS: %d", (int)fps); ImGui::TableNextColumn(); - ImGui::Image((void*)(intptr_t)waterfall, ImVec2(waterfall_width, waterfall_height)); + ImGui::Image((void*)(intptr_t)waterfall, ImVec2(wf_width, wf_height)); ImGui::EndTable(); ImGui::End();