diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2020-10-31 17:18:19 -0400 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2020-10-31 17:18:19 -0400 |
commit | 86453bc8f4ca7b41292e1e48223dc9661ce8e92e (patch) | |
tree | f00ee7a487b5da36a1d87bbcbd79a6e956329b52 /source | |
parent | 3113d96497853af196fa63a987e8c3ff550209c8 (diff) |
log conversion results to .csv
Diffstat (limited to 'source')
-rw-r--r-- | source/main.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/source/main.cpp b/source/main.cpp index 414d2f7..17b0adb 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -21,7 +21,7 @@ constexpr unsigned int MAX_ELF_FILE_SIZE = 8 * 1024; constexpr unsigned int MAX_ERROR_QUEUE_SIZE = 8; -constexpr unsigned int MAX_SAMPLE_BUFFER_SIZE = 6000; +constexpr unsigned int MAX_SAMPLE_BUFFER_SIZE = 6000; // operate on buffers size this / 2 constexpr unsigned int MAX_SIGGEN_BUFFER_SIZE = 3000; enum class RunStatus : char @@ -78,6 +78,7 @@ static std::array<adcsample_t, CACHE_SIZE_ALIGN(adcsample_t, MAX_SAMPLE_BUFFER_S CC_ALIGN(CACHE_LINE_SIZE) #endif static std::array<dacsample_t, CACHE_SIZE_ALIGN(dacsample_t, MAX_SAMPLE_BUFFER_SIZE)> dac_samples; +static volatile const dacsample_t *dac_samples_new = nullptr; #if CACHE_LINE_SIZE > 0 CC_ALIGN(CACHE_LINE_SIZE) #endif @@ -265,7 +266,29 @@ void main_loop() break; case 's': - usbserial::write(dac_samples.data(), dac_sample_count * sizeof(dacsample_t)); + if (dac_samples_new != nullptr) { + unsigned char buf[2] = { + static_cast<unsigned char>(dac_sample_count / 2 & 0xFF), + static_cast<unsigned char>(((dac_sample_count / 2) >> 8) & 0xFF) + }; + usbserial::write(buf, 2); + unsigned int total = dac_sample_count / 2 * sizeof(dacsample_t); + unsigned int offset = 0; + unsigned char unused; + auto samps = reinterpret_cast<const uint8_t *>( + const_cast<const dacsample_t *>(dac_samples_new)); + while (total > 512) { + usbserial::write(samps + offset, 512); + while (usbserial::read(&unused, 1) == 0); + offset += 512; + total -= 512; + } + usbserial::write(samps + offset, total); + while (usbserial::read(&unused, 1) == 0); + dac_samples_new = nullptr; + } else { + usbserial::write("\0\0", 2); + } break; case 'W': @@ -281,7 +304,7 @@ void main_loop() } } - chThdSleepMilliseconds(1); + chThdSleepMicroseconds(100); } } @@ -308,12 +331,14 @@ THD_FUNCTION(conversionThread, arg) if (!samples) samples = &adc_samples[0]; std::copy(samples, samples + halfsize, &dac_samples[0]); + dac_samples_new = &dac_samples[0]; } else if (message == MSG_CONVSECOND) { if (elf_entry) samples = elf_entry(&adc_samples[halfsize], halfsize); if (!samples) samples = &adc_samples[halfsize]; std::copy(samples, samples + halfsize, &dac_samples[dac_sample_count / 2]); + dac_samples_new = &dac_samples[dac_sample_count / 2]; } else if (message == MSG_CONVFIRST_MEASURE) { chTMStartMeasurementX(&conversion_time_measurement); if (elf_entry) @@ -322,6 +347,7 @@ THD_FUNCTION(conversionThread, arg) if (!samples) samples = &adc_samples[0]; std::copy(samples, samples + halfsize, &dac_samples[0]); + dac_samples_new = &dac_samples[0]; } else if (message == MSG_CONVSECOND_MEASURE) { chTMStartMeasurementX(&conversion_time_measurement); if (elf_entry) @@ -330,6 +356,7 @@ THD_FUNCTION(conversionThread, arg) if (!samples) samples = &adc_samples[halfsize]; std::copy(samples, samples + halfsize, &dac_samples[dac_sample_count / 2]); + dac_samples_new = &dac_samples[dac_sample_count / 2]; } } } |