1717
1818namespace {
1919
20+ inline float adc_sensor_template_output_0 = 0 .0f ;
21+ inline float adc_sensor_template_output_1 = 0 .0f ;
22+
2023constexpr std::array<ST_LIB::DMADomain::Entry, 2 > adc_dma_entries{{
2124 {.instance = ST_LIB::DMADomain::Peripheral::adc1,
2225 .stream = ST_LIB::DMADomain::Stream::dma1_stream0,
@@ -31,6 +34,45 @@ constexpr std::array<ST_LIB::DMADomain::Entry, 2> adc_dma_entries{{
3134constexpr auto adc_dma_cfg =
3235 ST_LIB::DMADomain::build<2 >(std::span<const ST_LIB::DMADomain::Entry, 2 >{adc_dma_entries});
3336
37+ constexpr std::array<ST_LIB::ADCDomain::Config, 1 > single_adc1_init_cfgs{{
38+ {.gpio_idx = 0 ,
39+ .peripheral = ST_LIB::ADCDomain::Peripheral::ADC_1,
40+ .channel = ST_LIB::ADCDomain::Channel::CH16,
41+ .resolution = ST_LIB::ADCDomain::Resolution::BITS_12,
42+ .sample_time = ST_LIB::ADCDomain::SampleTime::CYCLES_8_5,
43+ .prescaler = ST_LIB::ADCDomain::ClockPrescaler::DIV1,
44+ .sample_rate_hz = 0 ,
45+ .dma_request = DMA_REQUEST_ADC1,
46+ .output = &adc_sensor_template_output_0},
47+ }};
48+
49+ constexpr std::array<ST_LIB::ADCDomain::Config, 2 > split_adc12_init_cfgs{{
50+ {.gpio_idx = 0 ,
51+ .peripheral = ST_LIB::ADCDomain::Peripheral::ADC_1,
52+ .channel = ST_LIB::ADCDomain::Channel::CH16,
53+ .resolution = ST_LIB::ADCDomain::Resolution::BITS_12,
54+ .sample_time = ST_LIB::ADCDomain::SampleTime::CYCLES_8_5,
55+ .prescaler = ST_LIB::ADCDomain::ClockPrescaler::DIV1,
56+ .sample_rate_hz = 0 ,
57+ .dma_request = DMA_REQUEST_ADC1,
58+ .output = &adc_sensor_template_output_0},
59+ {.gpio_idx = 1 ,
60+ .peripheral = ST_LIB::ADCDomain::Peripheral::ADC_2,
61+ .channel = ST_LIB::ADCDomain::Channel::CH2,
62+ .resolution = ST_LIB::ADCDomain::Resolution::BITS_16,
63+ .sample_time = ST_LIB::ADCDomain::SampleTime::CYCLES_8_5,
64+ .prescaler = ST_LIB::ADCDomain::ClockPrescaler::DIV1,
65+ .sample_rate_hz = 0 ,
66+ .dma_request = DMA_REQUEST_ADC2,
67+ .output = &adc_sensor_template_output_1},
68+ }};
69+
70+ template <std::size_t N, const std::array<ST_LIB::ADCDomain::Config, N>& Cfgs>
71+ using ADCInit = ST_LIB::ADCDomain::Init<N, Cfgs>;
72+
73+ using SingleADCInit = ADCInit<1 , single_adc1_init_cfgs>;
74+ using SplitADCInit = ADCInit<2 , split_adc12_init_cfgs>;
75+
3476void clear_nvic_enables () {
3577 for (auto & reg : NVIC->ISER ) {
3678 reg = 0U ;
@@ -52,10 +94,10 @@ class ADCSensorTest : public ::testing::Test {
5294 clear_dma_irq_table ();
5395 }
5496
55- template <std::size_t N>
97+ template <std::size_t N, const std::array<ST_LIB::ADCDomain::Config, N>& InitCfgs >
5698 void init_adc_with_dma (const std::array<ST_LIB::ADCDomain::Config, N>& cfgs) {
5799 ST_LIB::DMADomain::Init<2 >::init (adc_dma_cfg);
58- ST_LIB::ADCDomain::Init<N >::init (
100+ ADCInit<N, InitCfgs >::init (
59101 cfgs,
60102 std::span<ST_LIB::GPIODomain::Instance>{},
61103 std::span<ST_LIB::DMADomain::Instance>(ST_LIB::DMADomain::Init<2 >::instances)
@@ -77,10 +119,10 @@ TEST_F(ADCSensorTest, LinearSensorUsesNormalizedADCVoltageForItsTransferFunction
77119 .output = &output},
78120 }};
79121
80- init_adc_with_dma (cfgs);
122+ init_adc_with_dma< 1 , single_adc1_init_cfgs> (cfgs);
81123 ST_LIB::MockedHAL::adc_set_channel_raw (ADC1, ADC_CHANNEL_16, 512U );
82124
83- LinearSensor<float > sensor (ST_LIB::ADCDomain::Init< 1 > ::instances[0 ], 2 .0f , -1 .0f , output, 5 .0f );
125+ LinearSensor<float > sensor (SingleADCInit ::instances[0 ], 2 .0f , -1 .0f , output, 5 .0f );
84126 sensor.read ();
85127
86128 EXPECT_NEAR (output, 2 .0f * ((512 .0f / 1023 .0f ) * 5 .0f ) - 1 .0f , 0 .001f );
@@ -100,12 +142,11 @@ TEST_F(ADCSensorTest, FilteredLinearSensorReusesTheSameADCConversionPath) {
100142 .output = &output},
101143 }};
102144
103- init_adc_with_dma (cfgs);
145+ init_adc_with_dma< 1 , single_adc1_init_cfgs> (cfgs);
104146 ST_LIB::MockedHAL::adc_set_channel_raw (ADC1, ADC_CHANNEL_16, 2048U );
105147
106148 MovingAverage<1 > filter;
107- FilteredLinearSensor<float , 1 >
108- sensor (ST_LIB::ADCDomain::Init<1 >::instances[0 ], 2 .0f , 1 .0f , output, filter);
149+ FilteredLinearSensor<float , 1 > sensor (SingleADCInit::instances[0 ], 2 .0f , 1 .0f , output, filter);
109150
110151 sensor.read ();
111152 sensor.read ();
@@ -138,15 +179,10 @@ TEST_F(ADCSensorTest, LookupSensorMapsEquivalentNormalizedReadingsAcrossResoluti
138179 .output = nullptr },
139180 }};
140181
141- init_adc_with_dma (cfgs);
182+ init_adc_with_dma< 2 , split_adc12_init_cfgs> (cfgs);
142183
143- LookupSensor span_sensor (
144- ST_LIB::ADCDomain::Init<2 >::instances[0 ],
145- std::span<const double >(table),
146- out12
147- );
148- LookupSensor
149- ptr_sensor (ST_LIB::ADCDomain::Init<2 >::instances[1 ], table.data (), table.size (), out16);
184+ LookupSensor span_sensor (SplitADCInit::instances[0 ], std::span<const double >(table), out12);
185+ LookupSensor ptr_sensor (SplitADCInit::instances[1 ], table.data (), table.size (), out16);
150186
151187 ST_LIB::MockedHAL::adc_set_channel_raw (ADC1, ADC_CHANNEL_16, 2048U );
152188 ST_LIB::MockedHAL::adc_set_channel_raw (ADC2, ADC_CHANNEL_2, 32768U );
@@ -180,12 +216,12 @@ TEST_F(ADCSensorTest, PT100ReadsFromADCVoltageAndSupportsFilteredMode) {
180216 .output = &direct_output},
181217 }};
182218
183- init_adc_with_dma (cfgs);
219+ init_adc_with_dma< 1 , single_adc1_init_cfgs> (cfgs);
184220 ST_LIB::MockedHAL::adc_set_channel_raw (ADC1, ADC_CHANNEL_16, 2048U );
185221
186- PT100<1 > direct_sensor (ST_LIB::ADCDomain::Init< 1 > ::instances[0 ], direct_output);
222+ PT100<1 > direct_sensor (SingleADCInit ::instances[0 ], direct_output);
187223 MovingAverage<1 > filter;
188- PT100<1 > filtered_sensor (ST_LIB::ADCDomain::Init< 1 > ::instances[0 ], filtered_output, filter);
224+ PT100<1 > filtered_sensor (SingleADCInit ::instances[0 ], filtered_output, filter);
189225
190226 direct_sensor.read ();
191227 filtered_sensor.read ();
@@ -222,10 +258,10 @@ TEST_F(ADCSensorTest, NTCUsesNormalizedADCCountsAcrossResolutions) {
222258 .output = nullptr },
223259 }};
224260
225- init_adc_with_dma (cfgs);
261+ init_adc_with_dma< 2 , split_adc12_init_cfgs> (cfgs);
226262
227- NTC ntc12 (ST_LIB::ADCDomain::Init< 2 > ::instances[0 ], out12);
228- NTC ntc16 (ST_LIB::ADCDomain::Init< 2 > ::instances[1 ], out16);
263+ NTC ntc12 (SplitADCInit ::instances[0 ], out12);
264+ NTC ntc16 (SplitADCInit ::instances[1 ], out16);
229265
230266 ST_LIB::MockedHAL::adc_set_channel_raw (ADC1, ADC_CHANNEL_16, 2047U );
231267 ST_LIB::MockedHAL::adc_set_channel_raw (ADC2, ADC_CHANNEL_2, 32767U );
0 commit comments