22 #include "app_error.h" 25 #include "common_util.h" 27 #include "sensebe_ble.h" 29 #include "evt_sd_handler.h" 33 #include "isr_manager.h" 38 #define DEVICE_NAME_CHAR 'S','e','n','s','e','B','e' 39 const uint8_t device_name[] = { DEVICE_NAME_CHAR };
44 #define SENSEBE_UUID_COMPLETE 0x0a, 0xde, 0xfb, 0x07, 0x74, 0x83, 0x66, 0xb0, 0x0d, 0x48, 0xf5, 0x07, 0x60, 0xdc, 0x73, 0x3c 47 #define SENSEBE_UUID_SERVICE 0xdc60 50 #define SENSEBE_UUID_SYSINFO 0xdc61 52 #define SENSEBE_UUID_CONFIG 0xdc62 55 #define ADVERTISING_INTERVAL MSEC_TO_UNITS(500, UNIT_0_625_MS) 57 #define MIN_CONN_INTERVAL MSEC_TO_UNITS(200, UNIT_1_25_MS) 59 #define MAX_CONN_INTERVAL MSEC_TO_UNITS(500, UNIT_1_25_MS) 61 #define SLAVE_LATENCY 0 63 #define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) 75 uint16_t h_sensebe_service;
79 ble_gatts_char_handles_t h_sysinfo_char;
83 ble_gatts_char_handles_t h_config_char;
86 void (* sensebe_ble_sd_evt)(ble_evt_t * evt);
88 void (* sensebe_config_t_update)(sensebe_config_t * cfg);
90 sensebe_sysinfo curr_sysinfo;
95 void sensebe_ble_swi_Handler ()
97 void SWI1_IRQHandler(
void)
110 static void ble_evt_handler(ble_evt_t * evt)
113 switch(evt->header.evt_id)
115 case BLE_GAP_EVT_CONNECTED:
116 h_conn = evt->evt.gap_evt.conn_handle;
118 case BLE_GAP_EVT_DISCONNECTED:
119 h_conn = BLE_CONN_HANDLE_INVALID;
121 case BLE_GATTS_EVT_WRITE:
123 sensebe_config_t * config =
124 (sensebe_config_t *) evt->evt.gatts_evt.params.write.data;
125 sensebe_config_t_update(config);
128 case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST:
130 uint16_t mtu_val = BLE_GATT_ATT_MTU_DEFAULT;
131 err_code = sd_ble_gatts_exchange_mtu_reply(h_conn, mtu_val);
135 case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
137 ble_gap_phys_t
const phys = {
138 .rx_phys = BLE_GAP_PHY_AUTO,
139 .tx_phys = BLE_GAP_PHY_AUTO,
142 err_code = sd_ble_gap_phy_update(h_conn, &phys);
146 case BLE_GAP_EVT_PHY_UPDATE:
148 log_printf(
"Tx_get : %x Rx_get : %x Status : %x\n",
149 evt->evt.gap_evt.params.phy_update.tx_phy,
150 evt->evt.gap_evt.params.phy_update.rx_phy,
151 evt->evt.gap_evt.params.phy_update.status);
156 sensebe_ble_sd_evt(evt);
164 static void soc_evt_handler(uint32_t evt_id)
166 log_printf(
"soc evt %x\n", evt_id);
170 void (* config_update)(sensebe_config_t * cfg))
172 sensebe_ble_sd_evt = ble_sd_evt;
173 sensebe_config_t_update = config_update;
178 if(h_conn != BLE_CONN_HANDLE_INVALID)
181 err_code = sd_ble_gap_disconnect(h_conn,
182 BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
190 ble_gatts_value_t val =
192 .len =
sizeof(sensebe_sysinfo),
194 .p_value = (uint8_t *) sysinfo
196 err_code = sd_ble_gatts_value_set(h_conn,
197 h_sysinfo_char.value_handle, &val);
204 ble_gatts_value_t val =
206 .len =
sizeof(sensebe_config_t),
208 .p_value = (uint8_t *) config
210 err_code = sd_ble_gatts_value_set(h_conn,
211 h_config_char.value_handle, &val);
224 uint32_t app_ram_start = 0x20001c00;
225 log_printf(
"Init %x", app_ram_start);
226 err_code = sd_ble_enable(&app_ram_start);
227 log_printf(
" RAM needed %x\n", app_ram_start);
233 err_code = sd_radio_notification_cfg_set(
234 NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE,
235 NRF_RADIO_NOTIFICATION_DISTANCE_NONE);
239 err_code = sd_nvic_ClearPendingIRQ(SWI1_IRQn);
242 err_code = sd_nvic_SetPriority(SWI1_IRQn, APP_IRQ_PRIORITY_LOWEST);
245 err_code = sd_nvic_EnableIRQ(SWI1_IRQn);
248 h_conn = BLE_CONN_HANDLE_INVALID;
258 ble_uuid128_t base_uuid = {{SENSEBE_UUID_COMPLETE}};
259 err_code = sd_ble_uuid_vs_add(&base_uuid, &uuid_type);
262 ble_uuid.type = uuid_type;
263 ble_uuid.uuid = SENSEBE_UUID_SERVICE;
265 err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
266 &ble_uuid, &h_sensebe_service);
270 ble_gatts_char_md_t char_md;
271 ble_gatts_attr_t attr_char_value;
272 ble_gatts_attr_md_t attr_md;
274 memset(&char_md, 0,
sizeof(char_md));
276 char_md.char_props.read = 1;
277 char_md.char_props.write = 0;
278 char_md.p_char_user_desc = NULL;
279 char_md.p_char_pf = NULL;
280 char_md.p_user_desc_md = NULL;
281 char_md.p_cccd_md = NULL;
282 char_md.p_sccd_md = NULL;
284 ble_uuid.type = uuid_type;
285 ble_uuid.uuid = (SENSEBE_UUID_SYSINFO);
287 memset(&attr_md, 0,
sizeof(attr_md));
289 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);
290 BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&attr_md.write_perm);
291 attr_md.vloc = BLE_GATTS_VLOC_STACK;
296 memset(&attr_char_value, 0,
sizeof(attr_char_value));
298 attr_char_value.p_uuid = &ble_uuid;
299 attr_char_value.p_attr_md = &attr_md;
300 attr_char_value.init_len =
sizeof(sensebe_sysinfo);
301 attr_char_value.init_offs = 0;
302 attr_char_value.max_len =
sizeof(sensebe_sysinfo);
303 attr_char_value.p_value = NULL;
305 err_code = sd_ble_gatts_characteristic_add(
306 h_sensebe_service, &char_md, &attr_char_value, &h_sysinfo_char);
310 memset(&char_md, 0,
sizeof(char_md));
312 char_md.char_props.read = 1;
313 char_md.char_props.write = 1;
314 char_md.p_char_user_desc = NULL;
315 char_md.p_char_pf = NULL;
316 char_md.p_user_desc_md = NULL;
317 char_md.p_cccd_md = NULL;
318 char_md.p_sccd_md = NULL;
320 ble_uuid.type = uuid_type;
321 ble_uuid.uuid = (SENSEBE_UUID_CONFIG);
323 memset(&attr_md, 0,
sizeof(attr_md));
325 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);
326 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm);
327 attr_md.vloc = BLE_GATTS_VLOC_STACK;
332 memset(&attr_char_value, 0,
sizeof(attr_char_value));
334 attr_char_value.p_uuid = &ble_uuid;
335 attr_char_value.p_attr_md = &attr_md;
336 attr_char_value.init_len =
sizeof(sensebe_config_t);
337 attr_char_value.init_offs = 0;
338 attr_char_value.max_len =
sizeof(sensebe_config_t);
339 attr_char_value.p_value = NULL;
341 err_code = sd_ble_gatts_characteristic_add(
342 h_sensebe_service, &char_md, &attr_char_value,&h_config_char);
349 ble_gap_conn_params_t gap_conn_params;
350 ble_gap_conn_sec_mode_t sec_mode;
352 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
354 err_code = sd_ble_gap_device_name_set(
355 &sec_mode, (
const uint8_t *)device_name,
sizeof(device_name));
358 memset(&gap_conn_params, 0,
sizeof(gap_conn_params));
360 gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
361 gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
362 gap_conn_params.slave_latency = SLAVE_LATENCY;
363 gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;
365 err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
371 h_adv = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
374 ble_gap_adv_data_t adv_payload;
376 adv_payload.adv_data.p_data = sensebe_ble_adv_data->adv_data;
377 adv_payload.adv_data.len = sensebe_ble_adv_data->adv_len;
379 adv_payload.scan_rsp_data.p_data = sensebe_ble_adv_data->scan_rsp_data;
380 adv_payload.scan_rsp_data.len = sensebe_ble_adv_data->scan_rsp_len;
382 ble_gap_adv_params_t adv_params;
384 memset(&adv_params, 0,
sizeof(adv_params));
387 memset(adv_params.channel_mask, 0, 5);
390 adv_params.duration = BLE_GAP_ADV_TIMEOUT_LIMITED_MAX;
393 adv_params.filter_policy = BLE_GAP_ADV_FP_ANY;
396 adv_params.interval = ADVERTISING_INTERVAL;
399 adv_params.primary_phy = BLE_GAP_PHY_1MBPS;
402 adv_params.properties.type =
403 BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;
405 adv_params.p_peer_addr = NULL;
406 adv_params.scan_req_notification = 0;
408 err_code = sd_ble_gap_adv_set_configure(&h_adv,
409 (ble_gap_adv_data_t
const *)&adv_payload,
410 (ble_gap_adv_params_t
const *) &adv_params);
417 err_code = sd_ble_gap_adv_start(h_adv, BLE_CONN_CFG_TAG_DEFAULT);
void sensebe_ble_update_sysinfo(sensebe_sysinfo *sysinfo)
Updates the characteristic that stores the sysinfo.
void sensebe_ble_stack_init(void)
Function for initializing the BLE stack by enabling the SoftDevice and the BLE event interrupt.
void sensebe_ble_service_init(void)
Create the Service and its characteristics for the SensePi device. There is a read-only characteristi...
void sensebe_ble_init(void(*ble_sd_evt)(ble_evt_t *evt), void(*config_update)(sensebe_config_t *cfg))
Initialize the handlers to pass the BLE SD events and the configuration received from the mobile app.
void evt_sd_handler_init(void(*ble_evt_handler)(ble_evt_t *ble_evt), void(*soc_evt_handler)(uint32_t soc_evt_id))
Initializes the SWI2 interrupt routine and stores the handlers for the BLE and SoC events.
#define BOARD_LFCLKSRC_STRUCT
void sensebe_ble_disconn(void)
Disconnect the current active connection, if already connected.
#define APP_ERROR_CHECK(ERR_CODE)
Macro calls error handler if the provided error code is not NRF_SUCCESS. The behavior of this call de...
void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info)
Callback to be invoked in case of fault i.e. unrecoverable errors occurring within the application or...
void sensebe_ble_update_config(sensebe_config_t *config)
Updates the characteristic that stores the SensePi config.
void sensebe_ble_adv_start(void)
Function to start advertising.
void sensebe_ble_gap_params_init(void)
Generic Access Profile initialization. The device name, and the preferred connection parameters are s...
void sensebe_ble_adv_init(sensebe_ble_adv_data_t *sensebe_ble_adv_data)
Function to initializing the advertising.