save work

This commit is contained in:
Nanosonde 2020-07-19 12:28:35 +02:00
parent d25b9cec65
commit c7a7a2d121
19 changed files with 374 additions and 137 deletions

View File

@ -18,9 +18,6 @@ Bau091A::Bau091A(Platform& platform)
_cemiServer(*this)
#endif
{
// TODO: setup callback for address check on TP1 medium which supports ACK
//_dlLayerSecondary.setAckRequiredCallback();
// Before accessing anything of the two router objects they have to be initialized according to the used media combination
_rtObjPrimary.initialize(1, DptMedium::KNX_IP, true, false, 201);
_rtObjSecondary.initialize(2, DptMedium::KNX_TP1, false, true, 201);

149
src/knx/bau2920.cpp Normal file
View File

@ -0,0 +1,149 @@
#include "config.h"
#include "bau2920.h"
#include "bits.h"
#include <string.h>
#include <stdio.h>
#if defined(USE_TP) && defined (USE_RF)
using namespace std;
Bau2920::Bau2920(Platform& platform)
: BauSystemBCoupler(platform),
_rfMediumObject(),
_dlLayerPrimary(_deviceObj, _netLayer.getEntity(0), _platform, (ITpUartCallBacks&) *this),
_dlLayerSecondary(_deviceObj, _rfMediumObject, _netLayer.getEntity(1), platform)
#ifdef USE_CEMI_SERVER
,
_cemiServer(*this)
#endif
{
// Before accessing anything of the two router objects they have to be initialized according to the used media combination
_rtObjPrimary.initialize(1, DptMedium::KNX_TP1, true, false, 201);
_rtObjSecondary.initialize(2, DptMedium::KNX_RF, false, true, 201);
_netLayer.getEntity(0).dataLinkLayer(_dlLayerPrimary);
_netLayer.getEntity(1).dataLinkLayer(_dlLayerSecondary);
#ifdef USE_CEMI_SERVER
_cemiServerObject.setMediumTypeAsSupported(DptMedium::KNX_TP1);
_cemiServerObject.setMediumTypeAsSupported(DptMedium::KNX_RF);
_cemiServer.dataLinkLayer(_dlLayerSecondary); // Secondary I/F is the important one!
_dlLayerSecondary.cemiServer(_cemiServer);
_memory.addSaveRestore(&_cemiServerObject);
#endif
_memory.addSaveRestore(&_rtObjPrimary);
_memory.addSaveRestore(&_rtObjSecondary);
_memory.addSaveRestore(&_rfMediumObject);
// Set Mask Version in Device Object depending on the BAU
_deviceObj.maskVersion(0x2920);
// Set which interface objects are available in the device object
// This differs from BAU to BAU with different medium types.
// See PID_IO_LIST
Property* prop = _deviceObj.property(PID_IO_LIST);
prop->write(1, (uint16_t) OT_DEVICE);
prop->write(2, (uint16_t) OT_ROUTER);
prop->write(3, (uint16_t) OT_ROUTER);
prop->write(3, (uint16_t) OT_APPLICATION_PROG);
prop->write(4, (uint16_t) OT_RF_MEDIUM);
#if defined(USE_DATASECURE) && defined(USE_CEMI_SERVER)
prop->write(5, (uint16_t) OT_SECURITY);
prop->write(6, (uint16_t) OT_CEMI_SERVER);
#elif defined(USE_DATASECURE)
prop->write(5, (uint16_t) OT_SECURITY);
#elif defined(USE_CEMI_SERVER)
prop->write(5, (uint16_t) OT_CEMI_SERVER);
#endif
}
InterfaceObject* Bau2920::getInterfaceObject(uint8_t idx)
{
switch (idx)
{
case 0:
return &_deviceObj;
case 1:
return &_rtObjPrimary;
case 2:
return &_rtObjSecondary;
case 3:
return &_appProgram;
case 4:
return &_rfMediumObject;
#if defined(USE_DATASECURE) && defined(USE_CEMI_SERVER)
case 5:
return &_secIfObj;
case 6:
return &_cemiServerObject;
#elif defined(USE_CEMI_SERVER)
case 5:
return &_cemiServerObject;
#elif defined(USE_DATASECURE)
case 5:
return &_secIfObj;
#endif
default:
return nullptr;
}
}
InterfaceObject* Bau2920::getInterfaceObject(ObjectType objectType, uint8_t objectInstance)
{
// We do not use it right now.
// Required for coupler mode as there are multiple router objects for example
(void) objectInstance;
switch (objectType)
{
case OT_DEVICE:
return &_deviceObj;
case OT_ROUTER:
return objectInstance == 0 ? &_rtObjPrimary : &_rtObjSecondary;
case OT_APPLICATION_PROG:
return &_appProgram;
case OT_RF_MEDIUM:
return &_rfMediumObject;
#ifdef USE_DATASECURE
case OT_SECURITY:
return &_secIfObj;
#endif
#ifdef USE_CEMI_SERVER
case OT_CEMI_SERVER:
return &_cemiServerObject;
#endif
default:
return nullptr;
}
}
void Bau2920::doMasterReset(EraseCode eraseCode, uint8_t channel)
{
// Common SystemB objects
BauSystemBCoupler::doMasterReset(eraseCode, channel);
_rfMediumObject.masterReset(eraseCode, channel);
}
bool Bau2920::enabled()
{
return _dlLayerPrimary.enabled() && _dlLayerSecondary.enabled();
}
void Bau2920::enabled(bool value)
{
_dlLayerPrimary.enabled(value);
_dlLayerSecondary.enabled(value);
}
void Bau2920::loop()
{
_dlLayerPrimary.loop();
_dlLayerSecondary.loop();
BauSystemBCoupler::loop();
}
#endif

34
src/knx/bau2920.h Normal file
View File

@ -0,0 +1,34 @@
#pragma once
#include "config.h"
#if defined(USE_TP) && defined (USE_RF)
#include "bau_systemB_coupler.h"
#include "tpuart_data_link_layer.h"
#include "rf_physical_layer.h"
#include "rf_data_link_layer.h"
#include "rf_medium_object.h"
#include "cemi_server_object.h"
class Bau2920 : public BauSystemBCoupler
{
public:
Bau2920(Platform& platform);
virtual void loop() override;
virtual bool enabled() override;
virtual void enabled(bool value) override;
protected:
InterfaceObject* getInterfaceObject(uint8_t idx);
InterfaceObject* getInterfaceObject(ObjectType objectType, uint8_t objectInstance);
virtual void doMasterReset(EraseCode eraseCode, uint8_t channel) override;
private:
RfMediumObject _rfMediumObject;
TpUartDataLinkLayer _dlLayerPrimary;
RfDataLinkLayer _dlLayerSecondary;
#ifdef USE_CEMI_SERVER
CemiServer _cemiServer;
CemiServerObject _cemiServerObject;
#endif
};
#endif

View File

@ -14,7 +14,7 @@ BauSystemBCoupler::BauSystemBCoupler(Platform& platform) :
_appLayer(*this),
#endif
_transLayer(_appLayer),
_netLayer(_deviceObj, _transLayer)
_netLayer(_deviceObj, _rtObjPrimary, _rtObjSecondary, _transLayer)
{
_appLayer.transportLayer(_transLayer);
_transLayer.networkLayer(_netLayer);

View File

@ -29,7 +29,7 @@ class DataLinkLayer
virtual void loop() = 0;
virtual void enabled(bool value) = 0;
virtual bool enabled() const = 0;
virtual bool isOpenMedium() const = 0;
virtual DptMedium mediumType() const = 0;
protected:
void frameRecieved(CemiFrame& frame);

View File

@ -99,9 +99,9 @@ bool IpDataLinkLayer::enabled() const
return _enabled;
}
bool IpDataLinkLayer::isOpenMedium() const
DptMedium IpDataLinkLayer::mediumType() const
{
return false;
return DptMedium::KNX_IP;
}
bool IpDataLinkLayer::sendBytes(uint8_t* bytes, uint16_t length)

View File

@ -17,7 +17,7 @@ class IpDataLinkLayer : public DataLinkLayer
void loop();
void enabled(bool value);
bool enabled() const;
virtual bool isOpenMedium() const override;
virtual DptMedium mediumType() const override;
private:
bool _enabled = false;

View File

@ -11,18 +11,6 @@ NetworkLayer::NetworkLayer(DeviceObject &deviceObj, TransportLayer& layer) :
_transportLayer(layer)
{
_hopCount = _deviceObj.defaultHopCount();
if ((_deviceObj.induvidualAddress() & 0x00FF) == 0x00)
{
if ((_deviceObj.induvidualAddress() & 0x0F00) == 0x0)
{
// Device is a backbone coupler -> individual address: x.0.0
}
else
{
// Device is a line coupler -> individual address: x.y.0
}
}
}
uint8_t NetworkLayer::hopCount() const
@ -49,93 +37,3 @@ bool NetworkLayer::isApciSystemBroadcast(APDU& apdu)
return false;
}
void NetworkLayer::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
// Only for devices which are not a coupler
if (addrType == InduvidualAddress && destination != _deviceObj.induvidualAddress())
return;
// TODO: remove. getTSAP() will return 0 later anyway. Get rid of dependency to GAT
//if (addrType == GroupAddress && !_groupAddressTable.contains(destination))
// return;
// if (frame.npdu().octetCount() > 0)
// {
// _print("-> DLL ");
// frame.apdu().printPDU();
// }
if (addrType == InduvidualAddress)
{
//if (npdu.octetCount() > 0)
//{
// print.print("<- NL ");
// npdu.frame().apdu().printPDU();
//}
_transportLayer.dataIndividualIndication(destination, hopType, priority, source, npdu.tpdu());
return;
}
// group-address type
if (destination != 0)
{
_transportLayer.dataGroupIndication(destination, hopType, priority, source, npdu.tpdu());
return;
}
// destination == 0
_transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu());
}
void NetworkLayer::dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
if (addressType == InduvidualAddress)
{
_transportLayer.dataIndividualConfirm(ack, destination, hopType, priority, npdu.tpdu(), status);
return;
}
// group-address type
if (destination != 0)
{
_transportLayer.dataGroupConfirm(ack, source, destination, hopType, priority, npdu.tpdu(), status);
return;
}
// destination == 0
_transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status);
}
void NetworkLayer::broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
DataLinkLayer& dlLayer = getEntity(npdu.frame().sourceInterface()).dataLinkLayer();
// for closed media like TP1 and IP
if (!dlLayer.isOpenMedium() && isApciSystemBroadcast(npdu.tpdu().apdu()))
{
npdu.frame().systemBroadcast(SysBroadcast);
_transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
return;
}
_transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu());
}
void NetworkLayer::broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status);
}
void NetworkLayer::systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
}
void NetworkLayer::systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastConfirm(ack, hopType, npdu.tpdu(), priority, status);
}

