Merge pull request #264 from OpenKNX/feature_activitycallback

Add activity callback function
This commit is contained in:
thelsing 2023-12-26 21:24:55 +01:00 committed by GitHub
commit 7215f470af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 108 additions and 14 deletions

View File

@ -10,7 +10,8 @@ using namespace std;
Bau07B0::Bau07B0(Platform& platform) Bau07B0::Bau07B0(Platform& platform)
: BauSystemBDevice(platform), : BauSystemBDevice(platform),
_dlLayer(_deviceObj, _netLayer.getInterface(), _platform, (ITpUartCallBacks&) *this) _dlLayer(_deviceObj, _netLayer.getInterface(), _platform, (ITpUartCallBacks&) *this, (DataLinkLayerCallbacks*) this),
DataLinkLayerCallbacks()
#ifdef USE_CEMI_SERVER #ifdef USE_CEMI_SERVER
, _cemiServer(*this) , _cemiServer(*this)
#endif #endif

View File

@ -8,7 +8,7 @@
#include "cemi_server.h" #include "cemi_server.h"
#include "cemi_server_object.h" #include "cemi_server_object.h"
class Bau07B0 : public BauSystemBDevice, public ITpUartCallBacks class Bau07B0 : public BauSystemBDevice, public ITpUartCallBacks, public DataLinkLayerCallbacks
{ {
public: public:
Bau07B0(Platform& platform); Bau07B0(Platform& platform);

View File

@ -12,8 +12,9 @@ Bau091A::Bau091A(Platform& platform)
: BauSystemBCoupler(platform), : BauSystemBCoupler(platform),
_routerObj(memory()), _routerObj(memory()),
_ipParameters(_deviceObj, platform), _ipParameters(_deviceObj, platform),
_dlLayerPrimary(_deviceObj, _ipParameters, _netLayer.getPrimaryInterface(), _platform), _dlLayerPrimary(_deviceObj, _ipParameters, _netLayer.getPrimaryInterface(), _platform, (DataLinkLayerCallbacks*) this),
_dlLayerSecondary(_deviceObj, _netLayer.getSecondaryInterface(), platform, (ITpUartCallBacks&) *this) _dlLayerSecondary(_deviceObj, _netLayer.getSecondaryInterface(), platform, (ITpUartCallBacks&) *this, (DataLinkLayerCallbacks*) this),
DataLinkLayerCallbacks()
#ifdef USE_CEMI_SERVER #ifdef USE_CEMI_SERVER
, ,
_cemiServer(*this) _cemiServer(*this)

View File

@ -10,7 +10,7 @@
#include "tpuart_data_link_layer.h" #include "tpuart_data_link_layer.h"
#include "cemi_server_object.h" #include "cemi_server_object.h"
class Bau091A : public BauSystemBCoupler, public ITpUartCallBacks class Bau091A : public BauSystemBCoupler, public ITpUartCallBacks, public DataLinkLayerCallbacks
{ {
public: public:
Bau091A(Platform& platform); Bau091A(Platform& platform);

View File

@ -11,7 +11,8 @@ using namespace std;
Bau57B0::Bau57B0(Platform& platform) Bau57B0::Bau57B0(Platform& platform)
: BauSystemBDevice(platform), : BauSystemBDevice(platform),
_ipParameters(_deviceObj, platform), _ipParameters(_deviceObj, platform),
_dlLayer(_deviceObj, _ipParameters, _netLayer.getInterface(), _platform) _dlLayer(_deviceObj, _ipParameters, _netLayer.getInterface(), _platform, (DataLinkLayerCallbacks*) this),
DataLinkLayerCallbacks()
#ifdef USE_CEMI_SERVER #ifdef USE_CEMI_SERVER
, ,
_cemiServer(*this) _cemiServer(*this)

View File

@ -8,7 +8,7 @@
#include "ip_data_link_layer.h" #include "ip_data_link_layer.h"
#include "cemi_server_object.h" #include "cemi_server_object.h"
class Bau57B0 : public BauSystemBDevice class Bau57B0 : public BauSystemBDevice, public DataLinkLayerCallbacks
{ {
public: public:
Bau57B0(Platform& platform); Bau57B0(Platform& platform);

View File

@ -94,6 +94,14 @@ void printHex(const char* suffix, const uint8_t *data, size_t length, bool newli
#define printHex(...) do {} while(0) #define printHex(...) do {} while(0)
#endif #endif
#ifdef KNX_ACTIVITYCALLBACK
#define KNX_ACTIVITYCALLBACK_DIR 0x00
#define KNX_ACTIVITYCALLBACK_DIR_RECV 0x00
#define KNX_ACTIVITYCALLBACK_DIR_SEND 0x01
#define KNX_ACTIVITYCALLBACK_IPUNICAST 0x02
#define KNX_ACTIVITYCALLBACK_NET 0x04
#endif
const uint8_t* popByte(uint8_t& b, const uint8_t* data); const uint8_t* popByte(uint8_t& b, const uint8_t* data);
const uint8_t* popWord(uint16_t& w, const uint8_t* data); const uint8_t* popWord(uint16_t& w, const uint8_t* data);
const uint8_t* popInt(uint32_t& i, const uint8_t* data); const uint8_t* popInt(uint32_t& i, const uint8_t* data);

View File

@ -6,9 +6,24 @@
#include "cemi_server.h" #include "cemi_server.h"
#include "cemi_frame.h" #include "cemi_frame.h"
void DataLinkLayerCallbacks::activity(uint8_t info)
{
if(_activityCallback)
_activityCallback(info);
}
void DataLinkLayerCallbacks::setActivityCallback(ActivityCallback activityCallback)
{
_activityCallback = activityCallback;
}
DataLinkLayer::DataLinkLayer(DeviceObject& devObj, NetworkLayerEntity& netLayerEntity, Platform& platform) : DataLinkLayer::DataLinkLayer(DeviceObject& devObj, NetworkLayerEntity& netLayerEntity, Platform& platform) :
_deviceObject(devObj), _networkLayerEntity(netLayerEntity), _platform(platform) _deviceObject(devObj), _networkLayerEntity(netLayerEntity), _platform(platform)
{ {
#ifdef KNX_ACTIVITYCALLBACK
_netIndex = netLayerEntity.getEntityIndex();
#endif
} }
#ifdef USE_CEMI_SERVER #ifdef USE_CEMI_SERVER

View File

@ -10,6 +10,18 @@
class Platform; class Platform;
typedef void (*ActivityCallback)(uint8_t info);
class DataLinkLayerCallbacks
{
protected:
ActivityCallback _activityCallback = nullptr;
public:
virtual ~DataLinkLayerCallbacks() = default;
virtual void activity(uint8_t info);
virtual void setActivityCallback(ActivityCallback activityCallback);
};
class DataLinkLayer class DataLinkLayer
{ {
public: public:
@ -43,4 +55,7 @@ class DataLinkLayer
#ifdef USE_CEMI_SERVER #ifdef USE_CEMI_SERVER
CemiServer* _cemiServer; CemiServer* _cemiServer;
#endif #endif
#ifdef KNX_ACTIVITYCALLBACK
uint8_t _netIndex = 0;
#endif
}; };

View File

@ -19,7 +19,7 @@
#define MIN_LEN_CEMI 10 #define MIN_LEN_CEMI 10
IpDataLinkLayer::IpDataLinkLayer(DeviceObject& devObj, IpParameterObject& ipParam, IpDataLinkLayer::IpDataLinkLayer(DeviceObject& devObj, IpParameterObject& ipParam,
NetworkLayerEntity &netLayerEntity, Platform& platform) : DataLinkLayer(devObj, netLayerEntity, platform), _ipParameters(ipParam) NetworkLayerEntity &netLayerEntity, Platform& platform, DataLinkLayerCallbacks* dllcb) : DataLinkLayer(devObj, netLayerEntity, platform), _ipParameters(ipParam), _dllcb(dllcb)
{ {
} }
@ -30,6 +30,10 @@ bool IpDataLinkLayer::sendFrame(CemiFrame& frame)
if(isSendLimitReached()) if(isSendLimitReached())
return false; return false;
bool success = sendBytes(packet.data(), packet.totalLength()); bool success = sendBytes(packet.data(), packet.totalLength());
#ifdef KNX_ACTIVITYCALLBACK
if(_dllcb)
_dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR));
#endif
dataConReceived(frame, success); dataConReceived(frame, success);
return success; return success;
} }
@ -51,6 +55,11 @@ void IpDataLinkLayer::loop()
|| buffer[1] != KNXIP_PROTOCOL_VERSION) || buffer[1] != KNXIP_PROTOCOL_VERSION)
return; return;
#ifdef KNX_ACTIVITYCALLBACK
if(_dllcb)
_dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_RECV << KNX_ACTIVITYCALLBACK_DIR));
#endif
uint16_t code; uint16_t code;
popWord(code, buffer + 2); popWord(code, buffer + 2);
switch ((KnxIpServiceType)code) switch ((KnxIpServiceType)code)
@ -67,6 +76,10 @@ void IpDataLinkLayer::loop()
KnxIpSearchResponse searchResponse(_ipParameters, _deviceObject); KnxIpSearchResponse searchResponse(_ipParameters, _deviceObject);
auto hpai = searchRequest.hpai(); auto hpai = searchRequest.hpai();
#ifdef KNX_ACTIVITYCALLBACK
if(_dllcb)
_dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR) | (KNX_ACTIVITYCALLBACK_IPUNICAST));
#endif
_platform.sendBytesUniCast(hpai.ipAddress(), hpai.ipPortNumber(), searchResponse.data(), searchResponse.totalLength()); _platform.sendBytesUniCast(hpai.ipAddress(), hpai.ipPortNumber(), searchResponse.data(), searchResponse.totalLength());
break; break;
} }

