diff --git a/source/adc.cpp b/source/adc.cpp index 851b461..609ffce 100644 --- a/source/adc.cpp +++ b/source/adc.cpp @@ -18,7 +18,7 @@ constexpr static const ADCConfig adc_config = { .difsel = 0 }; -void adc_read_callback(ADCDriver *); +static void adc_read_callback(ADCDriver *); /*constexpr*/ static ADCConversionGroup adc_group_config = { .circular = false, @@ -46,61 +46,64 @@ constexpr static const GPTConfig gpt_config = { static bool adc_is_read_finished = false; -void adc_init() -{ - palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG); - - gptStart(gptd, &gpt_config); - adcStart(adcd, &adc_config); - adcSTM32EnableVREF(adcd); -} - -adcsample_t *adc_read(adcsample_t *buffer, size_t count) -{ - adc_is_read_finished = false; - adcStartConversion(adcd, &adc_group_config, buffer, count); - gptStartContinuous(gptd, 100); // 10kHz - while (!adc_is_read_finished); - return buffer; -} - void adc_read_callback([[maybe_unused]] ADCDriver *driver) { gptStopTimer(gptd); adc_is_read_finished = true; } -void adc_set_rate(ADCRate rate) +namespace adc { - uint32_t val = 0; - - switch (rate) { - case ADCRate::R2P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_2P5); - break; - case ADCRate::R6P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_6P5); - break; - case ADCRate::R12P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_12P5); - break; - case ADCRate::R24P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_24P5); - break; - case ADCRate::R47P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_47P5); - break; - case ADCRate::R92P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_92P5); - break; - case ADCRate::R247P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5); - break; - case ADCRate::R640P5: - val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_640P5); - break; + void init() + { + palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG); + + gptStart(gptd, &gpt_config); + adcStart(adcd, &adc_config); + adcSTM32EnableVREF(adcd); + } + + adcsample_t *read(adcsample_t *buffer, size_t count) + { + adc_is_read_finished = false; + adcStartConversion(adcd, &adc_group_config, buffer, count); + gptStartContinuous(gptd, 100); // 10kHz + while (!adc_is_read_finished); + return buffer; + } + + void set_rate(rate r) + { + uint32_t val = 0; + + switch (r) { + case rate::R2P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_2P5); + break; + case rate::R6P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_6P5); + break; + case rate::R12P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_12P5); + break; + case rate::R24P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_24P5); + break; + case rate::R47P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_47P5); + break; + case rate::R92P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_92P5); + break; + case rate::R247P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5); + break; + case rate::R640P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_640P5); + break; + } + + adc_group_config.smpr[0] = val; } - - adc_group_config.smpr[0] = val; } diff --git a/source/adc.hpp b/source/adc.hpp index 4c3836e..e026d0c 100644 --- a/source/adc.hpp +++ b/source/adc.hpp @@ -14,20 +14,23 @@ #include "hal.h" -enum class ADCRate { - R2P5, - R6P5, - R12P5, - R24P5, - R47P5, - R92P5, - R247P5, - R640P5 -}; - -void adc_init(); -adcsample_t *adc_read(adcsample_t *buffer, size_t count); -void adc_set_rate(ADCRate rate); +namespace adc +{ + enum class rate { + R2P5, + R6P5, + R12P5, + R24P5, + R47P5, + R92P5, + R247P5, + R640P5 + }; + + void init(); + adcsample_t *read(adcsample_t *buffer, size_t count); + void set_rate(rate r); +} #endif // STMDSP_ADC_HPP_ diff --git a/source/dac.cpp b/source/dac.cpp index d2bcf37..6096d8e 100644 --- a/source/dac.cpp +++ b/source/dac.cpp @@ -34,24 +34,27 @@ constexpr static const GPTConfig gpt_config = { .dier = 0 }; -void dac_init() +namespace dac { - palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG); - //palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); - - dacStart(dacd, &dac_config); - gptStart(gptd, &gpt_config); -} - -void dac_write_start(dacsample_t *buffer, size_t count) -{ - dacStartConversion(dacd, &dac_group_config, buffer, count); - gptStartContinuous(gptd, 1); -} - -void dac_write_stop() -{ - gptStopTimer(gptd); - dacStopConversion(dacd); + void init() + { + palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG); + //palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); + + dacStart(dacd, &dac_config); + gptStart(gptd, &gpt_config); + } + + void write_start(dacsample_t *buffer, size_t count) + { + dacStartConversion(dacd, &dac_group_config, buffer, count); + gptStartContinuous(gptd, 1); + } + + void write_stop() + { + gptStopTimer(gptd); + dacStopConversion(dacd); + } } diff --git a/source/dac.hpp b/source/dac.hpp index ce67f40..9d529bf 100644 --- a/source/dac.hpp +++ b/source/dac.hpp @@ -14,9 +14,12 @@ #include "hal.h" -void dac_init(); -void dac_write_start(dacsample_t *buffer, size_t count); -void dac_write_stop(); +namespace dac +{ + void init(); + void write_start(dacsample_t *buffer, size_t count); + void write_stop(); +} #endif // STMDSP_DAC_HPP_ diff --git a/source/main.cpp b/source/main.cpp index cfd20a9..b5ebf86 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -33,39 +33,39 @@ int main() palSetPadMode(GPIOA, 5, PAL_MODE_OUTPUT_PUSHPULL); // LED - adc_init(); - dac_init(); - usbserial_init(); + adc::init(); + dac::init(); + usbserial::init(); static unsigned int dac_sample_count = 2048; while (true) { - if (usbserial_is_active()) { + if (usbserial::is_active()) { // Expect to receive a byte command 'packet'. - if (char cmd[3]; usbserial_read(&cmd, 1) > 0) { + if (char cmd[3]; usbserial::read(&cmd, 1) > 0) { switch (cmd[0]) { case 'r': // Read in analog signal - if (usbserial_read(&cmd[1], 2) < 2) + if (usbserial::read(&cmd[1], 2) < 2) break; if (auto count = std::min(static_cast(cmd[1] | (cmd[2] << 8)), adc_samples.size()); count > 0) { - adc_read(&adc_samples[0], count); - usbserial_write(adc_samples.data(), count * sizeof(adcsample_t)); + adc::read(&adc_samples[0], count); + usbserial::write(adc_samples.data(), count * sizeof(adcsample_t)); } break; case 'W': - if (usbserial_read(&cmd[1], 2) < 2) + if (usbserial::read(&cmd[1], 2) < 2) break; if (auto count = std::min(static_cast(cmd[1] | (cmd[2] << 8)), dac_samples.size()); count > 0) dac_sample_count = count; else - dac_write_stop(); + dac::write_stop(); break; case 'w': - if (usbserial_read(&dac_samples[0], 2 * dac_sample_count) != 2 * dac_sample_count) + if (usbserial::read(&dac_samples[0], 2 * dac_sample_count) != 2 * dac_sample_count) break; - dac_write_start(&dac_samples[0], dac_sample_count); + dac::write_start(&dac_samples[0], dac_sample_count); break; case 'i': // Identify ourself as an stmdsp device - usbserial_write("stmdsp", 6); + usbserial::write("stmdsp", 6); break; default: break; diff --git a/source/usbserial.cpp b/source/usbserial.cpp index 5d605e6..ec2fc5d 100644 --- a/source/usbserial.cpp +++ b/source/usbserial.cpp @@ -15,35 +15,38 @@ constexpr static const auto sdud = &SDU1; -void usbserial_init() +namespace usbserial { - palSetPadMode(GPIOA, 11, PAL_MODE_ALTERNATE(10)); - palSetPadMode(GPIOA, 12, PAL_MODE_ALTERNATE(10)); - - sduObjectInit(sdud); - sduStart(sdud, &serusbcfg); - - // Reconnect bus so device can re-enumerate on reset - usbDisconnectBus(serusbcfg.usbp); - chThdSleepMilliseconds(1500); - usbStart(serusbcfg.usbp, &usbcfg); - usbConnectBus(serusbcfg.usbp); -} - -bool usbserial_is_active() -{ - return sdud->config->usbp->state == USB_ACTIVE; -} - -size_t usbserial_read(void *buffer, size_t count) -{ - auto bss = reinterpret_cast(sdud); - return streamRead(bss, static_cast(buffer), count); -} - -size_t usbserial_write(const void *buffer, size_t count) -{ - auto bss = reinterpret_cast(sdud); - return streamWrite(bss, static_cast(buffer), count); + void init() + { + palSetPadMode(GPIOA, 11, PAL_MODE_ALTERNATE(10)); + palSetPadMode(GPIOA, 12, PAL_MODE_ALTERNATE(10)); + + sduObjectInit(sdud); + sduStart(sdud, &serusbcfg); + + // Reconnect bus so device can re-enumerate on reset + usbDisconnectBus(serusbcfg.usbp); + chThdSleepMilliseconds(1500); + usbStart(serusbcfg.usbp, &usbcfg); + usbConnectBus(serusbcfg.usbp); + } + + bool is_active() + { + return sdud->config->usbp->state == USB_ACTIVE; + } + + size_t read(void *buffer, size_t count) + { + auto bss = reinterpret_cast(sdud); + return streamRead(bss, static_cast(buffer), count); + } + + size_t write(const void *buffer, size_t count) + { + auto bss = reinterpret_cast(sdud); + return streamWrite(bss, static_cast(buffer), count); + } } diff --git a/source/usbserial.hpp b/source/usbserial.hpp index 4b0eab2..4c33d51 100644 --- a/source/usbserial.hpp +++ b/source/usbserial.hpp @@ -14,10 +14,14 @@ #include "hal.h" -void usbserial_init(); -bool usbserial_is_active(); -size_t usbserial_read(void *buffer, size_t count); -size_t usbserial_write(const void *buffer, size_t count); +namespace usbserial +{ + void init(); + bool is_active(); + + size_t read(void *buffer, size_t count); + size_t write(const void *buffer, size_t count); +} #endif // STMDSP_USBSERIAL_HPP_