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 namespace Internal 41 { 42 namespace CC 43 { 44 class Association; 45 class MultiChannelAssociation; 46 } 47 } 48 49 class Node; 50 51 // When dealing with MultiInstance Devices, 52 // OpenZWave uses "Instance" to identify a subdevice. 53 // The public interface maps an Instance ID to an "End Point", which in turn 54 // gets used to build Z-Wave packets. 55 // Config files and by extension ozwcache store this map per CC, for example: 56 // <Instance index="1" endpoint="1" /> 57 // The Group Aka Association commands, however, expect "End Points" 58 // It would make sense to change "Instance" to "End Point" in all related code but... 59 // InstanceAssociation is exposed by the API in Manager::GetAssociations 60 // Because of its exposure, m_instance cannot be renamed to m_endPoint without 61 // breaking existing code. 62 63 typedef struct InstanceAssociation 64 { 65 uint8 m_nodeId; 66 uint8 m_instance; // "End Point" as defined in SDS13782-11B, Multi Channel Association Command Class. 67 } InstanceAssociation; 68 69 /** \brief Manages a group of devices (various nodes associated with each other). 70 */ 71 class Group 72 { 73 friend class Node; 74 friend class Internal::CC::Association; 75 friend class Internal::CC::MultiChannelAssociation; 76 77 //----------------------------------------------------------------------------- 78 // Construction 79 //----------------------------------------------------------------------------- 80 public: 81 Group(uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx, uint8 const _maxAssociations); 82 Group(uint32 const _homeId, uint8 const _nodeId, TiXmlElement const* _valueElement); ~Group()83 ~Group() 84 { 85 } 86 87 void WriteXML(TiXmlElement* _groupElement); 88 89 //----------------------------------------------------------------------------- 90 // Association methods (COMMAND_CLASS_ASSOCIATION) 91 //----------------------------------------------------------------------------- 92 public: GetLabel()93 string const& GetLabel() const 94 { 95 return m_label; 96 } 97 uint32 GetAssociations(uint8** o_associations); 98 uint32 GetAssociations(InstanceAssociation** o_associations); GetMaxAssociations()99 uint8 GetMaxAssociations() const 100 { 101 return m_maxAssociations; 102 } GetIdx()103 uint8 GetIdx() const 104 { 105 return m_groupIdx; 106 } 107 bool Contains(uint8 const _nodeId, uint8 const _endPoint= 0x00); IsMultiInstance()108 bool IsMultiInstance() const 109 { 110 return m_multiInstance; 111 } 112 113 private: IsAuto()114 bool IsAuto() const 115 { 116 return m_auto; 117 } SetAuto(bool const _state)118 void SetAuto(bool const _state) 119 { 120 m_auto = _state; 121 } 122 void CheckAuto(); 123 SetMultiInstance(bool const _state)124 void SetMultiInstance(bool const _state) 125 { 126 m_multiInstance = _state; 127 } 128 129 void AddAssociation(uint8 const _nodeId, uint8 const endPoint = 0x00); 130 void RemoveAssociation(uint8 const _nodeId, uint8 const _endPoint = 0x00); 131 void OnGroupChanged(vector<uint8> const& _associations); 132 void OnGroupChanged(vector<InstanceAssociation> const& _associations); 133 134 //----------------------------------------------------------------------------- 135 // Command methods (COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION) 136 //----------------------------------------------------------------------------- 137 public: 138 bool ClearCommands(uint8 const _nodeId, uint8 const _endPoint = 0x00); 139 bool AddCommand(uint8 const _nodeId, uint8 const _length, uint8 const* _data, uint8 const _endPoint = 0x00); 140 141 private: 142 class AssociationCommand 143 { 144 public: 145 AssociationCommand(uint8 const _length, uint8 const* _data); 146 ~AssociationCommand(); 147 148 private: 149 uint8* m_data; 150 }; 151 152 typedef vector<AssociationCommand> AssociationCommandVec; 153 struct classcomp 154 { operatorclasscomp155 bool operator()(const InstanceAssociation& lhs, const InstanceAssociation& rhs) const 156 { 157 return lhs.m_nodeId == rhs.m_nodeId ? lhs.m_instance < rhs.m_instance : lhs.m_nodeId < rhs.m_nodeId; 158 } 159 }; 160 161 //----------------------------------------------------------------------------- 162 // Member variables 163 //----------------------------------------------------------------------------- 164 private: 165 string m_label; 166 uint32 m_homeId; 167 uint8 m_nodeId; 168 uint8 m_groupIdx; 169 uint8 m_maxAssociations; 170 bool m_auto; // If true, the controller will automatically be associated with the group 171 bool m_multiInstance; // If true, the group is MultiInstance capable 172 map<InstanceAssociation, AssociationCommandVec, classcomp> m_associations; 173 }; 174 175 } //namespace OpenZWave 176 177 #endif //_Group_H 178 179