mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +01:00 
			
		
		
		
	Feature: additional callbacks for application (#189)
* Feature: additional callbacks for application - beforeRestart callback - beforeTablesUnload callback * naming conventions for PR Co-authored-by: Waldemar Porscha <waldemar.porscha@sap.com>
This commit is contained in:
		
							parent
							
								
									145c354110
								
							
						
					
					
						commit
						a10fa20bde
					
				@ -19,7 +19,8 @@ AddressTableObject::AddressTableObject(Memory& memory)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
uint16_t AddressTableObject::entryCount()
 | 
					uint16_t AddressTableObject::entryCount()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (loadState() != LS_LOADED)
 | 
					    // after programming without GA the module hangs
 | 
				
			||||||
 | 
					    if (loadState() != LS_LOADED || _groupAddresses[0] == 0xFFFF)
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ntohs(_groupAddresses[0]);
 | 
					    return ntohs(_groupAddresses[0]);
 | 
				
			||||||
@ -67,6 +68,7 @@ bool AddressTableObject::contains(uint16_t addr)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void AddressTableObject::beforeStateChange(LoadState& newState)
 | 
					void AddressTableObject::beforeStateChange(LoadState& newState)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    TableObject::beforeStateChange(newState);
 | 
				
			||||||
    if (newState != LS_LOADED)
 | 
					    if (newState != LS_LOADED)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -60,6 +60,7 @@ int32_t AssociationTableObject::translateAsap(uint16_t asap)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void AssociationTableObject::beforeStateChange(LoadState& newState)
 | 
					void AssociationTableObject::beforeStateChange(LoadState& newState)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    TableObject::beforeStateChange(newState);
 | 
				
			||||||
    if (newState != LS_LOADED)
 | 
					    if (newState != LS_LOADED)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -338,3 +338,12 @@ void BusAccessUnit::propertyValueWrite(ObjectType objectType, uint8_t objectInst
 | 
				
			|||||||
                                       uint8_t* data, uint32_t length)
 | 
					                                       uint8_t* data, uint32_t length)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BusAccessUnit::beforeRestartCallback(BeforeRestartCallback func)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BeforeRestartCallback BusAccessUnit::beforeRestartCallback()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,8 @@
 | 
				
			|||||||
#include "knx_types.h"
 | 
					#include "knx_types.h"
 | 
				
			||||||
#include "interface_object.h"
 | 
					#include "interface_object.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void (*BeforeRestartCallback)(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BusAccessUnit
 | 
					class BusAccessUnit
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
@ -161,4 +163,6 @@ class BusAccessUnit
 | 
				
			|||||||
    virtual void propertyValueWrite(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId,
 | 
					    virtual void propertyValueWrite(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId,
 | 
				
			||||||
                                    uint8_t& numberOfElements, uint16_t startIndex,
 | 
					                                    uint8_t& numberOfElements, uint16_t startIndex,
 | 
				
			||||||
                                    uint8_t* data, uint32_t length);
 | 
					                                    uint8_t* data, uint32_t length);
 | 
				
			||||||
 | 
					    virtual void beforeRestartCallback(BeforeRestartCallback func);
 | 
				
			||||||
 | 
					    virtual BeforeRestartCallback beforeRestartCallback();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -152,6 +152,8 @@ void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopTyp
 | 
				
			|||||||
    if (restartType == RestartType::BasicRestart)
 | 
					    if (restartType == RestartType::BasicRestart)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        println("Basic restart requested");
 | 
					        println("Basic restart requested");
 | 
				
			||||||
 | 
					        if (_beforeRestart != 0)
 | 
				
			||||||
 | 
					            _beforeRestart();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (restartType == RestartType::MasterReset)
 | 
					    else if (restartType == RestartType::MasterReset)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -611,3 +613,13 @@ Memory& BauSystemB::memory()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    return _memory;
 | 
					    return _memory;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BauSystemB::beforeRestartCallback(BeforeRestartCallback func)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    _beforeRestart = func;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BeforeRestartCallback BauSystemB::beforeRestartCallback()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return _beforeRestart;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -38,6 +38,8 @@ class BauSystemB : protected BusAccessUnit
 | 
				
			|||||||
    void propertyValueWrite(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId,
 | 
					    void propertyValueWrite(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId,
 | 
				
			||||||
                            uint8_t& numberOfElements, uint16_t startIndex,
 | 
					                            uint8_t& numberOfElements, uint16_t startIndex,
 | 
				
			||||||
                            uint8_t* data, uint32_t length) override;
 | 
					                            uint8_t* data, uint32_t length) override;
 | 
				
			||||||
 | 
					    void beforeRestartCallback(BeforeRestartCallback func);
 | 
				
			||||||
 | 
					    BeforeRestartCallback beforeRestartCallback();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  protected:
 | 
					  protected:
 | 
				
			||||||
    virtual ApplicationLayer& applicationLayer() = 0;
 | 
					    virtual ApplicationLayer& applicationLayer() = 0;
 | 
				
			||||||
@ -107,4 +109,5 @@ class BauSystemB : protected BusAccessUnit
 | 
				
			|||||||
    RestartState _restartState = Idle;
 | 
					    RestartState _restartState = Idle;
 | 
				
			||||||
    SecurityControl _restartSecurity;
 | 
					    SecurityControl _restartSecurity;
 | 
				
			||||||
    uint32_t _restartDelay = 0;
 | 
					    uint32_t _restartDelay = 0;
 | 
				
			||||||
 | 
					    BeforeRestartCallback _beforeRestart = 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -77,6 +77,7 @@ void GroupObjectTableObject::groupObjects(GroupObject * objs, uint16_t size)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void GroupObjectTableObject::beforeStateChange(LoadState& newState)
 | 
					void GroupObjectTableObject::beforeStateChange(LoadState& newState)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    TableObject::beforeStateChange(newState);
 | 
				
			||||||
    if (newState != LS_LOADED)
 | 
					    if (newState != LS_LOADED)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,19 @@
 | 
				
			|||||||
