nRF5 SDK for Mesh v3.2.0  08c60f6
model_common.h
1 /* Copyright (c) 2010 - 2019, 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 #include "utils.h"
43 #include "app_timer.h"
44 #include "timer_scheduler.h"
45 #include "access.h"
46 
56 #define MODEL_TRANSITION_TIME_UNKNOWN (UINT32_MAX)
57 
58 
60 #ifndef MODEL_ACKNOWLEDGED_TRANSACTION_TIMEOUT
61 #define MODEL_ACKNOWLEDGED_TRANSACTION_TIMEOUT (SEC_TO_US(30))
62 #endif
63 
65 #define TRANSITION_TIME_STEP_100MS_MAX (6200ul)
66 
67 #define TRANSITION_TIME_STEP_1S_MAX (SEC_TO_MS(62ul))
68 
69 #define TRANSITION_TIME_STEP_10S_MAX (SEC_TO_MS(620ul))
70 
71 #define TRANSITION_TIME_STEP_10M_MAX (MIN_TO_MS(620ul))
72 
73 #define TRANSITION_TIME_MAX (0x3E)
74 
75 #define TRANSITION_TIME_UNKNOWN (0x3F)
76 
77 #define TRANSITION_TIME_MAX_MS (TRANSITION_TIME_STEP_10M_MAX)
78 
80 #define DELAY_TIME_STEP_FACTOR_MS (5)
81 
82 #define DELAY_TIME_STEP_MAX (0xFF)
83 
84 #define DELAY_TIME_MAX_MS (DELAY_TIME_STEP_MAX * DELAY_TIME_STEP_FACTOR_MS)
85 
87 #define MODEL_TIMER_TIMEOUT_MIN_TICKS (APP_TIMER_TICKS(1))
88 
89 #define MODEL_TIMER_TIMEOUT_MIN_US (MODEL_TIMER_PERIOD_US_GET(MODEL_TIMER_TIMEOUT_MIN_TICKS))
90 
91 #define MODEL_TIMER_MAX_TIMEOUT_TICKS (APP_TIMER_MAX_CNT_VAL)
92 
93 #define MODEL_TIMER_PERIOD_MS_GET(TICKS) ((1000ul * (TICKS)) / APP_TIMER_CLOCK_FREQ)
94 
95 #define MODEL_TIMER_PERIOD_US_GET(TICKS) ((1000ul * 1000ul * (TICKS)) / APP_TIMER_CLOCK_FREQ)
96 
97 #define MODEL_TIMER_TICKS_GET_MS(MS_TIME) \
98  ((uint64_t)ROUNDED_DIV((MS_TIME) * (uint64_t)APP_TIMER_CLOCK_FREQ, \
99  1000 * (APP_TIMER_CONFIG_RTC_FREQUENCY + 1)))
100 
101 #define MODEL_TIMER_TICKS_GET_US(US_TIME) \
102  ((uint64_t)ROUNDED_DIV( \
103  (US_TIME) * (uint64_t)APP_TIMER_CLOCK_FREQ, \
104  1000 * 1000 * (APP_TIMER_CONFIG_RTC_FREQUENCY + 1)))
105 
107 typedef struct
108 {
110  uint32_t delay_ms;
112 
114 typedef struct
115 {
117  uint16_t src;
119  uint16_t dst;
121  uint32_t message_id;
123  uint8_t old_tid;
127  timer_event_t tid_expiry_timer;
128 } tid_tracker_t;
129 
131 typedef enum
132 {
138 
139 typedef void(*model_timer_cb_t)(void * p_context);
140 
142 typedef struct
143 {
149  void * p_context;
151  model_timer_cb_t cb;
153  uint64_t total_rtc_ticks;
154 
156  app_timer_id_t const * p_timer_id;
157 
159  uint64_t remaining_ticks;
161  uint32_t last_rtc_stamp;
163  bool cb_active;
164 } model_timer_t;
165 
166 
175 uint32_t model_transition_time_decode(uint8_t enc_transition_time);
176 
185 uint8_t model_transition_time_encode(uint32_t transition_time);
186 
196 bool model_transition_time_is_valid(uint8_t enc_transition_time);
197 
206 uint32_t model_delay_decode(uint8_t enc_delay);
207 
216 uint8_t model_delay_encode(uint32_t delay);
217 
236 bool model_tid_validate(tid_tracker_t * p_tid_tracker, const access_message_rx_meta_t * p_meta,
237  uint32_t message_id, uint8_t tid);
238 
253 bool model_transaction_is_new(tid_tracker_t * p_tid_tracker);
254 
267 uint32_t model_timer_schedule(model_timer_t * p_timer);
268 
274 void model_timer_abort(model_timer_t * p_timer);
275 
284 uint64_t model_timer_elapsed_ticks_get(model_timer_t * p_timer);
285 
300 uint32_t model_timer_create(model_timer_t * p_timer);
301 
304 #endif /* MODEL_COMMON_H__ */
305 
access_message_rx_meta_t
Metadata for received messages.
Definition: access.h:196
model_timer_t
Structure for model timers.
Definition: model_common.h:142
tid_tracker_t::tid_expiry_timer
timer_event_t tid_expiry_timer
Expiration timer instance.
Definition: model_common.h:127
model_transaction_is_new
bool model_transaction_is_new(tid_tracker_t *p_tid_tracker)
Checks if given TID tracker instance has recorded a new transaction.
model_transition_time_encode
uint8_t model_transition_time_encode(uint32_t transition_time)
Gets the encoded value of the transition time as specified in the Mesh Model Specification.
MODEL_TIMER_MODE_SINGLE_SHOT
The timer will expire only once.
Definition: model_common.h:134
model_timer_elapsed_ticks_get
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.
model_transition_t::transition_time_ms
uint32_t transition_time_ms
Transition time value in milliseconds.
Definition: model_common.h:109
tid_tracker_t
Structure for tracking TID expiry for the models.
Definition: model_common.h:114
model_timer_t::mode
model_timer_mode_t mode
Timer mode : Single shot, repeated.
Definition: model_common.h:145
tid_tracker_t::new_transaction
bool new_transaction
New transaction indicator flag.
Definition: model_common.h:125
model_timer_t::last_rtc_stamp
uint32_t last_rtc_stamp
Internal variable.
Definition: model_common.h:161
tid_tracker_t::src
uint16_t src
Source address.
Definition: model_common.h:117
MODEL_TIMER_MODE_REPEATED
The timer will restart each time it expires.
Definition: model_common.h:136
model_timer_t::p_timer_id
const app_timer_id_t * p_timer_id
APP timer instance pointer.
Definition: model_common.h:156
model_transition_time_is_valid
bool model_transition_time_is_valid(uint8_t enc_transition_time)
Validates the given transition time value.
model_delay_encode
uint8_t model_delay_encode(uint32_t delay)
Gets the encoded value of the delay time as specified in the Mesh Model Specification.
model_timer_create
uint32_t model_timer_create(model_timer_t *p_timer)
Creates a model timer.
model_timer_t::total_rtc_ticks
uint64_t total_rtc_ticks
Total rtc ticks since begining of the timer.
Definition: model_common.h:153
model_delay_decode
uint32_t model_delay_decode(uint8_t enc_delay)
Gets the decoded value of the delay time in milliseconds.
model_timer_t::remaining_ticks
uint64_t remaining_ticks
Internal variable.
Definition: model_common.h:159
model_transition_time_decode
uint32_t model_transition_time_decode(uint8_t enc_transition_time)
Gets the decoded value of the transition time in milliseconds.
model_timer_t::timeout_rtc_ticks
uint64_t timeout_rtc_ticks
Timeout in number of RTC ticks.
Definition: model_common.h:147
model_tid_validate
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.
model_timer_abort
void model_timer_abort(model_timer_t *p_timer)
Aborts the currently scheduled timer.
model_timer_mode_t
model_timer_mode_t
Timer modes.
Definition: model_common.h:131
model_transition_t::delay_ms
uint32_t delay_ms
Message execution delay in milliseconds.
Definition: model_common.h:110
tid_tracker_t::dst
uint16_t dst
Destination address.
Definition: model_common.h:119
tid_tracker_t::message_id
uint32_t message_id
Previously received Opcode.
Definition: model_common.h:121
model_timer_t::p_context
void * p_context
context pointer for the timer callback
Definition: model_common.h:149
model_timer_schedule
uint32_t model_timer_schedule(model_timer_t *p_timer)
Schedules a model timer for a given interval.
tid_tracker_t::old_tid
uint8_t old_tid
Previously received TID.
Definition: model_common.h:123
model_transition_t
Generic Transition parameters for the model messages.
Definition: model_common.h:107
model_timer_t::cb_active
bool cb_active
Internal variable.
Definition: model_common.h:163