OpenZWave Library  1.7.0
CommandClass.h
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 //
3 // CommandClass.h
4 //
5 // Base class for all Z-Wave Command Classes
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 _CommandClass_H
29 #define _CommandClass_H
30 
31 #include <string>
32 #include <vector>
33 #include <map>
34 #include "Defs.h"
35 #include "Bitfield.h"
36 #include "Driver.h"
37 #include "CompatOptionManager.h"
38 
39 namespace OpenZWave
40 {
41 
42  class Msg;
43  class Node;
44  class Value;
45 
46  namespace Internal
47  {
48  namespace CC
49  {
61  {
63  public:
64  enum
65  {
66  RequestFlag_Static = 0x00000001,
67  RequestFlag_Session = 0x00000002,
68  RequestFlag_Dynamic = 0x00000004,
69  RequestFlag_AfterMark = 0x00000008
70  };
71 
72  CommandClass(uint32 const _homeId, uint8 const _nodeId);
73  virtual ~CommandClass();
74 
75  virtual void ReadXML(TiXmlElement const* _ccElement);
76  virtual void WriteXML(TiXmlElement* _ccElement);
77  virtual bool RequestState(uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue)
78  {
79  return false;
80  }
81  virtual bool RequestValue(uint32 const _requestFlags, uint16 const _index, uint8 const _instance, Driver::MsgQueue const _queue)
82  {
83  return false;
84  }
85  virtual void refreshValuesOnWakeup();
86 
87  virtual uint8 const GetCommandClassId() const = 0;
88  virtual string const GetCommandClassName() const = 0;
89  string const GetCommandClassLabel();
90  void SetCommandClassLabel(string label);
91  virtual bool HandleMsg(uint8 const* _data, uint32 const _length, uint32 const _instance = 1) = 0;
92  virtual bool HandleIncomingMsg(uint8 const* _data, uint32 const _length, uint32 const _instance = 1);
93  virtual bool SetValue(Internal::VC::Value const& _value)
94  {
95  return false;
96  }
97  virtual void SetValueBasic(uint8 const _instance, uint8 const _level)
98  {
99  } // Class specific handling of BASIC value mapping
100  virtual void SetVersion(uint8 const _version); // Made out-of-line to allow checks against downgrade
101 
102  bool RequestStateForAllInstances(uint32 const _requestFlags, Driver::MsgQueue const _queue);
103  bool CheckForRefreshValues(Internal::VC::Value const* _value);
104 
105  // The highest version number of the command class implemented by OpenZWave. We only need
106  // to do version gets on command classes that override this with a number greater than one.
108  {
109  return 1;
110  }
111 
113  {
114  return m_dom.GetFlagByte(STATE_FLAG_CCVERSION);
115  }
116  Bitfield const* GetInstances() const
117  {
118  return &m_instances;
119  }
121  {
122  return m_homeId;
123  }
124  uint8 GetNodeId() const
125  {
126  return m_nodeId;
127  }
128  Driver* GetDriver() const;
129  Node* GetNodeUnsafe() const;
130  Internal::VC::Value* GetValue(uint8 const _instance, uint16 const _index);
131  bool RemoveValue(uint8 const _instance, uint16 const _index);
132  uint8 GetEndPoint(uint8 const _instance)
133  {
134  map<uint8, uint8>::iterator it = m_endPointMap.find(_instance);
135  return (it == m_endPointMap.end() ? 0 : it->second);
136  }
137  uint8 GetInstance(uint8 const _endPoint)
138  {
139  for (map<uint8, uint8>::iterator it = m_endPointMap.begin(); it != m_endPointMap.end(); ++it)
140  {
141  if (_endPoint == it->second)
142  {
143  return it->first;
144  }
145  }
146  return 0;
147  }
148 
149  virtual bool supportsMultiInstance() {
150  return true;
151  }
152  virtual uint8 CreateSupervisionSession(uint8 _command_class_id, uint8 _index) {
153  return 0;
154  }
155  virtual uint32 GetSupervisionIndex(uint8 _session_id) {
156  return 0;
157  }
158  virtual void SupervisionSessionSuccess(uint8 _session_id, uint32 const _instance) {};
159 
160  void SetInstances(uint8 const _instances);
161  void SetInstance(uint8 const _endPoint);
162  /* overridden in the MultiInstance CC to set the Global Label for each Instance */
163  virtual void SetInstanceLabel(uint8 const _instance, char *label);
164  string GetInstanceLabel(uint8 const _instance);
166  {
167  return (uint8) m_endPointMap.size();
168  }
169  ;
171  {
172  m_dom.SetFlagBool(STATE_FLAG_AFTERMARK, true);
173  }
174  void SetEndPoint(uint8 const _instance, uint8 const _endpoint)
175  {
176  m_endPointMap[_instance] = _endpoint;
177  }
178  bool IsAfterMark() const
179  {
180  return m_dom.GetFlagBool(STATE_FLAG_AFTERMARK);
181  }
182  bool IsSecured() const
183  {
184  return m_dom.GetFlagBool(STATE_FLAG_ENCRYPTED);
185  }
186  void SetSecured()
187  {
188  m_dom.SetFlagBool(STATE_FLAG_ENCRYPTED, true);
189  }
190  bool IsSecureSupported() const
191  {
192  return m_SecureSupport;
193  }
195  {
196  m_SecureSupport = false;
197  }
199  {
200  m_SecureSupport = true;
201  }
202  void SetInNIF()
203  {
204  m_dom.SetFlagBool(STATE_FLAG_INNIF, true);
205  }
206  bool IsInNIF()
207  {
208  return m_dom.GetFlagBool(STATE_FLAG_INNIF);
209  }
210 
211  // Helper methods
212  string ExtractValue(uint8 const* _data, uint8* _scale, uint8* _precision, uint8 _valueOffset = 1) const;
213  uint32 decodeDuration(uint8 data) const;
214  uint8 encodeDuration(uint32 seconds) const;
222  void AppendValue(Msg* _msg, string const& _value, uint8 const _scale) const;
223  uint8 const GetAppendValueSize(string const& _value) const;
224  int32 ValueToInteger(string const& _value, uint8* o_precision, uint8* o_size) const;
225 
226  void UpdateMappedClass(uint8 const _instance, uint8 const _classId, uint8 const _value); // Update mapped class's value from BASIC class
227 
228  typedef struct RefreshValue
229  {
233  } RefreshValue;
234 
235  protected:
236  virtual void CreateVars(uint8 const _instance);
237  void ReadValueRefreshXML(TiXmlElement const* _ccElement);
240 
241  public:
242  void CreateVars();
243 
244  private:
245  uint32 m_homeId;
246  uint8 m_nodeId;
247  Bitfield m_instances;
248  map<uint8, uint8> m_endPointMap;
249  map<uint8, string> m_instanceLabel;
250  bool m_SecureSupport; // Does this commandclass support secure encryption (eg, the Security CC doesn't encrypt itself, so it doesn't support encryption)
251  multimap<uint16, RefreshValue *> m_RefreshClassValues; // what Command Class Values should we refresh ?
252  string m_commandClassLabel;
253  //-----------------------------------------------------------------------------
254  // Record which items of static data have been read from the device
255  //-----------------------------------------------------------------------------
256  public:
258  {
259  StaticRequest_Instances = 0x01,
260  StaticRequest_Values = 0x02,
261  StaticRequest_Version = 0x04
262  };
263 
264  bool HasStaticRequest(uint8_t _request) const
265  {
266  return ((m_dom.GetFlagByte(STATE_FLAG_STATIC_REQUESTS) & _request) != 0);
267  }
268  void SetStaticRequest(uint8_t _request);
269  void ClearStaticRequest(uint8_t _request);
270 
271  //-----------------------------------------------------------------------------
272  // Statistics
273  //-----------------------------------------------------------------------------
274  public:
276  {
277  return m_sentCnt;
278  }
280  {
281  return m_receivedCnt;
282  }
283  void SentCntIncr()
284  {
285  m_sentCnt++;
286  }
288  {
289  m_receivedCnt++;
290  }
291 
292  private:
293  uint32 m_sentCnt; // Number of messages sent from this command class.
294  uint32 m_receivedCnt; // Number of messages received from this commandclass.
295 
296  };
298  }// namespace CC
299  } // namespace Internal
300 } // namespace OpenZWave
301 
302 #endif
Definition: CompatOptionManager.h:75
CompatOptionManager m_dom
Definition: CommandClass.h:239
uint8 GetVersion() const
Definition: CommandClass.h:112
Definition: Bitfield.cpp:30
MsgQueue
Definition: Driver.h:659
uint32 GetSentCnt() const
Definition: CommandClass.h:275
Definition: CompatOptionManager.h:73
#define OPENZWAVE_EXPORT
Definition: Defs.h:52
virtual bool RequestState(uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue)
Definition: CommandClass.h:77
unsigned short uint16
Definition: Defs.h:88
bool HasStaticRequest(uint8_t _request) const
Definition: CommandClass.h:264
uint8 GetEndPoint(uint8 const _instance)
Definition: CommandClass.h:132
virtual uint8 CreateSupervisionSession(uint8 _command_class_id, uint8 _index)
Definition: CommandClass.h:152
void ReceivedCntIncr()
Definition: CommandClass.h:287
virtual void SetValueBasic(uint8 const _instance, uint8 const _level)
Definition: CommandClass.h:97
uint8 GetNumInstances()
Definition: CommandClass.h:165
bool IsSecured() const
Definition: CommandClass.h:182
void SetEndPoint(uint8 const _instance, uint8 const _endpoint)
Definition: CommandClass.h:174
uint8 GetInstance(uint8 const _endPoint)
Definition: CommandClass.h:137
Container that holds all of the values associated with a given node.
Definition: ValueStore.h:49
void SetInNIF()
Definition: CommandClass.h:202
The Node class describes a Z-Wave node object...typically a device on the Z-Wave network.
Definition: Node.h:81
virtual void SupervisionSessionSuccess(uint8 _session_id, uint32 const _instance)
Definition: CommandClass.h:158
Base class for all Z-Wave command classes.
Definition: CommandClass.h:60
virtual uint32 GetSupervisionIndex(uint8 _session_id)
Definition: CommandClass.h:155
uint8 requestflags
Definition: CommandClass.h:231
void SentCntIncr()
Definition: CommandClass.h:283
uint8 GetNodeId() const
Definition: CommandClass.h:124
Definition: CompatOptionManager.h:72
uint32 GetReceivedCnt() const
Definition: CommandClass.h:279
bool IsSecureSupported() const
Definition: CommandClass.h:190
The Driver class handles communication between OpenZWave and a device attached via a serial port (typ...
Definition: Driver.h:84
bool IsAfterMark() const
Definition: CommandClass.h:178
Definition: CompatOptionManager.h:76
signed int int32
Definition: Defs.h:90
unsigned int uint32
Definition: Defs.h:91
virtual bool RequestValue(uint32 const _requestFlags, uint16 const _index, uint8 const _instance, Driver::MsgQueue const _queue)
Definition: CommandClass.h:81
uint8 cc
Definition: CommandClass.h:230
virtual bool SetValue(Internal::VC::Value const &_value)
Definition: CommandClass.h:93
virtual bool supportsMultiInstance()
Definition: CommandClass.h:149
virtual uint8 GetMaxVersion()
Definition: CommandClass.h:107
Definition: CompatOptionManager.h:74
StaticRequest
Definition: CommandClass.h:257
Definition: CompatOptionManager.h:141
CompatOptionManager m_com
Definition: CommandClass.h:238
uint16 index
Definition: CommandClass.h:232
Definition: Bitfield.h:39
void SetSecured()
Definition: CommandClass.h:186
uint8_t GetFlagByte(CompatOptionFlags flag, uint32_t index=-1) const
Definition: CompatOptionManager.cpp:467
uint32 GetHomeId() const
Definition: CommandClass.h:120
Bitfield const * GetInstances() const
Definition: CommandClass.h:116
void SetSecureSupport()
Definition: CommandClass.h:198
Message object to be passed to and from devices on the Z-Wave network.
Definition: Msg.h:50
Base class for values associated with a node.
Definition: Value.h:54
void SetAfterMark()
Definition: CommandClass.h:170
bool IsInNIF()
Definition: CommandClass.h:206
void ClearSecureSupport()
Definition: CommandClass.h:194
unsigned char uint8
Definition: Defs.h:85