1 /***************************************************************************//**
2  * @file
3  * @brief The Z-Wave specific header file for the RAIL library.
4  *******************************************************************************
5  * # License
6  * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
7  *******************************************************************************
8  *
9  * SPDX-License-Identifier: Zlib
10  *
11  * The licensor of this software is Silicon Laboratories Inc.
12  *
13  * This software is provided 'as-is', without any express or implied
14  * warranty. In no event will the authors be held liable for any damages
15  * arising from the use of this software.
16  *
17  * Permission is granted to anyone to use this software for any purpose,
18  * including commercial applications, and to alter it and redistribute it
19  * freely, subject to the following restrictions:
20  *
21  * 1. The origin of this software must not be misrepresented; you must not
22  *    claim that you wrote the original software. If you use this software
23  *    in a product, an acknowledgment in the product documentation would be
24  *    appreciated but is not required.
25  * 2. Altered source versions must be plainly marked as such, and must not be
26  *    misrepresented as being the original software.
27  * 3. This notice may not be removed or altered from any source distribution.
28  *
29  ******************************************************************************/
30 
31 #ifndef __RAIL_ZWAVE_H__
32 #define __RAIL_ZWAVE_H__
33 
34 #include "rail_types.h"
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 /// @addtogroup Z_Wave Z-Wave
41 /// @ingroup Protocol_Specific
42 /// @brief Z-Wave configuration routines
43 ///
44 /// The functions in this group configure RAIL Z-Wave hardware
45 /// acceleration features.
46 ///
47 /// To configure Z-Wave functionality, the application must first set up
48 /// a RAIL instance with RAIL_Init() and other setup functions.
49 ///
50 /// @code{.c}
51 ///
52 /// RAIL_ZWAVE_NodeId_t gRecentBeamNodeId;
53 /// uint8_t gRecentBeamChannelIndex;
54 ///
55 /// // Main RAIL_EVENT callback
56 /// static void RAILCb_Event(RAIL_Handle_t railHandle, RAIL_Events_t events)
57 /// {
58 ///   // Get beamNodeId and channel index from beam packet
59 ///   if (events & RAIL_EVENT_ZWAVE_BEAM) {
60 ///     if (RAIL_ZWAVE_IsEnabled(railHandle)) {
61 ///       if ((RAIL_ZWAVE_GetBeamNodeId(railHandle, &gRecentBeamNodeId)
62 ///            != RAIL_STATUS_NO_ERROR)
63 ///           || (RAIL_ZWAVE_GetBeamChannelIndex(railHandle, &gRecentBeamChannelIndex)
64 ///               != RAIL_STATUS_NO_ERROR)) {
65 ///         return;
66 ///       }
67 ///     }
68 ///   }
69 /// }
70 ///
71 /// static const RAIL_ZWAVE_Config_t zwaveConfig = {
72 ///   .options = RAIL_ZWAVE_OPTIONS_DEFAULT
73 /// };
74 ///
75 /// RAIL_Status_t zwaveInit(void)
76 /// {
77 ///   // initialize Z-Wave
78 ///   RAIL_Status_t status = RAIL_ZWAVE_Init(railHandle, &zwaveConfig);
79 ///
80 ///   if (status != RAIL_STATUS_NO_ERROR) {
81 ///     return status;
82 ///   }
83 ///
84 ///   uint8_t myHomeId[4] = { 0xDE, 0xAD, 0xBE, 0xEF };
85 ///   RAIL_ZWAVE_SetNodeId(railHandle, RAIL_ZWAVE_NODE_ID_DEFAULT);
86 ///   RAIL_ZWAVE_SetHomeId(railHandle, myHomeId, RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE);
87 ///
88 ///   // configure region to EU(European Union)
89 ///   return RAIL_ZWAVE_ConfigRegion(railHandle, RAIL_ZWAVE_REGION_EU);
90 /// }
91 /// @endcode
92 ///
93 /// @{
94 
95 /**
96  * @enum RAIL_ZWAVE_Options_t
97  * @brief Z-Wave options.
98  */
RAIL_ENUM_GENERIC(RAIL_ZWAVE_Options_t,uint32_t)99 RAIL_ENUM_GENERIC(RAIL_ZWAVE_Options_t, uint32_t) {
100   // Z-Wave Option Bit Shifts
101 
102   /** Shift position of \ref RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE bit */
103   RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT = 0,
104   /** Shift position of \ref RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES bit */
105   RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT,
106   /** Shift position of \ref RAIL_ZWAVE_OPTION_NODE_ID_FILTERING bit */
107   RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT,
108   /** Shift position of \ref RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE bit */
109   RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT,
110 };
111 
112 // RAIL_ZWAVE_Options_t bitmasks
113 
114 /** A value representing no options */
115 #define RAIL_ZWAVE_OPTIONS_NONE 0U
116 
117 /** All options are disabled by default. */
118 #define RAIL_ZWAVE_OPTIONS_DEFAULT RAIL_ZWAVE_OPTIONS_NONE
119 
120 /**
121  * An option to configure promiscuous mode, accepting non-beam packets
122  * regardless of their HomeId. By default packets are filtered by their HomeId.
123  * When true, such filtering is disabled.
124  */
125 #define RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE \
126   (1u << RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT)
127 
128 /**
129  * An option to filter non-beam packets based on their NodeId when
130  * \ref RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE is disabled.
131  *
132  * @note This option has no effect when
133  *   \ref RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE is enabled.
134  */
135 #define RAIL_ZWAVE_OPTION_NODE_ID_FILTERING \
136   (1u << RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT)
137 
138 /**
139  * An option to configure beam frame recognition. By default beams are not
140  * considered special and will be received as if they were normal Z-Wave
141  * frames, assuredly triggering \ref RAIL_EVENT_RX_FRAME_ERROR.
142  * When true, beam frames that are broadcast or match the NodeId and
143  * HomeIdHash values will trigger \ref RAIL_EVENT_ZWAVE_BEAM event.
144  * (All beams additionally trigger \ref RAIL_EVENT_RX_PACKET_ABORTED
145  * regardless of NodeId / HomeIdHash values.)
146  *
147  * @note This option takes precedence over \ref
148  *   RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE when receiving a beam frame.
149  *   For promiscuous beam handling see related
150  *   \ref RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE option.
151  */
152 #define RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES \
153   (1u << RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT)
154 
155 /**
156  * An option to receive all beams promiscuously when \ref
157  * RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES is enabled.
158  * When true, beam frames are received regardless of their NodeId or HomeIdHash
159  * resulting in \ref RAIL_EVENT_ZWAVE_BEAM (and also \ref
160  * RAIL_EVENT_RX_PACKET_ABORTED) for each beam frame.
161  *
162  * @note This option has no effect when
163  *   \ref RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES is disabled.
164  */
165 #define RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE \
166   (1u << RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT)
167 
168 /** A value representing all options */
169 #define RAIL_ZWAVE_OPTIONS_ALL 0xFFFFFFFFU
170 
171 /**
172  * @enum RAIL_ZWAVE_NodeId_t
173  * @brief A Z-Wave Node ID.
174  *
175  * This data type is 12 bits wide when using the ZWave Long Range PHY, and
176  * 8 bits wide otherwise.
177  *
178  * @note When using the Long Range PHY, values 0xFA1..0xFFE are reserved.
179  *   Otherwise, values 0xE9..0xFE are reserved.
180  */
RAIL_ENUM_GENERIC(RAIL_ZWAVE_NodeId_t,uint16_t)181 RAIL_ENUM_GENERIC(RAIL_ZWAVE_NodeId_t, uint16_t) {
182   /** The unknown NodeId for uninitialized nodes. */
183   RAIL_ZWAVE_NODE_ID_NONE = 0x00U,
184   /** The broadcast NodeId. */
185   RAIL_ZWAVE_NODE_ID_BROADCAST = 0xFFU,
186   /** Default to the broadcast NodeId. */
187   RAIL_ZWAVE_NODE_ID_DEFAULT = RAIL_ZWAVE_NODE_ID_BROADCAST,
188   // All other values between 0x00 and 0xFE are valid node IDs normally
189   /** The Long Range broadcast NodeId. */
190   RAIL_ZWAVE_NODE_ID_BROADCAST_LONGRANGE = 0xFFFU,
191   /** Default to the Long Range broadcast NodeId. */
192   RAIL_ZWAVE_NODE_ID_DEFAULT_LONGRANGE = RAIL_ZWAVE_NODE_ID_BROADCAST_LONGRANGE,
193   // All values from 0x001 to 0xFA1 are valid node IDs with a Long Range PHY.
194 };
195 
196 #ifndef DOXYGEN_SHOULD_SKIP_THIS
197 // Self-referencing defines minimize compiler complaints when using RAIL_ENUM
198 #define RAIL_ZWAVE_NODE_ID_NONE      ((RAIL_ZWAVE_NodeId_t) RAIL_ZWAVE_NODE_ID_NONE)
199 #define RAIL_ZWAVE_NODE_ID_BROADCAST ((RAIL_ZWAVE_NodeId_t) RAIL_ZWAVE_NODE_ID_BROADCAST)
200 #define RAIL_ZWAVE_NODE_ID_DEFAULT   ((RAIL_ZWAVE_NodeId_t) RAIL_ZWAVE_NODE_ID_DEFAULT)
201 #endif//DOXYGEN_SHOULD_SKIP_THIS
202 
203 #ifndef DOXYGEN_SHOULD_SKIP_THIS
204 /** Defines for subPhyID field in RAIL_RxPacketDetails_t */
205 #define RAIL_ZWAVE_RX_SUBPHY_ID_0     (0U)
206 #define RAIL_ZWAVE_RX_SUBPHY_ID_1     (1U)
207 #define RAIL_ZWAVE_RX_SUBPHY_ID_2     (2U)
208 #define RAIL_ZWAVE_RX_SUBPHY_ID_3     (3U)
209 #endif//DOXYGEN_SHOULD_SKIP_THIS
210 
211 /**
212  * @enum RAIL_ZWAVE_HomeId_t
213  * @brief A Z-Wave Home ID.
214  *
215  * @note Home IDs in the range 0x54000000..0x55FFFFFF are illegal.
216  */
RAIL_ENUM_GENERIC(RAIL_ZWAVE_HomeId_t,uint32_t)217 RAIL_ENUM_GENERIC(RAIL_ZWAVE_HomeId_t, uint32_t) {
218   RAIL_ZWAVE_HOME_ID_UNKNOWN = 0x00000000U, /**< The unknown HomeId. */
219   RAIL_ZWAVE_HOME_ID_DEFAULT = 0x54545454U, /**< An impossible and unlikely HomeId. */
220 };
221 
222 #ifndef DOXYGEN_SHOULD_SKIP_THIS
223 // Self-referencing defines minimize compiler complaints when using RAIL_ENUM
224 #define RAIL_ZWAVE_HOME_ID_UNKNOWN ((RAIL_ZWAVE_HomeId_t) RAIL_ZWAVE_HOME_ID_UNKNOWN)
225 #define RAIL_ZWAVE_HOME_ID_DEFAULT ((RAIL_ZWAVE_HomeId_t) RAIL_ZWAVE_HOME_ID_DEFAULT)
226 #endif//DOXYGEN_SHOULD_SKIP_THIS
227 
228 /**
229  * @enum RAIL_ZWAVE_HomeIdHash_t
230  * @brief A Z-Wave Home ID hash.
231  *
232  * @note Certain values (as shown) are illegal.
233  */
RAIL_ENUM(RAIL_ZWAVE_HomeIdHash_t)234 RAIL_ENUM(RAIL_ZWAVE_HomeIdHash_t) {
235   RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1 = 0x0AU, /**< An illegal HomeIdHash value. */
236   RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2 = 0x4AU, /**< An illegal HomeIdHash value. */
237   RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_3 = 0x55U, /**< An illegal HomeIdHash value. */
238   RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE = 0x55U, /**< Illegal HomeIdHash value that
239                                                   suppresses checking the
240                                                   HomeIdHash field of beam
241                                                   packets. */
242   RAIL_ZWAVE_HOME_ID_HASH_DEFAULT
243     = RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE, /**< Default to don't care. */
244 };
245 
246 #ifndef DOXYGEN_SHOULD_SKIP_THIS
247 // Self-referencing defines minimize compiler complaints when using RAIL_ENUM
248 #define RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1 ((RAIL_ZWAVE_HomeIdHash_t) RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1)
249 #define RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2 ((RAIL_ZWAVE_HomeIdHash_t) RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2)
250 #define RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_3 ((RAIL_ZWAVE_HomeIdHash_t) RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_3)
251 #define RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE ((RAIL_ZWAVE_HomeIdHash_t) RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE)
252 #define RAIL_ZWAVE_HOME_ID_HASH_DEFAULT   ((RAIL_ZWAVE_HomeIdHash_t) RAIL_ZWAVE_HOME_ID_HASH_DEFAULT)
253 #endif//DOXYGEN_SHOULD_SKIP_THIS
254 
255 /**
256  * @struct RAIL_ZWAVE_Config_t
257  * @brief A configuration structure for Z-Wave in RAIL.
258  */
259 typedef struct RAIL_ZWAVE_Config {
260   /**
261    * Defines Z-Wave options.
262    */
263   RAIL_ZWAVE_Options_t options;
264   /**
265    * Defines Z-Wave ACKing configuration.
266    */
267   RAIL_AutoAckConfig_t ackConfig;
268   /**
269    * Defines state timings for Z-Wave.
270    */
271   RAIL_StateTiming_t timings;
272 } RAIL_ZWAVE_Config_t;
273 
274 /**
275  * @enum RAIL_ZWAVE_Baud_t
276  * @brief Z-Wave supported baudrates or PHYs.
277  */
RAIL_ENUM(RAIL_ZWAVE_Baud_t)278 RAIL_ENUM(RAIL_ZWAVE_Baud_t) {
279   RAIL_ZWAVE_BAUD_9600,     /**< 9.6kbps baudrate*/
280   RAIL_ZWAVE_BAUD_40K,      /**< 40kbps baudrate*/
281   RAIL_ZWAVE_BAUD_100K,     /**< 100kbps baudrate*/
282   RAIL_ZWAVE_LR,            /**< Long Range PHY*/
283   RAIL_ZWAVE_ENERGY_DETECT = RAIL_ZWAVE_LR, /**< Energy detection PHY*/
284   RAIL_ZWAVE_BAUD_INVALID   /**< Sentinel value for invalid baud rate*/
285 };
286 
287 /**
288  * Sentinel value to indicate that a channel (and thus its frequency)
289  * are invalid.
290  */
291 #define RAIL_ZWAVE_FREQ_INVALID 0xFFFFFFFFUL
292 
293 #ifndef DOXYGEN_SHOULD_SKIP_THIS
294 // Self-referencing defines minimize compiler complaints when using RAIL_ENUM
295 #define RAIL_ZWAVE_BAUD_9600      ((RAIL_ZWAVE_Baud_t) RAIL_ZWAVE_BAUD_9600)
296 #define RAIL_ZWAVE_BAUD_40K       ((RAIL_ZWAVE_Baud_t) RAIL_ZWAVE_BAUD_40K)
297 #define RAIL_ZWAVE_BAUD_100K      ((RAIL_ZWAVE_Baud_t) RAIL_ZWAVE_BAUD_100K)
298 #define RAIL_ZWAVE_LR             ((RAIL_ZWAVE_Baud_t) RAIL_ZWAVE_LR)
299 #define RAIL_ZWAVE_ENERGY_DETECT  ((RAIL_ZWAVE_Baud_t) RAIL_ZWAVE_ENERGY_DETECT)
300 #define RAIL_ZWAVE_INVALID        ((RAIL_ZWAVE_Baud_t) RAIL_ZWAVE_INVALID)
301 #endif//DOXYGEN_SHOULD_SKIP_THIS
302 
303 /**
304  * @enum RAIL_ZWAVE_RegionId_t
305  * @brief Z-Wave region identifications.
306  */
RAIL_ENUM(RAIL_ZWAVE_RegionId_t)307 RAIL_ENUM(RAIL_ZWAVE_RegionId_t) {
308   RAIL_ZWAVE_REGIONID_UNKNOWN, /**< Unknown/Invalid*/
309   RAIL_ZWAVE_REGIONID_EU,      /**< European Union*/
310   RAIL_ZWAVE_REGIONID_US,      /**< United States*/
311   RAIL_ZWAVE_REGIONID_ANZ,     /**< Australia/New Zealand*/
312   RAIL_ZWAVE_REGIONID_HK,      /**< Hong Kong*/
313   RAIL_ZWAVE_REGIONID_MY,      /**< Malaysia*/
314   RAIL_ZWAVE_REGIONID_IN,      /**< India*/
315   RAIL_ZWAVE_REGIONID_JP,      /**< Japan*/
316   RAIL_ZWAVE_REGIONID_RU,      /**< Russian Federation*/
317   RAIL_ZWAVE_REGIONID_IL,      /**< Israel*/
318   RAIL_ZWAVE_REGIONID_KR,      /**< Korea*/
319   RAIL_ZWAVE_REGIONID_CN,      /**< China*/
320   RAIL_ZWAVE_REGIONID_US_LR1,  /**< United States, with first long range PHY*/
321   RAIL_ZWAVE_REGIONID_US_LR2,  /**< United States, with second long range PHY*/
322   RAIL_ZWAVE_REGIONID_US_LR_END_DEVICE, /**< United States long range end device PHY for both LR frequencies*/
323   RAIL_ZWAVE_REGIONID_COUNT    /**< Count of known regions, must be last*/
324 };
325 
326 #ifndef DOXYGEN_SHOULD_SKIP_THIS
327 // Self-referencing defines minimize compiler complaints when using RAIL_ENUM
328 #define RAIL_ZWAVE_REGIONID_UNKNOWN ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_UNKNOWN)
329 #define RAIL_ZWAVE_REGIONID_EU ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_EU)
330 #define RAIL_ZWAVE_REGIONID_US ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_US)
331 #define RAIL_ZWAVE_REGIONID_ANZ ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_ANZ)
332 #define RAIL_ZWAVE_REGIONID_HK ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_HK)
333 #define RAIL_ZWAVE_REGIONID_MY ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_MY)
334 #define RAIL_ZWAVE_REGIONID_IN ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_IN)
335 #define RAIL_ZWAVE_REGIONID_JP ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_JP)
336 #define RAIL_ZWAVE_REGIONID_RU ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_RU)
337 #define RAIL_ZWAVE_REGIONID_IL ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_IL)
338 #define RAIL_ZWAVE_REGIONID_KR ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_KR)
339 #define RAIL_ZWAVE_REGIONID_CN ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_CN)
340 #define RAIL_ZWAVE_REGIONID_US_LR1 ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_US_LR1)
341 #define RAIL_ZWAVE_REGIONID_US_LR2 ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_US_LR2)
342 #define RAIL_ZWAVE_REGIONID_US_LR_END_DEVICE ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_US_LR_END_DEVICE)
343 #define RAIL_ZWAVE_REGIONID_COUNT ((RAIL_ZWAVE_RegionId_t) RAIL_ZWAVE_REGIONID_COUNT)
344 #endif//DOXYGEN_SHOULD_SKIP_THIS
345 
346 #ifndef DOXYGEN_SHOULD_SKIP_THIS
347 // Largest ACK timeout period based on
348 // aPhyTurnaroundTimeRxTx (1 ms max)+ (aMacTransferAckTimeTX (168 bits)* (1/data rate))
349 // For slowest Data Rate R1 (19.6 kbit/s)
350 #define RAIL_ZWAVE_MAX_ACK_TIMEOUT_US        (9600U)
351 
352 // Defines for Transition timing
353 #define RAIL_ZWAVE_TIME_IDLE_TO_RX_US        (100U)
354 #define RAIL_ZWAVE_TIME_TX_TO_RX_US          (0U)
355 #define RAIL_ZWAVE_TIME_IDLE_TO_TX_US        (0U)
356 #define RAIL_ZWAVE_TIME_RX_TO_TX_US          (1000U)
357 
358 #endif//DOXYGEN_SHOULD_SKIP_THIS
359 
360 /**
361  * Invalid beam TX power value returned when \ref RAIL_ZWAVE_GetLrBeamTxPower
362  * is called after receiving a regular non-long-range beam.
363  */
364 #define RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID  (0xFFU)
365 
366 /**
367  * @struct RAIL_ZWAVE_LrAckData_t
368  * @brief Configuration structure for Z-Wave Long Range ACK.
369  */
370 typedef struct RAIL_ZWAVE_LrAckData {
371   /// Radio noise level measured on the channel the frame is transmitted on.
372   int8_t noiseFloorDbm;
373   /// Transmit power used to transmit the ongoing Z-Wave Long Range ACK.
374   int8_t txPowerDbm;
375   /// Signal strength measured while receiving the Z-Wave Long Range frame.
376   int8_t receiveRssiDbm;
377 } RAIL_ZWAVE_LrAckData_t;
378 
379 /**
380  * @struct RAIL_ZWAVE_BeamRxConfig_t
381  * @brief Configuration structure for Z-Wave beam detection.
382  * This structure should not be used without direct instruction
383  * by Silicon Labs. Appropriate defaults for this are built into
384  * the RAIL library.
385  */
386 typedef struct RAIL_ZWAVE_BeamRxConfig {
387   /// Channel hopping pattern to use for beam detection.
388   RAIL_RxChannelHoppingConfig_t channelHoppingConfig;
389   /// Amount of time to spend trying to receive a beam once detected.
390   /// 100kbps only
391   RAIL_RxDutyCycleConfig_t receiveConfig_100;
392   /// Amount of time to spend trying to receive a beam once detected.
393   /// 40kbps only
394   RAIL_RxDutyCycleConfig_t receiveConfig_40;
395 } RAIL_ZWAVE_BeamRxConfig_t;
396 
397 /**
398  * Number of channels in each of Z-Wave's region-based PHYs
399  */
400 #define RAIL_NUM_ZWAVE_CHANNELS (4U)
401 
402 /**
403  * @struct RAIL_ZWAVE_RegionConfig_t
404  * @brief Each Z-Wave region supports 3 channels.
405  */
406 typedef struct RAIL_ZWAVE_RegionConfig {
407   uint32_t frequency[RAIL_NUM_ZWAVE_CHANNELS];                        /**< Channel frequency in hertz*/
408   RAIL_TxPower_t maxPower[RAIL_NUM_ZWAVE_CHANNELS];                   /**< The maximum power allowed on the channel*/
409   RAIL_ZWAVE_Baud_t baudRate[RAIL_NUM_ZWAVE_CHANNELS];                /**< Channel baud rate index*/
410   RAIL_ZWAVE_RegionId_t regionId;                                     /**< Identification number for the region*/
411 } RAIL_ZWAVE_RegionConfig_t;
412 
413 /**
414  * @struct RAIL_ZWAVE_IrcalVal_t
415  * @brief Structure for Z-Wave Image Rejection Calibration.
416  *
417  * @note Index 0 will hold the low side image rejection calibration value (channel 0),
418  * while index 1 will hold the high side image rejection value (channel 1).
419  */
420 typedef struct RAIL_ZWAVE_IrcalVal {
421   RAIL_IrCalValues_t imageRejection[2];      /**< Low side and high side image rejection values*/
422 } RAIL_ZWAVE_IrcalVal_t;
423 
424 /**
425  * @typedef RAIL_RxChannelHoppingParameters_t
426  * @brief Rx channel hopping on-channel time for all Z-Wave channels in a region
427  */
428 typedef RAIL_RxChannelHoppingParameter_t RAIL_RxChannelHoppingParameters_t[RAIL_NUM_ZWAVE_CHANNELS];
429 
430 /**
431  * Switch the Z-Wave region.
432  *
433  * @param[in] railHandle A handle of RAIL instance.
434  * @param[in] regionCfg Z-Wave channel configuration for the selected region
435  * @return Status code indicating success of the function call.
436  *
437  * @note Setting a new Z-Wave Region will default any Low Power values to
438  * Normal Power values for the region.
439  * Z-Wave Region configuration must always be followed by a Low Power setup
440  * in case one desires to have the Low Power ACKing functionality.
441  */
442 RAIL_Status_t RAIL_ZWAVE_ConfigRegion(RAIL_Handle_t railHandle,
443                                       const RAIL_ZWAVE_RegionConfig_t *regionCfg);
444 
445 /**
446  * Perform image rejection calibration on all valid channels of a
447  * Z-Wave region.
448  *
449  * @param[in] railHandle A handle of RAIL instance.
450  * @param[in, out] pIrCalVals An application-provided pointer of
451  *  type \ref RAIL_ZWAVE_IrcalVal_t. This is populated with image rejection
452  *  calibration values, if not NULL or initialized with
453  *  \ref RAIL_CAL_INVALID_VALUE or if forceIrcal is true.
454  * @param[in] forceIrcal If true, will always perform image rejection calibration
455  *  and not use previously cached values.
456  * @return Status code indicating success of the function call.
457  *
458  * Note: This function also calibrates for beam detection and should be
459  *  called before \ref RAIL_ZWAVE_ReceiveBeam() and after the Z-Wave region
460  *  has been configured via \ref RAIL_ZWAVE_ConfigRegion().
461  *  Channel hopping must be disabled otherwise this function will return
462  *  \ref RAIL_STATUS_INVALID_CALL.
463  */
464 RAIL_Status_t RAIL_ZWAVE_PerformIrcal(RAIL_Handle_t railHandle,
465                                       RAIL_ZWAVE_IrcalVal_t *pIrCalVals,
466                                       bool forceIrcal);
467 /**
468  * Initialize RAIL for Z-Wave features.
469  *
470  * @param[in] railHandle A handle of RAIL instance.
471  * @param[in] config A Z-Wave configuration structure.
472  * @return A status code indicating success of the function call.
473  *
474  * This function is the entry point for working with Z-Wave within
475  * RAIL. It sets up relevant hardware acceleration for Z-Wave-specific
476  * features, such as HomeId filtering and beam packets (as
477  * specified in the configuration) and allows users to select the
478  * relevant Z-Wave region-specific PHY via \ref RAIL_ZWAVE_ConfigRegion.
479  */
480 RAIL_Status_t RAIL_ZWAVE_Init(RAIL_Handle_t railHandle,
481                               const RAIL_ZWAVE_Config_t *config);
482 
483 /**
484  * De-initialize Z-Wave hardware acceleration.
485  *
486  * @param[in] railHandle A handle of RAIL instance.
487  * @return A status code indicating success of the function call.
488  *
489  * Disables and resets all Z-Wave hardware acceleration features. This
490  * function should only be called when the radio is IDLE.
491  */
492 RAIL_Status_t RAIL_ZWAVE_Deinit(RAIL_Handle_t railHandle);
493 
494 /**
495  * Return whether Z-Wave hardware acceleration is currently enabled.
496  *
497  * @param[in] railHandle A handle of RAIL instance.
498  * @return True if Z-Wave hardware acceleration was enabled to start with
499  * and false otherwise.
500  */
501 bool RAIL_ZWAVE_IsEnabled(RAIL_Handle_t railHandle);
502 
503 /**
504  * Configure Z-Wave options.
505  *
506  * @param[in] railHandle A handle of RAIL instance.
507  * @param[in] mask A bitmask containing which options should be modified.
508  * @param[in] options A bitmask containing desired configuration settings.
509  *   Bit positions for each option are found in the \ref RAIL_ZWAVE_Options_t.
510  * @return Status code indicating success of the function call.
511  */
512 RAIL_Status_t RAIL_ZWAVE_ConfigOptions(RAIL_Handle_t railHandle,
513                                        RAIL_ZWAVE_Options_t mask,
514                                        RAIL_ZWAVE_Options_t options);
515 
516 /**
517  * Inform RAIL of the Z-Wave node's NodeId for receive filtering.
518  *
519  * @param[in] railHandle A handle of RAIL instance.
520  * @param[in] nodeId A Z-Wave Node ID.
521  * @return Status code indicating success of the function call.
522  *
523  * @note Until this API is called, RAIL will assume the NodeId is
524  *   \ref RAIL_ZWAVE_NODE_ID_DEFAULT.
525  */
526 RAIL_Status_t RAIL_ZWAVE_SetNodeId(RAIL_Handle_t railHandle,
527                                    RAIL_ZWAVE_NodeId_t nodeId);
528 
529 /**
530  * Inform RAIL of the Z-Wave node's HomeId and its hash for receive filtering
531  *
532  * @param[in] railHandle A handle of RAIL instance.
533  * @param[in] homeId A Z-Wave HomeId.
534  * @param[in] homeIdHash The hash of the HomeId expected in beam frames.
535  *   If this is \ref RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE, beam frame detection
536  *   will not check the HomeIdHash in a received beam frame at all, and
537  *   \ref RAIL_EVENT_ZWAVE_BEAM will trigger based solely on the NodeId
538  *   in the beam frame.
539  * @return Status code indicating success of the function call.
540  *
541  * @note Until this API is called, RAIL will assume the HomeId is an
542  *   illegal one of \ref RAIL_ZWAVE_HOME_ID_DEFAULT, and its hash is \ref
543  *   RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE.
544  */
545 RAIL_Status_t RAIL_ZWAVE_SetHomeId(RAIL_Handle_t railHandle,
546                                    RAIL_ZWAVE_HomeId_t homeId,
547                                    RAIL_ZWAVE_HomeIdHash_t homeIdHash);
548 
549 /**
550  * Get the NodeId of the most recently seen beam frame that triggered
551  * \ref RAIL_EVENT_ZWAVE_BEAM.
552  *
553  * @param[in] railHandle A handle of RAIL instance.
554  * @param[out] pNodeId A pointer to \ref RAIL_ZWAVE_NodeId_t to populate.
555  * @return Status code indicating success of the function call.
556  *
557  * @note This is best called while handling the \ref RAIL_EVENT_ZWAVE_BEAM
558  *   event; if multiple beams are received only the most recent beam's NodeId
559  *   is provided.
560  */
561 RAIL_Status_t RAIL_ZWAVE_GetBeamNodeId(RAIL_Handle_t railHandle,
562                                        RAIL_ZWAVE_NodeId_t *pNodeId);
563 
564 /**
565  * Get the HomeIdHash of the most recently seen beam frame that triggered
566  * \ref RAIL_EVENT_ZWAVE_BEAM.
567  *
568  * @param[in] railHandle A handle of RAIL instance.
569  * @param[out] pBeamHomeIdHash A pointer to \ref RAIL_ZWAVE_HomeIdHash_t to populate.
570  * @return Status code indicating success of the function call.
571  *
572  * @note This is best called while handling the \ref RAIL_EVENT_ZWAVE_BEAM
573  *   event; if multiple beams are received only the most recent beam's HomeIdHash
574  *   is provided.
575  */
576 RAIL_Status_t RAIL_ZWAVE_GetBeamHomeIdHash(RAIL_Handle_t railHandle,
577                                            RAIL_ZWAVE_HomeIdHash_t *pBeamHomeIdHash);
578 
579 /**
580  * Get the channel hopping index of the most recently seen beam frame that
581  * triggered \ref RAIL_EVENT_ZWAVE_BEAM.
582  *
583  * @param[in] railHandle A handle of RAIL instance.
584  * @param[out] pChannelIndex A pointer to a uint8_t to populate with
585  *   the channel hopping index. If channel-hopping was off at the time
586  *   the beam packet was received, \ref RAIL_CHANNEL_HOPPING_INVALID_INDEX
587  *   is provided.
588  * @return Status code indicating success of the function call.
589  *
590  * @note This is best called while handling the \ref RAIL_EVENT_ZWAVE_BEAM
591  *   event; if multiple beams are received only the most recent beam's
592  *   channel hopping index is provided.
593  */
594 RAIL_Status_t RAIL_ZWAVE_GetBeamChannelIndex(RAIL_Handle_t railHandle,
595                                              uint8_t *pChannelIndex);
596 
597 /**
598  * Get the TX power used by the transmitter of the most recently seen
599  * long range beam frame that triggered \ref RAIL_EVENT_ZWAVE_BEAM.
600  *
601  * @param[in] railHandle A handle of RAIL instance.
602  * @param[out] pLrBeamTxPower An application provided pointer to a uint8_t to
603  *   be populated with the TX power of the latest long range beam. This will
604  *   be set to \ref RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID if this API is called
605  *   after receiving a regular non-long-range beam.
606  * @return Status code indicating success of the function call. This function
607  *   will return \ref RAIL_STATUS_INVALID_STATE if called after receiving a
608  *   regular (non-long-range) beam.
609  *
610  * @note This is best called while handling the \ref RAIL_EVENT_ZWAVE_BEAM
611  *   event; if multiple beams are received only the most recent long range
612  *   beam's TX power is provided.
613  *
614  * @note The following table shows long range beam TX power value to dBm
615  *  value mapping:
616  *
617  * <table>
618  * <tr><th>Tx Power Value <th>Description
619  * <tr><td>0 <td>-6dBm
620  * <tr><td>1 <td>-2dBm
621  * <tr><td>2 <td>+2dBm
622  * <tr><td>3 <td>+6dBm
623  * <tr><td>4 <td>+10dBm
624  * <tr><td>5 <td>+13dBm
625  * <tr><td>6 <td>+16dBm
626  * <tr><td>7 <td>+19dBm
627  * <tr><td>8 <td>+21dBm
628  * <tr><td>9 <td>+23Bm
629  * <tr><td>10 <td>+25dBm
630  * <tr><td>11 <td>+26dBm
631  * <tr><td>12 <td>+27dBm
632  * <tr><td>13 <td>+28dBm
633  * <tr><td>14 <td>+29dBm
634  * <tr><td>15 <td>+30dBm
635  * </table>
636  */
637 RAIL_Status_t RAIL_ZWAVE_GetLrBeamTxPower(RAIL_Handle_t railHandle,
638                                           uint8_t *pLrBeamTxPower);
639 
640 /**
641  * Get the RSSI of the received beam frame.
642  *
643  * @param[in] railHandle A handle of RAIL instance.
644  * @param[out] pBeamRssi An application provided pointer to a int8_t to
645  *   be populated with the latest beam's RSSI, in dBm.
646  * @return Status code indicating success of the function call. This function
647  *  will return \ref RAIL_STATUS_INVALID_STATE if called without ever
648  *  having received a beam.
649  *
650  * @note This is best called while handling the \ref RAIL_EVENT_ZWAVE_BEAM
651  *   event; if multiple beams are received only the most recent beam's
652  *   RSSI is provided.
653  */
654 RAIL_Status_t RAIL_ZWAVE_GetBeamRssi(RAIL_Handle_t railHandle,
655                                      int8_t *pBeamRssi);
656 /**
657  * Set the Raw Low Power settings.
658  *
659  * @param[in] railHandle A handle of RAIL instance.
660  * @param[in] powerLevel Desired low power raw level.
661  * @return Status code indicating success of the function call.
662  *
663  * Low Power settings are required during ACK transmissions when
664  * the Low Power Bit is set. This setting is only valid for one
665  * subsequent transmission, after which all transmissions will be
666  * at the nominal power setting, until re-invoked.
667  */
668 
669 RAIL_Status_t RAIL_ZWAVE_SetTxLowPower(RAIL_Handle_t railHandle,
670                                        uint8_t powerLevel);
671 
672 /**
673  * Set the Low Power settings in dBm.
674  *
675  * @param[in] railHandle A handle of RAIL instance.
676  * @param[in] powerLevel Desired low power level dBm.
677  * @return Status code indicating success of the function call.
678  *
679  * Low Power settings are required during ACK transmissions when
680  * the Low Power Bit is set. This setting is only valid for one
681  * subsequent transmission, after which all transmissions will be
682  * at the nominal power setting, until re-invoked.
683  */
684 RAIL_Status_t RAIL_ZWAVE_SetTxLowPowerDbm(RAIL_Handle_t railHandle,
685                                           RAIL_TxPower_t powerLevel);
686 
687 /**
688  * Get the TX low power in raw units (see \ref rail_chip_specific.h for
689  * value ranges).
690  *
691  * @param[in] railHandle A RAIL instance handle.
692  * @return The chip-specific \ref RAIL_TxPowerLevel_t raw value of the low
693  * transmit power.
694  *
695  * This API returns the low raw power value that was set by
696  * \ref RAIL_ZWAVE_SetTxLowPower.
697  *
698  * Calling this function before configuring the Low Power PA
699  * (i.e., before a successful
700  * call to \ref RAIL_ZWAVE_SetTxLowPowerDbm or \ref RAIL_ZWAVE_SetTxLowPower)
701  * will return the low power value same as the nominal power.
702  * Also, calling this function before configuring the PA
703  * (i.e., before a successful call to \ref RAIL_ConfigTxPower) will return an error
704  * (RAIL_TX_POWER_LEVEL_INVALID).
705  */
706 RAIL_TxPowerLevel_t RAIL_ZWAVE_GetTxLowPower(RAIL_Handle_t railHandle);
707 
708 /**
709  * Get the TX low power in terms of deci-dBm instead of raw power level.
710  *
711  * @param[in] railHandle A RAIL instance handle.
712  * @return The chip-specific \ref RAIL_TxPower_t value of the low
713  * transmit power in deci-dBm.
714  */
715 RAIL_TxPower_t RAIL_ZWAVE_GetTxLowPowerDbm(RAIL_Handle_t railHandle);
716 
717 /**
718  * Implement beam detection and reception algorithms.
719  * It will take care of all configuration and radio setup to
720  * detect and receive beams in the current Z-Wave region.
721  * If a beam is detected, RAIL will provide
722  * the usual \ref RAIL_EVENT_ZWAVE_BEAM event during which time users can
723  * process the beam as expected. However, normal packets may also be
724  * received during this time (also triggering \ref RAIL_EVENTS_RX_COMPLETION
725  * events), in which case, this API may need to be re-called to receive
726  * a beam. Users should also listen for
727  * \ref RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE, which will indicate
728  * that no beam is heard. At that point, the radio will be automatically idled.
729  * Until one of these events is received, users should not try to
730  * reconfigure radio settings or start another radio operation. If an application
731  * needs to do some other operation or configuration, it must first call
732  * \ref RAIL_Idle and wait for the radio to idle.
733  *
734  * @note: The radio must be idle before calling this function.
735  *
736  * @note: \ref RAIL_ConfigRxChannelHopping must have been called successfully
737  * in Z-Wave before this function is called to provide a valid memory buffer
738  * for internal use (see \ref RAIL_RxChannelHoppingConfig_t::buffer).
739  *
740  * @note: This function alters radio functionality substantially. After calling
741  * it, the user should call \ref RAIL_ZWAVE_ConfigRegion,
742  * \ref RAIL_ConfigRxChannelHopping, \ref RAIL_EnableRxChannelHopping,
743  * and \ref RAIL_SetRxTransitions to reset these parameters to whatever
744  * behaviors were desired before calling this function. Additionally,
745  * this function will idle the radio upon on exit.
746  *
747  * @param[in]  railHandle A RAIL instance handle.
748  * @param[out] beamDetectIndex Indicator of whether or not a beam was detected
749  * at all, regardless of if it was received, generally for use only by instruction
750  * from Silicon Labs. Can be NULL.
751  * @param[out] schedulerInfo While Z-Wave is currently not supported in
752  * RAIL Multiprotocol, this scheduler info is added to future proof
753  * against any future version of multiprotocol which may support it. For now,
754  * this argument can be NULL.
755  *
756  * @return status indicating whether or not the radio was able to configure
757  * beam packet detection/reception. Reasons for failure include an un-idled
758  * radio or a non-Japan non-Korea region configured before calling this function.
759  */
760 RAIL_Status_t RAIL_ZWAVE_ReceiveBeam(RAIL_Handle_t railHandle,
761                                      uint8_t *beamDetectIndex,
762                                      const RAIL_SchedulerInfo_t *schedulerInfo);
763 
764 /**
765  * Configure the receive algorithm used in \ref RAIL_ZWAVE_ReceiveBeam.
766  * This function should not be used without direct instruction by Silicon Labs.
767  *
768  * @param[in] railHandle A RAIL instance handle.
769  * @param[in] config Configuration for beam detection algorithm.
770  * @return Status code indicating success of the function call.
771  */
772 RAIL_Status_t RAIL_ZWAVE_ConfigBeamRx(RAIL_Handle_t railHandle, RAIL_ZWAVE_BeamRxConfig_t *config);
773 
774 /**
775  * Set the default RX beam configuration.
776  *
777  * @param[in] railHandle A RAIL instance handle.
778  * @return Status code indicating success of the function call.
779  *
780  * @note This function resets any changes made to the beam configuration via
781  *  \ref RAIL_ZWAVE_ConfigBeamRx and the default beam configuration will be in effect
782  *  on subsequent call(s) to \ref RAIL_ZWAVE_ReceiveBeam.
783  */
784 RAIL_Status_t RAIL_ZWAVE_SetDefaultRxBeamConfig(RAIL_Handle_t railHandle);
785 
786 /**
787  * Get the current RX beam configuration.
788  *
789  * @param[out] pConfig A pointer to \ref RAIL_ZWAVE_BeamRxConfig_t to be
790  *   populated with the current beam configuration.
791  * @return A status code indicating success of the function call.
792  */
793 RAIL_Status_t RAIL_ZWAVE_GetRxBeamConfig(RAIL_ZWAVE_BeamRxConfig_t *pConfig);
794 
795 /**
796  * Configure the channel hop timings for use in Z-Wave RX channel hop configuration.
797  * This function should not be used without direct instruction by Silicon Labs.
798  *
799  * @param[in] railHandle A RAIL instance handle.
800  * @param[in, out] config Configuration for Z-Wave RX channel hopping.
801  * This structure must be allocated in application global read-write memory.
802  * RAIL will populate fields within or referenced by this structure during its
803  * operation. Be sure to allocate \ref RAIL_RxChannelHoppingConfigEntry_t
804  * entries[] for \ref RAIL_NUM_ZWAVE_CHANNELS. Be sure to set \ref
805  * RAIL_RxChannelHoppingConfig_t::numberOfChannels to the desired number of
806  * channels.
807  * @return Status code indicating success of the function call.
808  *
809  * @note: This API must be called before \ref RAIL_EnableRxChannelHopping(). This
810  * API must never be called while the radio is on with RX Duty Cycle or Channel
811  * Hopping enabled.
812  */
813 RAIL_Status_t RAIL_ZWAVE_ConfigRxChannelHopping(RAIL_Handle_t railHandle, RAIL_RxChannelHoppingConfig_t *config);
814 
815 /**
816  * Get the Z-Wave region.
817  *
818  * @param[in] railHandle A RAIL instance handle.
819  * @return The \ref RAIL_ZWAVE_RegionId_t value
820  *
821  * @note: \ref RAIL_ZWAVE_ConfigRegion must have been called successfully
822  * before this function is called. Otherwise, \ref RAIL_ZWAVE_REGIONID_UNKNOWN
823  * is returned.
824  */
825 RAIL_ZWAVE_RegionId_t RAIL_ZWAVE_GetRegion(RAIL_Handle_t railHandle);
826 
827 /**
828  * Write the AutoACK FIFO for the next outgoing Z-Wave Long Range ACK.
829  *
830  * @param[in] railHandle A handle of RAIL instance.
831  * @param[in] pLrAckData An application provided pointer to a const
832  * \ref RAIL_ZWAVE_LrAckData_t to populate the noise floor, TX power and receive
833  * rssi bytes of the outgoing Z-Wave Long Range ACK packet.
834  * @return A status code indicating success of the function call.
835  *
836  * This function sets the AutoACK data to use in acknowledging the frame
837  * being received. It must only be called while processing the \ref
838  * RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND.
839  * This will return \ref RAIL_STATUS_INVALID_STATE if it is too late to
840  * write the outgoing ACK. When successful, the ackData will
841  * only be sent once. Subsequent packets needing an Z-Wave Long Range ACK will
842  * each need to call this function to write the ACK information.
843  */
844 RAIL_Status_t RAIL_ZWAVE_SetLrAckData(RAIL_Handle_t railHandle,
845                                       const RAIL_ZWAVE_LrAckData_t *pLrAckData);
846 
847 /** EU-European Union, RAIL_ZWAVE_REGION_EU */
848 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_EU;
849 
850 /** US-United States, RAIL_ZWAVE_REGION_US */
851 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US;
852 
853 /** ANZ-Australia/New Zealand, RAIL_ZWAVE_REGION_ANZ */
854 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_ANZ;
855 
856 /** HK-Hong Kong, RAIL_ZWAVE_REGION_HK */
857 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_HK;
858 
859 /** MY-Malaysia, RAIL_ZWAVE_REGION_MY */
860 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_MY;
861 
862 /** IN-India, RAIL_ZWAVE_REGION_IN */
863 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_IN;
864 
865 /** JP-Japan, RAIL_ZWAVE_REGION_JP */
866 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_JP;
867 
868 /** JP-Japan, RAIL_ZWAVE_REGION_JP */
869 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_JPED;
870 
871 /** RU-Russia, RAIL_ZWAVE_REGION_RU */
872 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_RU;
873 
874 /** IL-Israel, RAIL_ZWAVE_REGION_IL */
875 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_IL;
876 
877 /** KR-Korea, RAIL_ZWAVE_REGION_KR */
878 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_KR;
879 
880 /** KR-Korea, RAIL_ZWAVE_REGION_KR */
881 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_KRED;
882 
883 /** CN-China, RAIL_ZWAVE_REGION_CN */
884 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_CN;
885 
886 /** US-Long Range 1, RAIL_ZWAVE_REGION_US_LR1 */
887 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US_LR1;
888 
889 /** US-Long Range 2, RAIL_ZWAVE_REGION_US_LR2 */
890 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US_LR2;
891 
892 /** US-Long Range End Device, RAIL_ZWAVE_REGION_US_LR_END_DEVICE */
893 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US_LR_END_DEVICE;
894 
895 /** Invalid Region */
896 extern const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_INVALID;
897 
898 /** @} */ // end of Z_Wave
899 
900 #ifdef __cplusplus
901 }
902 #endif
903 
904 #endif // __RAIL_ZWAVE_H__
905