semf
spimasterhardware.cpp
Go to the documentation of this file.
1
12#include <cstdint>
13
14namespace semf
15{
17: m_chipSelectPin(&chipSelectPin)
18{
19}
20
21void SpiMasterHardware::write(const uint8_t data[], size_t dataSize)
22{
23 SEMF_INFO("data %p, dataSize is %u", data, dataSize);
24 if (m_isBusy)
25 {
26 SEMF_ERROR("is busy");
27 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Write_IsBusy)));
28 return;
29 }
30 if (data == nullptr)
31 {
32 SEMF_ERROR("data is nullptr");
33 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Write_DataIsNullptr)));
34 return;
35 }
36 if (dataSize == 0)
37 {
38 SEMF_ERROR("size is 0");
39 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Write_DataSizeIsZero)));
40 return;
41 }
42 m_isBusy = true;
43
46
47 writeHardware(data, dataSize);
48}
49
50void SpiMasterHardware::read(uint8_t buffer[], size_t bufferSize)
51{
52 SEMF_INFO("buffer %p, bufferSize is %u", buffer, bufferSize);
53 if (m_isBusy)
54 {
55 SEMF_ERROR("is busy");
56 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Read_IsBusy)));
57 return;
58 }
59 if (buffer == nullptr && bufferSize != 0)
60 {
61 SEMF_ERROR("buffer is nullptr");
62 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Read_BufferIsNullptr)));
63 return;
64 }
65 if (bufferSize == 0)
66 {
67 SEMF_ERROR("bufferSize is 0");
68 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Read_BufferSizeIsZero)));
69 return;
70 }
71
72 m_isBusy = true;
73
76
77 readHardware(buffer, bufferSize);
78}
79
81{
82 return m_isBusy;
83}
84
86{
87 return m_isBusy;
88}
89
91{
92 m_frame = frame;
94 {
95 SEMF_INFO("frame mode: first");
96 }
97 else if (m_frame == CommunicationHardware::Frame::Next)
98 {
99 SEMF_INFO("frame mode: next");
100 }
101 else if (m_frame == CommunicationHardware::Frame::Last)
102 {
103 SEMF_INFO("frame mode: last");
104 }
105 else
106 {
107 SEMF_INFO("frame mode: first and last");
108 }
109}
110
112{
113 if (m_isBusy)
114 {
115 SEMF_ERROR("is busy");
116 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetFormat_IsBusy)));
117 return;
118 }
119
120 m_transmission = transmission;
121 m_wire = wire;
122
123 deinit();
124 setFormatHardware(bits, transmission, wire);
125 init();
126}
127
129{
130 if (m_wire == WireMode::ReadOnlyWires)
131 {
132 SEMF_ERROR("is configured as read only");
133 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::StopWrite_IsReadOnly)));
134 return;
135 }
136 if (!isBusyWriting())
137 {
138 SEMF_WARNING("hardware is not writing");
139 return;
140 }
141
143}
144
146{
147 if (m_wire == WireMode::WriteOnlyWires)
148 {
149 SEMF_ERROR("is configured as write only");
150 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::StopRead_IsWriteOnly)));
151 return;
152 }
153 if (!isBusyReading())
154 {
155 SEMF_WARNING("hardware is not writing");
156 return;
157 }
158
160}
161
162void SpiMasterHardware::writeRead(const uint8_t writeData[], uint8_t readBuffer[], size_t size)
163{
164 SEMF_INFO("write data %p, read data %p, size is %u", writeData, readBuffer, size);
165 if (m_isBusy)
166 {
167 SEMF_ERROR("is busy");
168 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_IsBusy)));
169 return;
170 }
171 if (writeData == nullptr)
172 {
173 SEMF_ERROR("write data is nullptr");
174 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_WriteDataIsNullptr)));
175 return;
176 }
177 if (readBuffer == nullptr)
178 {
179 SEMF_ERROR("read buffer is nullptr");
180 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_ReadBufferIsNullptr)));
181 return;
182 }
183 if (size == 0)
184 {
185 SEMF_ERROR("size is 0");
186 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_SizeIsZero)));
187 return;
188 }
189
190 m_isBusy = true;
191
194
195 writeReadHardware(writeData, readBuffer, size);
196}
197
199{
200 SEMF_INFO("set chip select pin");
201 if (m_isBusy)
202 {
203 SEMF_ERROR("set chip select pin, is busy");
204 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetChipSelectPin_IsBusy)));
205 return;
206 }
207 m_chipSelectPin = &chipSelectPin;
208}
209
211{
212 if (m_chipSelectPin != nullptr)
213 {
214 SEMF_INFO("enable chip select pin");
215 m_chipSelectPin->reset();
216 }
217}
218
220{
221 if (m_chipSelectPin != nullptr)
222 {
223 SEMF_INFO("disable chip select pin");
224 m_chipSelectPin->set();
225 }
226}
227
229{
230 m_isBusy = isBusy;
231}
232
234{
235 return m_frame;
236}
237
239{
240 m_isBusy = false;
241 SEMF_INFO("data written");
242 dataWritten();
243}
244
246{
247 m_isBusy = false;
248 SEMF_INFO("data available");
250}
251
253{
254 m_isBusy = false;
255 SEMF_ERROR("error");
257 error(thrown);
258}
259
261{
262 m_transmission = mode;
263}
264
266{
267 m_wire = mode;
268}
269} /* namespace semf */
@ FirstAndLast
start AND stop condition
@ Next
no start AND no stop condition
@ First
start condition, but no stop condition
Class for representing errors. Every error should have a unique source code. As a user feel encourage...
Definition: error.h:22
Interface class for using a GPIO pin of the microcontroller.
Definition: gpio.h:23
virtual void set()=0
virtual void reset()=0
WireMode
Definition: spi.h:37
@ WriteOnlyWires
CLK and MOSI pins used (no master receive)
@ ReadOnlyWires
CLK and MISO pins used (no master write)
TransmissionMode
Definition: spi.h:29
void setWireMode(WireMode mode)
Sets the wire mode.
void setTransmissionMode(TransmissionMode mode)
Sets the transmission mode.
void onError(Error thrown)
Is called if an error occurred by hardware read or write access. Will throw error signal.
CommunicationHardware::Frame frame() const
Returns the actual frame mode setting.
void setFrame(CommunicationHardware::Frame frame) override
Sets the selected usage of start and stop condition.
virtual void stopWriteHardware()=0
bool isBusyWriting() const override
Communication hardware is busy writing at the moment.
virtual void writeHardware(const uint8_t data[], size_t dataSize)=0
Hardware will write data.
virtual void readHardware(uint8_t buffer[], size_t bufferSize)=0
Hardware will read data.
void setBusy(bool isBusy)
Sets the busy flag.
void writeRead(const uint8_t writeData[], uint8_t readBuffer[], size_t size) override
For writing and reading data parallel through the communication hardware 1) For interrupt or one shot...
bool isBusyReading() const override
Communication hardware is busy reading at the moment.
void write(const uint8_t data[], size_t dataSize) override
For writing data, dataWritten signal will be emitted after successful write.
virtual void writeReadHardware(const uint8_t writeData[], uint8_t readBuffer[], size_t size)=0
Hardware will read and write data parallel.
virtual void setFormatHardware(uint8_t bits, TransmissionMode transmission, WireMode wire)=0
Configures the hardware for insuring the given configuration.
virtual void stopReadHardware()=0
void setFormat(uint8_t bits, TransmissionMode transmission, WireMode wire) override
Sets the format for the spi slave device.
void read(uint8_t buffer[], size_t bufferSize) override
For reading data, dataAvailable signal will be emitted after successful read.
virtual void setChipSelectPin(Gpio &chipSelectPin)
Sets a new chip select pin read and write operations.
Signal< Error > error
Definition: communication.h:64
#define SEMF_ERROR(...)
Definition: debug.h:39
#define SEMF_WARNING(...)
Definition: debug.h:40
#define SEMF_INFO(...)
Definition: debug.h:41