Skip to content

Commit

Permalink
Refactor proof of concept code
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark Ruys committed Dec 22, 2020
1 parent 197c730 commit c286c6d
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 64 deletions.
73 changes: 46 additions & 27 deletions cpp/src/Msg.cpp
Expand Up @@ -103,6 +103,19 @@ namespace OpenZWave
}
}

//-----------------------------------------------------------------------------
// <Msg::SetSupervision>
// Encapsulate the data inside a Supervision message
//-----------------------------------------------------------------------------
void Msg::SetSupervision(uint8 _supervision_session_id)
{
if (_supervision_session_id != Internal::CC::Supervision::StaticNoSessionId())
{
m_supervision_session_id = _supervision_session_id;
m_flags |= m_Supervision;
}
}

//-----------------------------------------------------------------------------
// <Msg::Append>
// Add a byte to the message
Expand Down Expand Up @@ -136,6 +149,12 @@ namespace OpenZWave
return;
}

// Deal with Supervision encapsulation
if ((m_flags & m_Supervision) != 0)
{
SupervisionEncap();
}

// Deal with Multi-Channel/Instance encapsulation
if ((m_flags & (m_MultiChannel | m_MultiInstance)) != 0)
{
Expand Down Expand Up @@ -231,33 +250,6 @@ namespace OpenZWave
return str;
}

//-----------------------------------------------------------------------------
// <Msg::SupervisionEncap>
// Encapsulate the data inside a Supervision message
//-----------------------------------------------------------------------------
void Msg::SupervisionEncap(uint8 session_id)
{
char str[256];
if (m_buffer[3] != FUNC_ID_ZW_SEND_DATA)
{
return;
}

for (uint32 i = m_length - 1; i >= 6; --i)
{
m_buffer[i + 4] = m_buffer[i];
}
m_buffer[6] = Internal::CC::Supervision::StaticGetCommandClassId();
m_buffer[7] = Internal::CC::Supervision::SupervisionCmd_Get;
m_buffer[8] = Internal::CC::Supervision::SupervisionMoreStatusUpdates_MoreReports | session_id;
m_buffer[9] = m_buffer[5];
m_buffer[5] += 4;
m_length += 4;

snprintf(str, sizeof(str), "Supervisioned: %s", m_logText.c_str());
m_logText = str;
}

//-----------------------------------------------------------------------------
// <Msg::MultiEncap>
// Encapsulate the data inside a MultiInstance/Multicommand message
Expand Down Expand Up @@ -308,6 +300,33 @@ namespace OpenZWave
}
}

//-----------------------------------------------------------------------------
// <Msg::SupervisionEncap>
// Encapsulate the data inside a Supervision message
//-----------------------------------------------------------------------------
void Msg::SupervisionEncap()
{
char str[256];
if (m_buffer[3] != FUNC_ID_ZW_SEND_DATA)
{
return;
}

for (uint32 i = m_length - 1; i >= 6; --i)
{
m_buffer[i + 4] = m_buffer[i];
}
m_buffer[6] = Internal::CC::Supervision::StaticGetCommandClassId();
m_buffer[7] = Internal::CC::Supervision::SupervisionCmd_Get;
m_buffer[8] = Internal::CC::Supervision::SupervisionMoreStatusUpdates_MoreReports | m_supervision_session_id;
m_buffer[9] = m_buffer[5];
m_buffer[5] += 4;
m_length += 4;

snprintf(str, sizeof(str), "Supervisioned: %s", m_logText.c_str());
m_logText = str;
}

//-----------------------------------------------------------------------------
// <Node::GetDriver>
// Get a pointer to our driver
Expand Down
5 changes: 4 additions & 1 deletion cpp/src/Msg.h
Expand Up @@ -54,6 +54,7 @@ namespace OpenZWave
{
m_MultiChannel = 0x01, // Indicate MultiChannel encapsulation
m_MultiInstance = 0x02, // Indicate MultiInstance encapsulation
m_Supervision = 0x03, // Indicate Supervision encapsulation
};

Msg(string const& _logtext, uint8 _targetNodeId, uint8 const _msgType, uint8 const _function, bool const _bCallbackRequired, bool const _bReplyRequired = true, uint8 const _expectedReply = 0, uint8 const _expectedCommandClassId = 0);
Expand All @@ -62,10 +63,10 @@ namespace OpenZWave
}

void SetInstance(OpenZWave::Internal::CC::CommandClass * _cc, uint8 const _instance); // Used to enable wrapping with MultiInstance/MultiChannel during finalize.
void SetSupervision(uint8 _session_id);

void Append(uint8 const _data);
void AppendArray(const uint8* const _data, const uint8 _length);
void SupervisionEncap(uint8 session_id);
void Finalize();
void UpdateCallbackId();

Expand Down Expand Up @@ -232,6 +233,7 @@ namespace OpenZWave
private:

void MultiEncap(); // Encapsulate the data inside a MultiInstance/Multicommand message
void SupervisionEncap(); // Encapsulate the data inside a Supervision message
string m_logText;
bool m_bFinal;
bool m_bCallbackRequired;
Expand All @@ -250,6 +252,7 @@ namespace OpenZWave
uint8 m_instance;
uint8 m_endPoint; // Endpoint to use if the message must be wrapped in a multiInstance or multiChannel command class
uint8 m_flags;
uint8 m_supervision_session_id;

bool m_encrypted;
bool m_noncerecvd;
Expand Down
17 changes: 17 additions & 0 deletions cpp/src/Node.cpp
Expand Up @@ -58,6 +58,7 @@
#include "command_classes/NodeNaming.h"
#include "command_classes/NoOperation.h"
#include "command_classes/Version.h"
#include "command_classes/Supervision.h"
#include "command_classes/SwitchAll.h"
#include "command_classes/ZWavePlusInfo.h"
#include "command_classes/DeviceResetLocally.h"
Expand Down Expand Up @@ -4049,3 +4050,19 @@ void Node::WriteMetaDataXML(TiXmlElement *mdElement)
mdElement->LinkEndChild(cl);
}
}

//-----------------------------------------------------------------------------
// <Node::GetSupervisionSessionId>
// Generate a new session id for Supervision encapsulation, if supported
//-----------------------------------------------------------------------------
uint Node::GetSupervisionSessionId(uint8 _command_class_id)
{
if (Internal::CC::CommandClass* cc = GetCommandClass(Internal::CC::Supervision::StaticGetCommandClassId()))
{
return cc->GetSession(_command_class_id);
}
else
{
return Internal::CC::Supervision::StaticNoSessionId();
}
}
3 changes: 3 additions & 0 deletions cpp/src/Node.h
Expand Up @@ -911,6 +911,9 @@ namespace OpenZWave
void WriteMetaDataXML(TiXmlElement*);
map<MetaDataFields, string> m_metadata;
map<uint32_t, ChangeLogEntry> m_changeLog;

public:
uint GetSupervisionSessionId(uint8 _command_class_id);
};

} //namespace OpenZWave
Expand Down
3 changes: 1 addition & 2 deletions cpp/src/command_classes/CommandClass.h
Expand Up @@ -152,8 +152,7 @@ namespace OpenZWave
virtual uint8 GetSession(uint8 _command_class_id) {
return 0;
}
virtual void SessionSuccess(uint8 _session_id, uint32 const _instance) {
}
virtual void SupervisionSessionSuccess(uint8 _session_id, uint32 const _instance) {};

void SetInstances(uint8 const _instances);
void SetInstance(uint8 const _endPoint);
Expand Down
7 changes: 2 additions & 5 deletions cpp/src/command_classes/Supervision.cpp
Expand Up @@ -53,10 +53,9 @@ namespace OpenZWave
return Supervision::m_session_id;
}


//-----------------------------------------------------------------------------
// <Supervision::HandleSupervisionReport>
// Handle a message from the Z-Wave network
// Handle a supervision report message from the Z-Wave network
//-----------------------------------------------------------------------------
void Supervision::HandleSupervisionReport(uint8 const* _data, uint32 const _length, uint32 const _instance)
{
Expand All @@ -77,7 +76,7 @@ namespace OpenZWave
{
if (CommandClass* pCommandClass = node->GetCommandClass(Supervision::m_command_class_id))
{
pCommandClass->SessionSuccess(session_id, _instance);
pCommandClass->SupervisionSessionSuccess(session_id, _instance);
}
}
}
Expand All @@ -90,10 +89,8 @@ namespace OpenZWave
}
}


bool Supervision::HandleIncomingMsg(uint8 const* _data, uint32 const _length, uint32 const _instance)
{

return HandleMsg(_data, _length, _instance);
}

Expand Down
52 changes: 24 additions & 28 deletions cpp/src/command_classes/ThermostatSetpoint.cpp
Expand Up @@ -262,7 +262,7 @@ namespace OpenZWave
return false;
}

void ThermostatSetpoint::SessionSuccess(uint8 _session_id, uint32 const _instance)
void ThermostatSetpoint::SupervisionSessionSuccess(uint8 _session_id, uint32 const _instance)
{
if ( m_supervision_session_id == _session_id )
{
Expand All @@ -289,35 +289,31 @@ namespace OpenZWave
//-----------------------------------------------------------------------------
bool ThermostatSetpoint::SetValue(Internal::VC::Value const& _value)
{
if (ValueID::ValueType_Decimal == _value.GetID().GetType())
{
// TODO Is it safe to address _value outside this call?
m_value = static_cast<Internal::VC::ValueDecimal const*>(&_value);

uint8 scale = strcmp("C", m_value->GetUnits().c_str()) ? 1 : 0;

Msg* msg = new Msg("ThermostatSetpointCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true);
msg->SetInstance(this, _value.GetID().GetInstance());
msg->Append(GetNodeId());
msg->Append(4 + GetAppendValueSize(m_value->GetValue()));
msg->Append(GetCommandClassId());
msg->Append(ThermostatSetpointCmd_Set);
msg->Append((uint8_t) (m_value->GetID().GetIndex() & 0xFF));
AppendValue(msg, m_value->GetValue(), scale);

if (Node* node = GetNodeUnsafe())
if (Node* node = GetNodeUnsafe())
{
if (ValueID::ValueType_Decimal == _value.GetID().GetType())
{
if (CommandClass* pCommandClass = node->GetCommandClass(Internal::CC::Supervision::StaticGetCommandClassId()))
{
m_supervision_session_id = pCommandClass->GetSession(StaticGetCommandClassId());
msg->SupervisionEncap(m_supervision_session_id);
}
// TODO Is it safe to address _value outside this call?
m_value = static_cast<Internal::VC::ValueDecimal const*>(&_value);
m_supervision_session_id = node->GetSupervisionSessionId(StaticGetCommandClassId());

uint8 scale = strcmp("C", m_value->GetUnits().c_str()) ? 1 : 0;

Msg* msg = new Msg("ThermostatSetpointCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true);
msg->SetInstance(this, _value.GetID().GetInstance());
msg->SetSupervision(m_supervision_session_id);
msg->Append(GetNodeId());
msg->Append(4 + GetAppendValueSize(m_value->GetValue()));
msg->Append(GetCommandClassId());
msg->Append(ThermostatSetpointCmd_Set);
msg->Append((uint8_t) (m_value->GetID().GetIndex() & 0xFF));
AppendValue(msg, m_value->GetValue(), scale);

msg->Append(GetDriver()->GetTransmitOptions());
GetDriver()->SendMsg(msg, Driver::MsgQueue_Send);
return true;
}

msg->Append(GetDriver()->GetTransmitOptions());
GetDriver()->SendMsg(msg, Driver::MsgQueue_Send);
return true;
}
}

return false;
}
Expand Down
2 changes: 1 addition & 1 deletion cpp/src/command_classes/ThermostatSetpoint.h
Expand Up @@ -80,7 +80,7 @@ namespace OpenZWave
{
return 3;
}
virtual void SessionSuccess(uint8 _session_id, uint32 const _instance);
virtual void SupervisionSessionSuccess(uint8 _session_id, uint32 const _instance);

protected:
virtual void CreateVars(uint8 const _instance) override;
Expand Down

0 comments on commit c286c6d

Please sign in to comment.