Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of X_NUCLEO_IDB0XA1 by
Revision 128:46ae62a90136, committed 2015-10-06
- Comitter:
- Wolfgang Betz
- Date:
- Tue Oct 06 12:12:37 2015 +0200
- Parent:
- 127:66ab06ee67e0
- Parent:
- 126:32039585a969
- Commit message:
- Merge branch 'master' of hg::http://wobetz@developer.mbed.org/teams/ST/code/X_NUCLEO_IDB0XA1 into idb0xa1-split
Changed in this revision
--- a/BlueNRGDevice.h Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRGDevice.h Tue Oct 06 12:12:37 2015 +0200 @@ -62,7 +62,7 @@ virtual GattServer& getGattServer(); virtual const GattServer& getGattServer() const; virtual void waitForEvent(void); - + virtual GattClient& getGattClient() { return *gattClient; } @@ -90,7 +90,7 @@ DigitalOut nCS_; DigitalOut rst_; InterruptIn irq_; - + //FIXME: TBI (by now just placeholders to let build /*** betzw: placeholders ***/ GattClient *gattClient;
--- a/BlueNRG_HCI/hci/controller/bluenrg_gap_aci.c Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/hci/controller/bluenrg_gap_aci.c Tue Oct 06 12:12:37 2015 +0200 @@ -27,11 +27,10 @@ #define MIN(a,b) ((a) < (b) )? (a) : (b) #define MAX(a,b) ((a) > (b) )? (a) : (b) -#ifdef BLUENRG_MS -tBleStatus aci_gap_init(uint8_t role, uint8_t privacy_enabled, uint8_t device_name_char_len, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle) +tBleStatus aci_gap_init_IDB05A1(uint8_t role, uint8_t privacy_enabled, uint8_t device_name_char_len, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle) { struct hci_request rq; - gap_init_cp cp; + gap_init_cp_IDB05A1 cp; gap_init_rp resp; cp.role = role; @@ -61,11 +60,10 @@ return 0; } -#else -tBleStatus aci_gap_init(uint8_t role, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle) +tBleStatus aci_gap_init_IDB04A1(uint8_t role, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle) { struct hci_request rq; - gap_init_cp cp; + gap_init_cp_IDB04A1 cp; gap_init_rp resp; cp.role = role; @@ -93,7 +91,6 @@ return 0; } -#endif tBleStatus aci_gap_set_non_discoverable(void) { @@ -121,7 +118,7 @@ uint8_t status; uint8_t buffer[40]; uint8_t indx = 0; - + if((unsigned int)(LocalNameLen + ServiceUUIDLen + 14) > sizeof(buffer)) return BLE_STATUS_INVALID_PARAMS; @@ -243,20 +240,38 @@ return 0; } -#if BLUENRG_MS -tBleStatus aci_gap_set_direct_connectable(uint8_t own_addr_type, uint8_t directed_adv_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr) -#else -tBleStatus aci_gap_set_direct_connectable(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr) -#endif +tBleStatus aci_gap_set_direct_connectable_IDB05A1(uint8_t own_addr_type, uint8_t directed_adv_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr) { struct hci_request rq; - gap_set_direct_conectable_cp cp; + gap_set_direct_conectable_cp_IDB05A1 cp; uint8_t status; cp.own_bdaddr_type = own_addr_type; -#if BLUENRG_MS cp.directed_adv_type = directed_adv_type; -#endif + cp.direct_bdaddr_type = initiator_addr_type; + Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6); + + Osal_MemSet(&rq, 0, sizeof(rq)); + rq.ogf = OGF_VENDOR_CMD; + rq.ocf = OCF_GAP_SET_DIRECT_CONNECTABLE; + rq.cparam = &cp; + rq.clen = sizeof(cp); + rq.rparam = &status; + rq.rlen = 1; + + if (hci_send_req(&rq, FALSE) < 0) + return BLE_STATUS_TIMEOUT; + + return status; +} + +tBleStatus aci_gap_set_direct_connectable_IDB04A1(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr) +{ + struct hci_request rq; + gap_set_direct_conectable_cp_IDB04A1 cp; + uint8_t status; + + cp.own_bdaddr_type = own_addr_type; cp.direct_bdaddr_type = initiator_addr_type; Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6); @@ -406,20 +421,35 @@ return status; } -#if BLUENRG_MS -tBleStatus aci_gap_set_non_connectable(uint8_t adv_type, uint8_t own_address_type) -#else -tBleStatus aci_gap_set_non_connectable(uint8_t adv_type) -#endif +tBleStatus aci_gap_set_non_connectable_IDB05A1(uint8_t adv_type, uint8_t own_address_type) { struct hci_request rq; - gap_set_non_connectable_cp cp; + gap_set_non_connectable_cp_IDB05A1 cp; uint8_t status; cp.advertising_event_type = adv_type; -#if BLUENRG_MS cp.own_address_type = own_address_type; -#endif + Osal_MemSet(&rq, 0, sizeof(rq)); + rq.ogf = OGF_VENDOR_CMD; + rq.ocf = OCF_GAP_SET_NON_CONNECTABLE; + rq.cparam = &cp; + rq.clen = sizeof(cp); + rq.rparam = &status; + rq.rlen = 1; + + if (hci_send_req(&rq, FALSE) < 0) + return BLE_STATUS_TIMEOUT; + + return status; +} + +tBleStatus aci_gap_set_non_connectable_IDB04A1(uint8_t adv_type) +{ + struct hci_request rq; + gap_set_non_connectable_cp_IDB04A1 cp; + uint8_t status; + + cp.advertising_event_type = adv_type; Osal_MemSet(&rq, 0, sizeof(rq)); rq.ogf = OGF_VENDOR_CMD; @@ -623,11 +653,10 @@ return status; } -#if BLUENRG_MS -tBleStatus aci_gap_allow_rebond(uint16_t conn_handle) +tBleStatus aci_gap_allow_rebond_IDB05A1(uint16_t conn_handle) { struct hci_request rq; - gap_allow_rebond_cp cp; + gap_allow_rebond_cp_IDB05A1 cp; uint8_t status; cp.conn_handle = conn_handle; @@ -645,8 +674,7 @@ return status; } -#else -tBleStatus aci_gap_allow_rebond(void) +tBleStatus aci_gap_allow_rebond_IDB04A1(void) { struct hci_request rq; uint8_t status; @@ -662,7 +690,6 @@ return status; } -#endif tBleStatus aci_gap_start_limited_discovery_proc(uint16_t scanInterval, uint16_t scanWindow, uint8_t own_address_type, uint8_t filterDuplicates) @@ -757,9 +784,7 @@ return status; } -#if BLUENRG_MS - -tBleStatus aci_gap_start_auto_conn_establish_proc(uint16_t scanInterval, uint16_t scanWindow, +tBleStatus aci_gap_start_auto_conn_establish_proc_IDB05A1(uint16_t scanInterval, uint16_t scanWindow, uint8_t own_bdaddr_type, uint16_t conn_min_interval, uint16_t conn_max_interval, uint16_t conn_latency, uint16_t supervision_timeout, uint16_t min_conn_length, @@ -831,9 +856,7 @@ return status; } -#else - -tBleStatus aci_gap_start_auto_conn_establish_proc(uint16_t scanInterval, uint16_t scanWindow, +tBleStatus aci_gap_start_auto_conn_establish_proc_IDB04A1(uint16_t scanInterval, uint16_t scanWindow, uint8_t own_bdaddr_type, uint16_t conn_min_interval, uint16_t conn_max_interval, uint16_t conn_latency, uint16_t supervision_timeout, uint16_t min_conn_length, @@ -913,14 +936,11 @@ return status; } -#endif - -#if BLUENRG_MS -tBleStatus aci_gap_start_general_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, +tBleStatus aci_gap_start_general_conn_establish_proc_IDB05A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, uint8_t own_address_type, uint8_t filter_duplicates) { struct hci_request rq; - gap_start_general_conn_establish_proc_cp cp; + gap_start_general_conn_establish_proc_cp_IDB05A1 cp; uint8_t status; cp.scan_type = scan_type; @@ -943,12 +963,11 @@ return status; } -#else -tBleStatus aci_gap_start_general_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, +tBleStatus aci_gap_start_general_conn_establish_proc_IDB04A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, uint8_t own_address_type, uint8_t filter_duplicates, uint8_t use_reconn_addr, const tBDAddr reconn_addr) { struct hci_request rq; - gap_start_general_conn_establish_proc_cp cp; + gap_start_general_conn_establish_proc_cp_IDB04A1 cp; uint8_t status; cp.scan_type = scan_type; @@ -973,7 +992,6 @@ return status; } -#endif tBleStatus aci_gap_start_selective_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, uint8_t own_address_type, uint8_t filter_duplicates, uint8_t num_whitelist_entries, @@ -1124,8 +1142,7 @@ return status; } -#if BLUENRG_MS -tBleStatus aci_gap_resolve_private_address(const tBDAddr private_address, tBDAddr actual_address) +tBleStatus aci_gap_resolve_private_address_IDB05A1(const tBDAddr private_address, tBDAddr actual_address) { struct hci_request rq; gap_resolve_private_address_cp cp; @@ -1151,8 +1168,7 @@ return 0; } -#else -tBleStatus aci_gap_resolve_private_address(const tBDAddr address) +tBleStatus aci_gap_resolve_private_address_IDB04A1(const tBDAddr address) { struct hci_request rq; gap_resolve_private_address_cp cp; @@ -1173,7 +1189,6 @@ return status; } -#endif tBleStatus aci_gap_set_broadcast_mode(uint16_t adv_interv_min, uint16_t adv_interv_max, uint8_t adv_type, uint8_t own_addr_type, uint8_t adv_data_length, const uint8_t *adv_data, uint8_t num_whitelist_entries,
--- a/BlueNRG_HCI/hci/controller/bluenrg_gatt_aci.c Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/hci/controller/bluenrg_gatt_aci.c Tue Oct 06 12:12:37 2015 +0200 @@ -1438,8 +1438,7 @@ return 0; } -#if BLUENRG_MS -tBleStatus aci_gatt_read_handle_value_offset(uint16_t attr_handle, uint8_t offset, uint16_t data_len, uint16_t *data_len_out_p, uint8_t *data) +tBleStatus aci_gatt_read_handle_value_offset_IDB05A1(uint16_t attr_handle, uint8_t offset, uint16_t data_len, uint16_t *data_len_out_p, uint8_t *data) { struct hci_request rq; gatt_read_handle_val_offset_cp cp; @@ -1471,5 +1470,3 @@ return 0; } -#endif -
--- a/BlueNRG_HCI/hci/controller/bluenrg_l2cap_aci.c Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/hci/controller/bluenrg_l2cap_aci.c Tue Oct 06 12:12:37 2015 +0200 @@ -55,15 +55,14 @@ return status; } -#if BLUENRG_MS -tBleStatus aci_l2cap_connection_parameter_update_response(uint16_t conn_handle, uint16_t interval_min, +tBleStatus aci_l2cap_connection_parameter_update_response_IDB05A1(uint16_t conn_handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier, uint16_t min_ce_length, uint16_t max_ce_length, uint8_t id, uint8_t accept) { struct hci_request rq; uint8_t status; - l2cap_conn_param_update_resp_cp cp; + l2cap_conn_param_update_resp_cp_IDB05A1 cp; cp.conn_handle = htobs(conn_handle); cp.interval_min = htobs(interval_min); @@ -88,14 +87,13 @@ return status; } -#else -tBleStatus aci_l2cap_connection_parameter_update_response(uint16_t conn_handle, uint16_t interval_min, +tBleStatus aci_l2cap_connection_parameter_update_response_IDB04A1(uint16_t conn_handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier, uint8_t id, uint8_t accept) { struct hci_request rq; uint8_t status; - l2cap_conn_param_update_resp_cp cp; + l2cap_conn_param_update_resp_cp_IDB04A1 cp; cp.conn_handle = htobs(conn_handle); cp.interval_min = htobs(interval_min); @@ -118,4 +116,3 @@ return status; } -#endif
--- a/BlueNRG_HCI/hci/controller/bluenrg_utils.c Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/hci/controller/bluenrg_utils.c Tue Oct 06 12:12:37 2015 +0200 @@ -120,25 +120,25 @@ /*********************************************************************** * Erase and Program sectors - ************************************************************************/ + ************************************************************************/ for(unsigned int i = FW_OFFSET; i < (number_sectors * SECTOR_SIZE); i += SECTOR_SIZE) { - num_erase_retries = 0; - while (num_erase_retries++ < MAX_ERASE_RETRIES) { - aci_updater_erase_sector(BASE_ADDRESS + i); - if ((i/SECTOR_SIZE) < (unsigned int)(number_sectors-1)) - data_size = DATA_SIZE; - else - data_size = MIN_WRITE_BLOCK_SIZE; - for (j=i; ((j<SECTOR_SIZE+i)&&(j<fw_size)); j += data_size) { - RETRY_COMMAND(aci_updater_program_data_block(BASE_ADDRESS+j, data_size, fw_image+j), MAX_WRITE_RETRIES, status); - if (status != BLE_STATUS_SUCCESS) - break; - } - if (status == BLE_STATUS_SUCCESS) - break; + num_erase_retries = 0; + while (num_erase_retries++ < MAX_ERASE_RETRIES) { + aci_updater_erase_sector(BASE_ADDRESS + i); + if ((i/SECTOR_SIZE) < (unsigned int)(number_sectors-1)) + data_size = DATA_SIZE; + else + data_size = MIN_WRITE_BLOCK_SIZE; + for (j=i; ((j<SECTOR_SIZE+i)&&(j<fw_size)); j += data_size) { + RETRY_COMMAND(aci_updater_program_data_block(BASE_ADDRESS+j, data_size, fw_image+j), MAX_WRITE_RETRIES, status); + if (status != BLE_STATUS_SUCCESS) + break; } - if (num_erase_retries == MAX_ERASE_RETRIES) - return BLE_UTIL_ACI_ERROR; + if (status == BLE_STATUS_SUCCESS) + break; + } + if (num_erase_retries == MAX_ERASE_RETRIES) + return BLE_UTIL_ACI_ERROR; } /***********************************************************************
--- a/BlueNRG_HCI/includes/bluenrg_aci_const.h Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/includes/bluenrg_aci_const.h Tue Oct 06 12:12:37 2015 +0200 @@ -115,14 +115,18 @@ #define OCF_GAP_SET_DISCOVERABLE 0x0083 #define OCF_GAP_SET_DIRECT_CONNECTABLE 0x0084 -typedef __packed struct _gap_set_direct_conectable_cp{ +typedef __packed struct _gap_set_direct_conectable_cp_IDB05A1{ uint8_t own_bdaddr_type; -#if BLUENRG_MS uint8_t directed_adv_type; -#endif uint8_t direct_bdaddr_type; tBDAddr direct_bdaddr; -} PACKED gap_set_direct_conectable_cp; +} PACKED gap_set_direct_conectable_cp_IDB05A1; + +typedef __packed struct _gap_set_direct_conectable_cp_IDB04A1{ + uint8_t own_bdaddr_type; + uint8_t direct_bdaddr_type; + tBDAddr direct_bdaddr; +} PACKED gap_set_direct_conectable_cp_IDB04A1; #define GAP_SET_DIRECT_CONNECTABLE_CP_SIZE 8 #define OCF_GAP_SET_IO_CAPABILITY 0x0085 @@ -166,23 +170,17 @@ #define GAP_AUTHORIZATION_RESPONSE_CP_SIZE 3 #define OCF_GAP_INIT 0x008A -#ifdef BLUENRG_MS -///@cond BLUENRG_MS -typedef __packed struct _gap_init_cp{ +typedef __packed struct _gap_init_cp_IDB05A1{ uint8_t role; uint8_t privacy_enabled; uint8_t device_name_char_len; -} PACKED gap_init_cp; -#define GAP_INIT_CP_SIZE 3 -///@endcond -#else -///@cond BLUENRG -typedef __packed struct _gap_init_cp{ +} PACKED gap_init_cp_IDB05A1; +#define GAP_INIT_CP_SIZE_IDB05A1 3 + +typedef __packed struct _gap_init_cp_IDB04A1{ uint8_t role; -} PACKED gap_init_cp; -#define GAP_INIT_CP_SIZE 1 -///@endcond -#endif +} PACKED gap_init_cp_IDB04A1; +#define GAP_INIT_CP_SIZE_IDB04A1 1 typedef __packed struct _gap_init_rp{ uint8_t status; uint16_t service_handle; @@ -192,14 +190,15 @@ #define GAP_INIT_RP_SIZE 7 #define OCF_GAP_SET_NON_CONNECTABLE 0x008B -typedef __packed struct _gap_set_non_connectable_cp{ +typedef __packed struct _gap_set_non_connectable_cp_IDB05A1{ uint8_t advertising_event_type; -#if BLUENRG_MS -///@cond BLUENRG_MS uint8_t own_address_type; -///@endcond #endif -} PACKED gap_set_non_connectable_cp; +} PACKED gap_set_non_connectable_cp_IDB05A1; + +typedef __packed struct _gap_set_non_connectable_cp_IDB04A1{ + uint8_t advertising_event_type; +} PACKED gap_set_non_connectable_cp_IDB04A1; #define OCF_GAP_SET_UNDIRECTED_CONNECTABLE 0x008C typedef __packed struct _gap_set_undirected_connectable_cp{ @@ -252,14 +251,10 @@ #define OCF_GAP_CLEAR_SECURITY_DB 0x0094 #define OCF_GAP_ALLOW_REBOND_DB 0x0095 -#if BLUENRG_MS -///@cond BLUENRG_MS - typedef __packed struct _gap_allow_rebond_cp{ + +typedef __packed struct _gap_allow_rebond_cp_IDB05A1{ uint16_t conn_handle; -} PACKED gap_allow_rebond_cp; -///@endcond -#endif - +} PACKED gap_allow_rebond_cp_IDB05A1; #define OCF_GAP_START_LIMITED_DISCOVERY_PROC 0x0096 typedef __packed struct _gap_start_limited_discovery_proc_cp{ @@ -298,19 +293,15 @@ #define OCF_GAP_START_AUTO_CONN_ESTABLISH_PROC 0x0099 #define OCF_GAP_START_GENERAL_CONN_ESTABLISH_PROC 0x009A -#if BLUENRG_MS -///@cond BLUENRG_MS -typedef __packed struct _gap_start_general_conn_establish_proc_cp{ +typedef __packed struct _gap_start_general_conn_establish_proc_cp_IDB05A1{ uint8_t scan_type; uint16_t scan_interval; uint16_t scan_window; uint8_t own_address_type; uint8_t filter_duplicates; -} PACKED gap_start_general_conn_establish_proc_cp; -///@endcond -#else -///@cond BLUENRG -typedef __packed struct _gap_start_general_conn_establish_proc_cp{ +} PACKED gap_start_general_conn_establish_proc_cp_IDB05A1; + +typedef __packed struct _gap_start_general_conn_establish_proc_cp_IDB04A1{ uint8_t scan_type; uint16_t scan_interval; uint16_t scan_window; @@ -318,9 +309,7 @@ uint8_t filter_duplicates; uint8_t use_reconn_addr; tBDAddr reconn_addr; -} PACKED gap_start_general_conn_establish_proc_cp; -///@endcond -#endif +} PACKED gap_start_general_conn_establish_proc_cp_IDB04A1; #define OCF_GAP_START_SELECTIVE_CONN_ESTABLISH_PROC 0x009B #define GAP_START_SELECTIVE_CONN_ESTABLISH_PROC_CP_SIZE 8 @@ -376,14 +365,10 @@ tBDAddr address; } PACKED gap_resolve_private_address_cp; #define GAP_RESOLVE_PRIVATE_ADDRESS_CP_SIZE 6 -#if BLUENRG_MS -///@cond BLUENRG_MS typedef __packed struct _gap_resolve_private_address_rp{ uint8_t status; tBDAddr address; } PACKED gap_resolve_private_address_rp; -///@endcond -#endif #define OCF_GAP_SET_BROADCAST_MODE 0x00A1 #define GAP_SET_BROADCAST_MODE_CP_SIZE 6 @@ -736,9 +721,7 @@ #define L2CAP_CONN_PARAM_UPDATE_REQ_CP_SIZE 10 #define OCF_L2CAP_CONN_PARAM_UPDATE_RESP 0x0182 -#if BLUENRG_MS -///@cond BLUENRG_MS -typedef __packed struct _l2cap_conn_param_update_resp_cp{ +typedef __packed struct _l2cap_conn_param_update_resp_cp_IDB05A1{ uint16_t conn_handle; uint16_t interval_min; uint16_t interval_max; @@ -748,11 +731,9 @@ uint16_t max_ce_length; uint8_t id; uint8_t accept; -} PACKED l2cap_conn_param_update_resp_cp; -///@endcond -#else -///@cond BLUENRG -typedef __packed struct _l2cap_conn_param_update_resp_cp{ +} PACKED l2cap_conn_param_update_resp_cp_IDB05A1; + +typedef __packed struct _l2cap_conn_param_update_resp_cp_IDB04A1{ uint16_t conn_handle; uint16_t interval_min; uint16_t interval_max; @@ -760,11 +741,7 @@ uint16_t timeout_multiplier; uint8_t id; uint8_t accept; -} PACKED l2cap_conn_param_update_resp_cp; -///@endcond -#endif - -#endif /* DOXYGEN_SHOULD_SKIP_THIS */ +} PACKED l2cap_conn_param_update_resp_cp_IDB04A1; /** * @defgroup BlueNRG_Events BlueNRG events (vendor specific)
--- a/BlueNRG_HCI/includes/bluenrg_gap.h Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/includes/bluenrg_gap.h Tue Oct 06 12:12:37 2015 +0200 @@ -185,21 +185,15 @@ * @name GAP Roles * @{ */ -#ifdef BLUENRG_MS -///@cond BLUENRG_MS -#define GAP_PERIPHERAL_ROLE (0x01) -#define GAP_BROADCASTER_ROLE (0x02) -#define GAP_CENTRAL_ROLE (0x04) -#define GAP_OBSERVER_ROLE (0x08) -///@endcond -#else -///@cond BLUENRG -#define GAP_PERIPHERAL_ROLE (0x01) -#define GAP_BROADCASTER_ROLE (0x02) -#define GAP_CENTRAL_ROLE (0x03) -#define GAP_OBSERVER_ROLE (0x04) -///@endcond -#endif +#define GAP_PERIPHERAL_ROLE_IDB05A1 (0x01) +#define GAP_BROADCASTER_ROLE_IDB05A1 (0x02) +#define GAP_CENTRAL_ROLE_IDB05A1 (0x04) +#define GAP_OBSERVER_ROLE_IDB05A1 (0x08) + +#define GAP_PERIPHERAL_ROLE_IDB04A1 (0x01) +#define GAP_BROADCASTER_ROLE_IDB04A1 (0x02) +#define GAP_CENTRAL_ROLE_IDB04A1 (0x03) +#define GAP_OBSERVER_ROLE_IDB04A1 (0x04) /** * @} */ @@ -218,11 +212,7 @@ #define GAP_GENERAL_CONNECTION_ESTABLISHMENT_PROC (0x10) #define GAP_SELECTIVE_CONNECTION_ESTABLISHMENT_PROC (0x20) #define GAP_DIRECT_CONNECTION_ESTABLISHMENT_PROC (0x40) -#if BLUENRG_MS -///@cond BLUENRG_MS -#define GAP_OBSERVATION_PROC (0x80) -///@endcond -#endif +#define GAP_OBSERVATION_PROC_IDB05A1 (0x80) /** * @} */
--- a/BlueNRG_HCI/includes/bluenrg_gap_aci.h Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/includes/bluenrg_gap_aci.h Tue Oct 06 12:12:37 2015 +0200 @@ -28,8 +28,6 @@ *@{ */ -#ifdef BLUENRG_MS -///@cond BLUENRG_MS /** * @brief Initialize the GAP layer. * @note Register the GAP service with the GATT. @@ -42,7 +40,7 @@ tBleStatus ret; uint16_t service_handle, dev_name_char_handle, appearance_char_handle; - ret = aci_gap_init(1, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle); + ret = aci_gap_init_IDB05A1(1, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle); if(ret){ PRINTF("GAP_Init failed.\n"); reboot(); @@ -61,14 +59,11 @@ * @param[out] appearance_char_handle Appearance Characteristic handle * @retval tBleStatus Value indicating success or error code. */ -tBleStatus aci_gap_init(uint8_t role, uint8_t privacy_enabled, +tBleStatus aci_gap_init_IDB05A1(uint8_t role, uint8_t privacy_enabled, uint8_t device_name_char_len, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle); -///@endcond -#else -///@cond BLUENRG /** * @brief Initialize the GAP layer. * @note Register the GAP service with the GATT. @@ -83,7 +78,7 @@ tBleStatus ret; uint16_t service_handle, dev_name_char_handle, appearance_char_handle; - ret = aci_gap_init(1, &service_handle, &dev_name_char_handle, &appearance_char_handle); + ret = aci_gap_init_IDB04A1(1, &service_handle, &dev_name_char_handle, &appearance_char_handle); if(ret){ PRINTF("GAP_Init failed.\n"); reboot(); @@ -100,12 +95,10 @@ * @param[out] appearance_char_handle Appearance Characteristic handle * @retval tBleStatus Value indicating success or error code. */ -tBleStatus aci_gap_init(uint8_t role, +tBleStatus aci_gap_init_IDB04A1(uint8_t role, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle); -///@endcond -#endif /** * @brief Set the Device in non-discoverable mode. @@ -300,8 +293,6 @@ const char *LocalName, uint8_t ServiceUUIDLen, uint8_t* ServiceUUIDList, uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax); -#if BLUENRG_MS -///@cond BLUENRG_MS /** * @brief Set the Device in direct connectable mode (as defined in GAP specification Volume 3, Section 9.3.3). * @note If the privacy is enabled, the reconnection address is used for advertising, otherwise the address @@ -317,7 +308,7 @@ * tBleStatus ret; * * const uint8_t central_address[] = {0x43,0x27,0x84,0xE1,0x80,0x02}; - * ret = aci_gap_set_direct_connectable(PUBLIC_ADDR, HIGH_DUTY_CYCLE_DIRECTED_ADV, PUBLIC_ADDR, central_address); + * ret = aci_gap_set_direct_connectable_IDB05A1(PUBLIC_ADDR, HIGH_DUTY_CYCLE_DIRECTED_ADV, PUBLIC_ADDR, central_address); * @endcode * * @@ -328,10 +319,7 @@ * @param InitiatorAddr Initiator's address (Little Endian). * @return Value indicating success or error code. */ -tBleStatus aci_gap_set_direct_connectable(uint8_t own_addr_type, uint8_t directed_adv_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr); -///@endcond -#else -///@cond BLUENRG +tBleStatus aci_gap_set_direct_connectable_IDB05A1(uint8_t own_addr_type, uint8_t directed_adv_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr); /** * @brief Set the Device in direct connectable mode (as defined in GAP specification Volume 3, Section 9.3.3). * @note If the privacy is enabled, the reconnection address is used for advertising, otherwise the address @@ -347,7 +335,7 @@ * tBleStatus ret; * * const uint8_t central_address = {0x43,0x27,0x84,0xE1,0x80,0x02}; - * ret = aci_gap_set_direct_connectable(PUBLIC_ADDR, PUBLIC_ADDR, central_address); + * ret = aci_gap_set_direct_connectable_IDB04A1(PUBLIC_ADDR, PUBLIC_ADDR, central_address); * @endcode * * @@ -357,9 +345,7 @@ * @param InitiatorAddr Initiator's address (Little Endian). * @return Value indicating success or error code. */ -tBleStatus aci_gap_set_direct_connectable(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr); -///@endcond -#endif +tBleStatus aci_gap_set_direct_connectable_IDB04A1(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr); /** * @brief Set the IO capabilities of the device. @@ -443,8 +429,6 @@ */ tBleStatus aci_gap_authorization_response(uint16_t conn_handle, uint8_t authorize); -#if BLUENRG_MS -///@cond BLUENRG_MS /** * @brief Put the device into non-connectable mode. * @param adv_type One of the allowed advertising types: @@ -458,10 +442,7 @@ * @arg @ref NON_RESOLVABLE_PRIVATE_ADDR * @return Value indicating success or error code. */ -tBleStatus aci_gap_set_non_connectable(uint8_t adv_type, uint8_t own_address_type); -///@endcond -#else -///@cond BLUENRG +tBleStatus aci_gap_set_non_connectable_IDB05A1(uint8_t adv_type, uint8_t own_address_type); /** * @brief Put the device into non-connectable mode. * @param adv_type One of the allowed advertising types: @@ -469,9 +450,7 @@ * @arg @ref ADV_NONCONN_IND : Non-connectable undirected advertising * @return Value indicating success or error code. */ -tBleStatus aci_gap_set_non_connectable(uint8_t adv_type); -///@endcond -#endif +tBleStatus aci_gap_set_non_connectable_IDB04A1(uint8_t adv_type); /** * @brief Put the device into undirected connectable mode. @@ -479,18 +458,16 @@ * as the advertiser's address. If not, the address of the type specified in own_addr_type * is used for advertising. * @param own_addr_type Type of our address used during advertising: - * @cond BLUENRG + * if BLUENRG (IDB04A1) * @arg @ref PUBLIC_ADDR. * @arg @ref STATIC_RANDOM_ADDR. - * @endcond - * @cond BLUENRG_MS + * else if BLUENRG_MS (IDB05A1) * If Privacy is disabled: * @arg @ref PUBLIC_ADDR. * @arg @ref STATIC_RANDOM_ADDR. * If Privacy is enabled: * @arg @ref RESOLVABLE_PRIVATE_ADDR * @arg @ref NON_RESOLVABLE_PRIVATE_ADDR - * @endcond * @param adv_filter_policy Filter policy: * @arg @ref NO_WHITE_LIST_USE * @arg @ref WHITE_LIST_FOR_ALL @@ -590,26 +567,19 @@ */ tBleStatus aci_gap_clear_security_database(void); -#if BLUENRG_MS -///@cond BLUENRG_MS /** * @brief Allows the security manager to complete the pairing procedure and re-bond with the master. * @note This command can be issued by the application if a @ref EVT_BLUE_GAP_BOND_LOST event is generated. * @param conn_handle * @return Value indicating success or error code. */ -tBleStatus aci_gap_allow_rebond(uint16_t conn_handle); -///@endcond -#else -///@cond BLUENRG +tBleStatus aci_gap_allow_rebond_IDB05A1(uint16_t conn_handle); /** * @brief Allows the security manager to complete the pairing procedure and re-bond with the master. * @note This command can be issued by the application if a @ref EVT_BLUE_GAP_BOND_LOST event is generated. * @return Value indicating success or error code. */ -tBleStatus aci_gap_allow_rebond(void); -///@endcond -#endif +tBleStatus aci_gap_allow_rebond_IDB04A1(void); /** * @brief Start the limited discovery procedure. @@ -670,8 +640,8 @@ /** * @brief Start the name discovery procedure. * @note A LE_Create_Connection call will be made to the controller by GAP with the initiator filter - * policy set to ignore whitelist and process connectable advertising packets only for the - * specified device. Once a connection is established, GATT procedure is started to read the + * policy set to Âignore whitelist and process connectable advertising packets only for the + * specified deviceÂ. Once a connection is established, GATT procedure is started to read the * device name characteristic. When the read is completed (successfully or unsuccessfully), * a @ref EVT_BLUE_GAP_PROCEDURE_COMPLETE event is given to the upper layer. The event also * contains the name of the device if the device name was read successfully. @@ -721,7 +691,7 @@ * @brief Start the auto connection establishment procedure. * @note The devices specified are added to the white list of the controller and a LE_Create_Connection * call will be made to the controller by GAP with the initiator filter policy set to - * use whitelist to determine which advertiser to connect to. When a command is issued to + * Âuse whitelist to determine which advertiser to connect toÂ. When a command is issued to * terminate the procedure by upper layer, a LE_Create_Connection_Cancel call will be made to the * controller by GAP. * The procedure is terminated when either a connection is successfully established with one of @@ -775,19 +745,14 @@ * @endcode * @return Value indicating success or error code. */ -#if BLUENRG_MS -///@cond BLUENRG_MS - tBleStatus aci_gap_start_auto_conn_establish_proc(uint16_t scanInterval, uint16_t scanWindow, +tBleStatus aci_gap_start_auto_conn_establish_proc_IDB05A1(uint16_t scanInterval, uint16_t scanWindow, uint8_t own_bdaddr_type, uint16_t conn_min_interval, uint16_t conn_max_interval, uint16_t conn_latency, uint16_t supervision_timeout, uint16_t min_conn_length, uint16_t max_conn_length, uint8_t num_whitelist_entries, const uint8_t *addr_array); -///@endcond -#else -///@cond BLUENRG -tBleStatus aci_gap_start_auto_conn_establish_proc(uint16_t scanInterval, uint16_t scanWindow, +tBleStatus aci_gap_start_auto_conn_establish_proc_IDB04A1(uint16_t scanInterval, uint16_t scanWindow, uint8_t own_bdaddr_type, uint16_t conn_min_interval, uint16_t conn_max_interval, uint16_t conn_latency, uint16_t supervision_timeout, uint16_t min_conn_length, @@ -796,13 +761,11 @@ const tBDAddr reconn_addr, uint8_t num_whitelist_entries, const uint8_t *addr_array); -///@endcond -#endif /** * @brief Start a general connection establishment procedure. * @note The host enables scanning in the controller with the scanner filter policy set - * to accept all advertising packets and from the scanning results all the devices + * to Âaccept all advertising packets and from the scanning results all the devices * are sent to the upper layer using the event @ref EVT_BLUE_GAP_DEVICE_FOUND. * The upper layer then has to select one of the devices to which it wants to connect * by issuing the command aci_gap_create_connection(). The procedure is terminated @@ -832,23 +795,16 @@ * * @return Value indicating success or error code. */ -#if BLUENRG_MS -///@cond BLUENRG_MS -tBleStatus aci_gap_start_general_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, +tBleStatus aci_gap_start_general_conn_establish_proc_IDB05A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, uint8_t own_address_type, uint8_t filter_duplicates); -///@endcond -#else -///@cond BLUENRG -tBleStatus aci_gap_start_general_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, +tBleStatus aci_gap_start_general_conn_establish_proc_IDB04A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, uint8_t own_address_type, uint8_t filter_duplicates, uint8_t use_reconn_addr, const tBDAddr reconn_addr); -///@endcond -#endif /** * @brief Start a selective connection establishment procedure. * @note The GAP adds the specified device addresses into white list and enables scanning in - * the controller with the scanner filter policy set to accept packets only from - * devices in whitelist. All the devices found are sent to the upper layer by the + * the controller with the scanner filter policy set to Âaccept packets only from + * devices in whitelistÂ. All the devices found are sent to the upper layer by the * event @ref EVT_BLUE_GAP_DEVICE_FOUND. The upper layer then has to select one of the * devices to which it wants to connect by issuing the command aci_gap_create_connection(). * On completion of the procedure a @ref EVT_BLUE_GAP_PROCEDURE_COMPLETE event is generated @@ -887,8 +843,8 @@ /** * @brief Start the direct connection establishment procedure. * @note A LE_Create_Connection call will be made to the controller by GAP with the initiator filter - * policy set to ignore whitelist and process connectable advertising packets only for the - * specified device. The procedure can be terminated explicitly by the upper layer by issuing + * policy set to Âignore whitelist and process connectable advertising packets only for the + * specified deviceÂ. The procedure can be terminated explicitly by the upper layer by issuing * the command aci_gap_terminate_gap_procedure(). When a command is issued to terminate the * procedure by upper layer, a LE_Create_Connection_Cancel call will be made to the controller * by GAP. @@ -1000,20 +956,20 @@ * the address is resolved successfully with any one of the IRKs present in the database, it * returns success. * @param address Address to be resolved. - * @cond BLUENRG_MS * @param[in] actual_address The public or static random address of the peer device, distributed during pairing phase. - * @endcond * @return Value indicating success or error code. */ -#if BLUENRG_MS -///@cond BLUENRG_MS -tBleStatus aci_gap_resolve_private_address(const tBDAddr private_address, tBDAddr actual_address); -///@endcond -#else -///@cond BLUENRG -tBleStatus aci_gap_resolve_private_address(const tBDAddr private_address); -///@endcond -#endif +tBleStatus aci_gap_resolve_private_address_IDB05A1(const tBDAddr private_address, tBDAddr actual_address); + +/** + * @brief Resolve a private address. + * @note This command tries to resolve the address provided with the IRKs present in its database. If + * the address is resolved successfully with any one of the IRKs present in the database, it + * returns success. + * @param address Address to be resolved. + * @return Value indicating success or error code. + */ +tBleStatus aci_gap_resolve_private_address_IDB04A1(const tBDAddr private_address); /** * @brief This command gets the list of bonded devices. @@ -1039,8 +995,6 @@ */ tBleStatus aci_gap_get_bonded_devices(uint8_t *num_devices, uint8_t *device_list, uint8_t device_list_size); -#if BLUENRG_MS -///@cond BLUENRG_MS /** * @brief Puts the device into broadcast mode * @note A privacy enabled device uses either a resolvable private address or a non-resolvable private address @@ -1074,7 +1028,7 @@ * @endcode * @return Value indicating success or error code. */ -tBleStatus aci_gap_set_broadcast_mode(uint16_t adv_interv_min, uint16_t adv_interv_max, uint8_t adv_type, +tBleStatus aci_gap_set_broadcast_mode_IDB05A1(uint16_t adv_interv_min, uint16_t adv_interv_max, uint8_t adv_type, uint8_t own_addr_type, uint8_t adv_data_length, const uint8_t *adv_data, uint8_t num_whitelist_entries, const uint8_t *addr_array); @@ -1101,7 +1055,7 @@ * @arg 0x01: Filter duplicates * @return Value indicating success or error code. */ -tBleStatus aci_gap_start_observation_procedure(uint16_t scan_interval, uint16_t scan_window, uint8_t scan_type, +tBleStatus aci_gap_start_observation_procedure_IDB05A1(uint16_t scan_interval, uint16_t scan_window, uint8_t scan_type, uint8_t own_address_type, uint8_t filter_duplicates); /** @@ -1114,9 +1068,7 @@ * @param peer_address Address used by the peer device while advertising. * @return Value indicating success or error code. */ -tBleStatus aci_gap_is_device_bonded(uint8_t peer_address_type, const tBDAddr peer_address); -///@endcond -#endif +tBleStatus aci_gap_is_device_bonded_IDB05A1(uint8_t peer_address_type, const tBDAddr peer_address); /** @@ -1226,19 +1178,14 @@ uint8_t data[VARIABLE_SIZE]; } PACKED evt_gap_procedure_complete; -#if BLUENRG_MS -///@cond BLUENRG_MS /** * This event is sent only by a privacy enabled Peripheral. The event is sent to the upper layers when the peripheral * is not able to resolve the private address of the peer device after connecting to it. */ -#define EVT_BLUE_GAP_ADDR_NOT_RESOLVED (0x0408) -typedef __packed struct _evt_gap_addr_not_resolved{ +#define EVT_BLUE_GAP_ADDR_NOT_RESOLVED_IDB05A1 (0x0408) +typedef __packed struct _evt_gap_addr_not_resolved_IDB05A1{ uint16_t conn_handle; /**< Connection handle for which the private address could not be resolved with any of the stored IRK's. */ -} PACKED evt_gap_addr_not_resolved; -///@endcond -#else -///@cond BLUENRG +} PACKED evt_gap_addr_not_resolved_IDB05A1; /** * This event is raised when the reconnection address is generated during the general connection * establishment procedure. The same address is set into the peer device also as a part of the general @@ -1247,12 +1194,10 @@ * as its own address as well as the peer address to which it wants to connect. See aci_gap_start_general_conn_establish_proc() * and aci_gap_start_auto_conn_establish_proc(). */ -#define EVT_BLUE_GAP_RECONNECTION_ADDRESS (0x0408) -typedef __packed struct _evt_gap_reconnection_addr{ +#define EVT_BLUE_GAP_RECONNECTION_ADDRESS_IDB04A1 (0x0408) +typedef __packed struct _evt_gap_reconnection_addr_IDB04A1{ uint8_t reconnection_address[6]; /**< 6 bytes of reconnection address that has been generated */ -} PACKED evt_gap_reconnection_addr; -///@endcond -#endif +} PACKED evt_gap_reconnection_addr_IDB04A1; /** * @}
--- a/BlueNRG_HCI/includes/bluenrg_gatt_aci.h Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/includes/bluenrg_gatt_aci.h Tue Oct 06 12:12:37 2015 +0200 @@ -719,8 +719,6 @@ */ tBleStatus aci_gatt_read_handle_value(uint16_t attr_handle, uint16_t data_len, uint16_t *data_len_out_p, uint8_t *data); -#if BLUENRG_MS -///@cond BLUENRG_MS /** * @brief Reads the value of the attribute handle specified from the local GATT database, starting from a given offset. * @param attr_handle Handle of the attribute to read @@ -733,9 +731,7 @@ * attribute (in data_len_out_p). * @return Value indicating success or error code. */ -tBleStatus aci_gatt_read_handle_value_offset(uint16_t attr_handle, uint8_t offset, uint16_t data_len, uint16_t *data_len_out_p, uint8_t *data); -///@endcond -#endif +tBleStatus aci_gatt_read_handle_value_offset_IDB05A1(uint16_t attr_handle, uint8_t offset, uint16_t data_len, uint16_t *data_len_out_p, uint8_t *data); /** * @} @@ -750,20 +746,24 @@ /** * This event is raised to the application by the GATT server when a client modifies any attribute on the server, - * if event is enabled (see @ref Gatt_Event_Mask "Gatt Event Mask"). See @ref _evt_gatt_attr_modified. + * if event is enabled (see @ref Gatt_Event_Mask "Gatt Event Mask"). + * See @ref _evt_gatt_attr_modified_IDB04A1 or @ref _evt_gatt_attr_modified__IDB05A1. */ #define EVT_BLUE_GATT_ATTRIBUTE_MODIFIED (0x0C01) -typedef __packed struct _evt_gatt_attr_modified{ +typedef __packed struct _evt_gatt_attr_modified_IDB05A1{ uint16_t conn_handle; /**< The connection handle which modified the attribute. */ uint16_t attr_handle; /**< Handle of the attribute that was modified. */ uint8_t data_length; /**< The length of the data */ -#if BLUENRG_MS -///@cond BLUENRG_MS uint16_t offset; /**< Offset from which the write has been performed by the peer device */ -///@endcond -#endif uint8_t att_data[VARIABLE_SIZE]; /**< The new value (length is data_length) */ -} PACKED evt_gatt_attr_modified; +} PACKED evt_gatt_attr_modified_IDB05A1; + +typedef __packed struct _evt_gatt_attr_modified_IDB04A1{ + uint16_t conn_handle; /**< The connection handle which modified the attribute. */ + uint16_t attr_handle; /**< Handle of the attribute that was modified. */ + uint8_t data_length; /**< The length of the data */ + uint8_t att_data[VARIABLE_SIZE]; /**< The new value (length is data_length) */ +} PACKED evt_gatt_attr_modified_IDB04A1; /** * This event is generated by the client/server to the application on a GATT timeout (30 seconds).
--- a/BlueNRG_HCI/includes/bluenrg_l2cap_aci.h Thu Sep 17 10:32:34 2015 +0200 +++ b/BlueNRG_HCI/includes/bluenrg_l2cap_aci.h Tue Oct 06 12:12:37 2015 +0200 @@ -54,33 +54,38 @@ * @param interval_max The maximum connection interval parameter as received in the l2cap connection update request event. * @param slave_latency The slave latency parameter as received in the l2cap connection update request event. * @param timeout_multiplier The supervision connection timeout parameter as received in the l2cap connection update request event. - * @cond BLUENRG_MS * @param min_ce_length Minimum length of connection event needed for the LE connection.\n * Range: 0x0000 - 0xFFFF\n * Time = N x 0.625 msec. * @param max_ce_length Maximum length of connection event needed for the LE connection.\n * Range: 0x0000 - 0xFFFF\n * Time = N x 0.625 msec. - * @endcond * @param id Identifier received in @ref EVT_BLUE_L2CAP_CONN_UPD_REQ event. * @param accept @arg 0x00: The connection update parameters are not acceptable. * @arg 0x01: The connection update parameters are acceptable. * @return Value indicating success or error code. */ -#if BLUENRG_MS -///@cond BLUENRG_MS -tBleStatus aci_l2cap_connection_parameter_update_response(uint16_t conn_handle, uint16_t interval_min, +tBleStatus aci_l2cap_connection_parameter_update_response_IDB05A1(uint16_t conn_handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier, uint16_t min_ce_length, uint16_t max_ce_length, uint8_t id, uint8_t accept); -///@endcond -#else -///@cond BLUENRG -tBleStatus aci_l2cap_connection_parameter_update_response(uint16_t conn_handle, uint16_t interval_min, + /** + * @brief Accept or reject a connection update. + * @note This command should be sent in response to a @ref EVT_BLUE_L2CAP_CONN_UPD_REQ event from the controller. + * The accept parameter has to be set if the connection parameters given in the event are acceptable. + * @param conn_handle Handle received in @ref EVT_BLUE_L2CAP_CONN_UPD_REQ event. + * @param interval_min The connection interval parameter as received in the l2cap connection update request event + * @param interval_max The maximum connection interval parameter as received in the l2cap connection update request event. + * @param slave_latency The slave latency parameter as received in the l2cap connection update request event. + * @param timeout_multiplier The supervision connection timeout parameter as received in the l2cap connection update request event. + * @param id Identifier received in @ref EVT_BLUE_L2CAP_CONN_UPD_REQ event. + * @param accept @arg 0x00: The connection update parameters are not acceptable. + * @arg 0x01: The connection update parameters are acceptable. + * @return Value indicating success or error code. + */ +tBleStatus aci_l2cap_connection_parameter_update_response_IDB04A1(uint16_t conn_handle, uint16_t interval_min, uint16_t interval_max, uint16_t slave_latency, uint16_t timeout_multiplier, uint8_t id, uint8_t accept); -///@endcond -#endif /** * @}
--- a/platform/src/btle.cpp Thu Sep 17 10:32:34 2015 +0200 +++ b/platform/src/btle.cpp Tue Oct 06 12:12:37 2015 +0200 @@ -55,6 +55,7 @@ #include "bluenrg_aci.h" #include "bluenrg_hal_aci.h" #include "bluenrg_gap.h" +#include "bluenrg_utils.h" #include "hal_types.h" #include "hal.h" @@ -67,6 +68,8 @@ } #endif +#define IDB04A1 0 +#define IDB05A1 1 // static void btle_handler(/*ble_evt_t * p_ble_evt*/); void HCI_Input(tHciDataPacket * hciReadPacket); @@ -81,6 +84,8 @@ /* Private variables ---------------------------------------------------------*/ volatile uint8_t set_connectable = 1; // ANDREA +uint8_t bnrg_expansion_board = IDB04A1; /* at startup, suppose the X-NUCLEO-IDB04A1 is used */ + Gap::Address_t bleAddr; Gap::AddressType_t addr_type = Gap::ADDR_TYPE_PUBLIC; @@ -99,6 +104,8 @@ DEBUG("btle_init>>\n\r"); int ret; + uint8_t hwVersion; + uint16_t fwVersion; uint16_t service_handle, dev_name_char_handle, appearance_char_handle; /* Delay needed only to be able to acces the JTAG interface after reset @@ -111,6 +118,21 @@ /* Reset BlueNRG SPI interface */ BlueNRG_RST(); + /* get the BlueNRG HW and FW versions */ + getBlueNRGVersion(&hwVersion, &fwVersion); + + /* + * Reset BlueNRG again otherwise we won't + * be able to change its MAC address. + * aci_hal_write_config_data() must be the first + * command after reset otherwise it will fail. + */ + BlueNRG_RST(); + + if (hwVersion > 0x30) { /* X-NUCLEO-IDB05A1 expansion board is used */ + bnrg_expansion_board = IDB05A1; + } + /* The Nucleo board must be configured as SERVER */ //check if isSetAddress is set than set address. // ANDREA @@ -139,11 +161,12 @@ PRINTF("GATT_Init failed.\n"); } //GAP is always in PERIPHERAL _ROLE as mbed does not support Master role at the moment -#ifdef BLUENRG_MS - ret = aci_gap_init(GAP_PERIPHERAL_ROLE, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle); -#else - ret = aci_gap_init(GAP_PERIPHERAL_ROLE, &service_handle, &dev_name_char_handle, &appearance_char_handle); -#endif + if (bnrg_expansion_board == IDB05A1) { + ret = aci_gap_init_IDB05A1(GAP_PERIPHERAL_ROLE_IDB05A1, 0, 0x07, &service_handle, &dev_name_char_handle, &appearance_char_handle); + } else { + ret = aci_gap_init_IDB04A1(GAP_PERIPHERAL_ROLE_IDB04A1, &service_handle, &dev_name_char_handle, &appearance_char_handle); + } + if(ret != BLE_STATUS_SUCCESS){ PRINTF("GAP_Init failed.\n"); } @@ -228,6 +251,65 @@ //HAL_GPIO_EXTI_Callback_Poll(BNRG_SPI_EXTI_PIN); return; } + +void Attribute_Modified_CB(uint16_t attr_handle, uint8_t data_length, uint8_t *att_data, uint8_t offset) +{ + //Extract the GattCharacteristic from p_characteristics[] and find the properties mask + GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(attr_handle); + if(p_char!=NULL) { + GattAttribute::Handle_t charHandle = p_char->getValueAttribute().getHandle(); + BlueNRGGattServer::HandleEnum_t currentHandle = BlueNRGGattServer::CHAR_HANDLE; + DEBUG("CharHandle %d, length: %d, Data: %d\n\r", charHandle, data_length, (uint16_t)att_data[0]); + DEBUG("getProperties 0x%x\n\r",p_char->getProperties()); + if(attr_handle == charHandle+CHAR_VALUE_OFFSET) { + currentHandle = BlueNRGGattServer::CHAR_VALUE_HANDLE; + } + + if(attr_handle == charHandle+CHAR_DESC_OFFSET) { + currentHandle = BlueNRGGattServer::CHAR_DESC_HANDLE; + } + DEBUG("currentHandle %d\n\r", currentHandle); + if((p_char->getProperties() & + (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) && + currentHandle == BlueNRGGattServer::CHAR_DESC_HANDLE) { + + DEBUG("*****NOTIFICATION CASE\n\r"); + //Now Check if data written in Enable or Disable + if((uint16_t)att_data[0]==1) { + //DEBUG("Notify ENABLED\n\r"); + BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_ENABLED, p_char->getValueAttribute().getHandle()); + } else { + //DEBUG("Notify DISABLED\n\r"); + BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_DISABLED, p_char->getValueAttribute().getHandle()); + } + } + + //Check is attr handle property is WRITEABLE, if yes, generate GATT_EVENT_DATA_WRITTEN Event + if((p_char->getProperties() & + (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE)) && + currentHandle == BlueNRGGattServer::CHAR_VALUE_HANDLE) { + + DEBUG("*****WRITE CASE\n\r"); + + GattWriteCallbackParams writeParams; + writeParams.handle = p_char->getValueAttribute().getHandle(); + writeParams.writeOp = GattWriteCallbackParams::OP_WRITE_REQ;//Where to find this property in BLUENRG? + writeParams.len = data_length; + writeParams.data = att_data; + if (bnrg_expansion_board == IDB05A1) { + writeParams.offset = offset; + } + BlueNRGGattServer::getInstance().HCIDataWrittenEvent(&writeParams); + + //BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_WRITTEN, evt->attr_handle); + //Write the actual Data to the Attr Handle? (uint8_1[])att_data contains the data + if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) { + BlueNRGGattServer::getInstance().write(p_char->getValueAttribute().getHandle(), (uint8_t*)att_data, data_length, false); + } + } + } + +} #ifdef __cplusplus extern "C" { @@ -244,7 +326,6 @@ */ /**************************************************************************/ extern void HCI_Event_CB(void *pckt) { - hci_uart_pckt *hci_pckt = (hci_uart_pckt*)pckt; hci_event_pckt *event_pckt = (hci_event_pckt*)hci_pckt->data; @@ -319,67 +400,15 @@ case EVT_BLUE_GATT_ATTRIBUTE_MODIFIED: { + DEBUG("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED\n\r"); /* this callback is invoked when a GATT attribute is modified extract callback data and pass to suitable handler function */ - evt_gatt_attr_modified *evt = (evt_gatt_attr_modified*)blue_evt->data; - DEBUG("EVT_BLUE_GATT_ATTRIBUTE_MODIFIED\n\r"); - - //Extract the GattCharacteristic from p_characteristics[] and find the properties mask - GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(evt->attr_handle); - if(p_char!=NULL) { - GattAttribute::Handle_t charHandle = p_char->getValueAttribute().getHandle(); - BlueNRGGattServer::HandleEnum_t currentHandle = BlueNRGGattServer::CHAR_HANDLE; - DEBUG("CharHandle %d, length: %d, Data: %d\n\r",charHandle, evt->data_length, (uint16_t)evt->att_data[0]); - DEBUG("getProperties 0x%x\n\r",p_char->getProperties()); - if(evt->attr_handle == charHandle+CHAR_VALUE_OFFSET) { - currentHandle = BlueNRGGattServer::CHAR_VALUE_HANDLE; - } - if(evt->attr_handle == charHandle+CHAR_DESC_OFFSET) { - currentHandle = BlueNRGGattServer::CHAR_DESC_HANDLE; - } - DEBUG("currentHandle %d\n\r", currentHandle); - if((p_char->getProperties() & - (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) && - currentHandle == BlueNRGGattServer::CHAR_DESC_HANDLE) { - - DEBUG("*****NOTIFICATION CASE\n\r"); - //Now Check if data written in Enable or Disable - if((uint16_t)evt->att_data[0]==1) { - //DEBUG("Notify ENABLED\n\r"); - BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_ENABLED, p_char->getValueAttribute().getHandle()); - } - else { - //DEBUG("Notify DISABLED\n\r"); - BlueNRGGattServer::getInstance().HCIEvent(GattServerEvents::GATT_EVENT_UPDATES_DISABLED, p_char->getValueAttribute().getHandle()); - } - } - - //Check is attr handle property is WRITEABLE, if yes, generate GATT_EVENT_DATA_WRITTEN Event - if((p_char->getProperties() & - (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE)) && - currentHandle == BlueNRGGattServer::CHAR_VALUE_HANDLE) { - - DEBUG("*****WRITE CASE\n\r"); - - GattWriteCallbackParams writeParams; - writeParams.handle=p_char->getValueAttribute().getHandle(); - writeParams.writeOp=GattWriteCallbackParams::OP_WRITE_REQ;//Where to find this property in BLUENRG? - writeParams.len=evt->data_length; - writeParams.data=evt->att_data; - #ifdef BLUENRG_MS - writeParams.offset=evt->offset;//Not used in BlueNRG? - #endif - BlueNRGGattServer::getInstance().HCIDataWrittenEvent(&writeParams); - - //BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_WRITTEN, evt->attr_handle); - //Write the actual Data to the Attr Handle? (uint8_1[])evt->att_data contains the data - if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) { - BlueNRGGattServer::getInstance().write(p_char->getValueAttribute().getHandle(), - (uint8_t*)evt->att_data, - evt->data_length, - false /* localOnly */); - } - } + if (bnrg_expansion_board == IDB05A1) { + evt_gatt_attr_modified_IDB05A1 *evt = (evt_gatt_attr_modified_IDB05A1*)blue_evt->data; + Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data, evt->offset); + } else { + evt_gatt_attr_modified_IDB04A1 *evt = (evt_gatt_attr_modified_IDB04A1*)blue_evt->data; + Attribute_Modified_CB(evt->attr_handle, evt->data_length, evt->att_data, 0); } } break;