19 #include "rf_rx_ble.h" 24 #include "app_error.h" 27 #include "common_util.h" 30 #include "evt_sd_handler.h" 32 #include "hal_nop_delay.h" 36 #define DEVICE_NAME_CHAR 'B','T' 37 const uint8_t device_name[] = { DEVICE_NAME_CHAR };
42 #define BTDONGLE_UUID_COMPLETE 0x0a, 0xde, 0xfb, 0x07, 0x74, 0x83, 0x66, 0xb0, 0x0d, 0x48, 0xf5, 0x07, 0x70, 0xdc, 0x73, 0x3c 45 #define BTDONGLE_UUID_SERVICE 0xdc70 48 #define BTDONGLE_UUID_SYSINFO 0xdc71 50 #define BTDONGLE_UUID_CONFIG 0xdc72 53 #define ADVERTISING_INTERVAL MSEC_TO_UNITS(500, UNIT_0_625_MS) 55 #define MIN_CONN_INTERVAL MSEC_TO_UNITS(200, UNIT_1_25_MS) 57 #define MAX_CONN_INTERVAL MSEC_TO_UNITS(500, UNIT_1_25_MS) 59 #define SLAVE_LATENCY 0 61 #define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) 64 #define APP_ADV_DATA { \ 65 0x02, BLE_GAP_AD_TYPE_FLAGS, BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE, \ 66 sizeof(device_name) + 1, BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME, DEVICE_NAME_CHAR, \ 67 0x11, BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE, BTDONGLE_UUID_COMPLETE \ 70 #define APP_SCAN_RSP_DATA { \ 71 0x02, BLE_GAP_AD_TYPE_TX_POWER_LEVEL, 0 , \ 72 0x0A, BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME, \ 73 'B', 'T', ' ', 'D', 'o', 'n' , 'g', 'l', 'e', \ 74 0x04, BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA, 0 , 0 , 0 \ 86 uint16_t h_rf_rx_service;
90 ble_gatts_char_handles_t h_status_byte;
99 volatile bool bluetooth_status =
false;
100 void SWI1_IRQHandler(
void)
105 void (* connected_callback) (void);
114 static void ble_evt_handler(ble_evt_t * evt)
117 log_printf(
"BLE Event : %d\n", evt->header.evt_id);
118 switch(evt->header.evt_id)
120 case BLE_GAP_EVT_ADV_SET_TERMINATED:
122 case BLE_GAP_EVT_CONN_PARAM_UPDATE:
125 case BLE_GAP_EVT_CONNECTED:
126 h_conn = evt->evt.gap_evt.conn_handle;
127 connected_callback ();
129 case BLE_GAP_EVT_DISCONNECTED:
130 h_conn = BLE_CONN_HANDLE_INVALID;
131 bluetooth_status =
false;
132 rf_rx_ble_adv_start(connected_callback);
136 case BLE_GATTS_EVT_WRITE:
138 case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST:
140 uint16_t mtu_val = BLE_GATT_ATT_MTU_DEFAULT;
141 err_code = sd_ble_gatts_exchange_mtu_reply(h_conn, mtu_val);
145 case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
147 ble_gap_phys_t
const phys = {
148 .rx_phys = BLE_GAP_PHY_AUTO,
149 .tx_phys = BLE_GAP_PHY_AUTO,
152 err_code = sd_ble_gap_phy_update(h_conn, &phys);
156 case BLE_GAP_EVT_PHY_UPDATE:
158 log_printf(
"Tx_get : %x Rx_get : %x Status : %x\n",
159 evt->evt.gap_evt.params.phy_update.tx_phy,
160 evt->evt.gap_evt.params.phy_update.rx_phy,
161 evt->evt.gap_evt.params.phy_update.status);
173 static void soc_evt_handler(uint32_t evt_id)
175 log_printf(
"soc evt %x\n", evt_id);
178 void rf_rx_ble_disconn(
void)
180 if(h_conn != BLE_CONN_HANDLE_INVALID)
183 err_code = sd_ble_gap_disconnect(h_conn,
184 BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
189 void rf_rx_ble_stack_init()
198 uint32_t app_ram_start = 0x20001c00;
199 log_printf(
"Init %x", app_ram_start);
200 err_code = sd_ble_enable(&app_ram_start);
201 log_printf(
" RAM needed %x\n", app_ram_start);
207 err_code = sd_radio_notification_cfg_set(
208 NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE,
209 NRF_RADIO_NOTIFICATION_DISTANCE_NONE);
213 err_code = sd_nvic_ClearPendingIRQ(SWI1_IRQn);
216 err_code = sd_nvic_SetPriority(SWI1_IRQn, APP_IRQ_PRIORITY_LOWEST);
219 err_code = sd_nvic_EnableIRQ(SWI1_IRQn);
222 h_conn = BLE_CONN_HANDLE_INVALID;
225 void rf_rx_ble_service_init(
void)
232 ble_uuid128_t base_uuid = {{BTDONGLE_UUID_COMPLETE}};
233 err_code = sd_ble_uuid_vs_add(&base_uuid, &uuid_type);
236 ble_uuid.type = uuid_type;
237 ble_uuid.uuid = BTDONGLE_UUID_SERVICE;
239 err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
240 &ble_uuid, &h_rf_rx_service);
244 ble_gatts_char_md_t char_md;
245 ble_gatts_attr_t attr_char_value;
246 ble_gatts_attr_md_t attr_md;
249 memset(&char_md, 0,
sizeof(char_md));
256 char_md.char_props.read = 1;
257 char_md.char_props.write = 0;
259 char_md.p_char_user_desc = NULL;
260 char_md.p_char_pf = NULL;
261 char_md.p_user_desc_md = NULL;
263 char_md.p_cccd_md = NULL;
264 char_md.p_sccd_md = NULL;
266 ble_uuid.type = uuid_type;
267 ble_uuid.uuid = (BTDONGLE_UUID_SYSINFO);
269 memset(&attr_md, 0,
sizeof(attr_md));
271 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm);
272 BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&attr_md.write_perm);
273 attr_md.vloc = BLE_GATTS_VLOC_STACK;
278 memset(&attr_char_value, 0,
sizeof(attr_char_value));
280 attr_char_value.p_uuid = &ble_uuid;
281 attr_char_value.p_attr_md = &attr_md;
282 attr_char_value.init_len =
sizeof(mod_ble_data_t);
283 attr_char_value.init_offs = 0;
284 attr_char_value.max_len =
sizeof(mod_ble_data_t);
285 attr_char_value.p_value = NULL;
287 err_code = sd_ble_gatts_characteristic_add(
288 h_rf_rx_service, &char_md, &attr_char_value, &h_status_byte);
293 void rf_rx_ble_gap_params_init(
void)
296 ble_gap_conn_params_t gap_conn_params;
297 ble_gap_conn_sec_mode_t sec_mode;
299 BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
301 err_code = sd_ble_gap_device_name_set(
302 &sec_mode, (
const uint8_t *)device_name,
sizeof(device_name));
305 memset(&gap_conn_params, 0,
sizeof(gap_conn_params));
307 gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
308 gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
309 gap_conn_params.slave_latency = SLAVE_LATENCY;
310 gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;
312 err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
316 void rf_rx_ble_adv_init()
318 h_adv = BLE_GAP_ADV_SET_HANDLE_NOT_SET;
321 ble_gap_adv_data_t adv_payload;
324 adv_payload.adv_data.p_data = adv_data;
325 adv_payload.adv_data.len =
sizeof(adv_data);
327 adv_payload.scan_rsp_data.p_data = scn_rsp_data;
328 adv_payload.scan_rsp_data.len =
sizeof(scn_rsp_data);
330 ble_gap_adv_params_t adv_params;
332 memset(&adv_params, 0,
sizeof(adv_params));
335 memset(adv_params.channel_mask, 0, 5);
338 adv_params.duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED;
341 adv_params.filter_policy = BLE_GAP_ADV_FP_ANY;
344 adv_params.interval = ADVERTISING_INTERVAL;
347 adv_params.primary_phy = BLE_GAP_PHY_1MBPS;
350 adv_params.properties.type =
351 BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED;
353 adv_params.p_peer_addr = NULL;
354 adv_params.scan_req_notification = 0;
356 err_code = sd_ble_gap_adv_set_configure(&h_adv,
357 (ble_gap_adv_data_t
const *)&adv_payload,
358 (ble_gap_adv_params_t
const *) &adv_params);
362 void rf_rx_ble_adv_start(
void (*conn_func) (
void))
364 connected_callback = conn_func;
365 bluetooth_status =
true;
367 err_code = sd_ble_gap_adv_start(h_adv, BLE_CONN_CFG_TAG_DEFAULT);
371 bool rf_rx_is_bt_on ()
373 return bluetooth_status;
376 void rf_rx_ble_update_status_byte (mod_ble_data_t * status_byte)
380 ble_gatts_value_t val =
382 .len =
sizeof(mod_ble_data_t),
384 .p_value =(uint8_t *) status_byte
386 err_code = sd_ble_gatts_value_set(h_conn,
387 h_status_byte.value_handle, &val);
#define APP_SCAN_RSP_DATA
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
#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...