Digi XBee(R) ANSI C Host Library
zcl_types.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2012 Digi International Inc.,
3  * All rights not expressly granted are reserved.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
7  * You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
10  * =======================================================================
11  */
12 
22 #ifndef __ZIGBEE_ZCL_TYPES_H
23 #define __ZIGBEE_ZCL_TYPES_H
24 
25 #include "xbee/platform.h"
26 #include "xbee/byteorder.h"
27 
29 
33 #define ZCL_TYPE_NO_DATA 0x00 // 0 octets
34 
36 
40 #define ZCL_TYPE_GENERAL_8BIT 0x08 // 1 octet
41 #define ZCL_TYPE_GENERAL_16BIT 0x09 // 2 octets
42 #define ZCL_TYPE_GENERAL_24BIT 0x0a // 3 octets
43 #define ZCL_TYPE_GENERAL_32BIT 0x0b // 4 octets
44 #define ZCL_TYPE_GENERAL_40BIT 0x0c // 5 octets
45 #define ZCL_TYPE_GENERAL_48BIT 0x0d // 6 octets
46 #define ZCL_TYPE_GENERAL_56BIT 0x0e // 7 octets
47 #define ZCL_TYPE_GENERAL_64BIT 0x0f // 8 octets
48 
53 #define ZCL_TYPE_LOGICAL_BOOLEAN 0x10 // 1 octet, invalid=0xff
54 
59 #define ZCL_BOOL_FALSE 0x00
60 #define ZCL_BOOL_TRUE 0x01
61 #define ZCL_BOOL_INVALID 0xff
62 
67 #define ZCL_TYPE_BITMAP_8BIT 0x18 // 1 octet
68 #define ZCL_TYPE_BITMAP_16BIT 0x19 // 2 octets
69 #define ZCL_TYPE_BITMAP_24BIT 0x1a // 3 octets
70 #define ZCL_TYPE_BITMAP_32BIT 0x1b // 4 octets
71 #define ZCL_TYPE_BITMAP_40BIT 0x1c // 5 octets
72 #define ZCL_TYPE_BITMAP_48BIT 0x1d // 6 octets
73 #define ZCL_TYPE_BITMAP_56BIT 0x1e // 7 octets
74 #define ZCL_TYPE_BITMAP_64BIT 0x1f // 8 octets
75 
80 #define ZCL_TYPE_UNSIGNED_8BIT 0x20 // 1 octet, invalid=0xff
81 #define ZCL_TYPE_UNSIGNED_16BIT 0x21 // 2 octets, invalid = 0xffff
82 #define ZCL_TYPE_UNSIGNED_24BIT 0x22 // 3 octets, invalid = 0xffffff
83 #define ZCL_TYPE_UNSIGNED_32BIT 0x23 // 4 octets, invalid = 0xffffffff
84 #define ZCL_TYPE_UNSIGNED_40BIT 0x24 // 5 octets, invalid = all ff's
85 #define ZCL_TYPE_UNSIGNED_48BIT 0x25 // 6 octets, invalid = all ff's
86 #define ZCL_TYPE_UNSIGNED_56BIT 0x26 // 7 octets, invalid = all ff's
87 #define ZCL_TYPE_UNSIGNED_64BIT 0x27 // 8 octets, invalid = all ff's
88 
93 #define ZCL_TYPE_SIGNED_8BIT 0x28 // 1 octet, invalid=0x80
94 #define ZCL_TYPE_SIGNED_16BIT 0x29 // 2 octets, invalid=0x8000
95 #define ZCL_TYPE_SIGNED_24BIT 0x2a // 3 octets, invalid=0x800000
96 #define ZCL_TYPE_SIGNED_32BIT 0x2b // 4 octets, invalid=0x80000000
97 #define ZCL_TYPE_SIGNED_40BIT 0x2c // 5 octets, invalid=0x8000000000
98 #define ZCL_TYPE_SIGNED_48BIT 0x2d // 6 octets, invalid=0x80...0
99 #define ZCL_TYPE_SIGNED_56BIT 0x2e // 7 octets, invalid=0x80...0
100 #define ZCL_TYPE_SIGNED_64BIT 0x2f // 8 octets, invalid=0x80...0
101 
106 #define ZCL_TYPE_ENUM_8BIT 0x30 // 1 octet, invalid=0xff
107 #define ZCL_TYPE_ENUM_16BIT 0x31 // 2 octets, invalid=0xffff
108 
113 #define ZCL_TYPE_FLOAT_SEMI 0x38 // 2 octets, invalid=NaN
115 
117 #define ZCL_TYPE_FLOAT_SINGLE 0x39 // 4 octets, invalid=NaN
118 
120 #define ZCL_TYPE_FLOAT_DOUBLE 0x3a // 8 octets, invalid=NaN
121 
123 /* For now, comment out all floating point macros.
124  Needs significant work if we're going to use it.
125  Decide on whether the _EXPONENT macro should be the actual signed exponent,
126  or the value of the bits.
127 
128  Single precision and double-precision should map just fine to 'float' and
129  'double' on platforms that properly support IEEE 754 floating point.
130 
131 / ** @name Semi-Precision Floating Point
132  Macros for working with host-byte-order semi-precision floating-point values,
133  stored in a uint16_t.
134 
135  @internal
136 
137  @WARNING The current driver does not implement floating point values,
138  these macros are completely untested.
139  @{
140 * /
142 #define ZCL_FLOAT_SEMI_IS_NEGATIVE(f) ((uint16_t)(f) & UINT16_C(0x8000))
144 #define ZCL_FLOAT_SEMI_EXPONENT(f) \
145  (((int16_t)(f) >> 10 & UINT16_C(0x001F)) - 15)
147 #define ZCL_FLOAT_SEMI_MANTISSA(f) ((int16_t)(f) & UINT16_C(0x03FF))
148 
151 #define ZCL_FLOAT_SEMI_IS_NAN(f) (ZCL_FLOAT_SEMI_EXPONENT(f) == 16) && \
152  (ZCL_FLOAT_SEMI_MANTISSA(f))
153 
156 #define ZCL_FLOAT_SEMI_NORMALISED(f) (ZCL_FLOAT_SEMI_EXPONENT(f) == -15)
157 
160 #define ZCL_FLOAT_SEMI_INF_POS UINT16_C(0x7C00)
163 #define ZCL_FLOAT_SEMI_INF_NEG UINT16_C(0xFC00)
164 
167 #define ZCL_FLOAT_SEMI_ZERO_POS UINT16_C(0x0000)
170 #define ZCL_FLOAT_SEMI_ZERO_NEG UINT16_C(0x8000)
172 
173 / ** @name Semi-Precision Floating Point
174  Macros for working with single-precision IEEE 754 floating-point values, stored
175  in a uint32_t.
176 
177  @internal
178 
179  @WARNING The current driver does not implement floating point values,
180  these macros are completely untested.
181  @{
182 * /
184 #define ZCL_FLOAT_IS_NEGATIVE(f) ((uint32_t)(f) & UINT32_C(0x80000000))
186 #define ZCL_FLOAT_EXPONENT(f) \
187  (((int32_t)(f) >> 23 & UINT32_C(0x00FF)) - 127)
189 #define ZCL_FLOAT_MANTISSA(f) ((uint32_t)(f) & UINT32_C(0x007FFFFF))
190 
191 // Not a Number (NaN) used for undefined values and is indicated by an exponent
192 // of all-ones with a non-zero mantissa.
193 #define ZCL_FLOAT_IS_NAN(f) (ZCL_FLOAT_EXPONENT(f) == 128) && \
194  (ZCL_FLOAT_MANTISSA(f))
195 
196 // Un-normalised numbers: numbers < 2^-14 are indicated by a value of 0 for the
197 // exponent.
198 #define ZCL_FLOAT_NORMALISED(f) (ZCL_FLOAT_EXPONENT(f) == -127)
199 
200 // Infinity: indicated by an exponent of 31 and a zero mantissa
201 #define ZCL_FLOAT_INF_POS (float) 0x7F800000ul
202 #define ZCL_FLOAT_INF_NEG (float) 0xFF800000ul
203 
204 // Zero: indicated by a zero exponent and zero mantissa
205 #define ZCL_FLOAT_ZERO_POS (float) 0x00000000ul
206 #define ZCL_FLOAT_ZERO_NEG (float) 0x80000000ul
208 
209 */
210 
211 
215 //
217 #define ZCL_TYPE_STRING_OCTET 0x41
218 
223 #define ZCL_TYPE_STRING_CHAR 0x42
224 
228 #define ZCL_TYPE_STRING_LONG_OCTET 0x43
229 
234 #define ZCL_TYPE_STRING_LONG_CHAR 0x44
235 
237 // Array, Structure, Set, Bag
238 // These datatypes are currently unsupported.
239 
243 #define ZCL_TYPE_ARRAY 0x48 // invalid=0xffff in first 2 octets
245 #define ZCL_TYPE_STRUCT 0x4C // invalid=0xffff in first 2 octets
247 
252 #define ZCL_TYPE_SET 0x50 // number of elements = 0xffff
254 #define ZCL_TYPE_BAG 0x51 // number of elements = 0xffff
256 
261 #define ZCL_TYPE_TIME_TIMEOFDAY 0xE0 // 4 octets, invalid=0xffffffff
263 
265 #define ZCL_TYPE_TIME_DATE 0xE1 // 4 octets, invalid=0xffffffff
266 
268 #define ZCL_TYPE_TIME_UTCTIME 0xE2 // 4 octets, invalid=0xffffffff
269 
271 typedef uint32_t zcl_utctime_t;
272 #define ZCL_UTCTIME_INVALID 0xFFFFFFFF
273 
275 typedef XBEE_PACKED(zcl_timeofday_t, {
276  uint8_t hours;
277  uint8_t minutes;
278  uint8_t seconds;
279  uint8_t hundredths;
281 
283 typedef XBEE_PACKED(zcl_date_t, {
284  uint8_t year;
285  uint8_t month;
286  uint8_t day;
287  uint8_t dayofweek;
289 
293 #define ZCL_TYPE_ID_CLUSTER 0xE8 // 2 octets, invalid=0xffff
295 
297 #define ZCL_TYPE_ID_ATTRIB 0xE9 // 2 octets, invalid=0xffff
298 
300 #define ZCL_TYPE_ID_BACNET_OID 0xEA // 4 octets, invalid=0xffffffff
301 
306 #define ZCL_TYPE_IEEE_ADDR 0xF0 // 8 octets, invalid=all ffs
308 
310 #define ZCL_TYPE_SECURITY_KEY 0xF1 // 16 octets (128-bit security key)
311 
316 #define ZCL_TYPE_UNKNOWN 0xFF // 0 octets
318 
320 // DEVNOTE: May be necessary to add pragmas to pack these structures on
321 // non-embedded platforms.
322 
324 typedef union zcl40_t {
325  uint8_t u8[5];
326  XBEE_PACKED(, {
327  #if BYTE_ORDER == LITTLE_ENDIAN
328  uint32_t low32;
329  uint8_t high8;
330  #else
331  uint8_t high8;
332  uint32_t low32;
333  #endif
334  }) mixed;
335 } zcl40_t;
336 
338 typedef union zcl48_t {
339  uint8_t u8[6];
340  uint16_t u16[3];
341  XBEE_PACKED(, {
342  #if BYTE_ORDER == LITTLE_ENDIAN
343  uint32_t low32;
344  uint16_t high16;
345  #else
346  uint16_t high16;
347  uint32_t low32;
348  #endif
349  }) mixed;
350 } zcl48_t;
351 
352 // load separate header containing definition of zcl64_t and macros
353 // to work with 64-bit integers
354 #include "zigbee/zcl64.h"
355 
361 #define ZCL_T_INVALID 0x0F
363 #define ZCL_T_DISCRETE 0x80
366 #define ZCL_T_ANALOG 0x20
369 #define ZCL_T_SIGNED 0x40
371 #define ZCL_T_FLOAT 0x10
373 #define ZCL_T_REPORTABLE (ZCL_T_ANALOG | ZCL_T_DISCRETE)
376 
381 
383 #define ZCL_T_SIZE_MASK 0x0F
384 #define ZCL_T_SIZE_INVALID (ZCL_T_INVALID & ZCL_T_SIZE_MASK)
386 #define ZCL_T_SIZE_SHORT 0x0E
388 #define ZCL_T_SIZE_LONG 0x0D
390 #define ZCL_T_SIZE_128BIT 0x0C
392 #define ZCL_T_SIZE_VARIABLE 0x0B
394 
397 #define ZCL_TYPE_IS_ANALOG(t) (zcl_type_info[t] & ZCL_T_ANALOG)
398 #define ZCL_TYPE_IS_DISCRETE(t) (zcl_type_info[t] & ZCL_T_DISCRETE)
400 #define ZCL_TYPE_IS_SIGNED(t) (zcl_type_info[t] & ZCL_T_SIGNED)
402 #define ZCL_TYPE_IS_REPORTABLE(t) (zcl_type_info[t] & ZCL_T_REPORTABLE)
404 #define ZCL_TYPE_IS_INVALID(t) (zcl_type_info[t] == ZCL_T_INVALID)
406 
407 // documented in zcl_types.c
408 extern const uint8_t zcl_type_info[256];
409 #define ZCL_SIZE_SHORT -1
410 #define ZCL_SIZE_LONG -2
411 #define ZCL_SIZE_VARIABLE -3
412 #define ZCL_SIZE_INVALID -127
413 int zcl_sizeof_type( uint8_t type);
414 const char *zcl_type_name( uint8_t type);
415 
417 
418 // If compiling in Dynamic C, automatically #use the appropriate C file.
419 #ifdef __DC__
420  #use "zcl_types.c"
421 #endif
422 
423 #endif // __ZIGBEE_ZCL_TYPES_H
424 
unsigned long uint32_t
32-bit unsigned integer
Definition: platform_config.h:43
const uint8_t zcl_type_info[256]
Table to store information on each ZCL datatype.
Definition: zcl_types.c:54
#define XBEE_BEGIN_DECLS
Macro defined to.
Definition: platform.h:41
Common header for Hardware Abstraction Layer.
const char * zcl_type_name(uint8_t type)
Return a descriptive string for a given ZCL attribute type.
Definition: zcl_types.c:316
Date (for ZCL_TYPE_TIME_DATE Data Type)
Definition: zcl_types.h:288
48-bit unsigned in host-byte-order
Definition: zcl_types.h:338
Time of Day (for ZCL_TYPE_TIME_TIMEOFDAY Data Type)
Definition: zcl_types.h:280
unsigned short uint16_t
16-bit unsigned integer
Definition: platform_config.h:41
unsigned char uint8_t
8-bit unsigned integer
Definition: platform_config.h:39
Macros for working with 64-bit integers via the zcl64_t datatype.
40-bit unsigned in host-byte-order
Definition: zcl_types.h:324
int zcl_sizeof_type(uint8_t type)
Return the number of octets used by a given ZCL datatype.
Definition: zcl_types.c:274
#define XBEE_END_DECLS
Macro defined to.
Definition: platform.h:42