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.