1 //-----------------------------------------------------------------------------
2 //
3 // Defs.h
4 //
5 // Basic types and preprocessor directives
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 _Defs_H
29 #define _Defs_H
30 #include <assert.h>
31 #include <stdio.h>
32 #include <string>
33 #include <stdint.h>
34 #include <memory>
35
36 // Compilation export flags
37 #if (defined _WINDOWS || defined WIN32 || defined _MSC_VER) && (!defined MINGW && !defined __MINGW32__ && !defined __MINGW64__)
38 // As discussd here https://github.com/OpenZWave/open-zwave/pull/1835
39 // Disable certain MSVC warnings here (instead of applying the pragma throughout the code as was done in the past).
40 // Application and DLL should be built with same compiler and settings anyway.
41 // See https://stackoverflow.com/questions/5661738/how-can-i-use-standard-library-stl-classes-in-my-dll-interface-or-abi
42 # if defined OPENZWAVE_MAKEDLL // Create the dynamic library.
43 # define OPENZWAVE_EXPORT __declspec(dllexport)
44 __pragma(warning(disable: 4251)) __pragma(warning(disable: 4275))
45 # elif defined OPENZWAVE_USEDLL // Use the dynamic library
46 # define OPENZWAVE_EXPORT __declspec(dllimport)
47 __pragma(warning(disable: 4251)) __pragma(warning(disable: 4275))
48 # else // Create/Use the static library
49 # define OPENZWAVE_EXPORT
50 # endif
51 #else
52 # define OPENZWAVE_EXPORT
53 #endif
54
55 #ifdef __GNUC__
56 #define DEPRECATED __attribute__((deprecated))
57 #elif defined(_MSC_VER)
58 #define DEPRECATED __declspec(deprecated)
59 #else
60 #pragma message("WARNING: You need to implement DEPRECATED for this compiler")
61 #define DEPRECATED
62 #endif
63
64 #ifdef _MSC_VER
65 #define OPENZWAVE_DEPRECATED_WARNINGS_OFF __pragma( warning(push) )\
66 __pragma( warning(disable: 4996) )
67 #else
68 #define OPENZWAVE_DEPRECATED_WARNINGS_OFF _Pragma ( "GCC diagnostic push" )\
69 _Pragma ( "GCC diagnostic ignored \"-Wdeprecated-declarations\"" )
70 #endif
71
72 #ifdef _MSC_VER
73 #define OPENZWAVE_DEPRECATED_WARNINGS_ON __pragma( warning(pop) )
74 #else
75 #define OPENZWAVE_DEPRECATED_WARNINGS_ON _Pragma ( "GCC diagnostic pop" )
76 #endif
77
78 #ifdef NULL
79 #undef NULL
80 #endif
81 #define NULL 0
82
83 // Basic types
84 typedef signed char int8;
85 typedef unsigned char uint8;
86
87 typedef signed short int16;
88 typedef unsigned short uint16;
89
90 typedef signed int int32;
91 typedef unsigned int uint32;
92
93 #ifdef _MSC_VER
94 typedef signed __int64 int64;
95 typedef unsigned __int64 uint64;
96 #endif
97
98 #ifdef __GNUC__
99 typedef signed long long int64;
100 typedef unsigned long long uint64;
101 #endif
102
103 typedef float float32;
104 typedef double float64;
105
106 typedef struct ozwversion
107 {
108 uint32_t _v; /* major << 16 | minor */
109 } ozwversion;
110
111 /**
112 * \brief version_major - return the major version of the given struct
113 * \param v: the version number to obtain the major number from
114 * \return the Major Version Number
115 */
version_major(struct ozwversion v)116 static inline uint16_t version_major(struct ozwversion v)
117 {
118 return (v._v & 0xFFFF0000) >> 16;
119 }
120
121 /**
122 * \brief version_minor - return the minor version of the given struct
123 * \param v: the version number to obtain the minor number from
124 * \return the Minor Version Number
125 */
version_minor(const struct ozwversion & v)126 static inline uint16_t version_minor(const struct ozwversion &v)
127 {
128 return v._v & 0xFFFF;
129 }
130
131 /**
132 * \brief version - create a new version number
133 * \param major: major version number
134 * \param minor: minor version number
135 * \return the Version Number Struct
136 */
version(uint16_t major,uint16_t minor)137 static inline struct ozwversion version(uint16_t major, uint16_t minor)
138 {
139 struct ozwversion v;
140 v._v = (uint32_t) (major << 16) | (uint32_t) minor;
141 return v;
142 }
143
144 /**
145 * \brief version_cmp - compare two versions
146 * \param a: the first version number
147 * \param b: the second version number
148 * \return a number greater, equal, or less than 0 if a is greater, equal or
149 * less than b, respectively
150 *
151 * Example:
152 * struct version a = version(1, 0);
153 * struct version b = version(1, 3);
154 * if (version_cmp(a, b) < 0)
155 * printf("b is smaller than b\n");
156 */
version_cmp(struct ozwversion a,struct ozwversion b)157 static inline int version_cmp(struct ozwversion a, struct ozwversion b)
158 {
159 return (a._v == b._v) ? 0 : (a._v > b._v) ? 1 : -1;
160 }
161
162 #include "OZWException.h"
163 #if defined(_MSC_VER)
164 # define __MYFUNCTION__ __FUNCTION__
165 #else
166 # define __MYFUNCTION__ __FILE__
167 #endif
168
169 # define OZW_FATAL_ERROR(exitCode, msg) Log::Write( LogLevel_Error,"Exception: %s:%d - %d - %s", std::string(__MYFUNCTION__).substr(std::string(__MYFUNCTION__).find_last_of("/\\") + 1).c_str(), __LINE__, exitCode, msg); \
170 throw OZWException(__MYFUNCTION__, __LINE__, exitCode, msg)
171 # define OZW_ERROR(exitCode, msg) Log::Write( LogLevel_Warning,"Exception: %s:%d - %d - %s", std::string(__MYFUNCTION__).substr(std::string(__MYFUNCTION__).find_last_of("/\\") + 1).c_str(), __LINE__, exitCode, msg); \
172 throw OZWException(__MYFUNCTION__, __LINE__, exitCode, msg)
173
174 // Declare the OpenZWave namespace
175 namespace std
176 {
177 }
178 namespace OpenZWave
179 {
180 // Include the STL namespace
181 using namespace std;
182 namespace Internal
183 {
184 namespace CC
185 {
186
187 }
188 }
189 }
190
191 // Modifications for Microsoft compilers
192 #ifdef _MSC_VER
193
194 // Fix for namespace-related compiler bug
195 namespace OpenZWave
196 {
197 }
198
199 // Rename safe versions of sprintf etc
200 #define snprintf sprintf_s
201 #define strcasecmp _stricmp
202 #define sscanf sscanf_s
203 #define strncpy(x, y, z) strncpy_s(x, sizeof(x), y, sizeof(x)-1)
204 #define strncat strncat_s
205
206 #endif
207
208 // Modifications for MiNGW32 compiler
209 #ifdef MINGW
210
211 // Replace "safe" versions of sprintf
212 #define sprintf_s snprintf
213
214 // seems some MINGW versions don't have a errno_t
215 #ifndef errno_t
216 #define errno_t int
217 #endif
218
219 #define fopen_s fopen
220
221 #endif
222
223 //#define MAX_TRIES 3 // Retry sends up to 3 times
224 #define MAX_TRIES 1 // set this to one, as I believe now that a ACK failure is indication that the device is offline, hence additional attempts will not work.
225 #define MAX_MAX_TRIES 7 // Don't exceed this retry limit
226 #define ACK_TIMEOUT 1000 // How long to wait for an ACK
227 #define BYTE_TIMEOUT 150
228 //#define RETRY_TIMEOUT 40000 // Retry send after 40 seconds
229 #define RETRY_TIMEOUT 10000 // Retry send after 10 seconds (we might need to keep this below 10 for Security CC to function correctly)
230
231 #define SOF 0x01
232 #define ACK 0x06
233 #define NAK 0x15
234 #define CAN 0x18
235
236 #define NUM_NODE_BITFIELD_BYTES 29 // 29 bytes = 232 bits, one for each possible node in the network.
237
238 #define REQUEST 0x00
239 #define RESPONSE 0x01
240
241 #define ZW_CLOCK_SET 0x30
242
243 #define TRANSMIT_OPTION_ACK 0x01
244 #define TRANSMIT_OPTION_LOW_POWER 0x02
245 #define TRANSMIT_OPTION_AUTO_ROUTE 0x04
246 #define TRANSMIT_OPTION_NO_ROUTE 0x10
247 #define TRANSMIT_OPTION_EXPLORE 0x20
248
249 #define TRANSMIT_COMPLETE_OK 0x00
250 #define TRANSMIT_COMPLETE_NO_ACK 0x01
251 #define TRANSMIT_COMPLETE_FAIL 0x02
252 #define TRANSMIT_COMPLETE_NOT_IDLE 0x03
253 #define TRANSMIT_COMPLETE_NOROUTE 0x04
254 #define TRANSMIT_COMPLETE_VERIFIED 0x05
255
256 #define RECEIVE_STATUS_ROUTED_BUSY 0x01
257 #define RECEIVE_STATUS_TYPE_BROAD 0x04
258
259 #define FUNC_ID_SERIAL_API_GET_INIT_DATA 0x02
260 #define FUNC_ID_SERIAL_API_APPL_NODE_INFORMATION 0x03
261 #define FUNC_ID_APPLICATION_COMMAND_HANDLER 0x04
262 #define FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES 0x05
263 #define FUNC_ID_SERIAL_API_SET_TIMEOUTS 0x06
264 #define FUNC_ID_SERIAL_API_GET_CAPABILITIES 0x07
265 #define FUNC_ID_SERIAL_API_SOFT_RESET 0x08
266
267 #define FUNC_ID_SERIAL_API_SETUP 0x0b
268
269 #define FUNC_ID_ZW_SEND_NODE_INFORMATION 0x12
270 #define FUNC_ID_ZW_SEND_DATA 0x13
271 #define FUNC_ID_ZW_GET_VERSION 0x15
272 #define FUNC_ID_ZW_R_F_POWER_LEVEL_SET 0x17
273 #define FUNC_ID_ZW_GET_RANDOM 0x1c
274 #define FUNC_ID_ZW_MEMORY_GET_ID 0x20
275 #define FUNC_ID_MEMORY_GET_BYTE 0x21
276 #define FUNC_ID_ZW_READ_MEMORY 0x23
277
278 #define FUNC_ID_ZW_SET_LEARN_NODE_STATE 0x40 // Not implemented
279 #define FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO 0x41 // Get protocol info (baud rate, listening, etc.) for a given node
280 #define FUNC_ID_ZW_SET_DEFAULT 0x42 // Reset controller and node info to default (original) values
281 #define FUNC_ID_ZW_NEW_CONTROLLER 0x43 // Not implemented
282 #define FUNC_ID_ZW_REPLICATION_COMMAND_COMPLETE 0x44 // Replication send data complete
283 #define FUNC_ID_ZW_REPLICATION_SEND_DATA 0x45 // Replication send data
284 #define FUNC_ID_ZW_ASSIGN_RETURN_ROUTE 0x46 // Assign a return route from the specified node to the controller
285 #define FUNC_ID_ZW_DELETE_RETURN_ROUTE 0x47 // Delete all return routes from the specified node
286 #define FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE 0x48 // Ask the specified node to update its neighbors (then read them from the controller)
287 #define FUNC_ID_ZW_APPLICATION_UPDATE 0x49 // Get a list of supported (and controller) command classes
288 #define FUNC_ID_ZW_ADD_NODE_TO_NETWORK 0x4a // Control the addnode (or addcontroller) process...start, stop, etc.
289 #define FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK 0x4b // Control the removenode (or removecontroller) process...start, stop, etc.
290 #define FUNC_ID_ZW_CREATE_NEW_PRIMARY 0x4c // Control the createnewprimary process...start, stop, etc.
291 #define FUNC_ID_ZW_CONTROLLER_CHANGE 0x4d // Control the transferprimary process...start, stop, etc.
292 #define FUNC_ID_ZW_SET_LEARN_MODE 0x50 // Put a controller into learn mode for replication/ receipt of configuration info
293 #define FUNC_ID_ZW_ASSIGN_SUC_RETURN_ROUTE 0x51 // Assign a return route to the SUC
294 #define FUNC_ID_ZW_ENABLE_SUC 0x52 // Make a controller a Static Update Controller
295 #define FUNC_ID_ZW_REQUEST_NETWORK_UPDATE 0x53 // Network update for a SUC(?)
296 #define FUNC_ID_ZW_SET_SUC_NODE_ID 0x54 // Identify a Static Update Controller node id
297 #define FUNC_ID_ZW_DELETE_SUC_RETURN_ROUTE 0x55 // Remove return routes to the SUC
298 #define FUNC_ID_ZW_GET_SUC_NODE_ID 0x56 // Try to retrieve a Static Update Controller node id (zero if no SUC present)
299 #define FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE_OPTIONS 0x5a // Allow options for request node neighbor update
300 #define FUNC_ID_ZW_EXPLORE_REQUEST_INCLUSION 0x5e // supports NWI
301 #define FUNC_ID_ZW_REQUEST_NODE_INFO 0x60 // Get info (supported command classes) for the specified node
302 #define FUNC_ID_ZW_REMOVE_FAILED_NODE_ID 0x61 // Mark a specified node id as failed
303 #define FUNC_ID_ZW_IS_FAILED_NODE_ID 0x62 // Check to see if a specified node has failed
304 #define FUNC_ID_ZW_REPLACE_FAILED_NODE 0x63 // Remove a failed node from the controller's list (?)
305 #define FUNC_ID_ZW_GET_ROUTING_INFO 0x80 // Get a specified node's neighbor information from the controller
306 #define FUNC_ID_SERIAL_API_SLAVE_NODE_INFO 0xA0 // Set application virtual slave node information
307 #define FUNC_ID_APPLICATION_SLAVE_COMMAND_HANDLER 0xA1 // Slave command handler
308 #define FUNC_ID_ZW_SEND_SLAVE_NODE_INFO 0xA2 // Send a slave node information frame
309 #define FUNC_ID_ZW_SEND_SLAVE_DATA 0xA3 // Send data from slave
310 #define FUNC_ID_ZW_SET_SLAVE_LEARN_MODE 0xA4 // Enter slave learn mode
311 #define FUNC_ID_ZW_GET_VIRTUAL_NODES 0xA5 // Return all virtual nodes
312 #define FUNC_ID_ZW_IS_VIRTUAL_NODE 0xA6 // Virtual node test
313 #define FUNC_ID_ZW_SET_PROMISCUOUS_MODE 0xD0 // Set controller into promiscuous mode to listen to all frames
314 #define FUNC_ID_PROMISCUOUS_APPLICATION_COMMAND_HANDLER 0xD1
315
316 #define FUNC_ID_PROPRIETARY_0 0xF0
317 #define FUNC_ID_PROPRIETARY_1 0xF1
318 #define FUNC_ID_PROPRIETARY_2 0xF2
319 #define FUNC_ID_PROPRIETARY_3 0xF3
320 #define FUNC_ID_PROPRIETARY_4 0xF4
321 #define FUNC_ID_PROPRIETARY_5 0xF5
322 #define FUNC_ID_PROPRIETARY_6 0xF6
323 #define FUNC_ID_PROPRIETARY_7 0xF7
324 #define FUNC_ID_PROPRIETARY_8 0xF8
325 #define FUNC_ID_PROPRIETARY_9 0xF9
326 #define FUNC_ID_PROPRIETARY_A 0xFA
327 #define FUNC_ID_PROPRIETARY_B 0xFB
328 #define FUNC_ID_PROPRIETARY_C 0xFC
329 #define FUNC_ID_PROPRIETARY_D 0xFD
330 #define FUNC_ID_PROPRIETARY_E 0xFE
331
332 #define ADD_NODE_ANY 0x01
333 #define ADD_NODE_CONTROLLER 0x02
334 #define ADD_NODE_SLAVE 0x03
335 #define ADD_NODE_EXISTING 0x04
336 #define ADD_NODE_STOP 0x05
337 #define ADD_NODE_STOP_FAILED 0x06
338
339 #define ADD_NODE_STATUS_LEARN_READY 0x01
340 #define ADD_NODE_STATUS_NODE_FOUND 0x02
341 #define ADD_NODE_STATUS_ADDING_SLAVE 0x03
342 #define ADD_NODE_STATUS_ADDING_CONTROLLER 0x04
343 #define ADD_NODE_STATUS_PROTOCOL_DONE 0x05
344 #define ADD_NODE_STATUS_DONE 0x06
345 #define ADD_NODE_STATUS_FAILED 0x07
346
347 #define REMOVE_NODE_ANY 0x01
348 #define REMOVE_NODE_CONTROLLER 0x02
349 #define REMOVE_NODE_SLAVE 0x03
350 #define REMOVE_NODE_STOP 0x05
351
352 #define REMOVE_NODE_STATUS_LEARN_READY 0x01
353 #define REMOVE_NODE_STATUS_NODE_FOUND 0x02
354 #define REMOVE_NODE_STATUS_REMOVING_SLAVE 0x03
355 #define REMOVE_NODE_STATUS_REMOVING_CONTROLLER 0x04
356 #define REMOVE_NODE_STATUS_DONE 0x06
357 #define REMOVE_NODE_STATUS_FAILED 0x07
358
359 #define CREATE_PRIMARY_START 0x02
360 #define CREATE_PRIMARY_STOP 0x05
361 #define CREATE_PRIMARY_STOP_FAILED 0x06
362
363 #define CONTROLLER_CHANGE_START 0x02
364 #define CONTROLLER_CHANGE_STOP 0x05
365 #define CONTROLLER_CHANGE_STOP_FAILED 0x06
366
367 #define LEARN_MODE_STARTED 0x01
368 #define LEARN_MODE_DONE 0x06
369 #define LEARN_MODE_FAILED 0x07
370 #define LEARN_MODE_DELETED 0x80
371
372 #define REQUEST_NEIGHBOR_UPDATE_STARTED 0x21
373 #define REQUEST_NEIGHBOR_UPDATE_DONE 0x22
374 #define REQUEST_NEIGHBOR_UPDATE_FAILED 0x23
375
376 #define FAILED_NODE_OK 0x00
377 #define FAILED_NODE_REMOVED 0x01
378 #define FAILED_NODE_NOT_REMOVED 0x02
379
380 #define FAILED_NODE_REPLACE_WAITING 0x03
381 #define FAILED_NODE_REPLACE_DONE 0x04
382 #define FAILED_NODE_REPLACE_FAILED 0x05
383
384 #define FAILED_NODE_REMOVE_STARTED 0x00
385 #define FAILED_NODE_NOT_PRIMARY_CONTROLLER 0x02
386 #define FAILED_NODE_NO_CALLBACK_FUNCTION 0x04
387 #define FAILED_NODE_NOT_FOUND 0x08
388 #define FAILED_NODE_REMOVE_PROCESS_BUSY 0x10
389 #define FAILED_NODE_REMOVE_FAIL 0x20
390
391 #define SUC_UPDATE_DONE 0x00
392 #define SUC_UPDATE_ABORT 0x01
393 #define SUC_UPDATE_WAIT 0x02
394 #define SUC_UPDATE_DISABLED 0x03
395 #define SUC_UPDATE_OVERFLOW 0x04
396
397 #define SUC_FUNC_BASIC_SUC 0x00
398 #define SUC_FUNC_NODEID_SERVER 0x01
399
400 #define UPDATE_STATE_NODE_INFO_RECEIVED 0x84
401 #define UPDATE_STATE_NODE_INFO_REQ_DONE 0x82
402 #define UPDATE_STATE_NODE_INFO_REQ_FAILED 0x81
403 #define UPDATE_STATE_ROUTING_PENDING 0x80
404 #define UPDATE_STATE_NEW_ID_ASSIGNED 0x40
405 #define UPDATE_STATE_DELETE_DONE 0x20
406 #define UPDATE_STATE_SUC_ID 0x10
407
408 #define APPLICATION_NODEINFO_LISTENING 0x01
409 #define APPLICATION_NODEINFO_OPTIONAL_FUNCTIONALITY 0x02
410
411 #define SLAVE_ASSIGN_COMPLETE 0x00
412 #define SLAVE_ASSIGN_NODEID_DONE 0x01 // Node ID has been assigned
413 #define SLAVE_ASSIGN_RANGE_INFO_UPDATE 0x02 // Node is doing neighbor discovery
414
415 #define SLAVE_LEARN_MODE_DISABLE 0x00 // disable add/remove virtual slave nodes
416 #define SLAVE_LEARN_MODE_ENABLE 0x01 // enable ability to include/exclude virtual slave nodes
417 #define SLAVE_LEARN_MODE_ADD 0x02 // add node directly but only if primary/inclusion controller
418 #define SLAVE_LEARN_MODE_REMOVE 0x03 // remove node directly but only if primary/inclusion controller
419
420 #define OPTION_HIGH_POWER 0x80
421 #define OPTION_NWI 0x40 // NWI Inclusion
422 //Device request related
423 #define BASIC_SET 0x01
424 #define BASIC_REPORT 0x03
425
426 #define COMMAND_CLASS_BASIC 0x20
427 #define COMMAND_CLASS_CONTROLLER_REPLICATION 0x21
428 #define COMMAND_CLASS_APPLICATION_STATUS 0x22
429 #define COMMAND_CLASS_HAIL 0x82
430
431 /* library types */
432 #define ZW_LIB_CONTROLLER_STATIC 0x01
433 #define ZW_LIB_CONTROLLER 0x02
434 #define ZW_LIB_SLAVE_ENHANCED 0x03
435 #define ZW_LIB_SLAVE 0x04
436 #define ZW_LIB_INSTALLER 0x05
437 #define ZW_LIB_SLAVE_ROUTING 0x06
438 #define ZW_LIB_CONTROLLER_BRIDGE 0x07
439 #define ZW_LIB_DUT 0x08
440
441 /* Serial API Setup Commands */
442 #define SERIAL_API_SETUP_CMD_TX_STATUS_REPORT 0x02
443 #define SERIAL_API_SETUP_CMD_TX_POWERLEVEL_SET 0x04
444 #define SERIAL_API_SETUP_CMD_TX_POWERLEVEL_GET 0x08
445 #define SERIAL_API_SETUP_CMD_TX_GET_MAX_PAYLOAD_SIZE 0x10
446
447 /* RouteScheme Definitions */
448 typedef enum TXSTATUS_ROUTING_SCHEME
449 {
450 ROUTINGSCHEME_IDLE = 0,
451 ROUTINGSCHEME_DIRECT = 1,
452 ROUTINGSCHEME_CACHED_ROUTE_SR = 2,
453 ROUTINGSCHEME_CACHED_ROUTE = 3,
454 ROUTINGSCHEME_CACHED_ROUTE_NLWR = 4,
455 ROUTINGSCHEME_ROUTE = 5,
456 ROUTINGSCHEME_RESORT_DIRECT = 6,
457 ROUTINGSCHEME_RESORT_EXPLORE = 7
458 } TXSTATUS_ROUTING_SCHEME;
459
460 /* RouteSpeed Definitions */
461 typedef enum TXSTATUS_ROUTE_SPEED
462 {
463 ROUTE_SPEED_AUTO = 0,
464 ROUTE_SPEED_9600 = 1,
465 ROUTE_SPEED_40K = 2,
466 ROUTE_SPEED_100K = 3,
467 } TXSTATUS_ROUTE_SPEED;
468
469 #endif // _Defs_H
470