semf
stm32analogout.cpp
Go to the documentation of this file.
1
11
12#if defined(STM32) && defined(HAL_DAC_MODULE_ENABLED)
13namespace semf
14{
15Stm32AnalogOut::Stm32AnalogOut(DAC_HandleTypeDef& hwHandle, uint32_t channel, Alignment alignment)
16: m_hwHandle(hwHandle),
17 m_channel(channel),
18 m_alignment(alignment)
19{
20 queue()->push(*this);
21}
22
24{
25 SEMF_INFO("start");
26 HAL_StatusTypeDef state = HAL_DAC_Start(&m_hwHandle, m_channel);
27 if (state != HAL_OK)
28 {
29 if (state == HAL_ERROR)
30 {
31 SEMF_ERROR("start hal error");
32 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalError)));
33 }
34 else if (state == HAL_BUSY)
35 {
36 SEMF_ERROR("start hal busy");
37 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalBusy)));
38 }
39 else if (state == HAL_TIMEOUT)
40 {
41 SEMF_ERROR("start hal timeout");
42 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalTimeout)));
43 }
44 return;
45 }
46}
47
49{
50 SEMF_INFO("stop");
51 HAL_StatusTypeDef state = HAL_DAC_Stop(&m_hwHandle, m_channel);
52 if (state != HAL_OK)
53 {
54 if (state == HAL_ERROR)
55 {
56 SEMF_ERROR("stop hal error");
57 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Stop_HalError)));
58 }
59 else if (state == HAL_BUSY)
60 {
61 SEMF_ERROR("stop hal busy");
62 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Stop_HalBusy)));
63 }
64 else if (state == HAL_TIMEOUT)
65 {
66 SEMF_ERROR("stop hal timeout");
67 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Stop_HalTimeout)));
68 }
69 return;
70 }
71}
72
73void Stm32AnalogOut::setValue(uint32_t value)
74{
75 SEMF_INFO("set value on channel %u to %u", m_channel, value);
76 HAL_StatusTypeDef state = HAL_DAC_SetValue(&m_hwHandle, m_channel, alignment(m_alignment), value);
77 if (state != HAL_OK)
78 {
79 if (state == HAL_ERROR)
80 {
81 SEMF_ERROR("set hal error");
82 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetValue_HalError)));
83 }
84 else if (state == HAL_BUSY)
85 {
86 SEMF_ERROR("set hal busy");
87 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetValue_HalBusy)));
88 }
89 else if (state == HAL_TIMEOUT)
90 {
91 SEMF_ERROR("set hal timeout");
92 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetValue_HalTimeout)));
93 }
94 return;
95 }
96}
97
99{
101 return &queue;
102}
103
104void Stm32AnalogOut::systemIsrError(DAC_HandleTypeDef& dac)
105{
106 for (Stm32AnalogOut& i : *(queue()))
107 i.isrError(dac);
108}
109
110void Stm32AnalogOut::isrError(DAC_HandleTypeDef& dac)
111{
112 if (&dac == &m_hwHandle)
113 {
114 SEMF_ERROR("error");
115 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrError_Isr)));
116 }
117}
118
119uint32_t Stm32AnalogOut::alignment(Alignment setting) const
120{
121 switch (setting)
122 {
124 return DAC_ALIGN_8B_R;
125 break;
127 return DAC_ALIGN_12B_L;
128 break;
130 return DAC_ALIGN_12B_R;
131 break;
132 default:
133 SEMF_ERROR("invalid alignment setting %u", static_cast<uint8_t>(setting));
134 return 0;
135 }
136}
137} /* namespace semf */
138#endif /* STM32 & HAL_DAC_MODULE_ENABLED */
Signal< Error > error
Definition: analogout.h:43
Class for representing errors. Every error should have a unique source code. As a user feel encourage...
Definition: error.h:22
LinkedQueue is an managed single linked queue implementation.
Definition: linkedqueue.h:38
void isrError(DAC_HandleTypeDef &dac)
Sending a error signal.
static LinkedQueue< Stm32AnalogOut > * queue()
Get the list with all analog outs.
static void systemIsrError(DAC_HandleTypeDef &dac)
System-wide interrupt service routine for dac error.
void setValue(uint32_t value) override
Writes value into hardware register. Call start to output the value.
void start() const override
Starts the hardware module (DAC) for writing DAC values to the output. Call setValue before.
Stm32AnalogOut(DAC_HandleTypeDef &hwHandle, uint32_t channel, Alignment alignment)
Constructor.
void stop() const override
#define SEMF_ERROR(...)
Definition: debug.h:39
#define SEMF_INFO(...)
Definition: debug.h:41