View File

@ -29,20 +29,20 @@ class NetworkLayer
protected:
DeviceObject& _deviceObj;
TransportLayer& _transportLayer;
// from entities
virtual void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source);
Priority priority, uint16_t source) = 0;
virtual void dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority,
uint16_t source, NPDU& npdu, bool status);
uint16_t source, NPDU& npdu, bool status) = 0;
virtual void broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source);
virtual void broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status);
Priority priority, uint16_t source) = 0;
virtual void broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) = 0;
virtual void systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source);
virtual void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status);
Priority priority, uint16_t source) = 0;
virtual void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) = 0;
private:
TransportLayer& _transportLayer;
uint8_t _hopCount; // Network Layer Parameter hop_count for the device's own outgoing frames (default value from PID_ROUTING_COUNT)
};

View File

@ -1,13 +1,30 @@
#include "network_layer_coupler.h"
#include "device_object.h"
#include "router_object.h"
#include "tpdu.h"
#include "cemi_frame.h"
#include "bits.h"
NetworkLayerCoupler::NetworkLayerCoupler(DeviceObject &deviceObj, TransportLayer& layer) :
NetworkLayerCoupler::NetworkLayerCoupler(DeviceObject &deviceObj,
RouterObject& rtObjPrimary,
RouterObject& rtObjSecondary,
TransportLayer& layer) :
NetworkLayer(deviceObj, layer),
_netLayerEntities { {*this, 0}, {*this, 1} }
_netLayerEntities { {*this, 0}, {*this, 1} },
_rtObjPrimary(rtObjPrimary),
_rtObjSecondary(rtObjSecondary)
{
if ((_deviceObj.induvidualAddress() & 0x00FF) == 0x00)
{
if ((_deviceObj.induvidualAddress() & 0x0F00) == 0x0)
{
// Device is a backbone coupler -> individual address: x.0.0
}
else
{
// Device is a line coupler -> individual address: x.y.0
}
}
}
NetworkLayerEntity& NetworkLayerCoupler::getEntity(uint8_t interfaceIndex)
@ -17,47 +34,86 @@ NetworkLayerEntity& NetworkLayerCoupler::getEntity(uint8_t interfaceIndex)
void NetworkLayerCoupler::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
// TODO: implement routing
// Check if received frame is for us, we are a normal device in this case
if (addrType == InduvidualAddress && destination == _deviceObj.induvidualAddress())
{
NetworkLayer::dataIndication(ack, addrType, destination, format, npdu, priority, source);
// Do not process the frame any further
_transportLayer.dataIndividualIndication(destination, hopType, priority, source, npdu.tpdu());
return;
}
// group-address type
if (destination != 0)
{
_transportLayer.dataGroupIndication(destination, hopType, priority, source, npdu.tpdu());
return;
}
// TODO: implement routing
}
void NetworkLayerCoupler::dataConfirm(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
// Check if received frame is an echo from our sent frame, we are a normal device in this case
if (source == _deviceObj.induvidualAddress())
{
NetworkLayer::dataConfirm(ack, addrType, destination, format, priority, source, npdu, status);
if (addrType == InduvidualAddress)
{
_transportLayer.dataIndividualConfirm(ack, destination, hopType, priority, npdu.tpdu(), status);
return;
}
// group-address type
if (destination != 0)
{
_transportLayer.dataGroupConfirm(ack, source, destination, hopType, priority, npdu.tpdu(), status);
return;
}
}
// Do not process the frame any further
// Do not process the frame any further if it was a routed frame sent from network layer
}
void NetworkLayerCoupler::broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
NetworkLayer::broadcastIndication(ack, format, npdu, priority, source);
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
uint8_t sourceInterfaceIndex = npdu.frame().sourceInterface();
DptMedium mediumType = getEntity(sourceInterfaceIndex).mediumType();
// for closed media like TP1 and IP
if ( ((mediumType == DptMedium::KNX_TP1) || (mediumType == DptMedium::KNX_IP)) &&
isApciSystemBroadcast(npdu.tpdu().apdu()))
{
npdu.frame().systemBroadcast(SysBroadcast);
_transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
return;
}
_transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu());
// TODO: implement routing
}
void NetworkLayerCoupler::broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
// Check if received frame is an echo from our sent frame, we are a normal device in this case
if (source == _deviceObj.induvidualAddress())
{
NetworkLayer::broadcastConfirm(ack, format, priority, source, npdu, status);
_transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status);
}
// Do not process the frame any further
}
void NetworkLayerCoupler::systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
NetworkLayer::systemBroadcastIndication(ack, format, npdu, priority, source);
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
// TODO: implement routing
}
@ -67,7 +123,8 @@ void NetworkLayerCoupler::systemBroadcastConfirm(AckType ack, FrameFormat format
// Check if received frame is an echo from our sent frame, we are a normal device in this case
if (source == _deviceObj.induvidualAddress())
{
NetworkLayer::systemBroadcastConfirm(ack, format, priority, source, npdu, status);
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastConfirm(ack, hopType, npdu.tpdu(), priority, status);
}
// Do not process the frame any further
}

View File

@ -8,13 +8,15 @@
#include "network_layer.h"
class DeviceObject;
class RouterObject;
class NetworkLayerCoupler : public NetworkLayer
{
friend class NetworkLayerEntity;
public:
NetworkLayerCoupler(DeviceObject& deviceObj, TransportLayer& layer);
NetworkLayerCoupler(DeviceObject& deviceObj, RouterObject& rtObjPrimary,
RouterObject& rtObjSecondary, TransportLayer& layer);
virtual NetworkLayerEntity& getEntity(uint8_t interfaceIndex) override;
@ -39,4 +41,7 @@ class NetworkLayerCoupler : public NetworkLayer
// Support a maximum of two physical interfaces for couplers
NetworkLayerEntity _netLayerEntities[2];
RouterObject& _rtObjPrimary;
RouterObject& _rtObjSecondary;
};

View File

@ -58,6 +58,10 @@ void NetworkLayerDevice::dataBroadcastRequest(AckType ack, HopCountType hopType,
void NetworkLayerDevice::dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu)
{
// for closed media like TP1 and IP
bool isClosedMedium = (getEntity(0).mediumType() == DptMedium::KNX_TP1) || (getEntity(0).mediumType() == DptMedium::KNX_IP);
SystemBroadcast broadcastType = (isClosedMedium && isApciSystemBroadcast(tpdu.apdu()) ? Broadcast : SysBroadcast);
NPDU& npdu = tpdu.frame().npdu();
if (hopType == UnlimitedRouting)
@ -65,5 +69,79 @@ void NetworkLayerDevice::dataSystemBroadcastRequest(AckType ack, HopCountType ho
else
npdu.hopCount(hopCount());
_netLayerEntities[0].sendDataRequest(npdu, ack, 0, priority, GroupAddress, SysBroadcast);
_netLayerEntities[0].sendDataRequest(npdu, ack, 0, priority, GroupAddress, broadcastType);
}
void NetworkLayerDevice::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
if (addrType == InduvidualAddress)
{
if (destination != _deviceObj.induvidualAddress())
return;
_transportLayer.dataIndividualIndication(destination, hopType, priority, source, npdu.tpdu());
return;
}
// group-address type
if (destination != 0)
{
_transportLayer.dataGroupIndication(destination, hopType, priority, source, npdu.tpdu());
return;
}
}
void NetworkLayerDevice::dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
if (addressType == InduvidualAddress)
{
_transportLayer.dataIndividualConfirm(ack, destination, hopType, priority, npdu.tpdu(), status);
return;
}
// group-address type
if (destination != 0)
{
_transportLayer.dataGroupConfirm(ack, source, destination, hopType, priority, npdu.tpdu(), status);
return;
}
}
void NetworkLayerDevice::broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
uint8_t sourceInterfaceIndex = npdu.frame().sourceInterface();
DptMedium mediumType = getEntity(sourceInterfaceIndex).mediumType();
// for closed media like TP1 and IP
if ( ((mediumType == DptMedium::KNX_TP1) || (mediumType == DptMedium::KNX_IP)) &&
isApciSystemBroadcast(npdu.tpdu().apdu()))
{
npdu.frame().systemBroadcast(SysBroadcast);
_transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
return;
}
_transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu());
}
void NetworkLayerDevice::broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status);
}
void NetworkLayerDevice::systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
}
void NetworkLayerDevice::systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status)
{
HopCountType hopType = npdu.hopCount() == 7 ? UnlimitedRouting : NetworkLayerParameter;
_transportLayer.dataSystemBroadcastConfirm(ack, hopType, npdu.tpdu(), priority, status);
}