View File

@ -13,7 +13,7 @@ class IpDataLinkLayer : public DataLinkLayer
public: public:
IpDataLinkLayer(DeviceObject& devObj, IpParameterObject& ipParam, NetworkLayerEntity& netLayerEntity, IpDataLinkLayer(DeviceObject& devObj, IpParameterObject& ipParam, NetworkLayerEntity& netLayerEntity,
Platform& platform); Platform& platform, DataLinkLayerCallbacks* dllcb = nullptr);
void loop(); void loop();
void enabled(bool value); void enabled(bool value);
@ -30,5 +30,6 @@ class IpDataLinkLayer : public DataLinkLayer
bool isSendLimitReached(); bool isSendLimitReached();
IpParameterObject& _ipParameters; IpParameterObject& _ipParameters;
DataLinkLayerCallbacks* _dllcb;
}; };
#endif #endif

View File

@ -23,6 +23,11 @@ DptMedium NetworkLayerEntity::mediumType() const
return _dataLinkLayer->mediumType(); return _dataLinkLayer->mediumType();
} }
uint8_t NetworkLayerEntity::getEntityIndex()
{
return _entityIndex;
}
void NetworkLayerEntity::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source) void NetworkLayerEntity::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source)
{ {
_netLayer.dataIndication(ack, addrType, destination, format, npdu, priority, source, _entityIndex); _netLayer.dataIndication(ack, addrType, destination, format, npdu, priority, source, _entityIndex);

View File

@ -19,6 +19,7 @@ class NetworkLayerEntity
DataLinkLayer& dataLinkLayer(); DataLinkLayer& dataLinkLayer();
DptMedium mediumType() const; DptMedium mediumType() const;
uint8_t getEntityIndex();
// from data link layer // from data link layer
void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu, void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,

View File

@ -537,17 +537,22 @@ void TpUartDataLinkLayer::stopChip()
TpUartDataLinkLayer::TpUartDataLinkLayer(DeviceObject& devObj, TpUartDataLinkLayer::TpUartDataLinkLayer(DeviceObject& devObj,
NetworkLayerEntity &netLayerEntity, NetworkLayerEntity &netLayerEntity,
Platform& platform, Platform& platform,
ITpUartCallBacks& cb) ITpUartCallBacks& cb,
DataLinkLayerCallbacks* dllcb)
: DataLinkLayer(devObj, netLayerEntity, platform), : DataLinkLayer(devObj, netLayerEntity, platform),
_cb(cb) _cb(cb),
_dllcb(dllcb)
{ {
} }
void TpUartDataLinkLayer::frameBytesReceived(uint8_t* buffer, uint16_t length) void TpUartDataLinkLayer::frameBytesReceived(uint8_t* buffer, uint16_t length)
{ {
//printHex("=>", buffer, length); //printHex("=>", buffer, length);
#ifdef KNX_ACTIVITYCALLBACK
if(_dllcb)
_dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_RECV << KNX_ACTIVITYCALLBACK_DIR));
#endif
CemiFrame frame(buffer, length); CemiFrame frame(buffer, length);
frameReceived(frame); frameReceived(frame);
} }
@ -653,6 +658,10 @@ bool TpUartDataLinkLayer::sendSingleFrameByte()
if (_TxByteCnt >= _sendBufferLength) if (_TxByteCnt >= _sendBufferLength)
{ {
_TxByteCnt = 0; _TxByteCnt = 0;
#ifdef KNX_ACTIVITYCALLBACK
if(_dllcb)
_dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR));
#endif
return false; return false;
} }
return true; return true;

