Publishing for Bluetooth Asia 2018 developer session: mesh session. This repo is for GenericOnOff server side firmware.

EULA

PLEASE READ MESH_DEMO_TUTORIAL_EULA.TXT BEFORE START DEVELOPMENT.

Overview

This sample demonstrates Bluetooth Mesh functionality on micro:bit, www.microbit.org. It doesn't need provisioning because all the credential material (DevKey, NetKey, AppKey, Key Index, IVI and Unicast address) is pre-configured. This sample work as a GenericOnOff server:

  • Pressing Button B on micro:bit will subscribe to the group address from 0xC000 to 0xC003 and back to 0xC000 again like round robin;

Requirements

micro:bit board

Building and Running

0. Download source code, it's zip file, the link is on this page, Download repository.

1. Following below link to set the development environment up on your Windows computer. http://docs.zephyrproject.org/getting_started/installation_win.html Please make sure git checkout this commit, commit: 60b01f3f5489975098657caa514133c89a472d19 , the detail is here, https://github.com/zephyrproject-rtos/zephyr/commit/60b01f3f5489975098657caa514133c89a472d19

2. copy zip file into ./zephyr/samples/ in the Zephyr tree.

3. unzip the file by "Extract Here".

3. access into the extracted folder and rename prj_bbc_microbit.txt to prj_bbc_microbit.conf

4. if adopting Windows Command Prompt, use it to access into the unzip folder and type following commands on the console:

mkdir build & cd build

cmake -GNinja -DBOARD=bbc_microbit ..

ninja

if adopting MSYS2, use it to access into the unzip folder and type following commands on the console:

mkdir build & cd build

cmake -GNinja -DBOARD=bbc_microbit ..

ninja

5. connect micro:bit with your computer by USB cable, the board will be enumerated as a massive storage device;

6. drag the hex file (which is in ./zephyr/sample/[unzip folder]/build/zephyr/zephyr.hex) into Microbit massive storage device to flash the firmware;

7. micro:bit is ready to work as a GenericOnOff server.

