minor cleanup, use const
This commit is contained in:
parent
52bbfc0c33
commit
9bee53ab49
49
main.cpp
49
main.cpp
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue