#ifndef _Group_H
#define _Group_H
#include <string>
#include <vector>
#include <map>
#include "Defs.h"
class TiXmlElement;
namespace OpenZWave
{
class Node;
typedef struct InstanceAssociation {
uint8 m_nodeId;
uint8 m_instance;
} InstanceAssociation;
class Group
{
friend class Node;
friend class Association;
friend class MultiInstanceAssociation;
public:
Group( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx, uint8 const _maxAssociations );
Group( uint32 const _homeId, uint8 const _nodeId, TiXmlElement const* _valueElement );
~Group(){}
void WriteXML( TiXmlElement* _groupElement );
public:
string const& GetLabel()const{ return m_label; }
uint32 GetAssociations( uint8** o_associations );
uint32 GetAssociations( InstanceAssociation** o_associations );
uint8 GetMaxAssociations()const{ return m_maxAssociations; }
uint8 GetIdx()const{ return m_groupIdx; }
bool Contains( uint8 const _nodeId, uint8 const _instance = 0x00 );
private:
bool IsAuto()const{ return m_auto; }
void SetAuto( bool const _state ){ m_auto = _state; }
void CheckAuto();
bool IsMultiInstance()const{ return m_multiInstance; }
void SetMultiInstance( bool const _state ){ m_multiInstance = _state; }
void AddAssociation( uint8 const _nodeId, uint8 const _instance = 0x00 );
void RemoveAssociation( uint8 const _nodeId, uint8 const _instance = 0x00 );
void OnGroupChanged( vector<uint8> const& _associations );
void OnGroupChanged( vector<InstanceAssociation> const& _associations );
public:
bool ClearCommands( uint8 const _nodeId, uint8 const _instance = 0x00 );
bool AddCommand( uint8 const _nodeId, uint8 const _length, uint8 const* _data, uint8 const _instance = 0x00 );
private:
class AssociationCommand
{
public:
AssociationCommand( uint8 const _length, uint8 const* _data );
~AssociationCommand();
private:
uint8 m_length;
uint8* m_data;
};
typedef vector<AssociationCommand> AssociationCommandVec;
struct classcomp {
bool operator() (const InstanceAssociation& lhs, const InstanceAssociation& rhs) const
{return lhs.m_nodeId == rhs.m_nodeId ? lhs.m_instance < rhs.m_instance : lhs.m_nodeId < rhs.m_nodeId;}
};
private:
string m_label;
uint32 m_homeId;
uint8 m_nodeId;
uint8 m_groupIdx;
uint8 m_maxAssociations;
bool m_auto; bool m_multiInstance; map<InstanceAssociation,AssociationCommandVec,classcomp> m_associations;
};
}
#endif