1*042d53a7SEvalZero /* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
2*042d53a7SEvalZero *
3*042d53a7SEvalZero * Copyright (c) 2018 Vikrant More
4*042d53a7SEvalZero *
5*042d53a7SEvalZero * SPDX-License-Identifier: Apache-2.0
6*042d53a7SEvalZero */
7*042d53a7SEvalZero
8*042d53a7SEvalZero #include "console/console.h"
9*042d53a7SEvalZero #include "hal/hal_gpio.h"
10*042d53a7SEvalZero
11*042d53a7SEvalZero #include "common.h"
12*042d53a7SEvalZero #include "ble_mesh.h"
13*042d53a7SEvalZero #include "publisher.h"
14*042d53a7SEvalZero #include "device_composition.h"
15*042d53a7SEvalZero
16*042d53a7SEvalZero #define ONOFF
17*042d53a7SEvalZero #define GENERIC_LEVEL
18*042d53a7SEvalZero /* #define LIGHT_CTL */
19*042d53a7SEvalZero /* #define LIGHT_CTL_TEMP */
20*042d53a7SEvalZero
21*042d53a7SEvalZero static bool is_randomization_of_TIDs_done;
22*042d53a7SEvalZero
23*042d53a7SEvalZero #if defined(ONOFF)
24*042d53a7SEvalZero static u8_t tid_onoff;
25*042d53a7SEvalZero #elif defined(VND_MODEL_TEST)
26*042d53a7SEvalZero static u8_t tid_vnd;
27*042d53a7SEvalZero #endif
28*042d53a7SEvalZero
29*042d53a7SEvalZero static u8_t tid_level;
30*042d53a7SEvalZero
randomize_publishers_TID(void)31*042d53a7SEvalZero void randomize_publishers_TID(void)
32*042d53a7SEvalZero {
33*042d53a7SEvalZero #if defined(ONOFF)
34*042d53a7SEvalZero bt_rand(&tid_onoff, sizeof(tid_onoff));
35*042d53a7SEvalZero #elif defined(VND_MODEL_TEST)
36*042d53a7SEvalZero bt_rand(&tid_vnd, sizeof(tid_vnd));
37*042d53a7SEvalZero #endif
38*042d53a7SEvalZero
39*042d53a7SEvalZero bt_rand(&tid_level, sizeof(tid_level));
40*042d53a7SEvalZero
41*042d53a7SEvalZero is_randomization_of_TIDs_done = true;
42*042d53a7SEvalZero }
43*042d53a7SEvalZero
button_read(int button)44*042d53a7SEvalZero static u32_t button_read(int button)
45*042d53a7SEvalZero {
46*042d53a7SEvalZero return (uint32_t) hal_gpio_read(button);
47*042d53a7SEvalZero }
48*042d53a7SEvalZero
publish(struct ble_npl_event * work)49*042d53a7SEvalZero void publish(struct ble_npl_event *work)
50*042d53a7SEvalZero {
51*042d53a7SEvalZero int err = 0;
52*042d53a7SEvalZero
53*042d53a7SEvalZero if (is_randomization_of_TIDs_done == false) {
54*042d53a7SEvalZero return;
55*042d53a7SEvalZero }
56*042d53a7SEvalZero
57*042d53a7SEvalZero if (button_read(button_device[0]) == 0) {
58*042d53a7SEvalZero #if defined(ONOFF)
59*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[3].pub->msg,
60*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK);
61*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x01);
62*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, tid_onoff++);
63*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[3]);
64*042d53a7SEvalZero #elif defined(ONOFF_TT)
65*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[3].pub->msg,
66*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK);
67*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x01);
68*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, tid_onoff++);
69*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x45);
70*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x28);
71*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[3]);
72*042d53a7SEvalZero #elif defined(VND_MODEL_TEST)
73*042d53a7SEvalZero bt_mesh_model_msg_init(vnd_models[0].pub->msg,
74*042d53a7SEvalZero BT_MESH_MODEL_OP_3(0x02, CID_RUNTIME));
75*042d53a7SEvalZero net_buf_simple_add_le16(vnd_models[0].pub->msg, 0x0001);
76*042d53a7SEvalZero net_buf_simple_add_u8(vnd_models[0].pub->msg, tid_vnd++);
77*042d53a7SEvalZero err = bt_mesh_model_publish(&vnd_models[0]);
78*042d53a7SEvalZero #endif
79*042d53a7SEvalZero
80*042d53a7SEvalZero } else if (button_read(button_device[1]) == 0) {
81*042d53a7SEvalZero #if defined(ONOFF)
82*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[3].pub->msg,
83*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK);
84*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x00);
85*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, tid_onoff++);
86*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[3]);
87*042d53a7SEvalZero #elif defined(ONOFF_TT)
88*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[3].pub->msg,
89*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK);
90*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x00);
91*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, tid_onoff++);
92*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x45);
93*042d53a7SEvalZero net_buf_simple_add_u8(root_models[3].pub->msg, 0x28);
94*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[3]);
95*042d53a7SEvalZero #elif defined(VND_MODEL_TEST)
96*042d53a7SEvalZero bt_mesh_model_msg_init(vnd_models[0].pub->msg,
97*042d53a7SEvalZero BT_MESH_MODEL_OP_3(0x02, CID_RUNTIME));
98*042d53a7SEvalZero net_buf_simple_add_le16(vnd_models[0].pub->msg, 0x0000);
99*042d53a7SEvalZero net_buf_simple_add_u8(vnd_models[0].pub->msg, tid_vnd++);
100*042d53a7SEvalZero err = bt_mesh_model_publish(&vnd_models[0]);
101*042d53a7SEvalZero #endif
102*042d53a7SEvalZero
103*042d53a7SEvalZero } else if (button_read(button_device[2]) == 0) {
104*042d53a7SEvalZero #if defined(GENERIC_LEVEL)
105*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[5].pub->msg,
106*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_LEVEL_SET_UNACK);
107*042d53a7SEvalZero net_buf_simple_add_le16(root_models[5].pub->msg, LEVEL_S25);
108*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, tid_level++);
109*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[5]);
110*042d53a7SEvalZero #elif defined(GENERIC_DELTA_LEVEL)
111*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[5].pub->msg,
112*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_DELTA_SET_UNACK);
113*042d53a7SEvalZero net_buf_simple_add_le32(root_models[5].pub->msg, 100);
114*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, tid_level++);
115*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[5]);
116*042d53a7SEvalZero #elif defined(GENERIC_MOVE_LEVEL_TT)
117*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[5].pub->msg,
118*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_MOVE_SET_UNACK);
119*042d53a7SEvalZero net_buf_simple_add_le16(root_models[5].pub->msg, 13100);
120*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, tid_level++);
121*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, 0x45);
122*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, 0x00);
123*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[5]);
124*042d53a7SEvalZero #elif defined(LIGHT_LIGHTNESS_TT)
125*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[13].pub->msg,
126*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x4D));
127*042d53a7SEvalZero net_buf_simple_add_le16(root_models[13].pub->msg, LEVEL_U25);
128*042d53a7SEvalZero net_buf_simple_add_u8(root_models[13].pub->msg, tid_level++);
129*042d53a7SEvalZero net_buf_simple_add_u8(root_models[13].pub->msg, 0x45);
130*042d53a7SEvalZero net_buf_simple_add_u8(root_models[13].pub->msg, 0x28);
131*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[13]);
132*042d53a7SEvalZero #elif defined(LIGHT_CTL)
133*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[16].pub->msg,
134*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x5F));
135*042d53a7SEvalZero /* Lightness */
136*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, LEVEL_U25);
137*042d53a7SEvalZero /* Temperature (value should be from 0x0320 to 0x4E20 */
138*042d53a7SEvalZero /* This is as per 6.1.3.1 in Mesh Model Specification */
139*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0320);
140*042d53a7SEvalZero /* Delta UV */
141*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0000);
142*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, tid_level++);
143*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[16]);
144*042d53a7SEvalZero #elif defined(LIGHT_CTL_TT)
145*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[16].pub->msg,
146*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x5F));
147*042d53a7SEvalZero /* Lightness */
148*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, LEVEL_U25);
149*042d53a7SEvalZero /* Temperature (value should be from 0x0320 to 0x4E20 */
150*042d53a7SEvalZero /* This is as per 6.1.3.1 in Mesh Model Specification */
151*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0320);
152*042d53a7SEvalZero /* Delta UV */
153*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0000);
154*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, tid_level++);
155*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, 0x45);
156*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, 0x00);
157*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[16]);
158*042d53a7SEvalZero #elif defined(LIGHT_CTL_TEMP)
159*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[16].pub->msg,
160*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x65));
161*042d53a7SEvalZero /* Temperature (value should be from 0x0320 to 0x4E20 */
162*042d53a7SEvalZero /* This is as per 6.1.3.1 in Mesh Model Specification */
163*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0320);
164*042d53a7SEvalZero /* Delta UV */
165*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0000);
166*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, tid_level++);
167*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[16]);
168*042d53a7SEvalZero #endif
169*042d53a7SEvalZero
170*042d53a7SEvalZero } else if (button_read(button_device[3]) == 0) {
171*042d53a7SEvalZero #if defined(GENERIC_LEVEL)
172*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[5].pub->msg,
173*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_LEVEL_SET_UNACK);
174*042d53a7SEvalZero net_buf_simple_add_le16(root_models[5].pub->msg, LEVEL_S100);
175*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, tid_level++);
176*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[5]);
177*042d53a7SEvalZero #elif defined(GENERIC_DELTA_LEVEL)
178*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[5].pub->msg,
179*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_DELTA_SET_UNACK);
180*042d53a7SEvalZero net_buf_simple_add_le32(root_models[5].pub->msg, -100);
181*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, tid_level++);
182*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[5]);
183*042d53a7SEvalZero #elif defined(GENERIC_MOVE_LEVEL_TT)
184*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[5].pub->msg,
185*042d53a7SEvalZero BT_MESH_MODEL_OP_GEN_MOVE_SET_UNACK);
186*042d53a7SEvalZero net_buf_simple_add_le16(root_models[5].pub->msg, -13100);
187*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, tid_level++);
188*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, 0x45);
189*042d53a7SEvalZero net_buf_simple_add_u8(root_models[5].pub->msg, 0x00);
190*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[5]);
191*042d53a7SEvalZero #elif defined(LIGHT_LIGHTNESS_TT)
192*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[13].pub->msg,
193*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x4D));
194*042d53a7SEvalZero net_buf_simple_add_le16(root_models[13].pub->msg, LEVEL_U100);
195*042d53a7SEvalZero net_buf_simple_add_u8(root_models[13].pub->msg, tid_level++);
196*042d53a7SEvalZero net_buf_simple_add_u8(root_models[13].pub->msg, 0x45);
197*042d53a7SEvalZero net_buf_simple_add_u8(root_models[13].pub->msg, 0x28);
198*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[13]);
199*042d53a7SEvalZero #elif defined(LIGHT_CTL)
200*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[16].pub->msg,
201*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x5F));
202*042d53a7SEvalZero /* Lightness */
203*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, LEVEL_U100);
204*042d53a7SEvalZero /* Temperature (value should be from 0x0320 to 0x4E20 */
205*042d53a7SEvalZero /* This is as per 6.1.3.1 in Mesh Model Specification */
206*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x4E20);
207*042d53a7SEvalZero /* Delta UV */
208*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0000);
209*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, tid_level++);
210*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[16]);
211*042d53a7SEvalZero #elif defined(LIGHT_CTL_TT)
212*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[16].pub->msg,
213*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x5F));
214*042d53a7SEvalZero /* Lightness */
215*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, LEVEL_U100);
216*042d53a7SEvalZero /* Temperature (value should be from 0x0320 to 0x4E20 */
217*042d53a7SEvalZero /* This is as per 6.1.3.1 in Mesh Model Specification */
218*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x4E20);
219*042d53a7SEvalZero /* Delta UV */
220*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0000);
221*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, tid_level++);
222*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, 0x45);
223*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, 0x00);
224*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[16]);
225*042d53a7SEvalZero #elif defined(LIGHT_CTL_TEMP)
226*042d53a7SEvalZero bt_mesh_model_msg_init(root_models[16].pub->msg,
227*042d53a7SEvalZero BT_MESH_MODEL_OP_2(0x82, 0x65));
228*042d53a7SEvalZero /* Temperature (value should be from 0x0320 to 0x4E20 */
229*042d53a7SEvalZero /* This is as per 6.1.3.1 in Mesh Model Specification */
230*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x4E20);
231*042d53a7SEvalZero /* Delta UV */
232*042d53a7SEvalZero net_buf_simple_add_le16(root_models[16].pub->msg, 0x0000);
233*042d53a7SEvalZero net_buf_simple_add_u8(root_models[16].pub->msg, tid_level++);
234*042d53a7SEvalZero err = bt_mesh_model_publish(&root_models[16]);
235*042d53a7SEvalZero #endif
236*042d53a7SEvalZero }
237*042d53a7SEvalZero
238*042d53a7SEvalZero if (err) {
239*042d53a7SEvalZero printk("bt_mesh_model_publish: err: %d\n", err);
240*042d53a7SEvalZero }
241*042d53a7SEvalZero }
242