View File

@ -22,7 +22,9 @@ class TpUartDataLinkLayer : public DataLinkLayer
public: public:
TpUartDataLinkLayer(DeviceObject& devObj, NetworkLayerEntity& netLayerEntity, TpUartDataLinkLayer(DeviceObject& devObj, NetworkLayerEntity& netLayerEntity,
Platform& platform, ITpUartCallBacks& cb); Platform& platform, ITpUartCallBacks& cb, DataLinkLayerCallbacks* dllcb = nullptr);
void loop(); void loop();
void enabled(bool value); void enabled(bool value);
@ -74,5 +76,6 @@ class TpUartDataLinkLayer : public DataLinkLayer
void stopChip(); void stopChip();
ITpUartCallBacks& _cb; ITpUartCallBacks& _cb;
DataLinkLayerCallbacks* _dllcb;
}; };
#endif #endif

View File

@ -70,6 +70,9 @@ typedef uint8_t* (*SaveCallback)(uint8_t* buffer);
typedef void (*IsrFunctionPtr)(); typedef void (*IsrFunctionPtr)();
typedef void (*ProgLedOnCallback)(); typedef void (*ProgLedOnCallback)();
typedef void (*ProgLedOffCallback)(); typedef void (*ProgLedOffCallback)();
#ifdef KNX_ACTIVITYCALLBACK
typedef void (*ActivityCallback)(uint8_t info);
#endif
template <class P, class B> class KnxFacade : private SaveRestore template <class P, class B> class KnxFacade : private SaveRestore
{ {
@ -187,6 +190,21 @@ template <class P, class B> class KnxFacade : private SaveRestore
_progLedOnCallback = progLedOnCallback; _progLedOnCallback = progLedOnCallback;
} }
#ifdef KNX_ACTIVITYCALLBACK
/// @brief sets the Callback Function indicating sent or received telegrams
/// @param activityCallback
/// @details the info parameter
void setActivityCallback(ActivityCallback activityCallback)
{
_activityCallback = activityCallback;
}
void Activity(uint8_t info)
{
if(_activityCallback)
_activityCallback(info);
}
#endif
int32_t buttonPin() int32_t buttonPin()
{ {
@ -414,6 +432,9 @@ template <class P, class B> class KnxFacade : private SaveRestore
B& _bau; B& _bau;
ProgLedOnCallback _progLedOnCallback = 0; ProgLedOnCallback _progLedOnCallback = 0;
ProgLedOffCallback _progLedOffCallback = 0; ProgLedOffCallback _progLedOffCallback = 0;
#ifdef KNX_ACTIVITYCALLBACK
ActivityCallback _activityCallback = 0;
#endif
uint32_t _ledPinActiveOn = KNX_LED_ACTIVE_ON; uint32_t _ledPinActiveOn = KNX_LED_ACTIVE_ON;
uint32_t _ledPin = KNX_LED; uint32_t _ledPin = KNX_LED;
int32_t _buttonPin = KNX_BUTTON; int32_t _buttonPin = KNX_BUTTON;