xref: /nrf52832-nimble/packages/NimBLE-latest/apps/blemesh_light/src/main.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
1*042d53a7SEvalZero /*
2*042d53a7SEvalZero  * Licensed to the Apache Software Foundation (ASF) under one
3*042d53a7SEvalZero  * or more contributor license agreements.  See the NOTICE file
4*042d53a7SEvalZero  * distributed with this work for additional information
5*042d53a7SEvalZero  * regarding copyright ownership.  The ASF licenses this file
6*042d53a7SEvalZero  * to you under the Apache License, Version 2.0 (the
7*042d53a7SEvalZero  * "License"); you may not use this file except in compliance
8*042d53a7SEvalZero  * with the License.  You may obtain a copy of the License at
9*042d53a7SEvalZero  *
10*042d53a7SEvalZero  *  http://www.apache.org/licenses/LICENSE-2.0
11*042d53a7SEvalZero  *
12*042d53a7SEvalZero  * Unless required by applicable law or agreed to in writing,
13*042d53a7SEvalZero  * software distributed under the License is distributed on an
14*042d53a7SEvalZero  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15*042d53a7SEvalZero  * KIND, either express or implied.  See the License for the
16*042d53a7SEvalZero  * specific language governing permissions and limitations
17*042d53a7SEvalZero  * under the License.
18*042d53a7SEvalZero  */
19*042d53a7SEvalZero #include <assert.h>
20*042d53a7SEvalZero #include "sysinit/sysinit.h"
21*042d53a7SEvalZero #include "os/os.h"
22*042d53a7SEvalZero #include "mesh/mesh.h"
23*042d53a7SEvalZero #include "console/console.h"
24*042d53a7SEvalZero #include "hal/hal_system.h"
25*042d53a7SEvalZero #include "hal/hal_gpio.h"
26*042d53a7SEvalZero #include "bsp/bsp.h"
27*042d53a7SEvalZero #include "shell/shell.h"
28*042d53a7SEvalZero 
29*042d53a7SEvalZero /* BLE */
30*042d53a7SEvalZero #include "nimble/ble.h"
31*042d53a7SEvalZero #include "host/ble_hs.h"
32*042d53a7SEvalZero #include "services/gap/ble_svc_gap.h"
33*042d53a7SEvalZero #include "mesh/glue.h"
34*042d53a7SEvalZero #include "mesh/testing.h"
35*042d53a7SEvalZero #include "mesh/model_srv.h"
36*042d53a7SEvalZero #include "light_model.h"
37*042d53a7SEvalZero 
38*042d53a7SEvalZero 
model_bound_cb(u16_t addr,struct bt_mesh_model * model,u16_t key_idx)39*042d53a7SEvalZero static void model_bound_cb(u16_t addr, struct bt_mesh_model *model,
40*042d53a7SEvalZero                            u16_t key_idx)
41*042d53a7SEvalZero {
42*042d53a7SEvalZero     int rc;
43*042d53a7SEvalZero 
44*042d53a7SEvalZero     console_printf("Model bound: remote addr 0x%04x key_idx 0x%04x model %p\n",
45*042d53a7SEvalZero                    addr, key_idx, model);
46*042d53a7SEvalZero 
47*042d53a7SEvalZero     if (model->id != BT_MESH_MODEL_ID_GEN_LEVEL_SRV) {
48*042d53a7SEvalZero         return;
49*042d53a7SEvalZero     }
50*042d53a7SEvalZero 
51*042d53a7SEvalZero     /* Hack for demo purposes */
52*042d53a7SEvalZero     rc = bt_test_bind_app_key_to_model(model, key_idx,
53*042d53a7SEvalZero                                        BT_MESH_MODEL_ID_LIGHT_LIGHTNESS_SRV);
54*042d53a7SEvalZero 
55*042d53a7SEvalZero     if (rc) {
56*042d53a7SEvalZero         console_printf("Failed to bind light lightness srv model to app_key");
57*042d53a7SEvalZero     } else {
58*042d53a7SEvalZero         console_printf("Successfuly bound light lightness srv model to app_key");
59*042d53a7SEvalZero     }
60*042d53a7SEvalZero }
61*042d53a7SEvalZero 
62*042d53a7SEvalZero static struct bt_test_cb bt_test_cb = {
63*042d53a7SEvalZero     .mesh_model_bound = model_bound_cb,
64*042d53a7SEvalZero };
65*042d53a7SEvalZero 
66*042d53a7SEvalZero static void
blemesh_on_reset(int reason)67*042d53a7SEvalZero blemesh_on_reset(int reason)
68*042d53a7SEvalZero {
69*042d53a7SEvalZero     BLE_HS_LOG(ERROR, "Resetting state; reason=%d\n", reason);
70*042d53a7SEvalZero }
71*042d53a7SEvalZero 
72*042d53a7SEvalZero static struct bt_mesh_gen_onoff_srv_cb gen_onoff_srv_cb = {
73*042d53a7SEvalZero         .get = light_model_gen_onoff_get,
74*042d53a7SEvalZero         .set = light_model_gen_onoff_set,
75*042d53a7SEvalZero };
76*042d53a7SEvalZero static struct bt_mesh_gen_level_srv_cb gen_level_srv_cb = {
77*042d53a7SEvalZero         .get = light_model_gen_level_get,
78*042d53a7SEvalZero         .set = light_model_gen_level_set,
79*042d53a7SEvalZero };
80*042d53a7SEvalZero static struct bt_mesh_light_lightness_srv_cb light_lightness_srv_cb = {
81*042d53a7SEvalZero         .get = light_model_light_lightness_get,
82*042d53a7SEvalZero         .set = light_model_light_lightness_set,
83*042d53a7SEvalZero };
84*042d53a7SEvalZero 
85*042d53a7SEvalZero static void
blemesh_on_sync(void)86*042d53a7SEvalZero blemesh_on_sync(void)
87*042d53a7SEvalZero {
88*042d53a7SEvalZero     console_printf("Bluetooth initialized\n");
89*042d53a7SEvalZero 
90*042d53a7SEvalZero     shell_register_default_module("mesh");
91*042d53a7SEvalZero 
92*042d53a7SEvalZero     bt_test_cb_register(&bt_test_cb);
93*042d53a7SEvalZero 
94*042d53a7SEvalZero     light_model_init();
95*042d53a7SEvalZero     bt_mesh_set_gen_onoff_srv_cb(&gen_onoff_srv_cb);
96*042d53a7SEvalZero     bt_mesh_set_gen_level_srv_cb(&gen_level_srv_cb);
97*042d53a7SEvalZero     bt_mesh_set_light_lightness_srv_cb(&light_lightness_srv_cb);
98*042d53a7SEvalZero 
99*042d53a7SEvalZero     console_printf("Mesh initialized\n");
100*042d53a7SEvalZero 
101*042d53a7SEvalZero     if (IS_ENABLED(CONFIG_SETTINGS)) {
102*042d53a7SEvalZero         settings_load();
103*042d53a7SEvalZero     }
104*042d53a7SEvalZero 
105*042d53a7SEvalZero     if (bt_mesh_is_provisioned()) {
106*042d53a7SEvalZero         printk("Mesh network restored from flash\n");
107*042d53a7SEvalZero     }
108*042d53a7SEvalZero 
109*042d53a7SEvalZero     /* Hack for demo purposes */
110*042d53a7SEvalZero     bt_test_shell_init();
111*042d53a7SEvalZero }
112*042d53a7SEvalZero 
113*042d53a7SEvalZero int
main(void)114*042d53a7SEvalZero main(void)
115*042d53a7SEvalZero {
116*042d53a7SEvalZero     /* Initialize OS */
117*042d53a7SEvalZero     sysinit();
118*042d53a7SEvalZero 
119*042d53a7SEvalZero     /* Initialize the NimBLE host configuration. */
120*042d53a7SEvalZero     ble_hs_cfg.reset_cb = blemesh_on_reset;
121*042d53a7SEvalZero     ble_hs_cfg.sync_cb = blemesh_on_sync;
122*042d53a7SEvalZero     ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
123*042d53a7SEvalZero 
124*042d53a7SEvalZero     while (1) {
125*042d53a7SEvalZero         os_eventq_run(os_eventq_dflt_get());
126*042d53a7SEvalZero     }
127*042d53a7SEvalZero     return 0;
128*042d53a7SEvalZero }
129