1*042d53a7SEvalZero /*
2*042d53a7SEvalZero * Copyright (c) 2017 Intel Corporation
3*042d53a7SEvalZero *
4*042d53a7SEvalZero * SPDX-License-Identifier: Apache-2.0
5*042d53a7SEvalZero */
6*042d53a7SEvalZero
7*042d53a7SEvalZero #include "mesh/mesh.h"
8*042d53a7SEvalZero
9*042d53a7SEvalZero #define BT_DBG_ENABLED (MYNEWT_VAL(BLE_MESH_DEBUG_MODEL))
10*042d53a7SEvalZero
11*042d53a7SEvalZero #include "mesh/model_srv.h"
12*042d53a7SEvalZero #include "mesh_priv.h"
13*042d53a7SEvalZero
gen_onoff_status(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx)14*042d53a7SEvalZero static void gen_onoff_status(struct bt_mesh_model *model,
15*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx)
16*042d53a7SEvalZero {
17*042d53a7SEvalZero struct bt_mesh_gen_onoff_srv_cb *cb = model->user_data;
18*042d53a7SEvalZero struct os_mbuf *msg = NET_BUF_SIMPLE(3);
19*042d53a7SEvalZero u8_t *state;
20*042d53a7SEvalZero
21*042d53a7SEvalZero bt_mesh_model_msg_init(msg, OP_GEN_ONOFF_STATUS);
22*042d53a7SEvalZero state = net_buf_simple_add(msg, 1);
23*042d53a7SEvalZero if (cb && cb->get) {
24*042d53a7SEvalZero cb->get(model, state);
25*042d53a7SEvalZero }
26*042d53a7SEvalZero
27*042d53a7SEvalZero BT_DBG("state: %d", *state);
28*042d53a7SEvalZero
29*042d53a7SEvalZero if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
30*042d53a7SEvalZero BT_ERR("Send status failed");
31*042d53a7SEvalZero }
32*042d53a7SEvalZero
33*042d53a7SEvalZero os_mbuf_free_chain(msg);
34*042d53a7SEvalZero }
35*042d53a7SEvalZero
gen_onoff_get(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)36*042d53a7SEvalZero static void gen_onoff_get(struct bt_mesh_model *model,
37*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
38*042d53a7SEvalZero struct os_mbuf *buf)
39*042d53a7SEvalZero {
40*042d53a7SEvalZero BT_DBG("");
41*042d53a7SEvalZero
42*042d53a7SEvalZero gen_onoff_status(model, ctx);
43*042d53a7SEvalZero }
44*042d53a7SEvalZero
gen_onoff_set_unack(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)45*042d53a7SEvalZero static void gen_onoff_set_unack(struct bt_mesh_model *model,
46*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
47*042d53a7SEvalZero struct os_mbuf *buf)
48*042d53a7SEvalZero {
49*042d53a7SEvalZero struct bt_mesh_gen_onoff_srv_cb *cb = model->user_data;
50*042d53a7SEvalZero u8_t state;
51*042d53a7SEvalZero
52*042d53a7SEvalZero state = buf->om_data[0];
53*042d53a7SEvalZero
54*042d53a7SEvalZero BT_DBG("state: %d", state);
55*042d53a7SEvalZero
56*042d53a7SEvalZero if (cb && cb->set) {
57*042d53a7SEvalZero cb->set(model, state);
58*042d53a7SEvalZero }
59*042d53a7SEvalZero }
60*042d53a7SEvalZero
gen_onoff_set(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)61*042d53a7SEvalZero static void gen_onoff_set(struct bt_mesh_model *model,
62*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
63*042d53a7SEvalZero struct os_mbuf *buf)
64*042d53a7SEvalZero {
65*042d53a7SEvalZero BT_DBG("");
66*042d53a7SEvalZero
67*042d53a7SEvalZero gen_onoff_set_unack(model, ctx, buf);
68*042d53a7SEvalZero gen_onoff_status(model, ctx);
69*042d53a7SEvalZero }
70*042d53a7SEvalZero
gen_level_status(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx)71*042d53a7SEvalZero static void gen_level_status(struct bt_mesh_model *model,
72*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx)
73*042d53a7SEvalZero {
74*042d53a7SEvalZero struct bt_mesh_gen_level_srv_cb *cb = model->user_data;
75*042d53a7SEvalZero struct os_mbuf *msg = NET_BUF_SIMPLE(4);
76*042d53a7SEvalZero s16_t *level;
77*042d53a7SEvalZero
78*042d53a7SEvalZero bt_mesh_model_msg_init(msg, OP_GEN_LEVEL_STATUS);
79*042d53a7SEvalZero level = net_buf_simple_add(msg, 2);
80*042d53a7SEvalZero if (cb && cb->get) {
81*042d53a7SEvalZero cb->get(model, level);
82*042d53a7SEvalZero }
83*042d53a7SEvalZero
84*042d53a7SEvalZero BT_DBG("level: %d", *level);
85*042d53a7SEvalZero
86*042d53a7SEvalZero if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
87*042d53a7SEvalZero BT_ERR("Send status failed");
88*042d53a7SEvalZero }
89*042d53a7SEvalZero
90*042d53a7SEvalZero os_mbuf_free_chain(msg);
91*042d53a7SEvalZero }
92*042d53a7SEvalZero
gen_level_get(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)93*042d53a7SEvalZero static void gen_level_get(struct bt_mesh_model *model,
94*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
95*042d53a7SEvalZero struct os_mbuf *buf)
96*042d53a7SEvalZero {
97*042d53a7SEvalZero BT_DBG("");
98*042d53a7SEvalZero
99*042d53a7SEvalZero gen_level_status(model, ctx);
100*042d53a7SEvalZero }
101*042d53a7SEvalZero
gen_level_set_unack(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)102*042d53a7SEvalZero static void gen_level_set_unack(struct bt_mesh_model *model,
103*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
104*042d53a7SEvalZero struct os_mbuf *buf) {
105*042d53a7SEvalZero struct bt_mesh_gen_level_srv_cb *cb = model->user_data;
106*042d53a7SEvalZero s16_t level;
107*042d53a7SEvalZero
108*042d53a7SEvalZero level = (s16_t) net_buf_simple_pull_le16(buf);
109*042d53a7SEvalZero BT_DBG("level: %d", level);
110*042d53a7SEvalZero
111*042d53a7SEvalZero if (cb && cb->set) {
112*042d53a7SEvalZero cb->set(model, level);
113*042d53a7SEvalZero }
114*042d53a7SEvalZero }
115*042d53a7SEvalZero
gen_level_set(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)116*042d53a7SEvalZero static void gen_level_set(struct bt_mesh_model *model,
117*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
118*042d53a7SEvalZero struct os_mbuf *buf)
119*042d53a7SEvalZero {
120*042d53a7SEvalZero gen_level_set_unack(model, ctx, buf);
121*042d53a7SEvalZero gen_level_status(model, ctx);
122*042d53a7SEvalZero }
123*042d53a7SEvalZero
light_lightness_status(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx)124*042d53a7SEvalZero static void light_lightness_status(struct bt_mesh_model *model,
125*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx)
126*042d53a7SEvalZero {
127*042d53a7SEvalZero struct bt_mesh_light_lightness_srv_cb *cb = model->user_data;
128*042d53a7SEvalZero struct os_mbuf *msg = NET_BUF_SIMPLE(4);
129*042d53a7SEvalZero s16_t *lightness;
130*042d53a7SEvalZero
131*042d53a7SEvalZero bt_mesh_model_msg_init(msg, OP_GEN_LEVEL_STATUS);
132*042d53a7SEvalZero lightness = net_buf_simple_add(msg, 2);
133*042d53a7SEvalZero if (cb && cb->get) {
134*042d53a7SEvalZero cb->get(model, lightness);
135*042d53a7SEvalZero }
136*042d53a7SEvalZero
137*042d53a7SEvalZero BT_DBG("lightness: %d", *lightness);
138*042d53a7SEvalZero
139*042d53a7SEvalZero if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
140*042d53a7SEvalZero BT_ERR("Send status failed");
141*042d53a7SEvalZero }
142*042d53a7SEvalZero
143*042d53a7SEvalZero os_mbuf_free_chain(msg);
144*042d53a7SEvalZero }
145*042d53a7SEvalZero
light_lightness_get(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)146*042d53a7SEvalZero static void light_lightness_get(struct bt_mesh_model *model,
147*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
148*042d53a7SEvalZero struct os_mbuf *buf)
149*042d53a7SEvalZero {
150*042d53a7SEvalZero BT_DBG("");
151*042d53a7SEvalZero
152*042d53a7SEvalZero light_lightness_status(model, ctx);
153*042d53a7SEvalZero }
154*042d53a7SEvalZero
light_lightness_set_unack(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)155*042d53a7SEvalZero static void light_lightness_set_unack(struct bt_mesh_model *model,
156*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
157*042d53a7SEvalZero struct os_mbuf *buf) {
158*042d53a7SEvalZero struct bt_mesh_light_lightness_srv_cb *cb = model->user_data;
159*042d53a7SEvalZero s16_t lightness;
160*042d53a7SEvalZero
161*042d53a7SEvalZero lightness = (s16_t) net_buf_simple_pull_le16(buf);
162*042d53a7SEvalZero BT_DBG("lightness: %d", lightness);
163*042d53a7SEvalZero
164*042d53a7SEvalZero if (cb && cb->set) {
165*042d53a7SEvalZero cb->set(model, lightness);
166*042d53a7SEvalZero }
167*042d53a7SEvalZero }
168*042d53a7SEvalZero
light_lightness_set(struct bt_mesh_model * model,struct bt_mesh_msg_ctx * ctx,struct os_mbuf * buf)169*042d53a7SEvalZero static void light_lightness_set(struct bt_mesh_model *model,
170*042d53a7SEvalZero struct bt_mesh_msg_ctx *ctx,
171*042d53a7SEvalZero struct os_mbuf *buf)
172*042d53a7SEvalZero {
173*042d53a7SEvalZero light_lightness_set_unack(model, ctx, buf);
174*042d53a7SEvalZero light_lightness_status(model, ctx);
175*042d53a7SEvalZero }
176*042d53a7SEvalZero
177*042d53a7SEvalZero const struct bt_mesh_model_op gen_onoff_srv_op[] = {
178*042d53a7SEvalZero { OP_GEN_ONOFF_GET, 0, gen_onoff_get },
179*042d53a7SEvalZero { OP_GEN_ONOFF_SET, 2, gen_onoff_set },
180*042d53a7SEvalZero { OP_GEN_ONOFF_SET_UNACK, 2, gen_onoff_set_unack },
181*042d53a7SEvalZero BT_MESH_MODEL_OP_END,
182*042d53a7SEvalZero };
183*042d53a7SEvalZero
184*042d53a7SEvalZero const struct bt_mesh_model_op gen_level_srv_op[] = {
185*042d53a7SEvalZero { OP_GEN_LEVEL_GET, 0, gen_level_get },
186*042d53a7SEvalZero { OP_GEN_LEVEL_SET, 3, gen_level_set },
187*042d53a7SEvalZero { OP_GEN_LEVEL_SET_UNACK, 3, gen_level_set_unack },
188*042d53a7SEvalZero BT_MESH_MODEL_OP_END,
189*042d53a7SEvalZero };
190*042d53a7SEvalZero
191*042d53a7SEvalZero const struct bt_mesh_model_op light_lightness_srv_op[] = {
192*042d53a7SEvalZero { OP_LIGHT_LIGHTNESS_GET, 0, light_lightness_get },
193*042d53a7SEvalZero { OP_LIGHT_LIGHTNESS_SET, 3, light_lightness_set },
194*042d53a7SEvalZero { OP_LIGHT_LIGHTNESS_SET_UNACK, 3, light_lightness_set_unack },
195*042d53a7SEvalZero BT_MESH_MODEL_OP_END,
196*042d53a7SEvalZero };
197