semf
spislavehardware.cpp
Go to the documentation of this file.
1
12
13namespace semf
14{
15void SpiSlaveHardware::write(const uint8_t data[], size_t dataSize)
16{
17 SEMF_INFO("data at %p , dataSize is %u", data, dataSize);
18 if (m_isBusy)
19 {
20 SEMF_ERROR("is busy");
21 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Write_IsBusy)));
22 return;
23 }
24 if (data == nullptr)
25 {
26 SEMF_ERROR("data is nullptr");
27 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Write_DataIsNullptr)));
28 return;
29 }
30 if (dataSize == 0)
31 {
32 SEMF_ERROR("dataSize is 0");
33 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Write_DataSizeIsZero)));
34 return;
35 }
36
37 m_isBusy = true;
38 writeHardware(data, dataSize);
39}
40
41void SpiSlaveHardware::read(uint8_t buffer[], size_t bufferSize)
42{
43 SEMF_INFO("buffer at %p, bufferSize is %u", buffer, bufferSize);
44 if (m_isBusy)
45 {
46 SEMF_ERROR("is busy");
47 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Read_IsBusy)));
48 return;
49 }
50 if (buffer == nullptr)
51 {
52 SEMF_ERROR("buffer is nullptr");
53 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Read_BufferIsNullptr)));
54 return;
55 }
56 if (bufferSize == 0)
57 {
58 SEMF_ERROR("bufferSize is 0");
59 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Read_BufferSizeIsZero)));
60 return;
61 }
62 m_isBusy = true;
63 readHardware(buffer, bufferSize);
64}
65
67{
68 return m_isBusy;
69}
70
72{
73 return m_isBusy;
74}
75
77{
78 if (!isBusyReading())
79 {
80 SEMF_ERROR("hardware does not read");
81 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::StopRead_IsNotReading)));
82 return;
83 }
85}
86
88{
89 if (!isBusyWriting())
90 {
91 SEMF_ERROR("hardware does not read");
92 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::StopWrite_IsNotWriting)));
93 return;
94 }
96}
97
99{
100 (void)frame;
101 SEMF_WARNING("not implemented");
102}
103
104void SpiSlaveHardware::writeRead(const uint8_t writeData[], uint8_t readBuffer[], size_t size)
105{
106 SEMF_INFO("writeData at %p, readBuffer at %p, size is %u", writeData, readBuffer, size);
107 if (m_isBusy)
108 {
109 SEMF_ERROR("is busy");
110 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_IsBusy)));
111 return;
112 }
113 if (writeData == nullptr)
114 {
115 SEMF_ERROR("write data is nullptr");
116 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_WriteDataIsNullptr)));
117 return;
118 }
119 if (readBuffer == nullptr)
120 {
121 SEMF_ERROR("read buffer is nullptr");
122 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_ReadBufferIsNullptr)));
123 return;
124 }
125 if (size == 0)
126 {
127 SEMF_ERROR("size is 0");
128 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteRead_SizeIsZero)));
129 return;
130 }
131
132 m_isBusy = true;
133 writeReadHardware(writeData, readBuffer, size);
134}
135
136void SpiSlaveHardware::setFormat(uint8_t bits, TransmissionMode transmission, WireMode wire)
137{
138 if (m_isBusy)
139 {
140 SEMF_ERROR("is busy");
141 error(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetFormat_IsBusy)));
142 return;
143 }
144
145 m_transmission = transmission;
146 m_wire = wire;
147
148 deinit();
149 setFormatHardware(bits, transmission, wire);
150 init();
151}
152
154{
155 SEMF_ERROR("error");
156 m_isBusy = false;
157 error(thrown);
158}
159
161{
162 SEMF_INFO("data available");
163 m_isBusy = false;
165}
166
168{
169 SEMF_INFO("data written");
170 m_isBusy = false;
171 dataWritten();
172}
173
175{
176 m_isBusy = busy;
177}
178
180{
181 m_wire = mode;
182}
183
185{
186 m_transmission = mode;
187}
188} /* namespace semf */
Class for representing errors. Every error should have a unique source code. As a user feel encourage...
Definition: error.h:22
WireMode
Definition: spi.h:37
TransmissionMode
Definition: spi.h:29
void setWireMode(WireMode mode)
Sets the wire mode.
void onError(Error thrown)
Error routine, emits the error signal.
void setFrame(Frame frame) override
Sets the selected usage of start and stop condition.
bool isBusyReading() const override
Communication hardware is busy reading at the moment.
void setFormat(uint8_t bits, TransmissionMode transmission, WireMode wire) override
Sets the format for the spi slave device.
virtual void readHardware(uint8_t buffer[], size_t bufferSize)=0
Accesses the spi hardware in order to read bufferSize bytes and stores them in buffer.
bool isBusyWriting() const override
Communication hardware is busy writing at the moment.
virtual void stopReadHardware()=0
void read(uint8_t buffer[], size_t bufferSize) override
For reading data, dataAvailable signal will be emitted after successful read.
virtual void stopWriteHardware()=0
virtual void writeReadHardware(const uint8_t writeData[], uint8_t readBuffer[], size_t size)=0
Accesses the spi hardware in order to perform a full duplex read/write.
void setBusy(bool busy)
Sets the flag m_isBusy.
void setTransmissionMode(TransmissionMode mode)
Sets the transmission mode.
virtual void writeHardware(const uint8_t data[], size_t dataSize)=0
Accesses the spi hardware in order to write dataSize bytes of data.
virtual void setFormatHardware(uint8_t bits, TransmissionMode transmission, WireMode wire)=0
Configures the hardware for insuring the given configuration.
void write(const uint8_t data[], size_t dataSize) override
For writing data, dataWritten signal will be emitted after successful write.
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...
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