eurorack/stereo_mix/drivers/adc.h

61 lines
1 KiB
C
Raw Permalink Normal View History

#pragma once
#include "stmlib/stmlib.h"
2020-04-10 18:21:18 +00:00
#include <stm32f0xx_hal.h>
namespace stereo_mix {
enum AdcChannel {
2020-04-23 18:29:30 +00:00
ADC_CHANNEL_VOL_1,
ADC_CHANNEL_VOL_2,
ADC_CHANNEL_VOL_3,
ADC_CHANNEL_VOL_4,
ADC_CHANNEL_PAN_1,
ADC_CHANNEL_PAN_2,
ADC_CHANNEL_PAN_3,
ADC_CHANNEL_PAN_4,
2020-04-10 18:21:18 +00:00
ADC_CHANNEL_MUX,
ADC_CHANNEL_LAST,
2020-04-12 07:13:52 +00:00
ADC_CHANNEL_COUNT = (ADC_CHANNEL_LAST * 2) - 1
};
enum AdcGroup {
ADC_GROUP_CV = 0,
ADC_GROUP_POT = ADC_CHANNEL_LAST,
ADC_GROUP_COUNT
};
class Adc {
public:
2020-04-13 13:39:01 +00:00
Adc();
~Adc();
2020-04-10 18:21:18 +00:00
void OnDMATransferComplete();
inline const uint16_t* values() { return &values_[0]; }
inline int16_t cv_value(AdcChannel channel)
{
return -(this->values_[ADC_GROUP_CV + channel] - 32768);
}
inline uint16_t value(int32_t channel) const
{
return static_cast<uint16_t>(values_[channel]);
}
inline float float_value(int32_t index) const
{
return static_cast<float>(values_[index]) / 65536.0f;
}
private:
2020-04-12 07:13:52 +00:00
uint16_t values_[ADC_CHANNEL_COUNT];
uint8_t mux_index_;
DISALLOW_COPY_AND_ASSIGN(Adc);
};
} // namespace stereo_mix