knx
ETS configurable knx-stack
application_layer.cpp
Go to the documentation of this file.
1 #include "application_layer.h"
2 #include "transport_layer.h"
3 #include "cemi_frame.h"
5 #include "apdu.h"
6 #include "bau.h"
7 #include "string.h"
8 #include "bits.h"
9 #include <stdio.h>
10 
12 
14 {
15 }
16 
18 {
19  _transportLayer = &layer;
20 }
21 
23 {
24  _assocTable = &assocTable;
25 }
26 
27 #pragma region TL Callbacks
28 
29 void ApplicationLayer::dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu)
30 {
31  dataGroupIndication(hopType, priority, tsap, apdu, noSecurity);
32 }
33 
34 void ApplicationLayer::dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl)
35 {
36  if (_assocTable == nullptr)
37  return;
38 
39  uint8_t len = apdu.length();
40  uint8_t dataArray[len];
41  uint8_t* data = dataArray;
42  memcpy(data, apdu.data(), len);
43 
44  if (len == 1)
45  {
46  //less than six bit are encoded in first byte
47  *data &= 0x3f;
48  }
49  else
50  {
51  data += 1;
52  len -= 1;
53  }
54 
55  uint16_t startIdx = 0;
56  int32_t asap = _assocTable->nextAsap(tsap, startIdx);
57 
58  for (; asap != -1; asap = _assocTable->nextAsap(tsap, startIdx))
59  {
60  switch (apdu.type())
61  {
62  case GroupValueRead:
63  _bau.groupValueReadIndication(asap, priority, hopType, secCtrl);
64  break;
65 
66  case GroupValueResponse:
67  _bau.groupValueReadAppLayerConfirm(asap, priority, hopType, secCtrl, data, len);
68  break;
69 
70  case GroupValueWrite:
71  _bau.groupValueWriteIndication(asap, priority, hopType, secCtrl, data, len);
72 
73  default:
74  /* other apdutypes are not valid here. If they appear do nothing */
75  break;
76  }
77  }
78 }
79 
80 void ApplicationLayer::dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, bool status)
81 {
82  dataGroupConfirm(ack, hopType, priority, tsap, apdu, noSecurity, status);
83 }
84 
85 void ApplicationLayer::dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl, bool status)
86 {
87  switch (apdu.type())
88  {
89  case GroupValueRead:
90  if (_savedAsapReadRequest > 0)
91  _bau.groupValueReadLocalConfirm(ack, _savedAsapReadRequest, priority, hopType, secCtrl, status);
92 
93  _savedAsapReadRequest = 0;
94  break;
95 
96  case GroupValueResponse:
97  if (_savedAsapResponse > 0)
98  _bau.groupValueReadResponseConfirm(ack, _savedAsapResponse, priority, hopType, secCtrl, apdu.data(), apdu.length() - 1, status);
99 
100  _savedAsapResponse = 0;
101  break;
102 
103  case GroupValueWrite:
104  if (_savedAsapWriteRequest > 0)
105  _bau.groupValueWriteLocalConfirm(ack, _savedAsapWriteRequest, priority, hopType, secCtrl, apdu.data(), apdu.length() - 1, status);
106 
107  _savedAsapWriteRequest = 0;
108  break;
109 
110  default:
111  print("datagroup-confirm: unhandled APDU-Type: ");
112  println(apdu.type());
113  }
114 }
115 
116 void ApplicationLayer::dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu)
117 {
118  dataBroadcastIndication(hopType, priority, source, apdu, noSecurity);
119 }
120 
121 void ApplicationLayer::dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu, const SecurityControl& secCtrl)
122 {
123  uint8_t* data = apdu.data();
124 
125  switch (apdu.type())
126  {
128  {
129  uint16_t newAddress;
130  popWord(newAddress, data + 1);
131  _bau.individualAddressWriteIndication(hopType, secCtrl, newAddress);
132  break;
133  }
134 
136  _bau.individualAddressReadIndication(hopType, secCtrl);
137  break;
138 
140  _bau.individualAddressReadAppLayerConfirm(hopType, secCtrl, apdu.frame().sourceAddress());
141  break;
142 
144  {
145  uint8_t* knxSerialNumber = &data[1];
146  _bau.individualAddressSerialNumberReadIndication(priority, hopType, secCtrl, knxSerialNumber);
147  break;
148  }
149 
151  {
152  uint16_t domainAddress;
153  popWord(domainAddress, data + 7);
154  _bau.individualAddressSerialNumberReadAppLayerConfirm(hopType, secCtrl, data + 1, apdu.frame().sourceAddress(),
155  domainAddress);
156  break;
157  }
158 
160  {
161  uint8_t* knxSerialNumber = &data[1];
162  uint16_t newIndividualAddress;
163  popWord(newIndividualAddress, &data[7]);
164  _bau.individualAddressSerialNumberWriteIndication(priority, hopType, secCtrl, newIndividualAddress, knxSerialNumber);
165  break;
166  }
167 
168  default:
169  print("Broadcast-indication: unhandled APDU-Type: ");
170  println(apdu.type());
171  break;
172  }
173 }
174 
175 void ApplicationLayer::dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, APDU& apdu, bool status)
176 {
177  dataBroadcastConfirm(ack, hopType, priority, apdu, noSecurity, status);
178 }
179 
180 void ApplicationLayer::dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, APDU& apdu, const SecurityControl& secCtrl, bool status)
181 {
182  uint8_t* data = apdu.data();
183 
184  switch (apdu.type())
185  {
187  {
188  uint16_t newAddress;
189  popWord(newAddress, data + 1);
190  _bau.individualAddressWriteLocalConfirm(ack, hopType, secCtrl, newAddress, status);
191  break;
192  }
193 
195  _bau.individualAddressReadLocalConfirm(ack, hopType, secCtrl, status);
196  break;
197 
199  _bau.individualAddressReadResponseConfirm(ack, hopType, secCtrl, status);
200  break;
201 
203  _bau.individualAddressSerialNumberReadLocalConfirm(ack, hopType, secCtrl, data + 1, status);
204  break;
205 
207  {
208  uint16_t domainAddress;
209  popWord(domainAddress, data + 7);
210  _bau.individualAddressSerialNumberReadResponseConfirm(ack, hopType, secCtrl, data + 1, domainAddress, status);
211  break;
212  }
213 
215  {
216  uint16_t newAddress;
217  popWord(newAddress, data + 7);
218  _bau.individualAddressSerialNumberWriteLocalConfirm(ack, hopType, secCtrl, data + 1, newAddress, status);
219  break;
220  }
221 
222  default:
223  print("Broadcast-confirm: unhandled APDU-Type: ");
224  println(apdu.type());
225  break;
226  }
227 }
228 
229 void ApplicationLayer::dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu)
230 {
231  dataSystemBroadcastIndication(hopType, priority, source, apdu, noSecurity);
232 }
233 
234 void ApplicationLayer::dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu, const SecurityControl& secCtrl)
235 {
236  const uint8_t* data = apdu.data();
237 
238  switch (apdu.type())
239  {
240  // TODO: testInfo could be of any length
242  {
243  uint16_t objectType;
244  uint16_t propertyId;
245  uint8_t testInfo[2];
246  popWord(objectType, data + 1);
247  popWord(propertyId, data + 3);
248  popByte(testInfo[0], data + 4);
249  popByte(testInfo[1], data + 5);
250  propertyId = (propertyId >> 4) & 0x0FFF;
251  testInfo[0] &= 0x0F;
252  _bau.systemNetworkParameterReadIndication(priority, hopType, secCtrl, objectType, propertyId, testInfo, sizeof(testInfo));
253  break;
254  }
255 
257  {
258  const uint8_t* knxSerialNumber = &data[1];
259  const uint8_t* domainAddress = &data[7];
260  _bau.domainAddressSerialNumberWriteIndication(priority, hopType, secCtrl, domainAddress, knxSerialNumber);
261  break;
262  }
263 
265  {
266  const uint8_t* knxSerialNumber = &data[1];
267  _bau.domainAddressSerialNumberReadIndication(priority, hopType, secCtrl, knxSerialNumber);
268  break;
269  }
270 
271  default:
272  print("SystemBroadcast-indication: unhandled APDU-Type: ");
273  println(apdu.type());
274  break;
275  }
276 }
277 
278 void ApplicationLayer::dataSystemBroadcastConfirm(HopCountType hopType, Priority priority, APDU& apdu, bool status)
279 {
280  dataSystemBroadcastConfirm(hopType, priority, apdu, noSecurity, status);
281 }
282 
283 void ApplicationLayer::dataSystemBroadcastConfirm(HopCountType hopType, Priority priority, APDU& apdu, const SecurityControl& secCtrl, bool status)
284 {
285  const uint8_t* data = apdu.data();
286 
287  switch (apdu.type())
288  {
289  // TODO: testInfo could be of any length
291  {
292  uint16_t objectType;
293  uint16_t propertyId;
294  uint8_t testInfo[2];
295  popWord(objectType, data + 1);
296  popWord(propertyId, data + 3);
297  popByte(testInfo[0], data + 4);
298  popByte(testInfo[1], data + 5);
299  propertyId = (propertyId >> 4) & 0x0FFF;
300  testInfo[0] &= 0x0F;
301  _bau.systemNetworkParameterReadLocalConfirm(priority, hopType, secCtrl, objectType, propertyId, testInfo, sizeof(testInfo), status);
302  break;
303  }
304 
306  {
307  const uint8_t* knxSerialNumber = &data[1];
308  const uint8_t* domainAddress = &data[7];
309  _bau.domainAddressSerialNumberWriteLocalConfirm(priority, hopType, secCtrl, domainAddress, knxSerialNumber, status);
310  break;
311  }
312 
314  {
315  const uint8_t* knxSerialNumber = &data[1];
316  _bau.domainAddressSerialNumberReadLocalConfirm(priority, hopType, secCtrl, knxSerialNumber, status);
317  break;
318  }
319 
320  default:
321  print("SystemBroadcast-confirm: unhandled APDU-Type: ");
322  println(apdu.type());
323  break;
324  }
325 }
326 
327 void ApplicationLayer::dataIndividualIndication(HopCountType hopType, Priority priority, uint16_t source, APDU& apdu)
328 {
329  dataIndividualIndication(hopType, priority, source, apdu, noSecurity);
330 }
331 
332 void ApplicationLayer::dataIndividualIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl)
333 {
334  individualIndication(hopType, priority, tsap, apdu, secCtrl);
335 }
336 
337 void ApplicationLayer::dataIndividualConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, bool status)
338 {
339  dataIndividualConfirm(ack, hopType, priority, tsap, apdu, noSecurity, status);
340 }
341 
342 void ApplicationLayer::dataIndividualConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl, bool status)
343 {
344  individualConfirm(ack, hopType, priority, tsap, apdu, secCtrl, status);
345 }
346 
348 {
349  _connectedTsap = tsap;
350 }
351 
352 void ApplicationLayer::connectConfirm(uint16_t destination, uint16_t tsap, bool status)
353 {
354  if (status)
355  {
356  _connectedTsap = tsap;
357  _bau.connectConfirm(tsap);
358  }
359  else
360  _connectedTsap = -1;
361 }
362 
364 {
365  _connectedTsap = -1;
366 }
367 
368 void ApplicationLayer::disconnectConfirm(Priority priority, uint16_t tsap, bool status)
369 {
370  _connectedTsap = -1;
371 }
372 
373 void ApplicationLayer::dataConnectedIndication(Priority priority, uint16_t tsap, APDU& apdu)
374 {
375  dataConnectedIndication(priority, tsap, apdu, noSecurity);
376 }
377 
378 void ApplicationLayer::dataConnectedIndication(Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl)
379 {
380  individualIndication(NetworkLayerParameter, priority, tsap, apdu, secCtrl);
381 }
382 
384 {
386 }
387 
388 void ApplicationLayer::dataConnectedConfirm(uint16_t tsap, const SecurityControl& secCtrl)
389 {
390  //FIXME: implement dataConnectedConfirm DataSecurity
391 }
392 #pragma endregion
393 void ApplicationLayer::groupValueReadRequest(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl& secCtrl)
394 {
395  if (_assocTable == nullptr)
396  return;
397 
398  _savedAsapReadRequest = asap;
399  CemiFrame frame(1);
400  APDU& apdu = frame.apdu();
401  apdu.type(GroupValueRead);
402 
403  int32_t value = _assocTable->translateAsap(asap);
404 
405  if (value < 0)
406  return; // there is no tsap in association table for this asap
407 
408  uint16_t tsap = (uint16_t)value;
409 
410  // first to bus then to itself
411  dataGroupRequest(ack, hopType, priority, tsap, apdu, secCtrl);
412  dataGroupIndication(hopType, priority, tsap, apdu, secCtrl);
413 }
414 
415 void ApplicationLayer::groupValueReadResponse(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl& secCtrl, uint8_t* data, uint8_t dataLength)
416 {
417  _savedAsapResponse = asap;
418  groupValueSend(GroupValueResponse, ack, asap, priority, hopType, secCtrl, data, dataLength);
419 }
420 
421 void ApplicationLayer::groupValueWriteRequest(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl& secCtrl, uint8_t* data, uint8_t dataLength)
422 {
423  _savedAsapWriteRequest = asap;
424  groupValueSend(GroupValueWrite, ack, asap, priority, hopType, secCtrl, data, dataLength);
425 }
426 
427 void ApplicationLayer::individualAddressWriteRequest(AckType ack, HopCountType hopType, const SecurityControl& secCtrl, uint16_t newaddress)
428 {
429  CemiFrame frame(3);
430  APDU& apdu = frame.apdu();
432  uint8_t* apduData = apdu.data();
433  pushWord(newaddress, apduData + 1);
434  dataBroadcastRequest(ack, hopType, SystemPriority, apdu, secCtrl);
435 }
436 
438 {
439  CemiFrame frame(1);
440  APDU& apdu = frame.apdu();
442  dataBroadcastRequest(ack, hopType, SystemPriority, apdu, secCtrl);
443 }
444 
446 {
447  CemiFrame frame(1);
448  APDU& apdu = frame.apdu();
450  dataBroadcastRequest(ack, hopType, SystemPriority, apdu, secCtrl);
451 }
452 
454 {
455  CemiFrame frame(7);
456  APDU& apdu = frame.apdu();
458  uint8_t* data = apdu.data() + 1;
459  memcpy(data, serialNumber, 6);
460  dataBroadcastRequest(ack, hopType, SystemPriority, apdu, secCtrl);
461 }
462 
464  uint8_t* serialNumber, uint16_t domainAddress)
465 {
466  CemiFrame frame(7);
467  APDU& apdu = frame.apdu();
469  uint8_t* data = apdu.data() + 1;
470  memcpy(data, serialNumber, 6);
471  data += 6;
472  pushWord(domainAddress, data);
473  dataBroadcastRequest(ack, hopType, SystemPriority, apdu, secCtrl);
474 }
475 
477  uint16_t newaddress)
478 {
479  CemiFrame frame(13);
480  APDU& apdu = frame.apdu();
482  uint8_t* data = apdu.data() + 1;
483  memcpy(data, serialNumber, 6);
484  data += 6;
485  pushWord(newaddress, data);
486  dataBroadcastRequest(ack, hopType, SystemPriority, apdu, secCtrl);
487 }
488 
489 void ApplicationLayer::deviceDescriptorReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
490  uint8_t descriptorType)
491 {
492  CemiFrame frame(1);
493  APDU& apdu = frame.apdu();
495  uint8_t* data = apdu.data();
496  *data |= (descriptorType & 0x3f);
497 
498  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
499 }
500 
501 void ApplicationLayer::deviceDescriptorReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
502  uint8_t descriptorType, uint8_t* deviceDescriptor)
503 {
504  uint8_t length = 0;
505 
506  switch (descriptorType)
507  {
508  case 0:
509  length = 3;
510  break;
511 
512  case 2:
513  length = 14;
514  break;
515 
516  default:
517  length = 1;
518  descriptorType = 0x3f;
519  break;
520  }
521 
522  CemiFrame frame(length);
523  APDU& apdu = frame.apdu();
525  uint8_t* data = apdu.data();
526  *data |= (descriptorType & 0x3f);
527 
528  if (length > 1)
529  memcpy(data + 1, deviceDescriptor, length - 1);
530 
531  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
532 }
533 
534 void ApplicationLayer::connectRequest(uint16_t destination, Priority priority)
535 {
536  _transportLayer->connectRequest(destination, priority);
537 }
538 
540 {
541  _transportLayer->disconnectRequest(_connectedTsap, priority);
542 }
543 
545 {
546  CemiFrame frame(1);
547  APDU& apdu = frame.apdu();
548  apdu.type(Restart);
549 
550  individualSend(ack, hopType, priority, _connectedTsap, apdu, secCtrl);
551 }
552 
553 void ApplicationLayer::restartResponse(AckType ack, Priority priority, HopCountType hopType, const SecurityControl& secCtrl, uint8_t errorCode, uint16_t processTime)
554 {
555  CemiFrame frame(4);
556  APDU& apdu = frame.apdu();
557  apdu.type(Restart);
558  uint8_t* data = apdu.data();
559  data[0] |= (1 << 5) | 1; // Set response bit and a restart type of "master reset". Only the master reset sends a response.
560  data[1] = errorCode;
561  data[2] = processTime >> 8;
562  data[3] = processTime & 0xFF;
563 
564  individualSend(ack, hopType, priority, _connectedTsap, apdu, secCtrl);
565 }
566 
567 //TODO: ApplicationLayer::systemNetworkParameterReadRequest()
569  uint16_t objectType, uint16_t propertyId,
570  uint8_t* testInfo, uint16_t testInfoLength,
571  uint8_t* testResult, uint16_t testResultLength)
572 {
573  CemiFrame frame(testInfoLength + testResultLength + 3 + 1); // PID and testInfo share an octet (+3) and +1 for APCI byte(?)
574  APDU& apdu = frame.apdu();
576  uint8_t* data = apdu.data() + 1;
577 
578  pushWord(objectType, data);
579  pushWord((propertyId << 4) & 0xFFF0, data + 2); // Reserved bits for test_info are always 0
580  uint8_t* pData = pushByteArray(&testInfo[1], testInfoLength - 1, data + 4); // TODO: upper reserved bits (testInfo + 0) have to put into the lower bits of data + 3
581  memcpy(pData, testResult, testResultLength);
582 
583  //apdu.printPDU();
584 
585  dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu, secCtrl);
586 }
587 
588 //TODO: ApplicationLayer::domainAddressSerialNumberWriteRequest()
589 //TODO: ApplicationLayer::domainAddressSerialNumberReadRequest()
590 void ApplicationLayer::domainAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl& secCtrl, const uint8_t* rfDoA,
591  const uint8_t* knxSerialNumber)
592 {
593  CemiFrame frame(13);
594  APDU& apdu = frame.apdu();
596 
597  uint8_t* data = apdu.data() + 1;
598 
599  memcpy(data, knxSerialNumber, 6);
600  memcpy(data + 6, rfDoA, 6);
601 
602  //apdu.printPDU();
603 
604  dataSystemBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu, secCtrl);
605 }
606 
607 //TODO: ApplicationLayer::IndividualAddressSerialNumberWriteRequest()
608 //TODO: ApplicationLayer::IndividualAddressSerialNumberReadRequest()
609 void ApplicationLayer::IndividualAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl& secCtrl, const uint8_t* domainAddress,
610  const uint8_t* knxSerialNumber)
611 {
612  CemiFrame frame(11);
613  APDU& apdu = frame.apdu();
615 
616  uint8_t* data = apdu.data() + 1;
617 
618  memcpy(data, knxSerialNumber, 6);
619  memcpy(data + 6, domainAddress, 2);
620 
621  //apdu.printPDU();
622 
623  dataBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu, secCtrl);
624 }
625 
626 void ApplicationLayer::propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
627  uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex)
628 {
629  CemiFrame frame(5);
630  APDU& apdu = frame.apdu();
631  apdu.type(PropertyValueRead);
632  uint8_t* data = apdu.data();
633  data += 1;
634  data = pushByte(objectIndex, data);
635  data = pushByte(propertyId, data);
636  pushWord(startIndex & 0xfff, data);
637  *data &= ((numberOfElements & 0xf) << 4);
638 
639  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
640 }
641 
642 void ApplicationLayer::propertyValueReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
643  uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
644 {
645  propertyDataSend(PropertyValueResponse, ack, priority, hopType, asap, secCtrl, objectIndex, propertyId, numberOfElements,
646  startIndex, data, length);
647 }
648 
649 void ApplicationLayer::propertyValueExtReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
650  uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
651 {
652  propertyExtDataSend(PropertyValueExtResponse, ack, priority, hopType, asap, secCtrl, objectType, objectInstance, propertyId, numberOfElements,
653  startIndex, data, length);
654 }
655 
656 void ApplicationLayer::propertyValueExtWriteConResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
657  uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t returnCode)
658 {
659  uint8_t noOfElem = (returnCode != ReturnCodes::Success) ? 0 : numberOfElements;
660  propertyExtDataSend(PropertyValueExtWriteConResponse, ack, priority, hopType, asap, secCtrl, objectType, objectInstance, propertyId, noOfElem,
661  startIndex, &returnCode, 1);
662 }
663 
664 void ApplicationLayer::propertyValueWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
665  uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
666 {
667  propertyDataSend(PropertyValueWrite, ack, priority, hopType, asap, secCtrl, objectIndex, propertyId, numberOfElements,
668  startIndex, data, length);
669 }
670 
671 void ApplicationLayer::adcReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
672  uint8_t channelNr, uint8_t readCount, int16_t value)
673 {
674  CemiFrame frame(4);
675  APDU& apdu = frame.apdu();
676  apdu.type(ADCResponse);
677  uint8_t* data = apdu.data();
678 
679  data[0] |= (channelNr & 0b111111);
680  data[1] = readCount;
681  data[2] = value >> 8;
682  data[3] = value & 0xFF;
683 
684  if (asap == _connectedTsap)
685  dataConnectedRequest(asap, priority, apdu, secCtrl);
686  else
687  dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
688 }
689 
690 void ApplicationLayer::functionPropertyStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
691  uint8_t objectIndex, uint8_t propertyId, uint8_t* resultData, uint8_t resultLength)
692 {
693  CemiFrame frame(3 + resultLength);
694  APDU& apdu = frame.apdu();
696  uint8_t* data = apdu.data() + 1;
697 
698  data[0] = objectIndex;
699  data[1] = propertyId;
700 
701  if (resultLength > 0)
702  memcpy(&data[2], resultData, resultLength);
703 
704  if (asap == _connectedTsap)
705  dataConnectedRequest(asap, priority, apdu, secCtrl);
706  else
707  dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
708 }
709 
710 void ApplicationLayer::functionPropertyExtStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
711  uint16_t objectType, uint8_t objectInstance, uint16_t propertyId, uint8_t* resultData, uint8_t resultLength)
712 {
713  CemiFrame frame(5 + resultLength + 1);
714  APDU& apdu = frame.apdu();
716  uint8_t* data = apdu.data() + 1;
717 
718  data[0] = ((uint16_t)objectType) >> 8;
719  data[1] = ((uint16_t)objectType) & 0xFF;
720  data[2] = objectInstance >> 4;
721  data[3] = ((objectInstance & 0x0F) << 4) | (propertyId >> 8);
722  data[4] = (propertyId & 0xFF);
723 
724  // data[5] must contain the return code
725  if (resultLength > 0)
726  memcpy(&data[5], resultData, resultLength);
727 
728  if (asap == _connectedTsap)
729  dataConnectedRequest(asap, priority, apdu, secCtrl);
730  else
731  dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
732 }
733 
734 void ApplicationLayer::propertyDescriptionReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
735  uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex)
736 {
737  CemiFrame frame(4);
738  APDU& apdu = frame.apdu();
740  uint8_t* data = apdu.data();
741  data[1] = objectIndex;
742  data[2] = propertyId;
743  data[3] = propertyIndex;
744  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
745 }
746 
747 void ApplicationLayer::propertyDescriptionReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
748  uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool writeEnable, uint8_t type,
749  uint16_t maxNumberOfElements, uint8_t access)
750 {
751  CemiFrame frame(8);
752  APDU& apdu = frame.apdu();
754  uint8_t* data = apdu.data();
755  data[1] = objectIndex;
756  data[2] = propertyId;
757  data[3] = propertyIndex;
758 
759  if (writeEnable)
760  data[4] |= 0x80;
761 
762  data[4] |= (type & 0x3f);
763  pushWord(maxNumberOfElements & 0xfff, data + 5);
764  data[7] = access;
765  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
766 }
767 
768 void ApplicationLayer::propertyExtDescriptionReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
769  uint16_t objectType, uint16_t objectInstance, uint16_t propertyId, uint16_t propertyIndex, uint8_t descriptionType, bool writeEnable, uint8_t type,
770  uint16_t maxNumberOfElements, uint8_t access)
771 {
772  CemiFrame frame(16);
773  APDU& apdu = frame.apdu();
775  uint8_t* data = apdu.data();
776 
777  data[1] = (objectType & 0xff00) >> 8;
778  data[2] = (objectType & 0x00ff);
779 
780  data[3] = (objectInstance & 0x0ff0) >> 4;
781  data[4] = (objectInstance & 0x000f) << 4 | (propertyId & 0x0f00) >> 8;
782  data[5] = (propertyId & 0x00ff);
783 
784  data[6] = (descriptionType & 0x000f) << 4 | (propertyIndex & 0x0f00) >> 8;
785  data[7] = (propertyIndex & 0x00ff);
786  data[8] = 0; // DataPointType ??
787  data[9] = 0; // DataPointType ??
788  data[10] = 0; // DataPointType ??
789  data[11] = 0; // DataPointType ??
790 
791  if (writeEnable)
792  data[12] |= 0x80;
793 
794  data[12] |= (type & 0x3f);
795 
796  pushWord(maxNumberOfElements & 0xfff, data + 13);
797  data[15] = access;
798  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
799 }
800 
801 void ApplicationLayer::memoryReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
802  uint16_t memoryAddress)
803 {
804  CemiFrame frame(3);
805  APDU& apdu = frame.apdu();
806  apdu.type(MemoryRead);
807  uint8_t* data = apdu.data();
808  *data |= (number & 0x3f);
809  pushWord(memoryAddress, data + 1);
810  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
811 }
812 
813 void ApplicationLayer::memoryReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
814  uint16_t memoryAddress, uint8_t* memoryData)
815 {
816  memorySend(MemoryResponse, ack, priority, hopType, asap, secCtrl, number, memoryAddress, memoryData);
817 }
818 
819 void ApplicationLayer::memoryRouterReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
820  uint16_t memoryAddress, uint8_t* memoryData)
821 {
822  memoryRouterSend(MemoryRouterReadResponse, ack, priority, hopType, asap, secCtrl, number, memoryAddress, memoryData);
823 }
824 
825 void ApplicationLayer::memoryRoutingTableReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
826  uint16_t memoryAddress, uint8_t* memoryData)
827 {
828  memoryRoutingTableSend(RoutingTableReadResponse, ack, priority, hopType, asap, secCtrl, number, memoryAddress, memoryData);
829 }
830 
831 void ApplicationLayer::memoryExtReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, ReturnCodes code,
832  uint8_t number, uint32_t memoryAddress, uint8_t* memoryData)
833 {
834  CemiFrame frame(5 + number);
835  APDU& apdu = frame.apdu();
837  uint8_t* data = apdu.data();
838  data[1] = code;
839  data[2] = (memoryAddress >> 16);
840  data[3] = (memoryAddress >> 8);
841  data[4] = (memoryAddress & 0xFF);
842 
843  memcpy(&data[5], memoryData, number);
844 
845  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
846 }
847 
848 void ApplicationLayer::memoryExtWriteResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, ReturnCodes code,
849  uint8_t number, uint32_t memoryAddress, uint8_t* memoryData)
850 {
851  bool withCrc = code == ReturnCodes::SuccessWithCrc;
852 
853  CemiFrame frame(5 + (withCrc ? 2 : 0));
854  APDU& apdu = frame.apdu();
856  uint8_t* data = apdu.data();
857  data[1] = code;
858  data[2] = (memoryAddress >> 16);
859  data[3] = (memoryAddress >> 8);
860  data[4] = (memoryAddress & 0xFF);
861 
862  if (withCrc)
863  {
864  uint16_t crc = crc16Ccitt(memoryData, number);
865  data[5] = crc >> 8;
866  data[6] = crc & 0xFF;
867  }
868 
869  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
870 }
871 
872 void ApplicationLayer::memoryWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
873  uint8_t number, uint16_t memoryAddress, uint8_t* data)
874 {
875  memorySend(MemoryWrite, ack, priority, hopType, asap, secCtrl, number, memoryAddress, data);
876 }
877 
878 void ApplicationLayer::userMemoryReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
879  uint8_t number, uint32_t memoryAddress)
880 {
881  CemiFrame frame(4);
882  APDU& apdu = frame.apdu();
883  apdu.type(UserMemoryRead);
884  uint8_t* data = apdu.data();
885  data[1] |= (number & 0xf);
886  data[1] |= ((memoryAddress >> 12) & 0xf0);
887  pushWord(memoryAddress & 0xff, data + 2);
888  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
889 }
890 
891 void ApplicationLayer::userMemoryReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
892  uint8_t number, uint32_t memoryAddress, uint8_t* memoryData)
893 {
894  userMemorySend(UserMemoryResponse, ack, priority, hopType, asap, secCtrl, number, memoryAddress, memoryData);
895 }
896 
897 void ApplicationLayer::userMemoryWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
898  uint8_t number, uint32_t memoryAddress, uint8_t* memoryData)
899 {
900  userMemorySend(UserMemoryWrite, ack, priority, hopType, asap, secCtrl, number, memoryAddress, memoryData);
901 }
902 
903 void ApplicationLayer::userManufacturerInfoReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl)
904 {
905  CemiFrame frame(1);
906  APDU& apdu = frame.apdu();
908  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
909 }
910 
911 void ApplicationLayer::userManufacturerInfoReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
912  uint8_t* info)
913 {
914  CemiFrame frame(4);
915  APDU& apdu = frame.apdu();
916  apdu.type(UserMemoryRead);
917  uint8_t* data = apdu.data();
918  memcpy(data + 1, info, 3);
919  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
920 }
921 
922 void ApplicationLayer::authorizeRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint32_t key)
923 {
924  CemiFrame frame(6);
925  APDU& apdu = frame.apdu();
926  apdu.type(AuthorizeRequest);
927  uint8_t* data = apdu.data();
928  pushInt(key, data + 2);
929  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
930 }
931 
932 void ApplicationLayer::authorizeResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t level)
933 {
934  CemiFrame frame(2);
935  APDU& apdu = frame.apdu();
936  apdu.type(AuthorizeResponse);
937  uint8_t* data = apdu.data();
938  data[1] = level;
939  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
940 }
941 
942 void ApplicationLayer::keyWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t level, uint32_t key)
943 {
944  CemiFrame frame(6);
945  APDU& apdu = frame.apdu();
946  apdu.type(KeyWrite);
947  uint8_t* data = apdu.data();
948  data[1] = level;
949  pushInt(key, data + 2);
950  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
951 }
952 
953 void ApplicationLayer::keyWriteResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t level)
954 {
955  CemiFrame frame(6);
956  APDU& apdu = frame.apdu();
957  apdu.type(KeyResponse);
958  uint8_t* data = apdu.data();
959  data[1] = level;
960  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
961 }
962 
963 void ApplicationLayer::propertyDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
964  uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
965 {
966  CemiFrame frame(5 + length);
967  APDU& apdu = frame.apdu();
968  apdu.type(type);
969  uint8_t* apduData = apdu.data();
970  apduData += 1;
971  apduData = pushByte(objectIndex, apduData);
972  apduData = pushByte(propertyId, apduData);
973  pushWord(startIndex & 0xfff, apduData);
974  *apduData |= ((numberOfElements & 0xf) << 4);
975  apduData += 2;
976 
977  if (length > 0)
978  memcpy(apduData, data, length);
979 
980  if (asap == _connectedTsap)
981  dataConnectedRequest(asap, priority, apdu, secCtrl);
982  else
983  dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
984 }
985 
986 void ApplicationLayer::propertyExtDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
987  uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
988 {
989  CemiFrame frame(9 + length);
990  APDU& apdu = frame.apdu();
991  apdu.type(type);
992  uint8_t* apduData = apdu.data();
993  apduData += 1;
994 
995  apduData[0] = ((uint16_t)objectType) >> 8;
996  apduData[1] = ((uint16_t)objectType) & 0xFF;
997  apduData[2] = objectInstance >> 4;
998  apduData[3] = ((objectInstance & 0x0F) << 4) | (propertyId >> 8);
999  apduData[4] = (propertyId & 0xFF);
1000  apduData[5] = numberOfElements;
1001  apduData[6] = (startIndex & 0x0FFF) >> 8;
1002  apduData[7] = startIndex & 0xFF;
1003 
1004  if (length > 0)
1005  memcpy(apduData + 8, data, length);
1006 
1007  if (asap == _connectedTsap)
1008  dataConnectedRequest(asap, priority, apdu, secCtrl);
1009  else
1010  dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
1011 }
1012 
1013 void ApplicationLayer::groupValueSend(ApduType type, AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl& secCtrl,
1014  uint8_t* data, uint8_t& dataLength)
1015 {
1016  if (_assocTable == nullptr)
1017  return;
1018 
1019  CemiFrame frame(dataLength + 1);
1020  APDU& apdu = frame.apdu();
1021  apdu.type(type);
1022  uint8_t* apdudata = apdu.data();
1023 
1024  if (dataLength == 0)
1025  {
1026  // data size is six bit or less. So store in first byte
1027  *apdudata &= ~0x3f;
1028  *apdudata |= (*data & 0x3f);
1029  }
1030  else
1031  {
1032  memcpy(apdudata + 1, data, dataLength);
1033  }
1034 
1035  // no need to check if there is a tsap. This is a response, so the read got through
1036  uint16_t tsap = (uint16_t)_assocTable->translateAsap(asap);
1037  dataGroupRequest(ack, hopType, priority, tsap, apdu, secCtrl);
1038  dataGroupIndication(hopType, priority, tsap, apdu, secCtrl);
1039 }
1040 
1041 void ApplicationLayer::memorySend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
1042  uint16_t memoryAddress, uint8_t* memoryData)
1043 {
1044  CemiFrame frame(3 + number);
1045  APDU& apdu = frame.apdu();
1046  apdu.type(type);
1047  uint8_t* data = apdu.data();
1048  *data |= (number & 0x3f);
1049  pushWord(memoryAddress, data + 1);
1050 
1051  if (number > 0)
1052  memcpy(data + 3, memoryData, number);
1053 
1054  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
1055 }
1056 
1057 void ApplicationLayer::memoryRouterSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
1058  uint16_t memoryAddress, uint8_t* memoryData)
1059 {
1060  CemiFrame frame(4 + number);
1061  APDU& apdu = frame.apdu();
1062  apdu.type(type);
1063  uint8_t* data = apdu.data();
1064  data[1] |= (number & 0xf);
1065  pushWord(memoryAddress & 0xffff, data + 2);
1066 
1067  if (number > 0)
1068  memcpy(data + 4, memoryData, number);
1069 
1070  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
1071 }
1072 
1073 void ApplicationLayer::memoryRoutingTableSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
1074  uint16_t memoryAddress, uint8_t* memoryData)
1075 {
1076  CemiFrame frame(4 + number);
1077  APDU& apdu = frame.apdu();
1078  apdu.type(type);
1079  uint8_t* data = apdu.data();
1080  data[1] |= (number & 0xf);
1081  pushWord(memoryAddress & 0xffff, data + 2);
1082 
1083  if (number > 0)
1084  memcpy(data + 4, memoryData, number);
1085 
1086  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
1087 }
1088 
1089 void ApplicationLayer::userMemorySend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
1090  uint32_t memoryAddress, uint8_t* memoryData)
1091 {
1092  CemiFrame frame(4 + number);
1093  APDU& apdu = frame.apdu();
1094  apdu.type(type);
1095  uint8_t* data = apdu.data();
1096  data[1] |= (number & 0xf);
1097  data[1] |= ((memoryAddress >> 12) & 0xf0);
1098  pushWord(memoryAddress & 0xffff, data + 2);
1099 
1100  if (number > 0)
1101  memcpy(data + 4, memoryData, number);
1102 
1103  individualSend(ack, hopType, priority, asap, apdu, secCtrl);
1104 }
1105 
1106 void ApplicationLayer::individualIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl)
1107 {
1108  uint8_t* data = apdu.data();
1109 
1110  switch (apdu.type())
1111  {
1112  case DeviceDescriptorRead:
1113  _bau.deviceDescriptorReadIndication(priority, hopType, tsap, secCtrl, *data & 0x3f);
1114  break;
1115 
1117  _bau.deviceDescriptorReadAppLayerConfirm(priority, hopType, tsap, secCtrl, *data & 0x3f, data + 1);
1118  break;
1119 
1120  case Restart:
1121  case RestartMasterReset:
1122  {
1123  // These reserved bits must be 0
1124  uint8_t reservedBits = data[0] & 0x1e;
1125 
1126  if (reservedBits != 0)
1127  return;
1128 
1129  // handle erase code for factory reset (setting FDSK again as toolkey, etc.)
1130  RestartType restartType = (RestartType) (data[0] & 0x3f);
1131  EraseCode eraseCode = EraseCode::Void;
1132  uint8_t channel = 0;
1133 
1134  if (restartType == RestartType::MasterReset)
1135  {
1136  eraseCode = (EraseCode) data[1];
1137  channel = data[2];
1138  }
1139 
1140  _bau.restartRequestIndication(priority, hopType, tsap, secCtrl, restartType, eraseCode, channel);
1141  break;
1142  }
1143 
1144  case PropertyValueRead:
1145  {
1146  uint16_t startIndex;
1147  popWord(startIndex, data + 3);
1148  startIndex &= 0xfff;
1149  _bau.propertyValueReadIndication(priority, hopType, tsap, secCtrl, data[1], data[2], data[3] >> 4, startIndex);
1150  break;
1151  }
1152 
1153  case PropertyValueResponse:
1154  {
1155  uint16_t startIndex;
1156  popWord(startIndex, data + 3);
1157  startIndex &= 0xfff;
1158  _bau.propertyValueReadAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1], data[2], data[3] >> 4,
1159  startIndex, data + 5, apdu.length() - 5);
1160  break;
1161  }
1162 
1163  case PropertyValueWrite:
1164  {
1165  uint16_t startIndex;
1166  popWord(startIndex, data + 3);
1167  startIndex &= 0xfff;
1168  _bau.propertyValueWriteIndication(priority, hopType, tsap, secCtrl, data[1], data[2], data[3] >> 4,
1169  startIndex, data + 5, apdu.length() - 5);
1170  break;
1171  }
1172 
1173  case PropertyValueExtRead:
1174  {
1175  ObjectType objectType = (ObjectType)(((data[1] & 0xff) << 8) | (data[2] & 0xff));
1176  uint8_t objectInstance = ((data[3] & 0xff) << 4) | ((data[4] & 0xff) >> 4);
1177  uint16_t propertyId = ((data[4] & 0xf) << 8) | (data[5] & 0xff);
1178  uint8_t numberOfElements = data[6];
1179  uint16_t startIndex = ((data[7] & 0xf) << 8) | (data[8] & 0xff);
1180  _bau.propertyValueExtReadIndication(priority, hopType, tsap, secCtrl, objectType, objectInstance, propertyId, numberOfElements, startIndex);
1181  break;
1182  }
1183 
1186  {
1187  ObjectType objectType = (ObjectType)(((data[1] & 0xff) << 8) | (data[2] & 0xff));
1188  uint8_t objectInstance = ((data[3] & 0xff) << 4) | ((data[4] & 0xff) >> 4);
1189  uint16_t propertyId = ((data[4] & 0xf) << 8) | (data[5] & 0xff);
1190  uint8_t numberOfElements = data[6];
1191  uint16_t startIndex = ((data[7] & 0xf) << 8) | (data[8] & 0xff);
1192  bool confirmed = (apdu.type() == PropertyValueExtWriteCon);
1193  _bau.propertyValueExtWriteIndication(priority, hopType, tsap, secCtrl, objectType, objectInstance, propertyId, numberOfElements, startIndex,
1194  data + 9, apdu.length() - 9, confirmed);
1195  break;
1196  }
1197 
1199  _bau.functionPropertyCommandIndication(priority, hopType, tsap, secCtrl, data[1], data[2], &data[3], apdu.length() - 3); //TODO: check length
1200  break;
1201 
1202  case FunctionPropertyState:
1203  _bau.functionPropertyStateIndication(priority, hopType, tsap, secCtrl, data[1], data[2], &data[3], apdu.length() - 3); //TODO: check length
1204  break;
1205 
1207  {
1208  ObjectType objectType = (ObjectType)(((data[1] & 0xff) << 8) | (data[2] & 0xff));
1209  uint8_t objectInstance = ((data[3] & 0xff) << 4) | ((data[4] & 0xff) >> 4);
1210  uint16_t propertyId = ((data[4] & 0xf) << 8) | (data[5] & 0xff);
1211  uint8_t* functionInput = &data[6];
1212  _bau.functionPropertyExtCommandIndication(priority, hopType, tsap, secCtrl, objectType, objectInstance, propertyId, functionInput, apdu.length() - 6);
1213  break;
1214  }
1215 
1217  {
1218  ObjectType objectType = (ObjectType)(((data[1] & 0xff) << 8) | (data[2] & 0xff));
1219  uint8_t objectInstance = ((data[3] & 0xff) << 4) | ((data[4] & 0xff) >> 4);
1220  uint16_t propertyId = ((data[4] & 0xf) << 8) | (data[5] & 0xff);
1221  uint8_t* functionInput = &data[6];
1222  _bau.functionPropertyExtStateIndication(priority, hopType, tsap, secCtrl, objectType, objectInstance, propertyId, functionInput, apdu.length() - 6);
1223  break;
1224  }
1225 
1227  _bau.propertyDescriptionReadIndication(priority, hopType, tsap, secCtrl, data[1], data[2], data[3]);
1228  break;
1229 
1231  {
1232  ObjectType objectType = (ObjectType)(((data[1] & 0xff) << 8) | (data[2] & 0xff));
1233  uint16_t objectInstance = ((data[3] & 0xff) << 4) | ((data[4] & 0xf0) >> 4);
1234  uint16_t propertyId = ((data[4] & 0x0f) << 8) | (data[5] & 0xff);
1235  uint8_t descriptionType = (data[6] & 0xf0) >> 4;
1236  uint16_t propertyIndex = ((data[7] & 0x0f) << 8) | (data[8] & 0xff);
1237 
1238  _bau.propertyExtDescriptionReadIndication(priority, hopType, tsap, secCtrl, objectType, objectInstance, propertyId, descriptionType, propertyIndex);
1239  break;
1240  }
1241 
1243  _bau.propertyDescriptionReadAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1], data[2], data[3],
1244  (data[4] & 0x80) > 0, data[4] & 0x3f, getWord(data + 5) & 0xfff, data[7]);
1245  break;
1246 
1247  case MemoryRead:
1248  _bau.memoryReadIndication(priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1));
1249  break;
1250 
1251  case MemoryResponse:
1252  _bau.memoryReadAppLayerConfirm(priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3);
1253  break;
1254 
1255  case MemoryWrite:
1256  _bau.memoryWriteIndication(priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3);
1257  break;
1258 
1259  // EC
1260  case MemoryRouterWrite:
1261  print("MemoryRouterWrite: ");
1262  _bau.memoryRouterWriteIndication(priority, hopType, tsap, secCtrl, data[1], getWord(data + 2), data + 4);
1263  break;
1264 
1266  _bau.memoryRouterReadAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1], getWord(data + 2), data + 4);
1267  break;
1268 
1269  case RoutingTableOpen:
1270  println("Received OpenRoutingTable APDU, doing nothing");
1271  break;
1272 
1273  case RoutingTableRead:
1274  _bau.memoryRoutingTableReadIndication(priority, hopType, tsap, secCtrl, data[1], getWord(data + 2));
1275  break;
1276 
1278  _bau.memoryRoutingTableReadAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1], getWord(data + 2), data + 4);
1279  break;
1280 
1281  case RoutingTableWrite:
1282  _bau.memoryRoutingTableWriteIndication(priority, hopType, tsap, secCtrl, data[1], getWord(data + 2), data + 4);
1283  break;
1284 
1285  // end EC
1286 
1287  case MemoryExtRead:
1288  {
1289  uint8_t number = data[1];
1290  uint32_t memoryAddress = ((data[2] & 0xff) << 16) | ((data[3] & 0xff) << 8) | (data[4] & 0xff);
1291  _bau.memoryExtReadIndication(priority, hopType, tsap, secCtrl, number, memoryAddress);
1292  break;
1293  }
1294 
1295  //case MemoryExtReadResponse:
1296  // _bau.memoryExtReadAppLayerConfirm(priority, hopType, tsap, secCtrl, data[0], getInt(data + 1), data + 4); // TODO return code
1297  // break;
1298  case MemoryExtWrite:
1299  {
1300  uint8_t number = data[1];
1301  uint32_t memoryAddress = ((data[2] & 0xff) << 16) | ((data[3] & 0xff) << 8) | (data[4] & 0xff);
1302  _bau.memoryExtWriteIndication(priority, hopType, tsap, secCtrl, number, memoryAddress, data + 5);
1303  break;
1304  }
1305 
1306  //case MemoryExtWriteResponse:
1307  // _bau.memoryExtWriteAppLayerConfirm(priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3); // TODO return code
1308  // break;
1309  case UserMemoryRead:
1310  {
1311  uint32_t address = ((data[1] & 0xf0) << 12) + (data[2] << 8) + data[3];
1312  _bau.userMemoryReadIndication(priority, hopType, tsap, secCtrl, data[1] & 0xf, address);
1313  break;
1314  }
1315 
1316  case UserMemoryResponse:
1317  {
1318  uint32_t address = ((data[1] & 0xf0) << 12) + (data[2] << 8) + data[3];
1319  _bau.userMemoryReadAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1] & 0xf, address, data + 4);
1320  break;
1321  }
1322 
1323  case UserMemoryWrite:
1324  {
1325  uint32_t address = ((data[1] & 0xf0) << 12) + (data[2] << 8) + data[3];
1326  _bau.userMemoryWriteIndication(priority, hopType, tsap, secCtrl, data[1] & 0xf, address, data + 4);
1327  break;
1328  }
1329 
1331  _bau.userManufacturerInfoIndication(priority, hopType, tsap, secCtrl);
1332  break;
1333 
1335  _bau.userManufacturerInfoAppLayerConfirm(priority, hopType, tsap, secCtrl, data + 1);
1336  break;
1337 
1338  case AuthorizeRequest:
1339  _bau.authorizeIndication(priority, hopType, tsap, secCtrl, getInt(data + 2));
1340  break;
1341 
1342  case AuthorizeResponse:
1343  _bau.authorizeAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1]);
1344  break;
1345 
1346  case KeyWrite:
1347  _bau.keyWriteIndication(priority, hopType, tsap, secCtrl, data[1], getInt(data + 2));
1348  break;
1349 
1350  case KeyResponse:
1351  _bau.keyWriteAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1]);
1352  break;
1353 
1354  case ADCRead:
1355  {
1356  //Since we don't have an adc for bus voltage, we just send zero as readCount
1357  uint8_t channelNr = data[0] & 0b111111;
1358  this->adcReadResponse(AckRequested, priority, hopType, tsap, secCtrl, channelNr, 0, 0);
1359  break;
1360  }
1361 
1362  default:
1363  print("Individual-indication: unhandled APDU-Type: ");
1364  apdu.printPDU();
1365  }
1366 }
1367 
1368 void ApplicationLayer::individualConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl, bool status)
1369 {
1370  uint8_t* data = apdu.data();
1371 
1372  switch (apdu.type())
1373  {
1374  case DeviceDescriptorRead:
1375  _bau.deviceDescriptorReadLocalConfirm(ack, priority, hopType, tsap, secCtrl, *data & 0x3f, status);
1376  break;
1377 
1379  _bau.deviceDescriptorReadResponseConfirm(ack, priority, hopType, tsap, secCtrl, *data & 0x3f, data + 1, status);
1380  break;
1381 
1382  case Restart:
1383  _bau.restartRequestLocalConfirm(ack, priority, hopType, tsap, secCtrl, status);
1384  break;
1385 
1386  case PropertyValueRead:
1387  {
1388  uint16_t startIndex;
1389  popWord(startIndex, data + 3);
1390  startIndex &= 0xfff;
1391  _bau.propertyValueReadLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[1], data[2], data[3] >> 4,
1392  startIndex, status);
1393  break;
1394  }
1395 
1396  case PropertyValueResponse:
1397  {
1398  uint16_t startIndex;
1399  popWord(startIndex, data + 3);
1400  startIndex &= 0xfff;
1401  _bau.propertyValueReadResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[1], data[2], data[3] >> 4,
1402  startIndex, data + 5, apdu.length() - 5, status);
1403  break;
1404  }
1405 
1406  case PropertyValueWrite:
1407  {
1408  uint16_t startIndex;
1409  popWord(startIndex, data + 3);
1410  startIndex &= 0xfff;
1411  _bau.propertyValueWriteLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[1], data[2], data[3] >> 4,
1412  startIndex, data + 5, apdu.length() - 5, status);
1413  break;
1414  }
1415 
1417  _bau.propertyDescriptionReadLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[1], data[2], data[3], status);
1418  break;
1419 
1421  _bau.propertyExtDescriptionReadLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[1], data[2], data[3], status);
1422  break;
1423 
1425  _bau.propertyDescriptionReadResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[1], data[2], data[3],
1426  (data[4] & 0x80) > 0, data[4] & 0x3f, getWord(data + 5) & 0xfff, data[7], status);
1427  break;
1428 
1429  case MemoryRead:
1430  _bau.memoryReadLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), status);
1431  break;
1432 
1433  case MemoryResponse:
1434  _bau.memoryReadResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3, status);
1435  break;
1436 
1437  case MemoryWrite:
1438  _bau.memoryWriteLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3, status);
1439  break;
1440 
1441  case MemoryExtRead:
1442  _bau.memoryExtReadLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), status);
1443  break;
1444 
1445  case MemoryExtReadResponse:
1446  _bau.memoryExtReadResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3, status);
1447  break;
1448 
1449  case MemoryExtWrite:
1450  _bau.memoryExtWriteLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3, status);
1451  break;
1452 
1454  _bau.memoryExtWriteResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[0] & 0x3f, getWord(data + 1), data + 3, status);
1455  break;
1456 
1457  case UserMemoryRead:
1458  {
1459  uint32_t address = ((data[1] & 0xf0) << 12) + (data[2] << 8) + data[3];
1460  _bau.memoryReadLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[1] & 0xf, address, status);
1461  break;
1462  }
1463 
1464  case UserMemoryResponse:
1465  {
1466  uint32_t address = ((data[1] & 0xf0) << 12) + (data[2] << 8) + data[3];
1467  _bau.memoryReadResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[1] & 0xf, address, data + 4, status);
1468  break;
1469  }
1470 
1471  case UserMemoryWrite:
1472  {
1473  uint32_t address = ((data[1] & 0xf0) << 12) + (data[2] << 8) + data[3];
1474  _bau.memoryWriteLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[1] & 0xf, address, data + 4, status);
1475  break;
1476  }
1477 
1479  _bau.userManufacturerInfoLocalConfirm(ack, priority, hopType, tsap, secCtrl, status);
1480  break;
1481 
1483  _bau.userManufacturerInfoResponseConfirm(ack, priority, hopType, tsap, secCtrl, data + 1, status);
1484  break;
1485 
1486  case AuthorizeRequest:
1487  _bau.authorizeLocalConfirm(ack, priority, hopType, tsap, secCtrl, getInt(data + 2), status);
1488  break;
1489 
1490  case AuthorizeResponse:
1491  _bau.authorizeResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[1], status);
1492  break;
1493 
1494  case KeyWrite:
1495  _bau.keyWriteLocalConfirm(ack, priority, hopType, tsap, secCtrl, data[1], getInt(data + 2), status);
1496  break;
1497 
1498  case KeyResponse:
1499  _bau.keyWriteResponseConfirm(ack, priority, hopType, tsap, secCtrl, data[1], status);
1500  break;
1501 
1502  default:
1503  print("Individual-confirm: unhandled APDU-Type: ");
1504  println(apdu.type());
1505  }
1506 }
1507 
1508 void ApplicationLayer::individualSend(AckType ack, HopCountType hopType, Priority priority, uint16_t asap, APDU& apdu, const SecurityControl& secCtrl)
1509 {
1510  if (asap == _connectedTsap)
1511  dataConnectedRequest(asap, priority, apdu, secCtrl);
1512  else
1513  dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
1514 }
1515 
1517 {
1518  return (_connectedTsap >= 0);
1519 }
1520 
1521 void ApplicationLayer::dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, const SecurityControl& secCtrl)
1522 {
1523  (void)secCtrl; // We do not need security related information in the plain application layer
1524  _transportLayer->dataGroupRequest(ack, hopType, priority, tsap, apdu);
1525 }
1527 {
1528  (void)secCtrl; // We do not need security related information in the plain application layer
1529  _transportLayer->dataBroadcastRequest(ack, hopType, SystemPriority, apdu);
1530 }
1532 {
1533  (void)secCtrl; // We do not need security related information in the plain application layer
1535 }
1536 void ApplicationLayer::dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU& apdu, const SecurityControl& secCtrl)
1537 {
1538  (void)secCtrl; // We do not need security related information in the plain application layer
1539  _transportLayer->dataIndividualRequest(ack, hopType, priority, destination, apdu);
1540 }
1541 void ApplicationLayer::dataConnectedRequest(uint16_t tsap, Priority priority, APDU& apdu, const SecurityControl& secCtrl)
1542 {
1543  (void)secCtrl; // We do not need security related information in the plain application layer
1544  // apdu must be valid until it was confirmed
1545  _transportLayer->dataConnectedRequest(tsap, priority, apdu);
1546 }
void print(const char *s)
void println(const char *s)
const uint8_t * popByte(uint8_t &b, const uint8_t *data)
Definition: bits.cpp:4
uint8_t * pushInt(uint32_t i, uint8_t *data)
Definition: bits.cpp:72
uint8_t * pushByteArray(const uint8_t *src, uint32_t size, uint8_t *data)
Definition: bits.cpp:82
uint8_t * pushWord(uint16_t w, uint8_t *data)
Definition: bits.cpp:64
uint16_t getWord(const uint8_t *data)
Definition: bits.cpp:91
uint8_t * pushByte(uint8_t b, uint8_t *data)
Definition: bits.cpp:57
uint16_t crc16Ccitt(uint8_t *input, uint16_t length)
Definition: bits.cpp:133
uint32_t getInt(const uint8_t *data)
Definition: bits.cpp:96
const uint8_t * popWord(uint16_t &w, const uint8_t *data)
Definition: bits.cpp:34
This class represents an Application Protocol Data Unit.
Definition: apdu.h:12
void printPDU()
Print the contents of the APDU to console.
Definition: apdu.cpp:43
ApduType type()
Get the type of the APDU.
Definition: apdu.cpp:9
uint8_t * data()
Get a pointer to the data.
Definition: apdu.cpp:28
uint8_t length() const
Get the length of the APDU.
Definition: apdu.cpp:38
CemiFrame & frame()
Get the CemiFrame this APDU is part of.
Definition: apdu.cpp:33
void propertyDescriptionReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool writeEnable, uint8_t type, uint16_t maxNumberOfElements, uint8_t access)
void individualAddressReadResponse(AckType ack, HopCountType hopType, const SecurityControl &secCtrl)
void functionPropertyStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t *resultData, uint8_t resultLength)
void authorizeRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint32_t key)
void propertyValueExtReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length)
void disconnectConfirm(Priority priority, uint16_t tsap, bool status)
void memoryExtReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ReturnCodes code, uint8_t number, uint32_t memoryAddress, uint8_t *data)
void propertyExtDescriptionReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint16_t objectType, uint16_t objectInstance, uint16_t propertyId, uint16_t propertyIndex, uint8_t descriptionType, bool writeEnable, uint8_t type, uint16_t maxNumberOfElements, uint8_t access)
void individualAddressSerialNumberWriteRequest(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *serialNumber, uint16_t newaddress)
void individualAddressSerialNumberReadRequest(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *serialNumber)
void memoryExtWriteResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ReturnCodes code, uint8_t number, uint32_t memoryAddress, uint8_t *memoryData)
void keyWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level, uint32_t key)
void deviceDescriptorReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType, uint8_t *deviceDescriptor)
virtual void dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu)
void memoryWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
void associationTableObject(AssociationTableObject &assocTable)
void memoryReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
virtual void dataConnectedRequest(uint16_t tsap, Priority priority, APDU &apdu, const SecurityControl &secCtrl)
void authorizeResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level)
virtual void dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU &apdu, const SecurityControl &secCtrl)
virtual void dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu)
void functionPropertyExtStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint16_t objectType, uint8_t objectInstance, uint16_t propertyId, uint8_t *resultData, uint8_t resultLength)
void deviceDescriptorReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType)
TransportLayer * _transportLayer
void disconnectIndication(uint16_t tsap)
virtual void dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu, const SecurityControl &secCtrl)
void keyWriteResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level)
void connectConfirm(uint16_t destination, uint16_t tsap, bool status)
void groupValueReadResponse(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *data, uint8_t dataLength)
void userMemoryWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *memoryData)
void connectIndication(uint16_t tsap)
virtual void dataConnectedIndication(Priority priority, uint16_t tsap, APDU &apdu)
void propertyValueReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length)
void systemNetworkParameterReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint16_t objectType, uint16_t propertyId, uint8_t *testInfo, uint16_t testInfoLength, uint8_t *testResult, uint16_t testResultLength)
virtual void dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu, bool status)
Report the status of an APDU that we sent via multicast communication back to us.
void groupValueReadRequest(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl)
virtual void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU &apdu, const SecurityControl &secCtrl)
void memoryRouterReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
void IndividualAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t *domainAddress, const uint8_t *knxSerialNumber)
virtual void dataSystemBroadcastConfirm(HopCountType hopType, Priority priority, APDU &apdu, bool status)
void userMemoryReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress)
void propertyValueWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length)
void individualAddressReadRequest(AckType ack, HopCountType hopType, const SecurityControl &secCtrl)
void propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex)
void userManufacturerInfoReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t *info)
void restartRequest(AckType ack, Priority priority, HopCountType hopType, const SecurityControl &secCtrl)
void connectRequest(uint16_t destination, Priority priority)
virtual void dataIndividualConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu, bool status)
virtual void dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, APDU &apdu, bool status)
void disconnectRequest(Priority priority)
void memoryRoutingTableReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
void adcReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t channelNr, uint8_t readCount, int16_t value)
void userManufacturerInfoReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl)
ApplicationLayer(BusAccessUnit &bau)
The constructor.
void domainAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t *rfDoA, const uint8_t *knxSerialNumber)
virtual void dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu)
Somebody send us an APDU via multicast communication.
void userMemoryReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *memoryData)
void groupValueWriteRequest(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *data, uint8_t dataLength)
void propertyValueExtWriteConResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t returnCode)
void individualAddressWriteRequest(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint16_t newaddress)
void propertyDescriptionReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex)
void restartResponse(AckType ack, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t errorCode, uint16_t processTime)
void memoryReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress)
static const SecurityControl noSecurity
void transportLayer(TransportLayer &layer)
Assigns the TransportLayer to which encoded APDU are submitted to.
virtual void dataConnectedConfirm(uint16_t tsap)
virtual void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU &apdu, const SecurityControl &secCtrl)
void individualAddressSerialNumberReadResponse(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *serialNumber, uint16_t domainAddress)
virtual void dataIndividualIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu)
int32_t translateAsap(uint16_t asap)
int32_t nextAsap(uint16_t tsap, uint16_t &startIdx)
virtual void deviceDescriptorReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptortype, uint8_t *deviceDescriptor)
Definition: bau.cpp:89
virtual void memoryExtWriteLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *data, bool status)
Definition: bau.cpp:235
virtual void memoryRouterReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
Definition: bau.cpp:206
virtual void propertyDescriptionReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool status)
Definition: bau.cpp:150
virtual void memoryExtWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *data)
Definition: bau.cpp:239
virtual void userManufacturerInfoAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t *info)
Definition: bau.cpp:287
virtual void authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint32_t key)
Definition: bau.cpp:295
virtual void groupValueReadResponseConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopTtype, const SecurityControl &secCtrl, uint8_t *data, uint8_t dataLength, bool status)
Definition: bau.cpp:11
virtual void memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress)
Definition: bau.cpp:183
virtual void restartRequestLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, bool status)
Definition: bau.cpp:93
virtual void propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex)
Definition: bau.cpp:158
virtual void individualAddressReadLocalConfirm(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, bool status)
Definition: bau.cpp:35
virtual void deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType)
Definition: bau.cpp:80
virtual void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, RestartType restartType, EraseCode eraseCode, uint8_t channel)
Definition: bau.cpp:97
virtual void domainAddressSerialNumberWriteLocalConfirm(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t *rfDoA, const uint8_t *knxSerialNumber, bool status)
Definition: bau.cpp:346
virtual void userMemoryReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *memoryData)
Definition: bau.cpp:263
virtual void systemNetworkParameterReadIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint16_t objectType, uint16_t propertyId, uint8_t *testInfo, uint16_t testInfoLength)
Definition: bau.cpp:327
virtual void userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress)
Definition: bau.cpp:255
virtual void individualAddressSerialNumberReadLocalConfirm(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *serialNumber, bool status)
Definition: bau.cpp:51
virtual void systemNetworkParameterReadLocalConfirm(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint16_t objectType, uint16_t propertyId, uint8_t *testInfo, uint16_t testInfoLength, bool status)
Definition: bau.cpp:341
virtual void memoryRoutingTableReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress)
Definition: bau.cpp:209
virtual void individualAddressReadResponseConfirm(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, bool status)
Definition: bau.cpp:43
virtual void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex)
Definition: bau.cpp:105
virtual void individualAddressWriteLocalConfirm(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint16_t newaddress, bool status)
Definition: bau.cpp:27
virtual void userManufacturerInfoIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl)
Definition: bau.cpp:279
virtual void memoryExtReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress)
Definition: bau.cpp:223
virtual void memoryRoutingTableWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
Definition: bau.cpp:215
virtual void domainAddressSerialNumberReadLocalConfirm(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t *knxSerialNumber, bool status)
Definition: bau.cpp:351
virtual void propertyValueReadResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length, bool status)
Definition: bau.cpp:130
virtual void keyWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level, uint32_t key)
Definition: bau.cpp:311
virtual void userManufacturerInfoLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, bool status)
Definition: bau.cpp:275
virtual void memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
Definition: bau.cpp:199
virtual void userManufacturerInfoResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t *info, bool status)
Definition: bau.cpp:283
virtual void domainAddressSerialNumberReadIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t *knxSerialNumber)
Definition: bau.cpp:337
virtual void keyWriteLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level, uint32_t key, bool status)
Definition: bau.cpp:307
virtual void authorizeResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level, bool status)
Definition: bau.cpp:299
virtual void groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *data, uint8_t dataLength)
Definition: bau.cpp:23
virtual void propertyExtDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint16_t objectType, uint16_t objectInstance, uint16_t propertyId, uint8_t descriptionType, uint16_t propertyIndex)
Definition: bau.cpp:162
virtual void functionPropertyStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t *data, uint8_t length)
Definition: bau.cpp:118
virtual void deviceDescriptorReadResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptor_type, uint8_t *device_descriptor, bool status)
Definition: bau.cpp:84
virtual void individualAddressReadIndication(HopCountType hopType, const SecurityControl &secCtrl)
Definition: bau.cpp:39
virtual void propertyDescriptionReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool writeEnable, uint8_t type, uint16_t maxNumberOfElements, uint8_t access)
Definition: bau.cpp:175
virtual void propertyValueExtWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length, bool confirmed)
Definition: bau.cpp:146
virtual void memoryReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, bool status)
Definition: bau.cpp:179
virtual void authorizeAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level)
Definition: bau.cpp:303
virtual void connectConfirm(uint16_t destination)
Definition: bau.cpp:323
virtual void individualAddressReadAppLayerConfirm(HopCountType hopType, const SecurityControl &secCtrl, uint16_t individualAddress)
Definition: bau.cpp:47
virtual void propertyValueWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length)
Definition: bau.cpp:142
virtual void propertyValueReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, bool status)
Definition: bau.cpp:101
virtual void groupValueReadLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, bool status)
Definition: bau.cpp:3
virtual void keyWriteAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level)
Definition: bau.cpp:319
virtual void individualAddressSerialNumberReadAppLayerConfirm(HopCountType hopType, const SecurityControl &secCtrl, uint8_t *serialNumber, uint16_t individualAddress, uint16_t domainAddress)
Definition: bau.cpp:63
virtual void propertyValueWriteLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length, bool status)
Definition: bau.cpp:138
virtual void individualAddressSerialNumberReadIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *knxSerialNumber)
Definition: bau.cpp:55
virtual void groupValueReadIndication(uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl)
Definition: bau.cpp:7
virtual void memoryReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
Definition: bau.cpp:191
virtual void individualAddressSerialNumberWriteLocalConfirm(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *serialNumber, uint16_t newaddress, bool status)
Definition: bau.cpp:67
virtual void authorizeLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint32_t key, bool status)
Definition: bau.cpp:291
virtual void individualAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint16_t newIndividualAddress, uint8_t *knxSerialNumber)
Definition: bau.cpp:71
virtual void individualAddressSerialNumberReadResponseConfirm(AckType ack, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *serialNumber, uint16_t domainAddress, bool status)
Definition: bau.cpp:59
virtual void propertyDescriptionReadResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool writeEnable, uint8_t type, uint16_t maxNumberOfElements, uint8_t access, bool status)
Definition: bau.cpp:171
virtual void groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *data, uint8_t dataLength)
Definition: bau.cpp:15
virtual void memoryExtReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, bool status)
Definition: bau.cpp:219
virtual void functionPropertyExtStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t *data, uint8_t length)
Definition: bau.cpp:126
virtual void deviceDescriptorReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t descriptorType, bool status)
Definition: bau.cpp:76
virtual void memoryReadResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data, bool status)
Definition: bau.cpp:187
virtual void memoryRoutingTableReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
Definition: bau.cpp:212
virtual void domainAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t *rfDoA, const uint8_t *knxSerialNumber)
Definition: bau.cpp:332
virtual void keyWriteResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t level, bool status)
Definition: bau.cpp:315
virtual void groupValueWriteLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t *data, uint8_t dataLength, bool status)
Definition: bau.cpp:19
virtual void memoryRouterWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data)
Definition: bau.cpp:203
virtual void propertyExtDescriptionReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint16_t objectIndex, uint8_t propertyId, uint16_t propertyIndex, bool status)
Definition: bau.cpp:154
virtual void memoryExtWriteResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *data, bool status)
Definition: bau.cpp:243
virtual void propertyValueReadAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t *data, uint8_t length)
Definition: bau.cpp:134
virtual void functionPropertyExtCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t *data, uint8_t length)
Definition: bau.cpp:122
virtual void functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t *data, uint8_t length)
Definition: bau.cpp:114
virtual void memoryExtReadResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *data, bool status)
Definition: bau.cpp:227
virtual void userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint32_t memoryAddress, uint8_t *memoryData)
Definition: bau.cpp:271
virtual void memoryWriteLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t number, uint16_t memoryAddress, uint8_t *data, bool status)
Definition: bau.cpp:195
virtual void individualAddressWriteIndication(HopCountType hopType, const SecurityControl &secCtrl, uint16_t newaddress)
Definition: bau.cpp:31
virtual void propertyValueExtReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex)
Definition: bau.cpp:109
uint16_t sourceAddress() const
Definition: cemi_frame.cpp:303
APDU & apdu()
Definition: cemi_frame.cpp:367
void connectRequest(uint16_t destination, Priority priority)
void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU &apdu)
void dataGroupRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu)
Request to send an APDU that via multicast.
void dataConnectedRequest(uint16_t tsap, Priority priority, APDU &apdu)
void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU &apdu)
void disconnectRequest(uint16_t tsap, Priority priority)
void dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU &apdu)
ObjectType
Enum for the type of an interface object.
HopCountType
Definition: knx_types.h:124
@ NetworkLayerParameter
use NetworkLayer::hopCount as NPDU::hopCount
Definition: knx_types.h:126
Priority
Definition: knx_types.h:10
@ SystemPriority
Mainly used by ETS for device programming.
Definition: knx_types.h:14
EraseCode
Definition: knx_types.h:242
@ Void
Definition: knx_types.h:243
RestartType
Definition: knx_types.h:236
@ MasterReset
Definition: knx_types.h:238
ApduType
Definition: knx_types.h:142
@ MemoryRead
Definition: knx_types.h:187
@ PropertyExtDescriptionRead
Definition: knx_types.h:178
@ DomainAddressSerialNumberWrite
Definition: knx_types.h:167
@ DeviceDescriptorRead
Definition: knx_types.h:198
@ KeyResponse
Definition: knx_types.h:211
@ SystemNetworkParameterRead
Definition: knx_types.h:157
@ PropertyValueExtWriteUnCon
Definition: knx_types.h:177
@ PropertyValueExtRead
Definition: knx_types.h:173
@ RoutingTableRead
Definition: knx_types.h:203
@ UserMemoryRead
Definition: knx_types.h:190
@ IndividualAddressSerialNumberRead
Definition: knx_types.h:152
@ UserMemoryWrite
Definition: knx_types.h:192
@ FunctionPropertyExtStateResponse
Definition: knx_types.h:182
@ Restart
Definition: knx_types.h:200
@ PropertyExtDescriptionResponse
Definition: knx_types.h:179
@ MemoryExtWrite
Definition: knx_types.h:183
@ PropertyValueExtResponse
Definition: knx_types.h:174
@ PropertyValueRead
Definition: knx_types.h:212
@ FunctionPropertyCommand
Definition: knx_types.h:195
@ RoutingTableOpen
Definition: knx_types.h:202
@ IndividualAddressWrite
Definition: knx_types.h:149
@ UserManufacturerInfoResponse
Definition: knx_types.h:194
@ DomainAddressSerialNumberRead
Definition: knx_types.h:165
@ KeyWrite
Definition: knx_types.h:210
@ FunctionPropertyExtCommand
Definition: knx_types.h:180
@ AuthorizeRequest
Definition: knx_types.h:208
@ FunctionPropertyStateResponse
Definition: knx_types.h:197
@ MemoryResponse
Definition: knx_types.h:188
@ MemoryExtWriteResponse
Definition: knx_types.h:184
@ PropertyValueResponse
Definition: knx_types.h:213
@ PropertyValueExtWriteConResponse
Definition: knx_types.h:176
@ IndividualAddressRead
Definition: knx_types.h:150
@ DeviceDescriptorResponse
Definition: knx_types.h:199
@ MemoryRouterWrite
Definition: knx_types.h:206
@ ADCResponse
Definition: knx_types.h:172
@ IndividualAddressSerialNumberResponse
Definition: knx_types.h:153
@ RoutingTableWrite
Definition: knx_types.h:205
@ ADCRead
Definition: knx_types.h:171
@ PropertyDescriptionResponse
Definition: knx_types.h:216
@ FunctionPropertyExtState
Definition: knx_types.h:181
@ MemoryExtRead
Definition: knx_types.h:185
@ RoutingTableReadResponse
Definition: knx_types.h:204
@ GroupValueResponse
Definition: knx_types.h:145
@ DomainAddressSerialNumberResponse
Definition: knx_types.h:166
@ UserMemoryResponse
Definition: knx_types.h:191
@ FunctionPropertyState
Definition: knx_types.h:196
@ PropertyDescriptionRead
Definition: knx_types.h:215
@ RestartMasterReset
Definition: knx_types.h:201
@ PropertyValueExtWriteCon
Definition: knx_types.h:175
@ IndividualAddressResponse
Definition: knx_types.h:151
@ MemoryRouterReadResponse
Definition: knx_types.h:207
@ IndividualAddressSerialNumberWrite
Definition: knx_types.h:154
@ MemoryExtReadResponse
Definition: knx_types.h:186
@ PropertyValueWrite
Definition: knx_types.h:214
@ GroupValueWrite
Definition: knx_types.h:146
@ MemoryWrite
Definition: knx_types.h:189
@ AuthorizeResponse
Definition: knx_types.h:209
@ GroupValueRead
Definition: knx_types.h:144
@ UserManufacturerInfoRead
Definition: knx_types.h:193
@ SystemNetworkParameterResponse
Definition: knx_types.h:158
AckType
Definition: knx_types.h:18
@ AckRequested
We want a DataLinkLayer acknowledgement.
Definition: knx_types.h:20
@ AckDontCare
We don't care about DataLinkLayer acknowledgement.
Definition: knx_types.h:19
@ None
Definition: knx_types.h:224
ReturnCodes
Definition: knx_types.h:81
@ SuccessWithCrc
Definition: knx_types.h:84
@ Success
Definition: knx_types.h:83