knx
ETS configurable knx-stack
arduino_platform.cpp
Go to the documentation of this file.
1 #ifdef ARDUINO
2 
3 #include "arduino_platform.h"
4 #include "knx/bits.h"
5 
6 #include <Arduino.h>
7 #ifndef KNX_NO_SPI
8  #include <SPI.h>
9 #endif
10 
11 #ifndef KNX_NO_PRINT
12  Stream* ArduinoPlatform::SerialDebug = &KNX_DEBUG_SERIAL;
13 #endif
14 
15 ArduinoPlatform::ArduinoPlatform() : _knxSerial(nullptr)
16 {
17 }
18 
19 ArduinoPlatform::ArduinoPlatform(HardwareSerial* knxSerial) : _knxSerial(knxSerial)
20 {
21 }
22 
24 {
25  while (true)
26  {
27 #ifdef KNX_LED
28  static const long LED_BLINK_PERIOD = 200;
29 
30  if ((millis() % LED_BLINK_PERIOD) > (LED_BLINK_PERIOD / 2))
31  digitalWrite(KNX_LED, HIGH);
32  else
33  digitalWrite(KNX_LED, LOW);
34 
35 #endif
36  }
37 }
38 
39 void ArduinoPlatform::knxUart( HardwareSerial* serial )
40 {
41  if (_knxSerial)
42  closeUart();
43 
44  _knxSerial = serial;
45  setupUart();
46 }
47 
48 HardwareSerial* ArduinoPlatform::knxUart()
49 {
50  return _knxSerial;
51 }
52 
54 {
55  _knxSerial->begin(19200, SERIAL_8E1);
56 
57  while (!_knxSerial)
58  ;
59 }
60 
61 
63 {
64  _knxSerial->end();
65 }
66 
67 
69 {
70  return _knxSerial->available();
71 }
72 
73 
74 size_t ArduinoPlatform::writeUart(const uint8_t data)
75 {
76  //printHex("<p", &data, 1);
77  return _knxSerial->write(data);
78 }
79 
80 
81 size_t ArduinoPlatform::writeUart(const uint8_t* buffer, size_t size)
82 {
83  //printHex("<p", buffer, size);
84  return _knxSerial->write(buffer, size);
85 }
86 
87 
89 {
90  int val = _knxSerial->read();
91  //if(val > 0)
92  // printHex("p>", (uint8_t*)&val, 1);
93  return val;
94 }
95 
96 
97 size_t ArduinoPlatform::readBytesUart(uint8_t* buffer, size_t length)
98 {
99  size_t toRead = length;
100  uint8_t* pos = buffer;
101 
102  while (toRead > 0)
103  {
104  size_t val = _knxSerial->readBytes(pos, toRead);
105  pos += val;
106  toRead -= val;
107  }
108 
109  //printHex("p>", buffer, length);
110  return length;
111 }
112 
114 {
115  return _knxSerial->flush();
116 }
117 
118 #ifndef KNX_NO_SPI
120 {
121  SPI.begin();
122  SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0));
123 }
124 
126 {
127  SPI.endTransaction();
128  SPI.end();
129 }
130 
131 int ArduinoPlatform::readWriteSpi(uint8_t* data, size_t len)
132 {
133  SPI.transfer(data, len);
134  return 0;
135 }
136 #endif
137 
138 #ifndef KNX_NO_PRINT
139 void printUint64(uint64_t value, int base = DEC)
140 {
141  char buf[8 * sizeof(uint64_t) + 1];
142  char* str = &buf[sizeof(buf) - 1];
143  *str = '\0';
144 
145  uint64_t n = value;
146 
147  do
148  {
149  char c = n % base;
150  n /= base;
151 
152  *--str = c < 10 ? c + '0' : c + 'A' - 10;
153  } while (n > 0);
154 
155  print(str);
156 }
157 
158 void print(const char* s)
159 {
161 }
162 void print(char c)
163 {
165 }
166 
167 void print(unsigned char num)
168 {
169  ArduinoPlatform::SerialDebug->print(num);
170 }
171 
172 void print(unsigned char num, int base)
173 {
174  ArduinoPlatform::SerialDebug->print(num, base);
175 }
176 
177 void print(int num)
178 {
179  ArduinoPlatform::SerialDebug->print(num);
180 }
181 
182 void print(int num, int base)
183 {
184  ArduinoPlatform::SerialDebug->print(num, base);
185 }
186 
187 void print(unsigned int num)
188 {
189  ArduinoPlatform::SerialDebug->print(num);
190 }
191 
192 void print(unsigned int num, int base)
193 {
194  ArduinoPlatform::SerialDebug->print(num, base);
195 }
196 
197 void print(long num)
198 {
199  ArduinoPlatform::SerialDebug->print(num);
200 }
201 
202 void print(long num, int base)
203 {
204  ArduinoPlatform::SerialDebug->print(num, base);
205 }
206 
207 void print(unsigned long num)
208 {
209  ArduinoPlatform::SerialDebug->print(num);
210 }
211 
212 void print(unsigned long num, int base)
213 {
214  ArduinoPlatform::SerialDebug->print(num, base);
215 }
216 
217 void print(unsigned long long num)
218 {
219  printUint64(num);
220 }
221 
222 void print(unsigned long long num, int base)
223 {
224  printUint64(num, base);
225 }
226 
227 void print(double num)
228 {
229  ArduinoPlatform::SerialDebug->print(num);
230 }
231 
232 void println(const char* s)
233 {
234  ArduinoPlatform::SerialDebug->println(s);
235 }
236 
237 void println(char c)
238 {
239  ArduinoPlatform::SerialDebug->println(c);
240 }
241 
242 void println(unsigned char num)
243 {
244  ArduinoPlatform::SerialDebug->println(num);
245 }
246 
247 void println(unsigned char num, int base)
248 {
249  ArduinoPlatform::SerialDebug->println(num, base);
250 }
251 
252 void println(int num)
253 {
254  ArduinoPlatform::SerialDebug->println(num);
255 }
256 
257 void println(int num, int base)
258 {
259  ArduinoPlatform::SerialDebug->println(num, base);
260 }
261 
262 void println(unsigned int num)
263 {
264  ArduinoPlatform::SerialDebug->println(num);
265 }
266 
267 void println(unsigned int num, int base)
268 {
269  ArduinoPlatform::SerialDebug->println(num, base);
270 }
271 
272 void println(long num)
273 {
274  ArduinoPlatform::SerialDebug->println(num);
275 }
276 
277 void println(long num, int base)
278 {
279  ArduinoPlatform::SerialDebug->println(num, base);
280 }
281 
282 void println(unsigned long num)
283 {
284  ArduinoPlatform::SerialDebug->println(num);
285 }
286 
287 void println(unsigned long num, int base)
288 {
289  ArduinoPlatform::SerialDebug->println(num, base);
290 }
291 
292 void println(unsigned long long num)
293 {
294  printUint64(num);
295  println("");
296 }
297 
298 void println(unsigned long long num, int base)
299 {
300  printUint64(num, base);
301  println("");
302 }
303 
304 void println(double num)
305 {
306  ArduinoPlatform::SerialDebug->println(num);
307 }
308 
309 void println(void)
310 {
311  ArduinoPlatform::SerialDebug->println();
312 }
313 #endif // KNX_NO_PRINT
314 
315 #endif // ARDUINO
void printUint64(uint64_t value, int base=DEC)
void print(const char *s)
void println(const char *s)
void digitalWrite(unsigned long pin, unsigned long value)
uint32_t millis()
void closeSpi() override
HardwareSerial * _knxSerial
static Stream * SerialDebug
void setupSpi() override
virtual int uartAvailable()
virtual size_t readBytesUart(uint8_t *buffer, size_t length)
virtual void closeUart()
int readWriteSpi(uint8_t *data, size_t len) override
virtual HardwareSerial * knxUart()
virtual int readUart()
virtual size_t writeUart(const uint8_t data)
virtual void flushUart()
virtual void setupUart()