nRF5 SDK for Mesh v5.0.0
model_common.h
1 /* Copyright (c) 2010 - 2020, Nordic Semiconductor ASA
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification,
5  * are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice, this
8  * list of conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form, except as embedded into a Nordic
11  * Semiconductor ASA integrated circuit in a product or a software update for
12  * such product, must reproduce the above copyright notice, this list of
13  * conditions and the following disclaimer in the documentation and/or other
14  * materials provided with the distribution.
15  *
16  * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
17  * contributors may be used to endorse or promote products derived from this
18  * software without specific prior written permission.
19  *
20  * 4. This software, with or without modification, must only be used with a
21  * Nordic Semiconductor ASA integrated circuit.
22  *
23  * 5. Any software provided in binary form under this license must not be reverse
24  * engineered, decompiled, modified and/or disassembled.
25  *
26  * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
27  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28  * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
29  * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
32  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
35  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 #ifndef MODEL_COMMON_H__
39 #define MODEL_COMMON_H__
40 
41 #include <stdint.h>
42 
43 #include "nrf_mesh_config_core.h"
44 #include "utils.h"
45 #include "app_timer.h"
46 #include "timer_scheduler.h"
47 #include "access.h"
48 
60 #ifndef GENERIC_DTT_SERVER_INSTANCES_MAX
61 #define GENERIC_DTT_SERVER_INSTANCES_MAX (0)
62 #endif
63 
67 #ifndef GENERIC_LEVEL_SERVER_INSTANCES_MAX
68 #define GENERIC_LEVEL_SERVER_INSTANCES_MAX (0)
69 #endif
70 
74 #ifndef GENERIC_ONOFF_SERVER_INSTANCES_MAX
75 #define GENERIC_ONOFF_SERVER_INSTANCES_MAX (0)
76 #endif
77 
81 #ifndef LIGHT_LIGHTNESS_SETUP_SERVER_INSTANCES_MAX
82 #define LIGHT_LIGHTNESS_SETUP_SERVER_INSTANCES_MAX (0)
83 #endif
84 
88 #ifndef LIGHT_LC_SETUP_SERVER_INSTANCES_MAX
89 #define LIGHT_LC_SETUP_SERVER_INSTANCES_MAX (0)
90 #endif
91 
95 #ifndef LIGHT_CTL_SETUP_SERVER_INSTANCES_MAX
96 #define LIGHT_CTL_SETUP_SERVER_INSTANCES_MAX (0)
97 #endif
98 
102 #ifndef SCENE_SETUP_SERVER_INSTANCES_MAX
103 #define SCENE_SETUP_SERVER_INSTANCES_MAX (0)
104 #endif
105 
107 #define MODEL_TRANSITION_TIME_UNKNOWN (UINT32_MAX)
108 
109 
111 #ifndef MODEL_ACKNOWLEDGED_TRANSACTION_TIMEOUT
112 #define MODEL_ACKNOWLEDGED_TRANSACTION_TIMEOUT (SEC_TO_US(30))
113 #endif
114 
116 #ifndef TRANSITION_STEP_MIN_MS
117 #define TRANSITION_STEP_MIN_MS (45)
118 #endif
119 
120 #define TRANSITION_TIME_STEP_100MS_MAX (6200ul)
121 
122 #define TRANSITION_TIME_STEP_1S_MAX (SEC_TO_MS(62ul))
123 
124 #define TRANSITION_TIME_STEP_10S_MAX (SEC_TO_MS(620ul))
125 
126 #define TRANSITION_TIME_STEP_10M_MAX (MIN_TO_MS(620ul))
127 
128 #define TRANSITION_TIME_MAX (0x3E)
129 
130 #define TRANSITION_TIME_UNKNOWN (0x3F)
131 
132 #define TRANSITION_TIME_MAX_MS (TRANSITION_TIME_STEP_10M_MAX)
133 
135 #define DELAY_TIME_STEP_FACTOR_MS (5)
136 
137 #define DELAY_TIME_STEP_MAX (0xFF)
138 
139 #define DELAY_TIME_MAX_MS (DELAY_TIME_STEP_MAX * DELAY_TIME_STEP_FACTOR_MS)
140 
142 #define MODEL_TIMER_TIMEOUT_MIN_TICKS (APP_TIMER_TICKS(1))
143 
144 #define MODEL_TIMER_TIMEOUT_MIN_US (MODEL_TIMER_PERIOD_US_GET(MODEL_TIMER_TIMEOUT_MIN_TICKS))
145 
146 #define MODEL_TIMER_MAX_TIMEOUT_TICKS (APP_TIMER_MAX_CNT_VAL)
147 
148 #define MODEL_TIMER_PERIOD_MS_GET(TICKS) ((1000ul * (TICKS)) / APP_TIMER_CLOCK_FREQ)
149 
150 #define MODEL_TIMER_PERIOD_US_GET(TICKS) ((1000ul * 1000ul * (TICKS)) / APP_TIMER_CLOCK_FREQ)
151 
152 #define MODEL_TIMER_TICKS_GET_MS(MS_TIME) \
153  ((uint64_t)ROUNDED_DIV((MS_TIME) * (uint64_t)APP_TIMER_CLOCK_FREQ, \
154  1000 * (APP_TIMER_CONFIG_RTC_FREQUENCY + 1)))
155 
156 #define MODEL_TIMER_TICKS_GET_US(US_TIME) \
157  ((uint64_t)ROUNDED_DIV( \
158  (US_TIME) * (uint64_t)APP_TIMER_CLOCK_FREQ, \
159  1000 * 1000 * (APP_TIMER_CONFIG_RTC_FREQUENCY + 1)))
160 
162 typedef struct
163 {
165  uint32_t delay_ms;
167 
169 typedef struct
170 {
172  uint16_t src;
174  uint16_t dst;
176  uint32_t message_id;
178  uint8_t old_tid;
182  timer_event_t tid_expiry_timer;
183 } tid_tracker_t;
184 
186 typedef enum
187 {
193 
195 typedef void(*model_timer_cb_t)(void * p_context);
196 
198 typedef struct
199 {
205  void * p_context;
209  uint64_t total_rtc_ticks;
210 
212  app_timer_id_t const * p_timer_id;
213 
215  uint64_t remaining_ticks;
217  uint32_t last_rtc_stamp;
219  bool cb_active;
222 } model_timer_t;
223 
231  typedef uint32_t (*default_transition_time_value_get_cb_t)(uint16_t element_index);
232 
241 uint32_t model_transition_time_decode(uint8_t enc_transition_time);
242 
251 uint8_t model_transition_time_encode(uint32_t transition_time);
252 
262 bool model_transition_time_is_valid(uint8_t enc_transition_time);
263 
271 uint32_t model_delay_decode(uint8_t enc_delay);
272 
281 uint8_t model_delay_encode(uint32_t delay);
282 
301 bool model_tid_validate(tid_tracker_t * p_tid_tracker, const access_message_rx_meta_t * p_meta,
302  uint32_t message_id, uint8_t tid);
303 
318 bool model_transaction_is_new(tid_tracker_t * p_tid_tracker);
319 
333 uint32_t model_timer_schedule(model_timer_t * p_timer);
334 
340 void model_timer_abort(model_timer_t * p_timer);
341 
350 uint64_t model_timer_elapsed_ticks_get(model_timer_t * p_timer);
351 
365 bool model_timer_is_running(model_timer_t * p_timer);
366 
381 uint32_t model_timer_create(model_timer_t * p_timer);
382 
385 #endif /* MODEL_COMMON_H__ */
386 
uint32_t transition_time_ms
Transition time value in milliseconds.
Definition: model_common.h:164
uint32_t model_transition_time_decode(uint8_t enc_transition_time)
Gets the decoded value of the transition time in milliseconds.
Structure for tracking TID expiry for the models.
Definition: model_common.h:169
uint32_t delay_ms
Message execution delay in milliseconds.
Definition: model_common.h:165
uint8_t model_delay_encode(uint32_t delay)
Gets the encoded value of the delay time as specified in the Bluetooth Mesh Model Specification (MshM...
bool model_transaction_is_new(tid_tracker_t *p_tid_tracker)
Checks if given TID tracker instance has recorded a new transaction.
The timer will restart each time it expires.
Definition: model_common.h:191
Structure for model timers.
Definition: model_common.h:198
The timer will expire only once.
Definition: model_common.h:189
bool cb_active
Internal variable.
Definition: model_common.h:219
uint32_t message_id
Previously received Opcode.
Definition: model_common.h:176
uint8_t model_transition_time_encode(uint32_t transition_time)
Gets the encoded value of the transition time as specified in the Bluetooth Mesh Model Specification ...
uint32_t model_delay_decode(uint8_t enc_delay)
Gets the decoded value of the delay time in milliseconds.
uint8_t old_tid
Previously received TID.
Definition: model_common.h:178
timer_event_t tid_expiry_timer
Expiration timer instance.
Definition: model_common.h:182
app_timer_id_t const * p_timer_id
APP timer instance pointer.
Definition: model_common.h:212
uint16_t src
Source address.
Definition: model_common.h:172
void * p_context
context pointer for the timer callback
Definition: model_common.h:205
uint32_t model_timer_create(model_timer_t *p_timer)
Creates a model timer.
Metadata for received messages.
Definition: access.h:196
void(* model_timer_cb_t)(void *p_context)
Timer callback prototype.
Definition: model_common.h:195
bool new_transaction
New transaction indicator flag.
Definition: model_common.h:180
uint64_t model_timer_elapsed_ticks_get(model_timer_t *p_timer)
Returns the total elapsed rtc ticks since the last call to model_timer_schedule() API...
uint32_t last_rtc_stamp
Internal variable.
Definition: model_common.h:217
bool model_tid_validate(tid_tracker_t *p_tid_tracker, const access_message_rx_meta_t *p_meta, uint32_t message_id, uint8_t tid)
Checks if the given message parameters represents a new transaction.
uint32_t(* default_transition_time_value_get_cb_t)(uint16_t element_index)
Default transition time get callback prototype.
Definition: model_common.h:231
bool model_timer_is_running(model_timer_t *p_timer)
Returns whether the specified timer is running.
model_timer_mode_t mode
Timer mode : Single shot, repeated.
Definition: model_common.h:201
bool model_transition_time_is_valid(uint8_t enc_transition_time)
Validates the given transition time value.
model_timer_cb_t cb
Timer callback.
Definition: model_common.h:207
uint64_t timeout_rtc_ticks
Timeout in number of RTC ticks.
Definition: model_common.h:203
uint64_t total_rtc_ticks
Total rtc ticks since beginning of the timer.
Definition: model_common.h:209
Generic Transition parameters for the model messages.
Definition: model_common.h:162
uint32_t model_timer_schedule(model_timer_t *p_timer)
Schedules a model timer for a given interval.
uint64_t remaining_ticks
Internal variable.
Definition: model_common.h:215
model_timer_mode_t
Timer modes.
Definition: model_common.h:186
bool timer_running
Internal variable.
Definition: model_common.h:221
void model_timer_abort(model_timer_t *p_timer)
Aborts the currently scheduled timer.
uint16_t dst
Destination address.
Definition: model_common.h:174

Documentation feedback | Developer Zone | Subscribe | Updated