11 _savedFrameConnecting(0), _applicationLayer(layer)
18 _networkLayer = &layer;
23 _groupAddressTable = &addrTable;
45 if (source == _connectionAddress)
47 if (sequenceNo == _seqNoRecv)
50 switch (_currentState)
58 A2(source, priority, tpdu.
apdu());
67 else if (sequenceNo == ((_seqNoRecv - 1) & 0xF))
70 switch (_currentState)
79 A3(source, priority, tpdu);
86 switch (_currentState)
94 A4(source, priority, tpdu);
106 switch (_currentState)
123 if (source == _connectionAddress)
126 switch (_currentState)
143 switch (_currentState)
161 if (source == _connectionAddress)
164 switch (_currentState)
190 if (source == _connectionAddress)
192 if (sequenceNo == _seqNoSend)
195 switch (_currentState)
216 switch (_currentState)
234 switch (_currentState)
248 if (source == _connectionAddress)
250 if (sequenceNo != _seqNoSend)
253 switch (_currentState)
269 if (_repCount < _maxRepCount)
272 switch (_currentState)
292 switch (_currentState)
311 switch (_currentState)
354 switch (_currentState)
371 switch (_currentState)
410 if (_groupAddressTable ==
nullptr)
413 uint16_t tsap = _groupAddressTable->
getTsap(destination);
448 if (_groupAddressTable ==
nullptr)
479 switch (_currentState)
483 A12(destination, priority);
498 switch (_currentState)
518 switch (_currentState)
531 A11(tsap, priority, apdu);
542 switch (_currentState)
552 A6(_connectionAddress);
559 if (_repCount < _maxRepCount)
562 switch (_currentState)
578 switch (_currentState)
588 A6(_connectionAddress);
599 return ((_seqNoSend & 0xF) << 2);
605 return _connectionAddress;
610 uint32_t milliseconds =
millis();
612 if (_connectionTimeoutEnabled
613 && (milliseconds - _connectionTimeoutStartMillis) > _connectionTimeoutMillis)
616 if (_ackTimeoutEnabled
617 && (milliseconds - _ackTimeoutStartMillis) > _ackTimeoutMillis)
620 if (_savedConnectingValid)
623 _savedConnectingValid =
false;
628 void TransportLayer::sendControlTelegram(
TpduType pduType, uint8_t seqNo)
631 TPDU& tpdu = frame.tpdu();
638 void TransportLayer::A0()
643 void TransportLayer::A1(uint16_t source)
645 _connectionAddress = source;
649 enableConnectionTimeout();
660 void TransportLayer::A2(uint16_t source,
Priority priority,
APDU& apdu)
662 sendControlTelegram(
Ack, _seqNoRecv);
665 enableConnectionTimeout();
668 void TransportLayer::A3(uint16_t source,
Priority priority,
TPDU& recTpdu)
671 enableConnectionTimeout();
674 void TransportLayer::A4(uint16_t source,
Priority priority,
TPDU& recTpdu)
677 enableConnectionTimeout();
680 void TransportLayer::A5(uint16_t tsap)
683 disableConnectionTimeout();
687 void TransportLayer::A6(uint16_t tsap)
691 disableConnectionTimeout();
697 _savedPriority = priority;
701 _savedFrame = apdu.
frame();
705 enableConnectionTimeout();
708 void TransportLayer::A8()
713 enableConnectionTimeout();
716 void TransportLayer::A9()
723 enableConnectionTimeout();
726 void TransportLayer::A10(uint16_t source)
729 TPDU& tpdu = frame.tpdu();
735 void TransportLayer::A11(uint16_t tsap,
Priority priority,
APDU& apdu)
737 _savedTsapConnecting = tsap;
738 _savedPriorityConnecting = priority;
739 _savedFrameConnecting = apdu.
frame();
740 _savedConnectingValid =
true;
743 void TransportLayer::A12(uint16_t destination,
Priority priority)
745 _connectionAddress = destination;
747 TPDU& tpdu = frame.tpdu();
752 enableConnectionTimeout();
755 void TransportLayer::A13(uint16_t destination)
760 void TransportLayer::A14(uint16_t tsap,
Priority priority)
763 TPDU& tpdu = frame.tpdu();
768 disableConnectionTimeout();
772 void TransportLayer::A15(
Priority priority, uint16_t tsap)
775 disableConnectionTimeout();
779 void TransportLayer::enableConnectionTimeout()
781 _connectionTimeoutStartMillis =
millis();
782 _connectionTimeoutEnabled =
true;
785 void TransportLayer::disableConnectionTimeout()
787 _connectionTimeoutEnabled =
false;
790 void TransportLayer::enableAckTimeout()
792 _ackTimeoutStartMillis =
millis();
793 _ackTimeoutEnabled =
true;
796 void TransportLayer::disableAckTimeout()
798 _ackTimeoutEnabled =
false;
This class represents an Application Protocol Data Unit.
CemiFrame & frame()
Get the CemiFrame this APDU is part of.
This class represents the group address table.
uint16_t getGroupAddress(uint16_t tsap)
Get the group address mapped to a TSAP.
uint16_t getTsap(uint16_t groupAddress)
Get the TSAP mapped to a group address.
This is an implementation of the application layer as specified in .
void disconnectConfirm(Priority priority, uint16_t tsap, bool status)
virtual void dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu)
virtual void dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu)
void disconnectIndication(uint16_t tsap)
void connectConfirm(uint16_t destination, uint16_t tsap, bool status)
void connectIndication(uint16_t tsap)
virtual void dataConnectedIndication(Priority priority, uint16_t tsap, APDU &apdu)
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.
virtual void dataSystemBroadcastConfirm(HopCountType hopType, Priority priority, APDU &apdu, bool status)
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)
virtual void dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU &apdu)
Somebody send us an APDU via multicast communication.
virtual void dataConnectedConfirm(uint16_t tsap)
virtual void dataIndividualIndication(HopCountType hopType, Priority priority, uint16_t source, APDU &apdu)
virtual void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu)=0
virtual void dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu)=0
virtual void dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu)=0
virtual void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu)=0
uint8_t sequenceNumber() const
void connectRequest(uint16_t destination, Priority priority)
void dataGroupIndication(uint16_t destination, HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
void dataSystemBroadcastConfirm(AckType ack, HopCountType hopType, TPDU &tpdu, Priority priority, bool status)
void dataIndividualIndication(uint16_t destination, HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, APDU &apdu)
void dataIndividualConfirm(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu, bool status)
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 networkLayer(NetworkLayer &layer)
void dataGroupConfirm(AckType ack, uint16_t source, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu, bool status)
void disconnectRequest(uint16_t tsap, Priority priority)
void dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
void dataIndividualRequest(AckType ack, HopCountType hopType, Priority priority, uint16_t destination, APDU &apdu)
void connectionTimeoutIndication()
void groupAddressTable(AddressTableObject &addrTable)
void dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu, bool status)
uint16_t getConnectionAddress()
void ackTimeoutIndication()
void dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
TransportLayer(ApplicationLayer &layer)
@ NetworkLayerParameter
use NetworkLayer::hopCount as NPDU::hopCount
@ SystemPriority
Mainly used by ETS for device programming.
@ AckRequested
We want a DataLinkLayer acknowledgement.
void incSeqNr(uint8_t &seqNr)