|
@ -9,11 +9,11 @@ |
|
|
#define ZDATACHANNEL_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */ |
|
|
#define ZDATACHANNEL_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */ |
|
|
#define ZDATACHANNEL_TX_CHARACTERISTIC 0x0003 /**< The UUID of the TX Characteristic. */ |
|
|
#define ZDATACHANNEL_TX_CHARACTERISTIC 0x0003 /**< The UUID of the TX Characteristic. */ |
|
|
#define ZDATACHANNEL_RX_CHARACTERISTIC 0x0002 /**< The UUID of the RX Characteristic. */ |
|
|
#define ZDATACHANNEL_RX_CHARACTERISTIC 0x0002 /**< The UUID of the RX Characteristic. */ |
|
|
#define ZDATACHANNEL_DATABLOCK_TX_CHARACTERISTIC 0x0004 /**< The UUID of the RX Characteristic. */ |
|
|
|
|
|
|
|
|
// #define ZDATACHANNEL_DATABLOCK_TX_CHARACTERISTIC 0x0004 /**< The UUID of the RX Characteristic. */ |
|
|
|
|
|
|
|
|
#define ZDATACHANNEL_MAX_RX_CHAR_LEN ZDATACHANNEL_MAX_DATA_LEN /**< Maximum length of the RX Characteristic (in bytes). */ |
|
|
#define ZDATACHANNEL_MAX_RX_CHAR_LEN ZDATACHANNEL_MAX_DATA_LEN /**< Maximum length of the RX Characteristic (in bytes). */ |
|
|
#define ZDATACHANNEL_MAX_TX_CHAR_LEN ZDATACHANNEL_MAX_DATA_LEN /**< Maximum length of the TX Characteristic (in bytes). */ |
|
|
#define ZDATACHANNEL_MAX_TX_CHAR_LEN ZDATACHANNEL_MAX_DATA_LEN /**< Maximum length of the TX Characteristic (in bytes). */ |
|
|
#define ZDATACHANNEL_DATABLOCK_TX_CHAR_LEN ZDATACHANNEL_MAX_DATA_LEN /**< Maximum length of the TX Characteristic (in bytes). */ |
|
|
|
|
|
|
|
|
// #define ZDATACHANNEL_DATABLOCK_TX_CHAR_LEN ZDATACHANNEL_MAX_DATA_LEN /**< Maximum length of the TX Characteristic (in bytes). */ |
|
|
|
|
|
|
|
|
#define NUS_BASE_UUID \ |
|
|
#define NUS_BASE_UUID \ |
|
|
{ \ |
|
|
{ \ |
|
@ -57,13 +57,16 @@ static void on_write(zdatachannel_t *p_nus, ble_evt_t const *p_ble_evt) { |
|
|
} else { |
|
|
} else { |
|
|
p_nus->cmd_tx_channel_is_notification_enabled = false; |
|
|
p_nus->cmd_tx_channel_is_notification_enabled = false; |
|
|
} |
|
|
} |
|
|
} else if ((p_evt_write->handle == p_nus->datablock_tx_handles.cccd_handle) && (p_evt_write->len == 2)) { |
|
|
|
|
|
if (ble_srv_is_notification_enabled(p_evt_write->data)) { |
|
|
|
|
|
p_nus->datablock_tx_channel_is_notification_enabled = true; |
|
|
|
|
|
} else { |
|
|
|
|
|
p_nus->datablock_tx_channel_is_notification_enabled = false; |
|
|
|
|
|
} |
|
|
|
|
|
} else if ((p_evt_write->handle == p_nus->cmd_rx_handles.value_handle) && (p_nus->data_handler != NULL)) { |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
// else if ((p_evt_write->handle == p_nus->datablock_tx_handles.cccd_handle) && (p_evt_write->len == 2)) { |
|
|
|
|
|
// if (ble_srv_is_notification_enabled(p_evt_write->data)) { |
|
|
|
|
|
// p_nus->datablock_tx_channel_is_notification_enabled = true; |
|
|
|
|
|
// } else { |
|
|
|
|
|
// p_nus->datablock_tx_channel_is_notification_enabled = false; |
|
|
|
|
|
// } |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
else if ((p_evt_write->handle == p_nus->cmd_rx_handles.value_handle) && (p_nus->data_handler != NULL)) { |
|
|
evt.type = ZDATACHANNEL_EVT_RX_DATA; |
|
|
evt.type = ZDATACHANNEL_EVT_RX_DATA; |
|
|
evt.params.rx_data.p_data = p_evt_write->data; |
|
|
evt.params.rx_data.p_data = p_evt_write->data; |
|
|
evt.params.rx_data.length = p_evt_write->len; |
|
|
evt.params.rx_data.length = p_evt_write->len; |
|
@ -165,21 +168,21 @@ uint32_t zdatachannel_init(zdatachannel_t *p_nus, zdatachannel_init_t const *p_n |
|
|
|
|
|
|
|
|
VERIFY_SUCCESS(characteristic_add(p_nus->service_handle, &add_char_params, &p_nus->cmd_tx_handles)); |
|
|
VERIFY_SUCCESS(characteristic_add(p_nus->service_handle, &add_char_params, &p_nus->cmd_tx_handles)); |
|
|
|
|
|
|
|
|
// Add the TX Characteristic. |
|
|
|
|
|
/**@snippet [Adding proprietary characteristic to the SoftDevice] */ |
|
|
|
|
|
memset(&add_char_params, 0, sizeof(add_char_params)); |
|
|
|
|
|
add_char_params.uuid = ZDATACHANNEL_DATABLOCK_TX_CHARACTERISTIC; |
|
|
|
|
|
add_char_params.uuid_type = p_nus->uuid_type; |
|
|
|
|
|
add_char_params.max_len = ZDATACHANNEL_DATABLOCK_TX_CHAR_LEN; |
|
|
|
|
|
add_char_params.init_len = sizeof(uint8_t); |
|
|
|
|
|
add_char_params.is_var_len = true; |
|
|
|
|
|
add_char_params.char_props.notify = 1; |
|
|
|
|
|
|
|
|
// // Add the TX Characteristic. |
|
|
|
|
|
// /**@snippet [Adding proprietary characteristic to the SoftDevice] */ |
|
|
|
|
|
// memset(&add_char_params, 0, sizeof(add_char_params)); |
|
|
|
|
|
// add_char_params.uuid = ZDATACHANNEL_DATABLOCK_TX_CHARACTERISTIC; |
|
|
|
|
|
// add_char_params.uuid_type = p_nus->uuid_type; |
|
|
|
|
|
// add_char_params.max_len = ZDATACHANNEL_DATABLOCK_TX_CHAR_LEN; |
|
|
|
|
|
// add_char_params.init_len = sizeof(uint8_t); |
|
|
|
|
|
// add_char_params.is_var_len = true; |
|
|
|
|
|
// add_char_params.char_props.notify = 1; |
|
|
|
|
|
|
|
|
add_char_params.read_access = SEC_OPEN; |
|
|
|
|
|
add_char_params.write_access = SEC_OPEN; |
|
|
|
|
|
add_char_params.cccd_write_access = SEC_OPEN; |
|
|
|
|
|
|
|
|
// add_char_params.read_access = SEC_OPEN; |
|
|
|
|
|
// add_char_params.write_access = SEC_OPEN; |
|
|
|
|
|
// add_char_params.cccd_write_access = SEC_OPEN; |
|
|
|
|
|
|
|
|
VERIFY_SUCCESS(characteristic_add(p_nus->service_handle, &add_char_params, &p_nus->datablock_tx_handles)); |
|
|
|
|
|
|
|
|
// VERIFY_SUCCESS(characteristic_add(p_nus->service_handle, &add_char_params, &p_nus->datablock_tx_handles)); |
|
|
|
|
|
|
|
|
return NRF_SUCCESS; |
|
|
return NRF_SUCCESS; |
|
|
/**@snippet [Adding proprietary characteristic to the SoftDevice] */ |
|
|
/**@snippet [Adding proprietary characteristic to the SoftDevice] */ |
|
@ -210,25 +213,25 @@ uint32_t zdatachannel_data_send(uint8_t *p_data, uint16_t *p_length) { |
|
|
return sd_ble_gatts_hvx(p_datachannel->conn_handle, &hvx_params); |
|
|
return sd_ble_gatts_hvx(p_datachannel->conn_handle, &hvx_params); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
uint32_t zdatachannel_block_data_send(uint8_t *p_data, uint16_t *p_length) { |
|
|
|
|
|
ble_gatts_hvx_params_t hvx_params; |
|
|
|
|
|
|
|
|
// uint32_t zdatachannel_block_data_send(uint8_t *p_data, uint16_t *p_length) { |
|
|
|
|
|
// ble_gatts_hvx_params_t hvx_params; |
|
|
|
|
|
|
|
|
if (!p_datachannel->datablock_tx_channel_is_notification_enabled) { |
|
|
|
|
|
return NRF_ERROR_INVALID_STATE; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// if (!p_datachannel->datablock_tx_channel_is_notification_enabled) { |
|
|
|
|
|
// return NRF_ERROR_INVALID_STATE; |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
if (*p_length > ZDATACHANNEL_MAX_DATA_LEN) { |
|
|
|
|
|
return NRF_ERROR_INVALID_PARAM; |
|
|
|
|
|
} |
|
|
|
|
|
memset(&hvx_params, 0, sizeof(hvx_params)); |
|
|
|
|
|
|
|
|
// if (*p_length > ZDATACHANNEL_MAX_DATA_LEN) { |
|
|
|
|
|
// return NRF_ERROR_INVALID_PARAM; |
|
|
|
|
|
// } |
|
|
|
|
|
// memset(&hvx_params, 0, sizeof(hvx_params)); |
|
|
|
|
|
|
|
|
hvx_params.handle = p_datachannel->datablock_tx_handles.value_handle; |
|
|
|
|
|
hvx_params.p_data = p_data; |
|
|
|
|
|
hvx_params.p_len = p_length; |
|
|
|
|
|
hvx_params.type = BLE_GATT_HVX_NOTIFICATION; |
|
|
|
|
|
|
|
|
// hvx_params.handle = p_datachannel->datablock_tx_handles.value_handle; |
|
|
|
|
|
// hvx_params.p_data = p_data; |
|
|
|
|
|
// hvx_params.p_len = p_length; |
|
|
|
|
|
// hvx_params.type = BLE_GATT_HVX_NOTIFICATION; |
|
|
|
|
|
|
|
|
return sd_ble_gatts_hvx(p_datachannel->conn_handle, &hvx_params); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// return sd_ble_gatts_hvx(p_datachannel->conn_handle, &hvx_params); |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
uint32_t zdatachannel_last_rx_data_haspassed_s() { // |
|
|
uint32_t zdatachannel_last_rx_data_haspassed_s() { // |
|
|
uint32_t now = znordic_getpower_on_s(); |
|
|
uint32_t now = znordic_getpower_on_s(); |
|
|