#include "callback_property.h"
 | 
					#include "callback_property.h"
 | 
				
			||||||
#include "data_property.h"
 | 
					#include "data_property.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BeforeTablesUnloadCallback TableObject::_beforeTablesUnload = 0;
 | 
				
			||||||
 | 
					uint8_t TableObject::_tableUnloadCount = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TableObject::beforeTablesUnloadCallback(BeforeTablesUnloadCallback func)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    _beforeTablesUnload = func;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BeforeTablesUnloadCallback TableObject::beforeTablesUnloadCallback()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return _beforeTablesUnload;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TableObject::TableObject(Memory& memory)
 | 
					TableObject::TableObject(Memory& memory)
 | 
				
			||||||
    : _memory(memory)
 | 
					    : _memory(memory)
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
@ -13,6 +26,19 @@ TableObject::TableObject(Memory& memory)
 | 
				
			|||||||
TableObject::~TableObject()
 | 
					TableObject::~TableObject()
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TableObject::beforeStateChange(LoadState& newState)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (newState == LS_LOADED && _tableUnloadCount > 0)
 | 
				
			||||||
 | 
					        _tableUnloadCount--;
 | 
				
			||||||
 | 
					    if (_tableUnloadCount > 0)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    if (newState == LS_UNLOADED) {
 | 
				
			||||||
 | 
					        _tableUnloadCount++;
 | 
				
			||||||
 | 
					        if (_beforeTablesUnload != 0)
 | 
				
			||||||
 | 
					            _beforeTablesUnload();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LoadState TableObject::loadState()
 | 
					LoadState TableObject::loadState()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return _state;
 | 
					    return _state;
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,9 @@
 | 
				
			|||||||
#include "interface_object.h"
 | 
					#include "interface_object.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Memory;
 | 
					class Memory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void (*BeforeTablesUnloadCallback)();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * This class provides common functionality for interface objects that are configured by ETS with MemorWrite.
 | 
					 * This class provides common functionality for interface objects that are configured by ETS with MemorWrite.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -28,13 +31,17 @@ class TableObject: public InterfaceObject
 | 
				
			|||||||
    uint8_t* save(uint8_t* buffer) override;
 | 
					    uint8_t* save(uint8_t* buffer) override;
 | 
				
			||||||
    const uint8_t* restore(const uint8_t* buffer) override;
 | 
					    const uint8_t* restore(const uint8_t* buffer) override;
 | 
				
			||||||
    uint16_t saveSize() override;
 | 
					    uint16_t saveSize() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static void beforeTablesUnloadCallback(BeforeTablesUnloadCallback func);
 | 
				
			||||||
 | 
					    static BeforeTablesUnloadCallback beforeTablesUnloadCallback();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  protected:
 | 
					  protected:
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * This method is called before the interface object enters a new ::LoadState.
 | 
					     * This method is called before the interface object enters a new ::LoadState.
 | 
				
			||||||
     * If there is a error changing the state newState should be set to ::LS_ERROR and errorCode() 
 | 
					     * If there is a error changing the state newState should be set to ::LS_ERROR and errorCode() 
 | 
				
			||||||
     * to a reason for the failure.
 | 
					     * to a reason for the failure.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    virtual void beforeStateChange(LoadState& newState) {}
 | 
					    virtual void beforeStateChange(LoadState& newState);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * returns the internal data of the interface object. This pointer belongs to the TableObject class and 
 | 
					     * returns the internal data of the interface object. This pointer belongs to the TableObject class and 
 | 
				
			||||||
@ -48,6 +55,8 @@ class TableObject: public InterfaceObject
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    void initializeProperties(size_t propertiesSize, Property** properties) override;
 | 
					    void initializeProperties(size_t propertiesSize, Property** properties) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static BeforeTablesUnloadCallback _beforeTablesUnload;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    uint32_t tableReference();
 | 
					    uint32_t tableReference();
 | 
				
			||||||
    bool allocTable(uint32_t size, bool doFill, uint8_t fillByte);
 | 
					    bool allocTable(uint32_t size, bool doFill, uint8_t fillByte);
 | 
				
			||||||
@ -68,6 +77,7 @@ class TableObject: public InterfaceObject
 | 
				
			|||||||
    LoadState _state = LS_UNLOADED;
 | 
					    LoadState _state = LS_UNLOADED;
 | 
				
			||||||
    Memory& _memory;
 | 
					    Memory& _memory;
 | 
				
			||||||
    uint8_t *_data = 0;
 | 
					    uint8_t *_data = 0;
 | 
				
			||||||
 | 
					    static uint8_t _tableUnloadCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * used to store size of data() in allocTable(), needed for calculation of crc in PID_MCB_TABLE.
 | 
					     * used to store size of data() in allocTable(), needed for calculation of crc in PID_MCB_TABLE.
 | 
				
			||||||
 | 
				
			|||||||
@ -400,7 +400,18 @@ template <class P, class B> class KnxFacade : private SaveRestore
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    void restart(uint16_t individualAddress)
 | 
					    void restart(uint16_t individualAddress)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        _bau.restartRequest(individualAddress);
 | 
					        SecurityControl sc = {false, None};
 | 
				
			||||||
 | 
					        _bau.restartRequest(individualAddress, sc);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void beforeRestartCallback(BeforeRestartCallback func)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _bau.beforeRestartCallback(func);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    BeforeRestartCallback beforeRestartCallback()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return _bau.beforeRestartCallback();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user