mirror of
https://github.com/thelsing/knx.git
synced 2024-12-18 19:08:18 +01:00
"Restart device" implementation (#38)
* corrected float with DPT9 * Switch Programming-LED also via Bus/ETS * Again: Prog-LED switchable from bus/ETS * DPT16 (to bus) implemented * - Allows ProgButton interrupts on FALLING signal * restart device command * - removed magic numbers - added enum for restart states
This commit is contained in:
parent
4a0b46e062
commit
70f387a7b9
@ -176,7 +176,10 @@ void ApplicationLayer::connectIndication(uint16_t tsap)
|
||||
void ApplicationLayer::connectConfirm(uint16_t destination, uint16_t tsap, bool status)
|
||||
{
|
||||
if (status)
|
||||
{
|
||||
_connectedTsap = tsap;
|
||||
_bau.connectConfirm(tsap);
|
||||
}
|
||||
else
|
||||
_connectedTsap = -1;
|
||||
}
|
||||
@ -188,7 +191,7 @@ void ApplicationLayer::disconnectIndication(uint16_t tsap)
|
||||
|
||||
void ApplicationLayer::disconnectConfirm(Priority priority, uint16_t tsap, bool status)
|
||||
{
|
||||
|
||||
_connectedTsap = -1;
|
||||
}
|
||||
|
||||
void ApplicationLayer::dataConnectedIndication(Priority priority, uint16_t tsap, APDU& apdu)
|
||||
@ -334,13 +337,23 @@ void ApplicationLayer::deviceDescriptorReadResponse(AckType ack, Priority priori
|
||||
individualSend(ack, hopType, priority, asap, apdu);
|
||||
}
|
||||
|
||||
void ApplicationLayer::restartRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap)
|
||||
void ApplicationLayer::connectRequest(uint16_t destination, Priority priority)
|
||||
{
|
||||
_transportLayer->connectRequest(destination, priority);
|
||||
}
|
||||
|
||||
void ApplicationLayer::disconnectRequest(Priority priority)
|
||||
{
|
||||
_transportLayer->disconnectRequest(_connectedTsap, priority);
|
||||
}
|
||||
|
||||
void ApplicationLayer::restartRequest(AckType ack, Priority priority, HopCountType hopType)
|
||||
{
|
||||
CemiFrame frame(1);
|
||||
APDU& apdu = frame.apdu();
|
||||
apdu.type(Restart);
|
||||
|
||||
individualSend(ack, hopType, priority, asap, apdu);
|
||||
individualSend(ack, hopType, priority, _connectedTsap, apdu);
|
||||
}
|
||||
|
||||
void ApplicationLayer::propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap,
|
||||
@ -788,3 +801,8 @@ void ApplicationLayer::individualSend(AckType ack, HopCountType hopType, Priorit
|
||||
else
|
||||
_transportLayer->dataIndividualRequest(ack, hopType, priority, asap, apdu);
|
||||
}
|
||||
|
||||
bool ApplicationLayer::isConnected()
|
||||
{
|
||||
return (_connectedTsap >= 0);
|
||||
}
|
@ -95,7 +95,10 @@ class ApplicationLayer
|
||||
uint8_t descriptorType);
|
||||
void deviceDescriptorReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap,
|
||||
uint8_t descriptorType, uint8_t* deviceDescriptor);
|
||||
void restartRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap);
|
||||
void connectRequest(uint16_t destination, Priority priority);
|
||||
void disconnectRequest(Priority priority);
|
||||
bool isConnected();
|
||||
void restartRequest(AckType ack, Priority priority, HopCountType hopType);
|
||||
void propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap,
|
||||
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex);
|
||||
void propertyValueReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex,
|
||||
@ -147,5 +150,5 @@ class ApplicationLayer
|
||||
AssociationTableObject& _assocTable;
|
||||
BusAccessUnit& _bau;
|
||||
TransportLayer* _transportLayer = 0;
|
||||
int32_t _connectedTsap;
|
||||
int32_t _connectedTsap = -1;
|
||||
};
|
||||
|
@ -236,3 +236,7 @@ void BusAccessUnit::keyWriteResponseConfirm(AckType ack, Priority priority, HopC
|
||||
void BusAccessUnit::keyWriteAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, uint8_t level)
|
||||
{
|
||||
}
|
||||
|
||||
void BusAccessUnit::connectConfirm(uint16_t destination)
|
||||
{
|
||||
}
|
@ -108,4 +108,5 @@ class BusAccessUnit
|
||||
virtual void keyWriteResponseConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, uint8_t level,
|
||||
bool status);
|
||||
virtual void keyWriteAppLayerConfirm(Priority priority, HopCountType hopType, uint16_t asap, uint8_t level);
|
||||
virtual void connectConfirm(uint16_t destination);
|
||||
};
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "bau_systemB.h"
|
||||
#include "bits.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
@ -21,6 +22,7 @@ void BauSystemB::loop()
|
||||
dataLinkLayer().loop();
|
||||
_transLayer.loop();
|
||||
sendNextGroupTelegram();
|
||||
nextRestartState();
|
||||
}
|
||||
|
||||
bool BauSystemB::enabled()
|
||||
@ -293,8 +295,58 @@ void BauSystemB::addSaveRestore(SaveRestore* obj)
|
||||
_memory.addSaveRestore(obj);
|
||||
}
|
||||
|
||||
|
||||
void BauSystemB::restartRequest(uint16_t asap)
|
||||
bool BauSystemB::restartRequest(uint16_t asap)
|
||||
{
|
||||
_appLayer.restartRequest(AckRequested, LowPriority, NetworkLayerParameter, asap);
|
||||
if (_appLayer.isConnected())
|
||||
return false;
|
||||
_restartState = Connecting; // order important, has to be set BEFORE connectRequest
|
||||
_appLayer.connectRequest(asap, SystemPriority);
|
||||
_appLayer.deviceDescriptorReadRequest(AckRequested, SystemPriority, NetworkLayerParameter, asap, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
void BauSystemB::connectConfirm(uint16_t tsap)
|
||||
{
|
||||
if (_restartState == Connecting && tsap >= 0)
|
||||
{
|
||||
/* restart connection is confirmed, go to the next state */
|
||||
_restartState = Connected;
|
||||
_restartDelay = millis();
|
||||
}
|
||||
else
|
||||
{
|
||||
_restartState = Idle;
|
||||
}
|
||||
}
|
||||
|
||||
void BauSystemB::nextRestartState()
|
||||
{
|
||||
switch (_restartState)
|
||||
{
|
||||
case Idle:
|
||||
/* inactive state, do nothing */
|
||||
break;
|
||||
case Connecting:
|
||||
/* wait for connection, we do nothing here */
|
||||
break;
|
||||
case Connected:
|
||||
/* connection confirmed, we send restartRequest, but we wait a moment (sending ACK etc)... */
|
||||
if (millis() - _restartDelay > 30)
|
||||
{
|
||||
_appLayer.restartRequest(AckRequested, SystemPriority, NetworkLayerParameter);
|
||||
_restartState = Restarted;
|
||||
_restartDelay = millis();
|
||||
}
|
||||
break;
|
||||
case Restarted:
|
||||
/* restart is finished, we send a discommect */
|
||||
if (millis() - _restartDelay > 30)
|
||||
{
|
||||
_appLayer.disconnectRequest(SystemPriority);
|
||||
_restartState = Idle;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ class BauSystemB : protected BusAccessUnit
|
||||
void readMemory();
|
||||
void writeMemory();
|
||||
void addSaveRestore(SaveRestore* obj);
|
||||
void restartRequest(uint16_t asap);
|
||||
bool restartRequest(uint16_t asap);
|
||||
|
||||
protected:
|
||||
virtual DataLinkLayer& dataLinkLayer() = 0;
|
||||
@ -58,10 +58,20 @@ class BauSystemB : protected BusAccessUnit
|
||||
uint8_t* data, uint8_t dataLength) override;
|
||||
void groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType,
|
||||
uint8_t* data, uint8_t dataLength) override;
|
||||
void connectConfirm(uint16_t tsap) override;
|
||||
|
||||
virtual InterfaceObject* getInterfaceObject(uint8_t idx) = 0;
|
||||
void sendNextGroupTelegram();
|
||||
void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length);
|
||||
void nextRestartState();
|
||||
|
||||
enum RestartState
|
||||
{
|
||||
Idle,
|
||||
Connecting,
|
||||
Connected,
|
||||
Restarted
|
||||
};
|
||||
|
||||
DeviceObject _deviceObj;
|
||||
Memory _memory;
|
||||
@ -74,4 +84,6 @@ class BauSystemB : protected BusAccessUnit
|
||||
TransportLayer _transLayer;
|
||||
NetworkLayer _netLayer;
|
||||
bool _configured = true;
|
||||
RestartState _restartState = Idle;
|
||||
uint32_t _restartDelay = 0;
|
||||
};
|
Loading…
Reference in New Issue
Block a user