1 //-----------------------------------------------------------------------------
2 //
3 //	Group.h
4 //
5 //	A set of associations in a Z-Wave device.
6 //
7 //	Copyright (c) 2010 Mal Lansell <openzwave@lansell.org>
8 //
9 //	SOFTWARE NOTICE AND LICENSE
10 //
11 //	This file is part of OpenZWave.
12 //
13 //	OpenZWave is free software: you can redistribute it and/or modify
14 //	it under the terms of the GNU Lesser General Public License as published
15 //	by the Free Software Foundation, either version 3 of the License,
16 //	or (at your option) any later version.
17 //
18 //	OpenZWave is distributed in the hope that it will be useful,
19 //	but WITHOUT ANY WARRANTY; without even the implied warranty of
20 //	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 //	GNU Lesser General Public License for more details.
22 //
23 //	You should have received a copy of the GNU Lesser General Public License
24 //	along with OpenZWave.  If not, see <http://www.gnu.org/licenses/>.
25 //
26 //-----------------------------------------------------------------------------
27 
28 #ifndef _Group_H
29 #define _Group_H
30 
31 #include <string>
32 #include <vector>
33 #include <map>
34 #include "Defs.h"
35 
36 class TiXmlElement;
37 
38 namespace OpenZWave
39 {
40 	class Node;
41 
42 	typedef struct InstanceAssociation {
43 		uint8 m_nodeId;
44 		uint8 m_instance;
45 	} InstanceAssociation;
46 
47 	/** \brief Manages a group of devices (various nodes associated with each other).
48 	 */
49 	class Group
50 	{
51 		friend class Node;
52 		friend class Association;
53 		friend class MultiChannelAssociation;
54 
55 	//-----------------------------------------------------------------------------
56 	// Construction
57 	//-----------------------------------------------------------------------------
58 	public:
59 		Group( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx, uint8 const _maxAssociations );
60 		Group( uint32 const _homeId, uint8 const _nodeId, TiXmlElement const* _valueElement );
~Group()61 		~Group(){}
62 
63 		void WriteXML( TiXmlElement* _groupElement );
64 
65 	//-----------------------------------------------------------------------------
66 	// Association methods	(COMMAND_CLASS_ASSOCIATION)
67 	//-----------------------------------------------------------------------------
68 	public:
GetLabel()69 		string const& GetLabel()const{ return m_label; }
70 		uint32 GetAssociations( uint8** o_associations );
71 		uint32 GetAssociations( InstanceAssociation** o_associations );
GetMaxAssociations()72 		uint8 GetMaxAssociations()const{ return m_maxAssociations; }
GetIdx()73 		uint8 GetIdx()const{ return m_groupIdx; }
74 		bool Contains( uint8 const _nodeId, uint8 const _instance = 0x00 );
75 
76 	private:
IsAuto()77 		bool IsAuto()const{ return m_auto; }
SetAuto(bool const _state)78 		void SetAuto( bool const _state ){ m_auto = _state; }
79 		void CheckAuto();
80 
IsMultiInstance()81 		bool IsMultiInstance()const{ return m_multiInstance; }
SetMultiInstance(bool const _state)82 		void SetMultiInstance( bool const _state ){ m_multiInstance = _state; }
83 
84 		void AddAssociation( uint8 const _nodeId, uint8 const _instance = 0x00 );
85 		void RemoveAssociation( uint8 const _nodeId, uint8 const _instance = 0x00 );
86 		void OnGroupChanged( vector<uint8> const& _associations );
87 		void OnGroupChanged( vector<InstanceAssociation> const& _associations );
88 
89 	//-----------------------------------------------------------------------------
90 	// Command methods (COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION)
91 	//-----------------------------------------------------------------------------
92 	public:
93 		bool ClearCommands( uint8 const _nodeId, uint8 const _instance = 0x00 );
94 		bool AddCommand( uint8 const _nodeId, uint8 const _length, uint8 const* _data, uint8 const _instance = 0x00 );
95 
96 	private:
97 		class AssociationCommand
98 		{
99 		public:
100 			AssociationCommand( uint8 const _length, uint8 const* _data );
101 			~AssociationCommand();
102 
103 		private:
104 			uint8*	m_data;
105 		};
106 
107 		typedef vector<AssociationCommand>	AssociationCommandVec;
108 		struct classcomp {
operatorclasscomp109 			bool operator() (const InstanceAssociation& lhs, const InstanceAssociation& rhs) const
110 			{return lhs.m_nodeId == rhs.m_nodeId ? lhs.m_instance < rhs.m_instance : lhs.m_nodeId < rhs.m_nodeId;}
111 		};
112 
113 	//-----------------------------------------------------------------------------
114 	// Member variables
115 	//-----------------------------------------------------------------------------
116 	private:
117 		string								m_label;
118 		uint32								m_homeId;
119 		uint8								m_nodeId;
120 		uint8								m_groupIdx;
121 		uint8								m_maxAssociations;
122 		bool								m_auto;				// If true, the controller will automatically be associated with the group
123 		bool								m_multiInstance;    // If true, the group is MultiInstance capable
124 		map<InstanceAssociation,AssociationCommandVec,classcomp>	m_associations;
125 	};
126 
127 } //namespace OpenZWave
128 
129 #endif //_Group_H
130 
131