minor cleanup, use const

This commit is contained in:
Sebastien Bourdeauducq 2023-09-13 10:45:02 +08:00
parent 52bbfc0c33
commit 9bee53ab49
1 changed files with 26 additions and 23 deletions

View File

@ -24,14 +24,17 @@ namespace net = std::experimental::net;
void fft_mag(std::complex<float>* in, float* out, size_t len); void fft_mag(std::complex<float>* 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<bool> terminate_dsp; static std::atomic<bool> terminate_dsp;
struct bladerf* bladerf_dev; static struct bladerf* bladerf_dev;
static std::mutex waterfall_data_mutex; static std::mutex wf_data_mutex;
static int waterfall_width = 1000; static unsigned int wf_data[wf_width*wf_height];
static int waterfall_height = 2000;
static unsigned int waterfall_data[1000*2000];
static std::atomic<float> freq_setpoint; static std::atomic<float> freq_setpoint;
static std::atomic<float> freq_peak; static std::atomic<float> freq_peak;
@ -41,35 +44,35 @@ static std::atomic<float> tec_current;
static std::atomic<int> fps; static std::atomic<int> fps;
static void dsp_thread() { static void dsp_thread()
{
using namespace std::literals::chrono_literals; using namespace std::literals::chrono_literals;
net::io_context io_context; net::io_context io_context;
net::ip::tcp::socket tec_socket(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)); tec_socket.connect(net::ip::tcp::endpoint(net::ip::make_address("192.168.1.27"), 23));
size_t len = 16384; std::vector<std::complex<int16_t>> frames(block_len);
std::vector<std::complex<int16_t>> frames(len); std::vector<std::complex<float>> frames_f(block_len);
std::vector<std::complex<float>> frames_f(len); std::vector<float> frames_mag(block_len);
std::vector<float> frames_mag(len);
int iterations = 0; int iterations = 0;
auto last_second = std::chrono::steady_clock::now(); auto last_second = std::chrono::steady_clock::now();
auto last_tec = std::chrono::steady_clock::now(); auto last_tec = std::chrono::steady_clock::now();
while(!terminate_dsp) { while(!terminate_dsp) {
int status; 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; std::cerr << "failed to receive samples from bladeRF: " << bladerf_strerror(status) << std::endl;
break; break;
} }
fft_mag(frames_f.data(), frames_mag.data(), len); fft_mag(frames_f.data(), frames_mag.data(), block_len);
// stabilize laser // stabilize laser
bool tick = false; bool tick = false;
if((std::chrono::steady_clock::now() - last_tec) >= 100ms) { if((std::chrono::steady_clock::now() - last_tec) >= 100ms) {
float freq_peak_local; 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; freq_peak = freq_peak_local;
float freq_error = freq_peak_local - freq_setpoint; float freq_error = freq_peak_local - freq_setpoint;
float tec_current_local = std::max(tec_bias+tec_p*freq_error, 0.0f); float tec_current_local = std::max(tec_bias+tec_p*freq_error, 0.0f);
@ -91,16 +94,16 @@ static void dsp_thread() {
// update waterfall // update waterfall
{ {
std::lock_guard<std::mutex> guard(waterfall_data_mutex); std::lock_guard<std::mutex> guard(wf_data_mutex);
std::memmove(&waterfall_data[waterfall_width], &waterfall_data[0], sizeof(int)*waterfall_width*(waterfall_height - 1)); std::memmove(&wf_data[wf_width], &wf_data[0], sizeof(int)*wf_width*(wf_height - 1));
for(int i=0;i<waterfall_width;i++) { for(int i=0;i<wf_width;i++) {
int j = i*len/waterfall_width; int j = i*block_len/wf_width;
waterfall_data[i] = 0xff000000 | 0x010101*std::min(int(frames_mag[j]/900.0f), 255); wf_data[i] = 0xff000000 | 0x010101*std::min(int(frames_mag[j]/900.0f), 255);
} }
waterfall_data[int(freq_setpoint*waterfall_width)/40] = 0xff0000ff; wf_data[int(freq_setpoint*wf_width)/40] = 0xff0000ff;
if(tick) if(tick)
for(int i=0;i<100;i++) for(int i=0;i<100;i++)
waterfall_data[i] = 0xffff0000; wf_data[i] = 0xffff0000;
} }
// FPS counter // FPS counter
@ -223,8 +226,8 @@ int main(int argc, char* argv[])
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
#endif #endif
if(update) { if(update) {
std::lock_guard<std::mutex> guard(waterfall_data_mutex); std::lock_guard<std::mutex> guard(wf_data_mutex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, waterfall_width, waterfall_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, waterfall_data); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wf_width, wf_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, wf_data);
} }
ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplOpenGL3_NewFrame();
@ -253,7 +256,7 @@ int main(int argc, char* argv[])
exit = true; exit = true;
ImGui::Text("FPS: %d", (int)fps); ImGui::Text("FPS: %d", (int)fps);
ImGui::TableNextColumn(); 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::EndTable();
ImGui::End(); ImGui::End();