View File

@ -25,6 +25,18 @@ class NetworkLayerDevice : public NetworkLayer
virtual void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu) override;
private:
// Support only physical interface for normal devices
// from entities
virtual void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source) override;
virtual void dataConfirm(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, Priority priority,
uint16_t source, NPDU& npdu, bool status) override;
virtual void broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source) override;
virtual void broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) override;
virtual void systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source) override;
virtual void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status) override;
// Support only a single physical interface for normal devices
NetworkLayerEntity _netLayerEntities[1];
};

View File

@ -19,6 +19,11 @@ DataLinkLayer& NetworkLayerEntity::dataLinkLayer()
return *_dataLinkLayer;
}
DptMedium NetworkLayerEntity::mediumType() const
{
return _dataLinkLayer->mediumType();
}
void NetworkLayerEntity::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{
npdu.frame().sourceInterface(_entityIndex);

View File

@ -18,6 +18,8 @@ class NetworkLayerEntity
void dataLinkLayer(DataLinkLayer& layer);
DataLinkLayer& dataLinkLayer();
DptMedium mediumType() const;
// from data link layer
void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,
Priority priority, uint16_t source);

View File

@ -269,9 +269,9 @@ bool RfDataLinkLayer::enabled() const
return _enabled;
}
bool RfDataLinkLayer::isOpenMedium() const
DptMedium RfDataLinkLayer::mediumType() const
{
return true;
return DptMedium::KNX_RF;
}
void RfDataLinkLayer::fillRfFrame(CemiFrame& frame, uint8_t* data)

View File

@ -25,7 +25,7 @@ class RfDataLinkLayer : public DataLinkLayer
void loop();
void enabled(bool value);
bool enabled() const;
virtual bool isOpenMedium() const override;
virtual DptMedium mediumType() const override;
private:
bool _enabled = false;

View File

@ -466,9 +466,9 @@ bool TpUartDataLinkLayer::enabled() const
return _enabled;
}
bool TpUartDataLinkLayer::isOpenMedium() const
DptMedium TpUartDataLinkLayer::mediumType() const
{
return false;
return DptMedium::KNX_TP1;
}
bool TpUartDataLinkLayer::sendSingleFrameByte()

View File

@ -27,7 +27,7 @@ class TpUartDataLinkLayer : public DataLinkLayer
void loop();
void enabled(bool value);
bool enabled() const;
virtual bool isOpenMedium() const override;
virtual DptMedium mediumType() const override;
private:
bool _enabled = false;