OpenZWave Library  1.7.0
Msg.h
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 //
3 // Msg.h
4 //
5 // Represents a Z-Wave message
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 _Msg_H
29 #define _Msg_H
30 
31 #include <cstdio>
32 #include <string>
33 #include <string.h>
34 #include "Defs.h"
35 //#include "Driver.h"
36 
37 namespace OpenZWave
38 {
39  class Driver;
40 
41  namespace Internal
42  {
43  namespace CC
44  {
45  class CommandClass;
46  }
47 
51  {
52  public:
54  {
55  m_MultiChannel = 0x01, // Indicate MultiChannel encapsulation
56  m_MultiInstance = 0x02, // Indicate MultiInstance encapsulation
57  m_Supervision = 0x04, // Indicate Supervision encapsulation
58  };
59 
60  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);
61  ~Msg()
62  {
63  }
64 
65  void SetInstance(OpenZWave::Internal::CC::CommandClass * _cc, uint8 const _instance); // Used to enable wrapping with MultiInstance/MultiChannel during finalize.
66  void SetSupervision(uint8 _session_id);
67 
68  void Append(uint8 const _data);
69  void AppendArray(const uint8* const _data, const uint8 _length);
70  void Finalize();
71  void UpdateCallbackId();
72 
78  {
79  return m_targetNodeId;
80  }
81 
88  {
89  return m_callbackId;
90  }
91 
101  {
102  return m_expectedReply;
103  }
104 
110  {
111  return m_expectedCommandClassId;
112  }
113 
120  {
121  return m_instance;
122  }
123 
129 // uint8 GetExpectedIndex()const{ return m_expectedIndex; }
134  string GetLogText() const
135  {
136  return m_logText;
137  }
138 
140  {
141  return m_encrypted == true ? m_length + 20 + 6 : m_length;
142  }
143  uint8* GetBuffer();
144  string GetAsString();
145 
147  {
148  return m_sendAttempts;
149  }
150  void SetSendAttempts(uint8 _count)
151  {
152  m_sendAttempts = _count;
153  }
154 
156  {
157  return m_maxSendAttempts;
158  }
160  {
161  if (_count < MAX_MAX_TRIES)
162  m_maxSendAttempts = _count;
163  }
164 
166  {
167  return (m_bFinal && (m_length == 11) && (m_buffer[3] == 0x13) && (m_buffer[6] == 0x84) && (m_buffer[7] == 0x08));
168  }
170  {
171  return (m_bFinal && (m_length == 11) && (m_buffer[3] == 0x13) && (m_buffer[6] == 0x00) && (m_buffer[7] == 0x00));
172  }
173 
174  bool operator ==(Msg const& _other) const
175  {
176  if (m_bFinal && _other.m_bFinal)
177  {
178  // Do not include the callback Id or checksum in the comparison.
179  uint8 length = m_length - (m_bCallbackRequired ? 2 : 1);
180  return (!memcmp(m_buffer, _other.m_buffer, length));
181  }
182 
183  return false;
184  }
186  {
187  if (m_buffer[3] == 0x13)
188  {
189  return m_buffer[6];
190  }
191  return 0;
192  }
193  bool isEncrypted()
194  {
195  return m_encrypted;
196  }
198  {
199  m_encrypted = true;
200  }
202  {
203  return m_noncerecvd;
204  }
205  void setNonce(uint8 nonce[8])
206  {
207  memcpy(m_nonce, nonce, 8);
208  m_noncerecvd = true;
209  UpdateCallbackId();
210  }
211  void clearNonce()
212  {
213  memset((m_nonce), '\0', 8);
214  m_noncerecvd = false;
215  }
216  void SetHomeId(uint32 homeId)
217  {
218  m_homeId = homeId;
219  }
221  {
222  m_resendDuetoCANorNAK = true;
223  }
225  {
226  return m_resendDuetoCANorNAK;
227  }
228 
232  Driver* GetDriver() const;
233  private:
234 
235  void MultiEncap(); // Encapsulate the data inside a MultiInstance/Multicommand message
236  void SupervisionEncap(); // Encapsulate the data inside a Supervision message
237  string m_logText;
238  bool m_bFinal;
239  bool m_bCallbackRequired;
240 
241  uint8 m_callbackId;
242  uint8 m_expectedReply;
243  uint8 m_expectedCommandClassId;
244  uint8 m_length;
245  uint8 m_buffer[256];
246  uint8 e_buffer[256];
247 
248  uint8 m_targetNodeId;
249  uint8 m_sendAttempts;
250  uint8 m_maxSendAttempts;
251 
252  uint8 m_instance;
253  uint8 m_endPoint; // Endpoint to use if the message must be wrapped in a multiInstance or multiChannel command class
254  uint8 m_flags;
255  uint8 m_supervision_session_id;
256 
257  bool m_encrypted;
258  bool m_noncerecvd;
259  uint8 m_nonce[8];
260  uint32 m_homeId;
261  static uint8 s_nextCallbackId; // counter to get a unique callback id
262  /* we are resending this message due to CAN or NAK messages */
263  bool m_resendDuetoCANorNAK;
264  };
265  } // namespace Internal
266 } // namespace OpenZWave
267 
268 #endif //_Msg_H
269 
uint8 GetSendingCommandClass()
Definition: Msg.h:185
Definition: Bitfield.cpp:30
#define OPENZWAVE_EXPORT
Definition: Defs.h:52
uint8 GetCallbackId() const
Identifies the Callback ID (if any) for this message. Callback ID is a value (OpenZWave uses sequenti...
Definition: Msg.h:87
uint8 GetExpectedReply() const
Identifies the expected reply type (if any) for this message. The expected reply is a function code...
Definition: Msg.h:100
uint32 GetLength() const
Definition: Msg.h:139
#define MAX_MAX_TRIES
Definition: Defs.h:225
void SetMaxSendAttempts(uint8 _count)
Definition: Msg.h:159
uint8 GetTargetNodeId() const
Identifies the Node ID of the "target" node (if any) for this function.
Definition: Msg.h:77
void clearNonce()
Definition: Msg.h:211
uint8 GetExpectedInstance() const
For messages that request a Report for a specified command class, identifies the expected Instance fo...
Definition: Msg.h:119
Base class for all Z-Wave command classes.
Definition: CommandClass.h:60
MessageFlags
Definition: Msg.h:53
bool IsWakeUpNoMoreInformationCommand()
Definition: Msg.h:165
bool IsNoOperation()
Definition: Msg.h:169
uint8 GetExpectedCommandClassId() const
Identifies the expected Command Class ID (if any) for this message.
Definition: Msg.h:109
void setNonce(uint8 nonce[8])
Definition: Msg.h:205
void SetHomeId(uint32 homeId)
Definition: Msg.h:216
The Driver class handles communication between OpenZWave and a device attached via a serial port (typ...
Definition: Driver.h:84
void SetSendAttempts(uint8 _count)
Definition: Msg.h:150
string GetLogText() const
For messages that request a Report for a specified command class, identifies the expected Index for t...
Definition: Msg.h:134
unsigned int uint32
Definition: Defs.h:91
uint8 GetMaxSendAttempts() const
Definition: Msg.h:155
bool isResendDuetoCANorNAK()
Definition: Msg.h:224
bool isNonceRecieved()
Definition: Msg.h:201
bool isEncrypted()
Definition: Msg.h:193
void setResendDuetoCANorNAK()
Definition: Msg.h:220
~Msg()
Definition: Msg.h:61
uint8 GetSendAttempts() const
Definition: Msg.h:146
void setEncrypted()
Definition: Msg.h:197
Message object to be passed to and from devices on the Z-Wave network.
Definition: Msg.h:50
unsigned char uint8
Definition: Defs.h:85