Committer:
krenbluetoothsig
Date:
Wed May 02 05:14:13 2018 +0000
Revision:
0:3ed424a8870a
Child:
4:a52949a1cf72
server; 1. NEW: project created.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
krenbluetoothsig 0:3ed424a8870a 1 /*
krenbluetoothsig 0:3ed424a8870a 2 * Copyright (c) 2018 Bluetooth SIG
krenbluetoothsig 0:3ed424a8870a 3 *
krenbluetoothsig 0:3ed424a8870a 4 * SPDX-License-Identifier: Apache-2.0
krenbluetoothsig 0:3ed424a8870a 5 */
krenbluetoothsig 0:3ed424a8870a 6
krenbluetoothsig 0:3ed424a8870a 7 #include <misc/printk.h>
krenbluetoothsig 0:3ed424a8870a 8
krenbluetoothsig 0:3ed424a8870a 9 #include <bluetooth/bluetooth.h>
krenbluetoothsig 0:3ed424a8870a 10 #include <bluetooth/mesh.h>
krenbluetoothsig 0:3ed424a8870a 11 #include <gpio.h>
krenbluetoothsig 0:3ed424a8870a 12 #include <board.h>
krenbluetoothsig 0:3ed424a8870a 13 #include <soc.h>
krenbluetoothsig 0:3ed424a8870a 14 #include <misc/printk.h>
krenbluetoothsig 0:3ed424a8870a 15 #include <ctype.h>
krenbluetoothsig 0:3ed424a8870a 16 #include <flash.h>
krenbluetoothsig 0:3ed424a8870a 17 #include <gpio.h>
krenbluetoothsig 0:3ed424a8870a 18 #include <pwm.h>
krenbluetoothsig 0:3ed424a8870a 19
krenbluetoothsig 0:3ed424a8870a 20 #include <display/mb_display.h>
krenbluetoothsig 0:3ed424a8870a 21
krenbluetoothsig 0:3ed424a8870a 22 #include <bluetooth/mesh.h>
krenbluetoothsig 0:3ed424a8870a 23
krenbluetoothsig 0:3ed424a8870a 24 #define GROUP_ADDR 0xc000
krenbluetoothsig 0:3ed424a8870a 25 #define PUBLISHER_ADDR 0x000f
krenbluetoothsig 0:3ed424a8870a 26 #if !defined(NODE_ADDR)
krenbluetoothsig 0:3ed424a8870a 27 #define NODE_ADDR 0x0b02
krenbluetoothsig 0:3ed424a8870a 28 #endif
krenbluetoothsig 0:3ed424a8870a 29
krenbluetoothsig 0:3ed424a8870a 30 /* Model Operation Codes */
krenbluetoothsig 0:3ed424a8870a 31 #define BT_MESH_MODEL_OP_GEN_ONOFF_GET BT_MESH_MODEL_OP_2(0x82, 0x01)
krenbluetoothsig 0:3ed424a8870a 32 #define BT_MESH_MODEL_OP_GEN_ONOFF_SET BT_MESH_MODEL_OP_2(0x82, 0x02)
krenbluetoothsig 0:3ed424a8870a 33 #define BT_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK BT_MESH_MODEL_OP_2(0x82, 0x03)
krenbluetoothsig 0:3ed424a8870a 34 #define BT_MESH_MODEL_OP_GEN_ONOFF_STATUS BT_MESH_MODEL_OP_2(0x82, 0x04)
krenbluetoothsig 0:3ed424a8870a 35
krenbluetoothsig 0:3ed424a8870a 36
krenbluetoothsig 0:3ed424a8870a 37 /* Button debounce timeout */
krenbluetoothsig 0:3ed424a8870a 38 #define BUTTON_DEBOUNCE_DELAY_MS 250
krenbluetoothsig 0:3ed424a8870a 39
krenbluetoothsig 0:3ed424a8870a 40 /* LED matrix scroll speed */
krenbluetoothsig 0:3ed424a8870a 41 #define SCROLL_SPEED K_MSEC(500)
krenbluetoothsig 0:3ed424a8870a 42
krenbluetoothsig 0:3ed424a8870a 43 /* LED matrix scroll speed */
krenbluetoothsig 0:3ed424a8870a 44 #define BUZZER_PIN EXT_P0_GPIO_PIN
krenbluetoothsig 0:3ed424a8870a 45 #define BEEP_DURATION K_MSEC(60)
krenbluetoothsig 0:3ed424a8870a 46
krenbluetoothsig 0:3ed424a8870a 47 /* NVM offset */
krenbluetoothsig 0:3ed424a8870a 48 #define SEQ_PER_BIT 976
krenbluetoothsig 0:3ed424a8870a 49 #define SEQ_PAGE (NRF_FICR->CODEPAGESIZE * (NRF_FICR->CODESIZE - 1))
krenbluetoothsig 0:3ed424a8870a 50 #define SEQ_MAX (NRF_FICR->CODEPAGESIZE * 8 * SEQ_PER_BIT)
krenbluetoothsig 0:3ed424a8870a 51
krenbluetoothsig 0:3ed424a8870a 52 /* Key definition, it's pre-configured, not need to do provisioning. */
krenbluetoothsig 0:3ed424a8870a 53 static const u8_t net_key[16] = {
krenbluetoothsig 0:3ed424a8870a 54 0xf1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
krenbluetoothsig 0:3ed424a8870a 55 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
krenbluetoothsig 0:3ed424a8870a 56 };
krenbluetoothsig 0:3ed424a8870a 57 static const u8_t dev_key[16] = {
krenbluetoothsig 0:3ed424a8870a 58 0xf1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
krenbluetoothsig 0:3ed424a8870a 59 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
krenbluetoothsig 0:3ed424a8870a 60 };
krenbluetoothsig 0:3ed424a8870a 61 static const u8_t app_key[16] = {
krenbluetoothsig 0:3ed424a8870a 62 0xf1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
krenbluetoothsig 0:3ed424a8870a 63 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
krenbluetoothsig 0:3ed424a8870a 64 };
krenbluetoothsig 0:3ed424a8870a 65
krenbluetoothsig 0:3ed424a8870a 66 /* group address string. */
krenbluetoothsig 0:3ed424a8870a 67 const char *groupAddress2String[] = {
krenbluetoothsig 0:3ed424a8870a 68 "Bedroom",
krenbluetoothsig 0:3ed424a8870a 69 "Living",
krenbluetoothsig 0:3ed424a8870a 70 "Dining",
krenbluetoothsig 0:3ed424a8870a 71 "Garage"
krenbluetoothsig 0:3ed424a8870a 72 };
krenbluetoothsig 0:3ed424a8870a 73
krenbluetoothsig 0:3ed424a8870a 74 static struct device *gpio;
krenbluetoothsig 0:3ed424a8870a 75 static struct device *nvm;
krenbluetoothsig 0:3ed424a8870a 76 static struct device *pwm;
krenbluetoothsig 0:3ed424a8870a 77
krenbluetoothsig 0:3ed424a8870a 78 static struct k_work button_work;
krenbluetoothsig 0:3ed424a8870a 79 static struct k_work subscribe_work;
krenbluetoothsig 0:3ed424a8870a 80 static u32_t time, last_time;
krenbluetoothsig 0:3ed424a8870a 81
krenbluetoothsig 0:3ed424a8870a 82 const u16_t net_idx;
krenbluetoothsig 0:3ed424a8870a 83 const u16_t app_idx;
krenbluetoothsig 0:3ed424a8870a 84 const u32_t iv_index;
krenbluetoothsig 0:3ed424a8870a 85 u8_t flags;
krenbluetoothsig 0:3ed424a8870a 86 u16_t addr;
krenbluetoothsig 0:3ed424a8870a 87 static u32_t seq;
krenbluetoothsig 0:3ed424a8870a 88
krenbluetoothsig 0:3ed424a8870a 89 /* group address, initialized */
krenbluetoothsig 0:3ed424a8870a 90 u16_t groupAddress = GROUP_ADDR;
krenbluetoothsig 0:3ed424a8870a 91
krenbluetoothsig 0:3ed424a8870a 92 u16_t board_set_target(void)
krenbluetoothsig 0:3ed424a8870a 93 {
krenbluetoothsig 0:3ed424a8870a 94 switch (groupAddress) {
krenbluetoothsig 0:3ed424a8870a 95 case GROUP_ADDR:
krenbluetoothsig 0:3ed424a8870a 96 groupAddress++ ;
krenbluetoothsig 0:3ed424a8870a 97 break;
krenbluetoothsig 0:3ed424a8870a 98 case (GROUP_ADDR + 3):
krenbluetoothsig 0:3ed424a8870a 99 groupAddress = GROUP_ADDR;
krenbluetoothsig 0:3ed424a8870a 100 break;
krenbluetoothsig 0:3ed424a8870a 101 default:
krenbluetoothsig 0:3ed424a8870a 102 groupAddress++;
krenbluetoothsig 0:3ed424a8870a 103 break;
krenbluetoothsig 0:3ed424a8870a 104 }
krenbluetoothsig 0:3ed424a8870a 105
krenbluetoothsig 0:3ed424a8870a 106 return groupAddress;
krenbluetoothsig 0:3ed424a8870a 107 }
krenbluetoothsig 0:3ed424a8870a 108
krenbluetoothsig 0:3ed424a8870a 109 void board_seq_update(u32_t seq)
krenbluetoothsig 0:3ed424a8870a 110 {
krenbluetoothsig 0:3ed424a8870a 111 u32_t loc, seq_map;
krenbluetoothsig 0:3ed424a8870a 112 int err;
krenbluetoothsig 0:3ed424a8870a 113
krenbluetoothsig 0:3ed424a8870a 114 if (seq % SEQ_PER_BIT) {
krenbluetoothsig 0:3ed424a8870a 115 return;
krenbluetoothsig 0:3ed424a8870a 116 }
krenbluetoothsig 0:3ed424a8870a 117
krenbluetoothsig 0:3ed424a8870a 118 loc = (SEQ_PAGE + ((seq / SEQ_PER_BIT) / 32));
krenbluetoothsig 0:3ed424a8870a 119
krenbluetoothsig 0:3ed424a8870a 120 err = flash_read(nvm, loc, &seq_map, sizeof(seq_map));
krenbluetoothsig 0:3ed424a8870a 121 if (err) {
krenbluetoothsig 0:3ed424a8870a 122 printk("flash_read err %d\n", err);
krenbluetoothsig 0:3ed424a8870a 123 return;
krenbluetoothsig 0:3ed424a8870a 124 }
krenbluetoothsig 0:3ed424a8870a 125
krenbluetoothsig 0:3ed424a8870a 126 seq_map >>= 1;
krenbluetoothsig 0:3ed424a8870a 127
krenbluetoothsig 0:3ed424a8870a 128 flash_write_protection_set(nvm, false);
krenbluetoothsig 0:3ed424a8870a 129 err = flash_write(nvm, loc, &seq_map, sizeof(seq_map));
krenbluetoothsig 0:3ed424a8870a 130 flash_write_protection_set(nvm, true);
krenbluetoothsig 0:3ed424a8870a 131 if (err) {
krenbluetoothsig 0:3ed424a8870a 132 printk("flash_write err %d\n", err);
krenbluetoothsig 0:3ed424a8870a 133 }
krenbluetoothsig 0:3ed424a8870a 134 }
krenbluetoothsig 0:3ed424a8870a 135
krenbluetoothsig 0:3ed424a8870a 136 static u32_t get_seq(void)
krenbluetoothsig 0:3ed424a8870a 137 {
krenbluetoothsig 0:3ed424a8870a 138 u32_t seq_map, seq = 0;
krenbluetoothsig 0:3ed424a8870a 139 int err, i;
krenbluetoothsig 0:3ed424a8870a 140
krenbluetoothsig 0:3ed424a8870a 141 for (i = 0; i < NRF_FICR->CODEPAGESIZE / sizeof(seq_map); i++) {
krenbluetoothsig 0:3ed424a8870a 142 err = flash_read(nvm, SEQ_PAGE + (i * sizeof(seq_map)),
krenbluetoothsig 0:3ed424a8870a 143 &seq_map, sizeof(seq_map));
krenbluetoothsig 0:3ed424a8870a 144 if (err) {
krenbluetoothsig 0:3ed424a8870a 145 printk("flash_read err %d\n", err);
krenbluetoothsig 0:3ed424a8870a 146 return seq;
krenbluetoothsig 0:3ed424a8870a 147 }
krenbluetoothsig 0:3ed424a8870a 148
krenbluetoothsig 0:3ed424a8870a 149 printk("seq_map 0x%08x\n", seq_map);
krenbluetoothsig 0:3ed424a8870a 150
krenbluetoothsig 0:3ed424a8870a 151 if (seq_map) {
krenbluetoothsig 0:3ed424a8870a 152 seq = ((i * 32) +
krenbluetoothsig 0:3ed424a8870a 153 (32 - popcount(seq_map))) * SEQ_PER_BIT;
krenbluetoothsig 0:3ed424a8870a 154 if (!seq) {
krenbluetoothsig 0:3ed424a8870a 155 return 0;
krenbluetoothsig 0:3ed424a8870a 156 }
krenbluetoothsig 0:3ed424a8870a 157
krenbluetoothsig 0:3ed424a8870a 158 break;
krenbluetoothsig 0:3ed424a8870a 159 }
krenbluetoothsig 0:3ed424a8870a 160 }
krenbluetoothsig 0:3ed424a8870a 161
krenbluetoothsig 0:3ed424a8870a 162 seq += SEQ_PER_BIT;
krenbluetoothsig 0:3ed424a8870a 163 if (seq >= SEQ_MAX) {
krenbluetoothsig 0:3ed424a8870a 164 seq = 0;
krenbluetoothsig 0:3ed424a8870a 165 }
krenbluetoothsig 0:3ed424a8870a 166
krenbluetoothsig 0:3ed424a8870a 167 if (seq) {
krenbluetoothsig 0:3ed424a8870a 168 seq_map >>= 1;
krenbluetoothsig 0:3ed424a8870a 169 flash_write_protection_set(nvm, false);
krenbluetoothsig 0:3ed424a8870a 170 err = flash_write(nvm, SEQ_PAGE + (i * sizeof(seq_map)),
krenbluetoothsig 0:3ed424a8870a 171 &seq_map, sizeof(seq_map));
krenbluetoothsig 0:3ed424a8870a 172 flash_write_protection_set(nvm, true);
krenbluetoothsig 0:3ed424a8870a 173 if (err) {
krenbluetoothsig 0:3ed424a8870a 174 printk("flash_write err %d\n", err);
krenbluetoothsig 0:3ed424a8870a 175 }
krenbluetoothsig 0:3ed424a8870a 176 } else {
krenbluetoothsig 0:3ed424a8870a 177 printk("Performing flash erase of page 0x%08x\n", SEQ_PAGE);
krenbluetoothsig 0:3ed424a8870a 178 err = flash_erase(nvm, SEQ_PAGE, NRF_FICR->CODEPAGESIZE);
krenbluetoothsig 0:3ed424a8870a 179 if (err) {
krenbluetoothsig 0:3ed424a8870a 180 printk("flash_erase err %d\n", err);
krenbluetoothsig 0:3ed424a8870a 181 }
krenbluetoothsig 0:3ed424a8870a 182 }
krenbluetoothsig 0:3ed424a8870a 183
krenbluetoothsig 0:3ed424a8870a 184 return seq;
krenbluetoothsig 0:3ed424a8870a 185 }
krenbluetoothsig 0:3ed424a8870a 186
krenbluetoothsig 0:3ed424a8870a 187 static void buttonA_pressed(struct k_work *work)
krenbluetoothsig 0:3ed424a8870a 188 {
krenbluetoothsig 0:3ed424a8870a 189 struct mb_display *disp = mb_display_get();
krenbluetoothsig 0:3ed424a8870a 190
krenbluetoothsig 0:3ed424a8870a 191 printk("buttonA_pressed\n");
krenbluetoothsig 0:3ed424a8870a 192 mb_display_print(disp, MB_DISPLAY_MODE_DEFAULT, SCROLL_SPEED, "%s",
krenbluetoothsig 0:3ed424a8870a 193 groupAddress2String[groupAddress - GROUP_ADDR]);
krenbluetoothsig 0:3ed424a8870a 194 }
krenbluetoothsig 0:3ed424a8870a 195
krenbluetoothsig 0:3ed424a8870a 196 static void buttonB_resubscribe(struct k_work *work)
krenbluetoothsig 0:3ed424a8870a 197 {
krenbluetoothsig 0:3ed424a8870a 198 struct mb_display *disp = mb_display_get();
krenbluetoothsig 0:3ed424a8870a 199
krenbluetoothsig 0:3ed424a8870a 200 printk("change new group address to 0x%04x\n", board_set_target());
krenbluetoothsig 0:3ed424a8870a 201
krenbluetoothsig 0:3ed424a8870a 202 mb_display_print(disp, MB_DISPLAY_MODE_DEFAULT, SCROLL_SPEED, "%s",
krenbluetoothsig 0:3ed424a8870a 203 groupAddress2String[groupAddress - GROUP_ADDR]);
krenbluetoothsig 0:3ed424a8870a 204
krenbluetoothsig 0:3ed424a8870a 205 // change model subscription
krenbluetoothsig 0:3ed424a8870a 206 bt_mesh_cfg_mod_sub_overwrite(net_idx, addr, addr, groupAddress,
krenbluetoothsig 0:3ed424a8870a 207 BT_MESH_MODEL_ID_GEN_ONOFF_SRV, NULL);
krenbluetoothsig 0:3ed424a8870a 208
krenbluetoothsig 0:3ed424a8870a 209 {
krenbluetoothsig 0:3ed424a8870a 210 struct bt_mesh_cfg_hb_sub sub = {
krenbluetoothsig 0:3ed424a8870a 211 .src = PUBLISHER_ADDR,
krenbluetoothsig 0:3ed424a8870a 212 .dst = groupAddress,
krenbluetoothsig 0:3ed424a8870a 213 .period = 0x10,
krenbluetoothsig 0:3ed424a8870a 214 };
krenbluetoothsig 0:3ed424a8870a 215
krenbluetoothsig 0:3ed424a8870a 216 bt_mesh_cfg_hb_sub_set(net_idx, addr, &sub, NULL /*&status*/);
krenbluetoothsig 0:3ed424a8870a 217 }
krenbluetoothsig 0:3ed424a8870a 218
krenbluetoothsig 0:3ed424a8870a 219 }
krenbluetoothsig 0:3ed424a8870a 220
krenbluetoothsig 0:3ed424a8870a 221 static void button_pressed(struct device *dev, struct gpio_callback *cb,
krenbluetoothsig 0:3ed424a8870a 222 uint32_t pins)
krenbluetoothsig 0:3ed424a8870a 223 {
krenbluetoothsig 0:3ed424a8870a 224
krenbluetoothsig 0:3ed424a8870a 225 /*
krenbluetoothsig 0:3ed424a8870a 226 * One button press within a 1 second interval sends an on message
krenbluetoothsig 0:3ed424a8870a 227 * More than one button press sends an off message
krenbluetoothsig 0:3ed424a8870a 228 */
krenbluetoothsig 0:3ed424a8870a 229 time = k_uptime_get_32();
krenbluetoothsig 0:3ed424a8870a 230
krenbluetoothsig 0:3ed424a8870a 231 /* debounce the switch */
krenbluetoothsig 0:3ed424a8870a 232 if (time < last_time + BUTTON_DEBOUNCE_DELAY_MS) {
krenbluetoothsig 0:3ed424a8870a 233 last_time = time;
krenbluetoothsig 0:3ed424a8870a 234 return;
krenbluetoothsig 0:3ed424a8870a 235 }
krenbluetoothsig 0:3ed424a8870a 236
krenbluetoothsig 0:3ed424a8870a 237 if (pins & BIT(SW0_GPIO_PIN)) {
krenbluetoothsig 0:3ed424a8870a 238 k_work_submit(&button_work);
krenbluetoothsig 0:3ed424a8870a 239 }
krenbluetoothsig 0:3ed424a8870a 240 else {
krenbluetoothsig 0:3ed424a8870a 241 k_work_submit(&subscribe_work);
krenbluetoothsig 0:3ed424a8870a 242 }
krenbluetoothsig 0:3ed424a8870a 243
krenbluetoothsig 0:3ed424a8870a 244 last_time = time;
krenbluetoothsig 0:3ed424a8870a 245
krenbluetoothsig 0:3ed424a8870a 246 }
krenbluetoothsig 0:3ed424a8870a 247
krenbluetoothsig 0:3ed424a8870a 248 static const struct {
krenbluetoothsig 0:3ed424a8870a 249 char note;
krenbluetoothsig 0:3ed424a8870a 250 u32_t period;
krenbluetoothsig 0:3ed424a8870a 251 u32_t sharp;
krenbluetoothsig 0:3ed424a8870a 252 } period_map[] = {
krenbluetoothsig 0:3ed424a8870a 253 { 'C', 3822, 3608 },
krenbluetoothsig 0:3ed424a8870a 254 { 'D', 3405, 3214 },
krenbluetoothsig 0:3ed424a8870a 255 { 'E', 3034, 3034 },
krenbluetoothsig 0:3ed424a8870a 256 { 'F', 2863, 2703 },
krenbluetoothsig 0:3ed424a8870a 257 { 'G', 2551, 2407 },
krenbluetoothsig 0:3ed424a8870a 258 { 'A', 2273, 2145 },
krenbluetoothsig 0:3ed424a8870a 259 { 'B', 2025, 2025 },
krenbluetoothsig 0:3ed424a8870a 260 };
krenbluetoothsig 0:3ed424a8870a 261
krenbluetoothsig 0:3ed424a8870a 262 static u32_t get_period(char note, bool sharp)
krenbluetoothsig 0:3ed424a8870a 263 {
krenbluetoothsig 0:3ed424a8870a 264 int i;
krenbluetoothsig 0:3ed424a8870a 265
krenbluetoothsig 0:3ed424a8870a 266 if (note == ' ') {
krenbluetoothsig 0:3ed424a8870a 267 return 0;
krenbluetoothsig 0:3ed424a8870a 268 }
krenbluetoothsig 0:3ed424a8870a 269
krenbluetoothsig 0:3ed424a8870a 270 for (i = 0; i < ARRAY_SIZE(period_map); i++) {
krenbluetoothsig 0:3ed424a8870a 271 if (period_map[i].note != note) {
krenbluetoothsig 0:3ed424a8870a 272 continue;
krenbluetoothsig 0:3ed424a8870a 273 }
krenbluetoothsig 0:3ed424a8870a 274
krenbluetoothsig 0:3ed424a8870a 275 if (sharp) {
krenbluetoothsig 0:3ed424a8870a 276 return period_map[i].sharp;
krenbluetoothsig 0:3ed424a8870a 277 } else {
krenbluetoothsig 0:3ed424a8870a 278 return period_map[i].period;
krenbluetoothsig 0:3ed424a8870a 279 }
krenbluetoothsig 0:3ed424a8870a 280 }
krenbluetoothsig 0:3ed424a8870a 281
krenbluetoothsig 0:3ed424a8870a 282 return 1500;
krenbluetoothsig 0:3ed424a8870a 283 }
krenbluetoothsig 0:3ed424a8870a 284
krenbluetoothsig 0:3ed424a8870a 285 void board_heartbeat(u8_t hops, u16_t feat)
krenbluetoothsig 0:3ed424a8870a 286 {
krenbluetoothsig 0:3ed424a8870a 287 struct mb_display *disp = mb_display_get();
krenbluetoothsig 0:3ed424a8870a 288 const struct mb_image hops_img[] = {
krenbluetoothsig 0:3ed424a8870a 289 MB_IMAGE({ 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 290 { 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 291 { 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 292 { 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 293 { 1, 1, 1, 1, 1 }),
krenbluetoothsig 0:3ed424a8870a 294 MB_IMAGE({ 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 295 { 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 296 { 1, 1, 0, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 297 { 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 298 { 1, 1, 1, 1, 1 }),
krenbluetoothsig 0:3ed424a8870a 299 MB_IMAGE({ 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 300 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 301 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 302 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 303 { 1, 1, 1, 1, 1 }),
krenbluetoothsig 0:3ed424a8870a 304 MB_IMAGE({ 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 305 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 306 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 307 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 308 { 1, 1, 1, 1, 1 }),
krenbluetoothsig 0:3ed424a8870a 309 MB_IMAGE({ 1, 0, 1, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 310 { 0, 0, 0, 0, 0 },
krenbluetoothsig 0:3ed424a8870a 311 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 312 { 0, 0, 0, 0, 0 },
krenbluetoothsig 0:3ed424a8870a 313 { 1, 0, 1, 0, 1 })
krenbluetoothsig 0:3ed424a8870a 314 };
krenbluetoothsig 0:3ed424a8870a 315
krenbluetoothsig 0:3ed424a8870a 316 printk("%u hops\n", hops);
krenbluetoothsig 0:3ed424a8870a 317
krenbluetoothsig 0:3ed424a8870a 318 if (hops) {
krenbluetoothsig 0:3ed424a8870a 319 hops = min(hops, ARRAY_SIZE(hops_img));
krenbluetoothsig 0:3ed424a8870a 320 mb_display_image(disp, MB_DISPLAY_MODE_SINGLE, K_SECONDS(2),
krenbluetoothsig 0:3ed424a8870a 321 &hops_img[hops - 1], 1);
krenbluetoothsig 0:3ed424a8870a 322 }
krenbluetoothsig 0:3ed424a8870a 323 }
krenbluetoothsig 0:3ed424a8870a 324
krenbluetoothsig 0:3ed424a8870a 325 void board_other_dev_pressed(u16_t addr)
krenbluetoothsig 0:3ed424a8870a 326 {
krenbluetoothsig 0:3ed424a8870a 327 struct mb_display *disp = mb_display_get();
krenbluetoothsig 0:3ed424a8870a 328
krenbluetoothsig 0:3ed424a8870a 329 printk("board_other_dev_pressed(0x%04x)\n", addr);
krenbluetoothsig 0:3ed424a8870a 330
krenbluetoothsig 0:3ed424a8870a 331 mb_display_print(disp, MB_DISPLAY_MODE_SINGLE, K_SECONDS(2),
krenbluetoothsig 0:3ed424a8870a 332 "%c", groupAddress2String[groupAddress - GROUP_ADDR][0]);
krenbluetoothsig 0:3ed424a8870a 333 }
krenbluetoothsig 0:3ed424a8870a 334
krenbluetoothsig 0:3ed424a8870a 335 void board_attention(bool attention)
krenbluetoothsig 0:3ed424a8870a 336 {
krenbluetoothsig 0:3ed424a8870a 337 struct mb_display *disp = mb_display_get();
krenbluetoothsig 0:3ed424a8870a 338 static const struct mb_image attn_img[] = {
krenbluetoothsig 0:3ed424a8870a 339 MB_IMAGE({ 0, 0, 0, 0, 0 },
krenbluetoothsig 0:3ed424a8870a 340 { 0, 0, 0, 0, 0 },
krenbluetoothsig 0:3ed424a8870a 341 { 0, 0, 1, 0, 0 },
krenbluetoothsig 0:3ed424a8870a 342 { 0, 0, 0, 0, 0 },
krenbluetoothsig 0:3ed424a8870a 343 { 0, 0, 0, 0, 0 }),
krenbluetoothsig 0:3ed424a8870a 344 MB_IMAGE({ 0, 0, 0, 0, 0 },
krenbluetoothsig 0:3ed424a8870a 345 { 0, 1, 1, 1, 0 },
krenbluetoothsig 0:3ed424a8870a 346 { 0, 1, 1, 1, 0 },
krenbluetoothsig 0:3ed424a8870a 347 { 0, 1, 1, 1, 0 },
krenbluetoothsig 0:3ed424a8870a 348 { 0, 0, 0, 0, 0 }),
krenbluetoothsig 0:3ed424a8870a 349 MB_IMAGE({ 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 350 { 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 351 { 1, 1, 0, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 352 { 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 353 { 1, 1, 1, 1, 1 }),
krenbluetoothsig 0:3ed424a8870a 354 MB_IMAGE({ 1, 1, 1, 1, 1 },
krenbluetoothsig 0:3ed424a8870a 355 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 356 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 357 { 1, 0, 0, 0, 1 },
krenbluetoothsig 0:3ed424a8870a 358 { 1, 1, 1, 1, 1 }),
krenbluetoothsig 0:3ed424a8870a 359 };
krenbluetoothsig 0:3ed424a8870a 360
krenbluetoothsig 0:3ed424a8870a 361 if (attention) {
krenbluetoothsig 0:3ed424a8870a 362 mb_display_image(disp,
krenbluetoothsig 0:3ed424a8870a 363 MB_DISPLAY_MODE_DEFAULT | MB_DISPLAY_FLAG_LOOP,
krenbluetoothsig 0:3ed424a8870a 364 K_MSEC(150), attn_img, ARRAY_SIZE(attn_img));
krenbluetoothsig 0:3ed424a8870a 365 } else {
krenbluetoothsig 0:3ed424a8870a 366 mb_display_stop(disp);
krenbluetoothsig 0:3ed424a8870a 367 }
krenbluetoothsig 0:3ed424a8870a 368 }
krenbluetoothsig 0:3ed424a8870a 369
krenbluetoothsig 0:3ed424a8870a 370 static void configure_button(void)
krenbluetoothsig 0:3ed424a8870a 371 {
krenbluetoothsig 0:3ed424a8870a 372 static struct gpio_callback button_cb;
krenbluetoothsig 0:3ed424a8870a 373
krenbluetoothsig 0:3ed424a8870a 374 /* Initialize the button debouncer */
krenbluetoothsig 0:3ed424a8870a 375 last_time = k_uptime_get_32();
krenbluetoothsig 0:3ed424a8870a 376
krenbluetoothsig 0:3ed424a8870a 377 k_work_init(&button_work, buttonA_pressed);
krenbluetoothsig 0:3ed424a8870a 378 k_work_init(&subscribe_work, buttonB_resubscribe);
krenbluetoothsig 0:3ed424a8870a 379
krenbluetoothsig 0:3ed424a8870a 380 gpio = device_get_binding(SW0_GPIO_NAME);
krenbluetoothsig 0:3ed424a8870a 381
krenbluetoothsig 0:3ed424a8870a 382 gpio_pin_configure(gpio, SW0_GPIO_PIN,
krenbluetoothsig 0:3ed424a8870a 383 (GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE |
krenbluetoothsig 0:3ed424a8870a 384 GPIO_INT_ACTIVE_LOW));
krenbluetoothsig 0:3ed424a8870a 385 gpio_pin_configure(gpio, SW1_GPIO_PIN,
krenbluetoothsig 0:3ed424a8870a 386 (GPIO_DIR_IN | GPIO_INT | GPIO_INT_EDGE |
krenbluetoothsig 0:3ed424a8870a 387 GPIO_INT_ACTIVE_LOW));
krenbluetoothsig 0:3ed424a8870a 388
krenbluetoothsig 0:3ed424a8870a 389 gpio_init_callback(&button_cb, button_pressed,
krenbluetoothsig 0:3ed424a8870a 390 BIT(SW0_GPIO_PIN) | BIT(SW1_GPIO_PIN));
krenbluetoothsig 0:3ed424a8870a 391 gpio_add_callback(gpio, &button_cb);
krenbluetoothsig 0:3ed424a8870a 392
krenbluetoothsig 0:3ed424a8870a 393 gpio_pin_enable_callback(gpio, SW0_GPIO_PIN);
krenbluetoothsig 0:3ed424a8870a 394 gpio_pin_enable_callback(gpio, SW1_GPIO_PIN);
krenbluetoothsig 0:3ed424a8870a 395 }
krenbluetoothsig 0:3ed424a8870a 396
krenbluetoothsig 0:3ed424a8870a 397 void board_init(u16_t *addr, u32_t *seq)
krenbluetoothsig 0:3ed424a8870a 398 {
krenbluetoothsig 0:3ed424a8870a 399 struct mb_display *disp = mb_display_get();
krenbluetoothsig 0:3ed424a8870a 400
krenbluetoothsig 0:3ed424a8870a 401 printk("SEQ_PAGE 0x%08x\n", SEQ_PAGE);
krenbluetoothsig 0:3ed424a8870a 402
krenbluetoothsig 0:3ed424a8870a 403 nvm = device_get_binding(FLASH_DEV_NAME);
krenbluetoothsig 0:3ed424a8870a 404 pwm = device_get_binding(CONFIG_PWM_NRF5_SW_0_DEV_NAME);
krenbluetoothsig 0:3ed424a8870a 405
krenbluetoothsig 0:3ed424a8870a 406 *addr = ( (u16_t)NRF_FICR->DEVICEADDR[0] ) & 0x7fff;
krenbluetoothsig 0:3ed424a8870a 407
krenbluetoothsig 0:3ed424a8870a 408 printk("FICR 0x%02x\n", *addr);
krenbluetoothsig 0:3ed424a8870a 409
krenbluetoothsig 0:3ed424a8870a 410 *seq = get_seq();
krenbluetoothsig 0:3ed424a8870a 411
krenbluetoothsig 0:3ed424a8870a 412 mb_display_print(disp, MB_DISPLAY_MODE_DEFAULT, SCROLL_SPEED,
krenbluetoothsig 0:3ed424a8870a 413 "%s %s", "Server", groupAddress2String[groupAddress - GROUP_ADDR]);
krenbluetoothsig 0:3ed424a8870a 414
krenbluetoothsig 0:3ed424a8870a 415 configure_button();
krenbluetoothsig 0:3ed424a8870a 416 }
krenbluetoothsig 0:3ed424a8870a 417
krenbluetoothsig 0:3ed424a8870a 418 static void heartbeat(u8_t hops, u16_t feat)
krenbluetoothsig 0:3ed424a8870a 419 {
krenbluetoothsig 0:3ed424a8870a 420 board_heartbeat(hops, feat);
krenbluetoothsig 0:3ed424a8870a 421 }
krenbluetoothsig 0:3ed424a8870a 422
krenbluetoothsig 0:3ed424a8870a 423 static struct bt_mesh_cfg_srv cfg_srv = {
krenbluetoothsig 0:3ed424a8870a 424 #if defined(CONFIG_BOARD_BBC_MICROBIT)
krenbluetoothsig 0:3ed424a8870a 425 .relay = BT_MESH_RELAY_ENABLED,
krenbluetoothsig 0:3ed424a8870a 426 .beacon = BT_MESH_BEACON_DISABLED,
krenbluetoothsig 0:3ed424a8870a 427 #else
krenbluetoothsig 0:3ed424a8870a 428 .relay = BT_MESH_RELAY_ENABLED,
krenbluetoothsig 0:3ed424a8870a 429 .beacon = BT_MESH_BEACON_ENABLED,
krenbluetoothsig 0:3ed424a8870a 430 #endif
krenbluetoothsig 0:3ed424a8870a 431 .frnd = BT_MESH_FRIEND_NOT_SUPPORTED,
krenbluetoothsig 0:3ed424a8870a 432 .default_ttl = 7,
krenbluetoothsig 0:3ed424a8870a 433
krenbluetoothsig 0:3ed424a8870a 434 /* 3 transmissions with 20ms interval */
krenbluetoothsig 0:3ed424a8870a 435 .net_transmit = BT_MESH_TRANSMIT(2, 20),
krenbluetoothsig 0:3ed424a8870a 436 .relay_retransmit = BT_MESH_TRANSMIT(3, 20),
krenbluetoothsig 0:3ed424a8870a 437
krenbluetoothsig 0:3ed424a8870a 438 .hb_sub.func = heartbeat,
krenbluetoothsig 0:3ed424a8870a 439 };
krenbluetoothsig 0:3ed424a8870a 440
krenbluetoothsig 0:3ed424a8870a 441 static struct bt_mesh_cfg_cli cfg_cli = {
krenbluetoothsig 0:3ed424a8870a 442 };
krenbluetoothsig 0:3ed424a8870a 443
krenbluetoothsig 0:3ed424a8870a 444 static void attention_on(struct bt_mesh_model *model)
krenbluetoothsig 0:3ed424a8870a 445 {
krenbluetoothsig 0:3ed424a8870a 446 printk("attention_on()\n");
krenbluetoothsig 0:3ed424a8870a 447 board_attention(true);
krenbluetoothsig 0:3ed424a8870a 448 }
krenbluetoothsig 0:3ed424a8870a 449
krenbluetoothsig 0:3ed424a8870a 450 static void attention_off(struct bt_mesh_model *model)
krenbluetoothsig 0:3ed424a8870a 451 {
krenbluetoothsig 0:3ed424a8870a 452 printk("attention_off()\n");
krenbluetoothsig 0:3ed424a8870a 453 board_attention(false);
krenbluetoothsig 0:3ed424a8870a 454 }
krenbluetoothsig 0:3ed424a8870a 455
krenbluetoothsig 0:3ed424a8870a 456 static const struct bt_mesh_health_srv_cb health_srv_cb = {
krenbluetoothsig 0:3ed424a8870a 457 .attn_on = attention_on,
krenbluetoothsig 0:3ed424a8870a 458 .attn_off = attention_off,
krenbluetoothsig 0:3ed424a8870a 459 };
krenbluetoothsig 0:3ed424a8870a 460
krenbluetoothsig 0:3ed424a8870a 461 static struct bt_mesh_health_srv health_srv = {
krenbluetoothsig 0:3ed424a8870a 462 .cb = &health_srv_cb,
krenbluetoothsig 0:3ed424a8870a 463 };
krenbluetoothsig 0:3ed424a8870a 464
krenbluetoothsig 0:3ed424a8870a 465 BT_MESH_HEALTH_PUB_DEFINE(health_pub, 0);
krenbluetoothsig 0:3ed424a8870a 466 BT_MESH_MODEL_PUB_DEFINE(gen_onoff_pub_srv, NULL, 2 + 2);
krenbluetoothsig 0:3ed424a8870a 467 BT_MESH_MODEL_PUB_DEFINE(gen_onoff_pub_cli, NULL, 2 + 2);
krenbluetoothsig 0:3ed424a8870a 468
krenbluetoothsig 0:3ed424a8870a 469
krenbluetoothsig 0:3ed424a8870a 470 static void gen_onoff_set(struct bt_mesh_model *model,
krenbluetoothsig 0:3ed424a8870a 471 struct bt_mesh_msg_ctx *ctx,
krenbluetoothsig 0:3ed424a8870a 472 struct net_buf_simple *buf)
krenbluetoothsig 0:3ed424a8870a 473 {
krenbluetoothsig 0:3ed424a8870a 474 struct mb_display *disp = mb_display_get();
krenbluetoothsig 0:3ed424a8870a 475 uint8_t value, trans;
krenbluetoothsig 0:3ed424a8870a 476 value = *buf->data++;
krenbluetoothsig 0:3ed424a8870a 477 trans = *buf->data++;
krenbluetoothsig 0:3ed424a8870a 478
krenbluetoothsig 0:3ed424a8870a 479 printk("gen_onoff_set model 0x%04x, src 0x%04x, value:0x%02x, trans: 0x%02x\n",
krenbluetoothsig 0:3ed424a8870a 480 model->id, ctx->addr, value, trans);
krenbluetoothsig 0:3ed424a8870a 481 if(value){
krenbluetoothsig 0:3ed424a8870a 482 mb_display_print(disp, MB_DISPLAY_MODE_SINGLE, -1,
krenbluetoothsig 0:3ed424a8870a 483 "%c", groupAddress2String[groupAddress - GROUP_ADDR][0]);
krenbluetoothsig 0:3ed424a8870a 484 }
krenbluetoothsig 0:3ed424a8870a 485 else{
krenbluetoothsig 0:3ed424a8870a 486 mb_display_stop(disp);
krenbluetoothsig 0:3ed424a8870a 487 }
krenbluetoothsig 0:3ed424a8870a 488
krenbluetoothsig 0:3ed424a8870a 489 }
krenbluetoothsig 0:3ed424a8870a 490
krenbluetoothsig 0:3ed424a8870a 491 static void gen_onoff_status(struct bt_mesh_model *model,
krenbluetoothsig 0:3ed424a8870a 492 struct bt_mesh_msg_ctx *ctx,
krenbluetoothsig 0:3ed424a8870a 493 struct net_buf_simple *buf)
krenbluetoothsig 0:3ed424a8870a 494 {
krenbluetoothsig 0:3ed424a8870a 495 printk("gen_onoff_status modelId 0x%04x, src 0x%04x\n", model->id, ctx->addr);
krenbluetoothsig 0:3ed424a8870a 496 }
krenbluetoothsig 0:3ed424a8870a 497
krenbluetoothsig 0:3ed424a8870a 498 /*
krenbluetoothsig 0:3ed424a8870a 499 * OnOff Model Server Op Dispatch Table
krenbluetoothsig 0:3ed424a8870a 500 *
krenbluetoothsig 0:3ed424a8870a 501 */
krenbluetoothsig 0:3ed424a8870a 502
krenbluetoothsig 0:3ed424a8870a 503 static const struct bt_mesh_model_op gen_onoff_srv_op[] = {
krenbluetoothsig 0:3ed424a8870a 504 //{ BT_MESH_MODEL_OP_GEN_ONOFF_GET, 0, gen_onoff_get },
krenbluetoothsig 0:3ed424a8870a 505 { BT_MESH_MODEL_OP_GEN_ONOFF_SET, 2, gen_onoff_set },
krenbluetoothsig 0:3ed424a8870a 506 //{ BT_MESH_MODEL_OP_GEN_ONOFF_SET_UNACK, 2, gen_onoff_set_unack },
krenbluetoothsig 0:3ed424a8870a 507 BT_MESH_MODEL_OP_END,
krenbluetoothsig 0:3ed424a8870a 508 };
krenbluetoothsig 0:3ed424a8870a 509
krenbluetoothsig 0:3ed424a8870a 510 static struct bt_mesh_model root_models[] = {
krenbluetoothsig 0:3ed424a8870a 511 BT_MESH_MODEL_CFG_SRV(&cfg_srv),
krenbluetoothsig 0:3ed424a8870a 512 BT_MESH_MODEL_CFG_CLI(&cfg_cli),
krenbluetoothsig 0:3ed424a8870a 513 BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
krenbluetoothsig 0:3ed424a8870a 514 BT_MESH_MODEL(BT_MESH_MODEL_ID_GEN_ONOFF_SRV, gen_onoff_srv_op,
krenbluetoothsig 0:3ed424a8870a 515 &gen_onoff_pub_srv, NULL),
krenbluetoothsig 0:3ed424a8870a 516 };
krenbluetoothsig 0:3ed424a8870a 517
krenbluetoothsig 0:3ed424a8870a 518 static struct bt_mesh_elem elements[] = {
krenbluetoothsig 0:3ed424a8870a 519 BT_MESH_ELEM(0, root_models, BT_MESH_MODEL_NONE),
krenbluetoothsig 0:3ed424a8870a 520 //BT_MESH_ELEM(0, vnd_models, BT_MESH_MODEL_NONE),
krenbluetoothsig 0:3ed424a8870a 521 };
krenbluetoothsig 0:3ed424a8870a 522
krenbluetoothsig 0:3ed424a8870a 523 static const struct bt_mesh_comp comp = {
krenbluetoothsig 0:3ed424a8870a 524 .cid = BT_COMP_ID_LF,
krenbluetoothsig 0:3ed424a8870a 525 .elem = elements,
krenbluetoothsig 0:3ed424a8870a 526 .elem_count = ARRAY_SIZE(elements),
krenbluetoothsig 0:3ed424a8870a 527 };
krenbluetoothsig 0:3ed424a8870a 528
krenbluetoothsig 0:3ed424a8870a 529
krenbluetoothsig 0:3ed424a8870a 530 static void configure(void)
krenbluetoothsig 0:3ed424a8870a 531 {
krenbluetoothsig 0:3ed424a8870a 532 printk("Configuring...\n");
krenbluetoothsig 0:3ed424a8870a 533
krenbluetoothsig 0:3ed424a8870a 534 /* Add Application Key */
krenbluetoothsig 0:3ed424a8870a 535 bt_mesh_cfg_app_key_add(net_idx, addr, net_idx, app_idx, app_key, NULL);
krenbluetoothsig 0:3ed424a8870a 536
krenbluetoothsig 0:3ed424a8870a 537 /* Bind to vendor model */
krenbluetoothsig 0:3ed424a8870a 538 bt_mesh_cfg_mod_app_bind(net_idx, addr, addr, app_idx,
krenbluetoothsig 0:3ed424a8870a 539 BT_MESH_MODEL_ID_GEN_ONOFF_SRV, NULL);
krenbluetoothsig 0:3ed424a8870a 540
krenbluetoothsig 0:3ed424a8870a 541 /* Bind to Health model */
krenbluetoothsig 0:3ed424a8870a 542 bt_mesh_cfg_mod_app_bind(net_idx, addr, addr, app_idx,
krenbluetoothsig 0:3ed424a8870a 543 BT_MESH_MODEL_ID_HEALTH_SRV, NULL);
krenbluetoothsig 0:3ed424a8870a 544
krenbluetoothsig 0:3ed424a8870a 545 bt_mesh_cfg_mod_sub_add(net_idx, addr, addr, groupAddress,
krenbluetoothsig 0:3ed424a8870a 546 BT_MESH_MODEL_ID_GEN_ONOFF_SRV, NULL);
krenbluetoothsig 0:3ed424a8870a 547
krenbluetoothsig 0:3ed424a8870a 548 {
krenbluetoothsig 0:3ed424a8870a 549 struct bt_mesh_cfg_hb_sub sub = {
krenbluetoothsig 0:3ed424a8870a 550 .src = PUBLISHER_ADDR,
krenbluetoothsig 0:3ed424a8870a 551 .dst = groupAddress,
krenbluetoothsig 0:3ed424a8870a 552 .period = 0x10,
krenbluetoothsig 0:3ed424a8870a 553 };
krenbluetoothsig 0:3ed424a8870a 554
krenbluetoothsig 0:3ed424a8870a 555 bt_mesh_cfg_hb_sub_set(net_idx, addr, &sub, NULL);
krenbluetoothsig 0:3ed424a8870a 556 printk("Subscribing to heartbeat messages, group address: 0x%04x, %s\n",
krenbluetoothsig 0:3ed424a8870a 557 groupAddress, groupAddress2String[groupAddress - GROUP_ADDR]);
krenbluetoothsig 0:3ed424a8870a 558 }
krenbluetoothsig 0:3ed424a8870a 559
krenbluetoothsig 0:3ed424a8870a 560 printk("Configuration complete\n");
krenbluetoothsig 0:3ed424a8870a 561
krenbluetoothsig 0:3ed424a8870a 562 }
krenbluetoothsig 0:3ed424a8870a 563
krenbluetoothsig 0:3ed424a8870a 564 static const u8_t dev_uuid[16] = { 0xdd, 0xdd };
krenbluetoothsig 0:3ed424a8870a 565
krenbluetoothsig 0:3ed424a8870a 566 static const struct bt_mesh_prov prov = {
krenbluetoothsig 0:3ed424a8870a 567 .uuid = dev_uuid,
krenbluetoothsig 0:3ed424a8870a 568 };
krenbluetoothsig 0:3ed424a8870a 569
krenbluetoothsig 0:3ed424a8870a 570 static void bt_ready(int err)
krenbluetoothsig 0:3ed424a8870a 571 {
krenbluetoothsig 0:3ed424a8870a 572 if (err) {
krenbluetoothsig 0:3ed424a8870a 573 printk("Bluetooth init failed (err %d)\n", err);
krenbluetoothsig 0:3ed424a8870a 574 return;
krenbluetoothsig 0:3ed424a8870a 575 }
krenbluetoothsig 0:3ed424a8870a 576
krenbluetoothsig 0:3ed424a8870a 577 printk("Bluetooth initialized\n");
krenbluetoothsig 0:3ed424a8870a 578
krenbluetoothsig 0:3ed424a8870a 579 err = bt_mesh_init(&prov, &comp);
krenbluetoothsig 0:3ed424a8870a 580 if (err) {
krenbluetoothsig 0:3ed424a8870a 581 printk("Initializing mesh failed (err %d)\n", err);
krenbluetoothsig 0:3ed424a8870a 582 return;
krenbluetoothsig 0:3ed424a8870a 583 }
krenbluetoothsig 0:3ed424a8870a 584
krenbluetoothsig 0:3ed424a8870a 585 printk("Mesh initialized\n");
krenbluetoothsig 0:3ed424a8870a 586
krenbluetoothsig 0:3ed424a8870a 587 err = bt_mesh_provision(net_key, net_idx, flags, iv_index, seq, addr,
krenbluetoothsig 0:3ed424a8870a 588 dev_key);
krenbluetoothsig 0:3ed424a8870a 589 if (err) {
krenbluetoothsig 0:3ed424a8870a 590 printk("Provisioning failed (err %d)\n", err);
krenbluetoothsig 0:3ed424a8870a 591 return;
krenbluetoothsig 0:3ed424a8870a 592 }
krenbluetoothsig 0:3ed424a8870a 593
krenbluetoothsig 0:3ed424a8870a 594 printk("Provisioning completed\n");
krenbluetoothsig 0:3ed424a8870a 595
krenbluetoothsig 0:3ed424a8870a 596 configure();
krenbluetoothsig 0:3ed424a8870a 597 }
krenbluetoothsig 0:3ed424a8870a 598
krenbluetoothsig 0:3ed424a8870a 599 void main(void)
krenbluetoothsig 0:3ed424a8870a 600 {
krenbluetoothsig 0:3ed424a8870a 601 int err;
krenbluetoothsig 0:3ed424a8870a 602
krenbluetoothsig 0:3ed424a8870a 603 printk("Initializing...\n");
krenbluetoothsig 0:3ed424a8870a 604
krenbluetoothsig 0:3ed424a8870a 605 board_init(&addr, &seq);
krenbluetoothsig 0:3ed424a8870a 606
krenbluetoothsig 0:3ed424a8870a 607 printk("Unicast address: 0x%04x, seq 0x%06x\n", addr, seq);
krenbluetoothsig 0:3ed424a8870a 608
krenbluetoothsig 0:3ed424a8870a 609 /* Initialize the Bluetooth Subsystem */
krenbluetoothsig 0:3ed424a8870a 610 err = bt_enable(bt_ready);
krenbluetoothsig 0:3ed424a8870a 611 if (err) {
krenbluetoothsig 0:3ed424a8870a 612 printk("Bluetooth init failed (err %d)\n", err);
krenbluetoothsig 0:3ed424a8870a 613 }
krenbluetoothsig 0:3ed424a8870a 614
krenbluetoothsig 0:3ed424a8870a 615 while (1) {
krenbluetoothsig 0:3ed424a8870a 616 }
krenbluetoothsig 0:3ed424a8870a 617
krenbluetoothsig 0:3ed424a8870a 618 }