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