diff --git a/.vscode/c_cpp_properties.app.json b/.vscode/c_cpp_properties.app.json
new file mode 100644
index 0000000..79227f7
--- /dev/null
+++ b/.vscode/c_cpp_properties.app.json
@@ -0,0 +1,241 @@
+{
+ "configurations": [
+ {
+ "name": "nrf52833_xxaa",
+ "includePath": [
+ "libznordic\\include",
+ "sdk/external/fatfs/src/",
+ "sdk/external/fatfs/src/",
+ "sdk/external/fatfs/port/",
+ "sdk/components/libraries/block_dev/sdc/",
+ "sdk/components/libraries/block_dev/",
+ "sdk\\config",
+ "app\\src",
+ "sdk\\components",
+ "sdk\\components\\ble\\ble_advertising",
+ "sdk\\components\\ble\\ble_dtm",
+ "sdk\\components\\ble\\ble_link_ctx_manager",
+ "sdk\\components\\ble\\ble_racp",
+ "sdk\\components\\ble\\ble_services\\ble_ancs_c",
+ "sdk\\components\\ble\\ble_services\\ble_ans_c",
+ "sdk\\components\\ble\\ble_services\\ble_bas",
+ "sdk\\components\\ble\\ble_services\\ble_bas_c",
+ "sdk\\components\\ble\\ble_services\\ble_cscs",
+ "sdk\\components\\ble\\ble_services\\ble_cts_c",
+ "sdk\\components\\ble\\ble_services\\ble_dfu",
+ "sdk\\components\\ble\\ble_services\\ble_dis",
+ "sdk\\components\\ble\\ble_services\\ble_gls",
+ "sdk\\components\\ble\\ble_services\\ble_hids",
+ "sdk\\components\\ble\\ble_services\\ble_hrs",
+ "sdk\\components\\ble\\ble_services\\ble_hrs_c",
+ "sdk\\components\\ble\\ble_services\\ble_hts",
+ "sdk\\components\\ble\\ble_services\\ble_ias",
+ "sdk\\components\\ble\\ble_services\\ble_ias_c",
+ "sdk\\components\\ble\\ble_services\\ble_lbs",
+ "sdk\\components\\ble\\ble_services\\ble_lbs_c",
+ "sdk\\components\\ble\\ble_services\\ble_lls",
+ "sdk\\components\\ble\\ble_services\\ble_nus",
+ "sdk\\components\\ble\\ble_services\\ble_nus_c",
+ "sdk\\components\\ble\\ble_services\\ble_rscs",
+ "sdk\\components\\ble\\ble_services\\ble_rscs_c",
+ "sdk\\components\\ble\\ble_services\\ble_tps",
+ "sdk\\components\\ble\\common",
+ "sdk\\components\\ble\\nrf_ble_gatt",
+ "sdk\\components\\ble\\nrf_ble_qwr",
+ "sdk\\components\\ble\\peer_manager",
+ "sdk\\components\\boards",
+ "sdk\\components\\libraries\\atomic",
+ "sdk\\components\\libraries\\atomic_fifo",
+ "sdk\\components\\libraries\\atomic_flags",
+ "sdk\\components\\libraries\\balloc",
+ "sdk\\components\\libraries\\bootloader\\ble_dfu",
+ "sdk\\components\\libraries\\bsp",
+ "sdk\\components\\libraries\\button",
+ "sdk\\components\\libraries\\cli",
+ "sdk\\components\\libraries\\crc16",
+ "sdk\\components\\libraries\\crc32",
+ "sdk\\components\\libraries\\crypto",
+ "sdk\\components\\libraries\\csense",
+ "sdk\\components\\libraries\\csense_drv",
+ "sdk\\components\\libraries\\delay",
+ "sdk\\components\\libraries\\ecc",
+ "sdk\\components\\libraries\\experimental_section_vars",
+ "sdk\\components\\libraries\\experimental_task_manager",
+ "sdk\\components\\libraries\\fds",
+ "sdk\\components\\libraries\\fifo",
+ "sdk\\components\\libraries\\fstorage",
+ "sdk\\components\\libraries\\gfx",
+ "sdk\\components\\libraries\\gpiote",
+ "sdk\\components\\libraries\\hardfault",
+ "sdk\\components\\libraries\\hci",
+ "sdk\\components\\libraries\\led_softblink",
+ "sdk\\components\\libraries\\log",
+ "sdk\\components\\libraries\\log\\src",
+ "sdk\\components\\libraries\\low_power_pwm",
+ "sdk\\components\\libraries\\mem_manager",
+ "sdk\\components\\libraries\\memobj",
+ "sdk\\components\\libraries\\mpu",
+ "sdk\\components\\libraries\\mutex",
+ "sdk\\components\\libraries\\pwm",
+ "sdk\\components\\libraries\\pwr_mgmt",
+ "sdk\\components\\libraries\\queue",
+ "sdk\\components\\libraries\\ringbuf",
+ "sdk\\components\\libraries\\scheduler",
+ "sdk\\components\\libraries\\sdcard",
+ "sdk\\components\\libraries\\slip",
+ "sdk\\components\\libraries\\sortlist",
+ "sdk\\components\\libraries\\spi_mngr",
+ "sdk\\components\\libraries\\stack_guard",
+ "sdk\\components\\libraries\\strerror",
+ "sdk\\components\\libraries\\svc",
+ "sdk\\components\\libraries\\timer",
+ "sdk\\components\\libraries\\twi_mngr",
+ "sdk\\components\\libraries\\twi_sensor",
+ "sdk\\components\\libraries\\uart",
+ "sdk\\components\\libraries\\usbd",
+ "sdk\\components\\libraries\\usbd\\class\\audio",
+ "sdk\\components\\libraries\\usbd\\class\\cdc",
+ "sdk\\components\\libraries\\usbd\\class\\cdc\\acm",
+ "sdk\\components\\libraries\\usbd\\class\\hid",
+ "sdk\\components\\libraries\\usbd\\class\\hid\\generic",
+ "sdk\\components\\libraries\\usbd\\class\\hid\\kbd",
+ "sdk\\components\\libraries\\usbd\\class\\hid\\mouse",
+ "sdk\\components\\libraries\\usbd\\class\\msc",
+ "sdk\\components\\libraries\\util",
+ "sdk\\components\\nfc\\ndef\\conn_hand_parser",
+ "sdk\\components\\nfc\\ndef\\conn_hand_parser\\ac_rec_parser",
+ "sdk\\components\\nfc\\ndef\\conn_hand_parser\\ble_oob_advdata_parser",
+ "sdk\\components\\nfc\\ndef\\conn_hand_parser\\le_oob_rec_parser",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\ac_rec",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\ble_oob_advdata",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\ble_pair_lib",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\ble_pair_msg",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\common",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\ep_oob_rec",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\hs_rec",
+ "sdk\\components\\nfc\\ndef\\connection_handover\\le_oob_rec",
+ "sdk\\components\\nfc\\ndef\\generic\\message",
+ "sdk\\components\\nfc\\ndef\\generic\\record",
+ "sdk\\components\\nfc\\ndef\\launchapp",
+ "sdk\\components\\nfc\\ndef\\parser\\message",
+ "sdk\\components\\nfc\\ndef\\parser\\record",
+ "sdk\\components\\nfc\\ndef\\text",
+ "sdk\\components\\nfc\\ndef\\uri",
+ "sdk\\components\\nfc\\platform",
+ "sdk\\components\\nfc\\t2t_lib",
+ "sdk\\components\\nfc\\t2t_parser",
+ "sdk\\components\\nfc\\t4t_lib",
+ "sdk\\components\\nfc\\t4t_parser\\apdu",
+ "sdk\\components\\nfc\\t4t_parser\\cc_file",
+ "sdk\\components\\nfc\\t4t_parser\\hl_detection_procedure",
+ "sdk\\components\\nfc\\t4t_parser\\tlv",
+ "sdk\\components\\softdevice\\common",
+ "sdk\\components\\softdevice\\s140\\headers",
+ "sdk\\components\\softdevice\\s140\\headers\\nrf52",
+ "sdk\\external\\fprintf",
+ "sdk\\external\\segger_rtt",
+ "sdk\\external\\utf_converter",
+ "sdk\\integration\\nrfx",
+ "sdk\\integration\\nrfx\\legacy",
+ "sdk\\modules\\nrfx",
+ "sdk\\modules\\nrfx\\drivers\\include",
+ "sdk\\modules\\nrfx\\hal",
+ "app\\config\\",
+ "app\\config",
+ "app",
+ "sdk\\modules\\nrfx\\soc",
+ "sdk\\modules\\nrfx\\drivers\\src",
+ "sdk\\modules\\nrfx\\drivers\\src\\prs",
+ "sdk\\modules\\nrfx\\mdk\\",
+ "sdk\\components\\toolchain\\cmsis\\include\\"
+ ],
+ "defines": [
+ "APP_TIMER_V2",
+ "APP_TIMER_V2_RTC1_ENABLED",
+ "BOARD_PCA10100",
+ "CONFIG_GPIO_AS_PINRESET",
+ "FLOAT_ABI_HARD",
+ "NRF52833_XXAA",
+ "NRF_SD_BLE_API_VERSION=7",
+ "S140",
+ "SOFTDEVICE_PRESENT",
+ "__HEAP_SIZE=2048",
+ "__STACK_SIZE=2048",
+ "__CC_ARM",
+ "__arm__",
+ "__align(x)=",
+ "__ALIGNOF__(x)=",
+ "__alignof__(x)=",
+ "__asm(x)=",
+ "__forceinline=",
+ "__restrict=",
+ "__global_reg(n)=",
+ "__inline=",
+ "__int64=long long",
+ "__INTADDR__(expr)=0",
+ "__irq=",
+ "__packed=",
+ "__pure=",
+ "__smc(n)=",
+ "__svc(n)=",
+ "__svc_indirect(n)=",
+ "__svc_indirect_r7(n)=",
+ "__value_in_regs=",
+ "__weak=",
+ "__writeonly=",
+ "__declspec(x)=",
+ "__attribute__(x)=",
+ "__nonnull__(x)=",
+ "__register=",
+ "__breakpoint(x)=",
+ "__cdp(x,y,z)=",
+ "__clrex()=",
+ "__clz(x)=0U",
+ "__current_pc()=0U",
+ "__current_sp()=0U",
+ "__disable_fiq()=",
+ "__disable_irq()=",
+ "__dmb(x)=",
+ "__dsb(x)=",
+ "__enable_fiq()=",
+ "__enable_irq()=",
+ "__fabs(x)=0.0",
+ "__fabsf(x)=0.0f",
+ "__force_loads()=",
+ "__force_stores()=",
+ "__isb(x)=",
+ "__ldrex(x)=0U",
+ "__ldrexd(x)=0U",
+ "__ldrt(x)=0U",
+ "__memory_changed()=",
+ "__nop()=",
+ "__pld(...)=",
+ "__pli(...)=",
+ "__qadd(x,y)=0",
+ "__qdbl(x)=0",
+ "__qsub(x,y)=0",
+ "__rbit(x)=0U",
+ "__rev(x)=0U",
+ "__return_address()=0U",
+ "__ror(x,y)=0U",
+ "__schedule_barrier()=",
+ "__semihost(x,y)=0",
+ "__sev()=",
+ "__sqrt(x)=0.0",
+ "__sqrtf(x)=0.0f",
+ "__ssat(x,y)=0",
+ "__strex(x,y)=0U",
+ "__strexd(x,y)=0",
+ "__strt(x,y)=",
+ "__swp(x,y)=0U",
+ "__usat(x,y)=0U",
+ "__wfe()=",
+ "__wfi()=",
+ "__yield()=",
+ "__vfp_status(x,y)=0"
+ ],
+ "intelliSenseMode": "${default}"
+ }
+ ],
+ "version": 4
+}
\ No newline at end of file
diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index 79227f7..600a0af 100644
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -3,18 +3,20 @@
{
"name": "nrf52833_xxaa",
"includePath": [
- "libznordic\\include",
- "sdk/external/fatfs/src/",
- "sdk/external/fatfs/src/",
- "sdk/external/fatfs/port/",
- "sdk/components/libraries/block_dev/sdc/",
- "sdk/components/libraries/block_dev/",
- "sdk\\config",
- "app\\src",
+ "sdk\\components\\ble\\nrf_ble_gq\\",
+ "sdk\\components\\softdevice\\mbr\\headers\\",
+ "sdk\\components\\ble\\common\\",
+ "sdk\\components\\ble\\ble_db_discovery\\",
+ "sdk\\components\\toolchain\\cmsis\\include\\",
+ "ble_app_uart_c\\config",
+ "sdk\\components\\libraries\\util\\",
+ "sdk\\modules\\nrfx\\mdk\\",
+ "sdk\\components\\softdevice\\s140\\headers",
+ "ble_app_uart_c\\config",
"sdk\\components",
"sdk\\components\\ble\\ble_advertising",
+ "sdk\\components\\ble\\ble_db_discovery",
"sdk\\components\\ble\\ble_dtm",
- "sdk\\components\\ble\\ble_link_ctx_manager",
"sdk\\components\\ble\\ble_racp",
"sdk\\components\\ble\\ble_services\\ble_ancs_c",
"sdk\\components\\ble\\ble_services\\ble_ans_c",
@@ -41,12 +43,13 @@
"sdk\\components\\ble\\ble_services\\ble_tps",
"sdk\\components\\ble\\common",
"sdk\\components\\ble\\nrf_ble_gatt",
+ "sdk\\components\\ble\\nrf_ble_gq",
"sdk\\components\\ble\\nrf_ble_qwr",
+ "sdk\\components\\ble\\nrf_ble_scan",
"sdk\\components\\ble\\peer_manager",
"sdk\\components\\boards",
"sdk\\components\\libraries\\atomic",
"sdk\\components\\libraries\\atomic_fifo",
- "sdk\\components\\libraries\\atomic_flags",
"sdk\\components\\libraries\\balloc",
"sdk\\components\\libraries\\bootloader\\ble_dfu",
"sdk\\components\\libraries\\bsp",
@@ -130,8 +133,8 @@
"sdk\\components\\nfc\\t4t_parser\\hl_detection_procedure",
"sdk\\components\\nfc\\t4t_parser\\tlv",
"sdk\\components\\softdevice\\common",
- "sdk\\components\\softdevice\\s140\\headers",
- "sdk\\components\\softdevice\\s140\\headers\\nrf52",
+ "sdk\\components\\softdevice\\s122\\headers",
+ "sdk\\components\\softdevice\\s122\\headers\\nrf52",
"sdk\\external\\fprintf",
"sdk\\external\\segger_rtt",
"sdk\\external\\utf_converter",
@@ -140,24 +143,21 @@
"sdk\\modules\\nrfx",
"sdk\\modules\\nrfx\\drivers\\include",
"sdk\\modules\\nrfx\\hal",
- "app\\config\\",
- "app\\config",
- "app",
+ "config",
+ "ble_app_uart_c",
"sdk\\modules\\nrfx\\soc",
"sdk\\modules\\nrfx\\drivers\\src",
- "sdk\\modules\\nrfx\\drivers\\src\\prs",
- "sdk\\modules\\nrfx\\mdk\\",
- "sdk\\components\\toolchain\\cmsis\\include\\"
+ "sdk\\modules\\nrfx\\drivers\\src\\prs"
],
"defines": [
"APP_TIMER_V2",
"APP_TIMER_V2_RTC1_ENABLED",
- "BOARD_PCA10100",
+ "BOARD_QING_FENG_NRF52833",
"CONFIG_GPIO_AS_PINRESET",
"FLOAT_ABI_HARD",
"NRF52833_XXAA",
- "NRF_SD_BLE_API_VERSION=7",
- "S140",
+ "NRF_SD_BLE_API_VERSION=8",
+ "S122",
"SOFTDEVICE_PRESENT",
"__HEAP_SIZE=2048",
"__STACK_SIZE=2048",
@@ -235,6 +235,124 @@
"__vfp_status(x,y)=0"
],
"intelliSenseMode": "${default}"
+ },
+ {
+ "name": "flash_s122_nrf52_8.0.0_softdevice",
+ "includePath": [
+ "ble_app_uart_c\\config",
+ "config",
+ "ble_app_uart_c",
+ "sdk\\components\\boards",
+ "sdk\\components\\libraries\\bsp",
+ "sdk\\external\\utf_converter",
+ "sdk\\components\\ble\\common",
+ "sdk\\components\\ble\\ble_db_discovery",
+ "sdk\\components\\ble\\nrf_ble_gatt",
+ "sdk\\components\\ble\\nrf_ble_gq",
+ "sdk\\components\\ble\\nrf_ble_scan",
+ "sdk\\integration\\nrfx\\legacy",
+ "sdk\\modules\\nrfx\\soc",
+ "sdk\\modules\\nrfx\\drivers\\src",
+ "sdk\\modules\\nrfx\\drivers\\src\\prs",
+ "sdk\\components\\libraries\\button",
+ "sdk\\components\\libraries\\util",
+ "sdk\\components\\libraries\\fifo",
+ "sdk\\components\\libraries\\scheduler",
+ "sdk\\components\\libraries\\timer",
+ "sdk\\components\\libraries\\uart",
+ "sdk\\components\\libraries\\hardfault",
+ "sdk\\components\\libraries\\atomic_fifo",
+ "sdk\\components\\libraries\\atomic",
+ "sdk\\components\\libraries\\balloc",
+ "sdk\\external\\fprintf",
+ "sdk\\components\\libraries\\memobj",
+ "sdk\\components\\libraries\\pwr_mgmt",
+ "sdk\\components\\libraries\\queue",
+ "sdk\\components\\libraries\\ringbuf",
+ "sdk\\components\\libraries\\experimental_section_vars",
+ "sdk\\components\\libraries\\sortlist",
+ "sdk\\components\\libraries\\strerror",
+ "sdk\\components\\libraries\\log\\src",
+ "sdk\\external\\segger_rtt",
+ "sdk\\components\\softdevice\\common"
+ ],
+ "defines": [
+ "__HEAP_SIZE=2048",
+ "__STACK_SIZE=2048",
+ "__CC_ARM",
+ "__arm__",
+ "__align(x)=",
+ "__ALIGNOF__(x)=",
+ "__alignof__(x)=",
+ "__asm(x)=",
+ "__forceinline=",
+ "__restrict=",
+ "__global_reg(n)=",
+ "__inline=",
+ "__int64=long long",
+ "__INTADDR__(expr)=0",
+ "__irq=",
+ "__packed=",
+ "__pure=",
+ "__smc(n)=",
+ "__svc(n)=",
+ "__svc_indirect(n)=",
+ "__svc_indirect_r7(n)=",
+ "__value_in_regs=",
+ "__weak=",
+ "__writeonly=",
+ "__declspec(x)=",
+ "__attribute__(x)=",
+ "__nonnull__(x)=",
+ "__register=",
+ "__breakpoint(x)=",
+ "__cdp(x,y,z)=",
+ "__clrex()=",
+ "__clz(x)=0U",
+ "__current_pc()=0U",
+ "__current_sp()=0U",
+ "__disable_fiq()=",
+ "__disable_irq()=",
+ "__dmb(x)=",
+ "__dsb(x)=",
+ "__enable_fiq()=",
+ "__enable_irq()=",
+ "__fabs(x)=0.0",
+ "__fabsf(x)=0.0f",
+ "__force_loads()=",
+ "__force_stores()=",
+ "__isb(x)=",
+ "__ldrex(x)=0U",
+ "__ldrexd(x)=0U",
+ "__ldrt(x)=0U",
+ "__memory_changed()=",
+ "__nop()=",
+ "__pld(...)=",
+ "__pli(...)=",
+ "__qadd(x,y)=0",
+ "__qdbl(x)=0",
+ "__qsub(x,y)=0",
+ "__rbit(x)=0U",
+ "__rev(x)=0U",
+ "__return_address()=0U",
+ "__ror(x,y)=0U",
+ "__schedule_barrier()=",
+ "__semihost(x,y)=0",
+ "__sev()=",
+ "__sqrt(x)=0.0",
+ "__sqrtf(x)=0.0f",
+ "__ssat(x,y)=0",
+ "__strex(x,y)=0U",
+ "__strexd(x,y)=0",
+ "__strt(x,y)=",
+ "__swp(x,y)=0U",
+ "__usat(x,y)=0U",
+ "__wfe()=",
+ "__wfi()=",
+ "__yield()=",
+ "__vfp_status(x,y)=0"
+ ],
+ "intelliSenseMode": "${default}"
}
],
"version": 4
diff --git a/.vscode/settings.json b/.vscode/settings.json
index c5d872b..a781f04 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -61,6 +61,21 @@
"znordic.h": "c",
"ads1293.h": "c",
"app_scheduler.h": "c",
- "stdbool.h": "c"
+ "stdbool.h": "c",
+ "stdlib.h": "c",
+ "zble_nus_c.h": "c",
+ "ble.h": "c",
+ "ble_gattc.h": "c",
+ "ble_gatt.h": "c",
+ "ble_gap.h": "c",
+ "sdk_common.h": "c",
+ "app_error.h": "c",
+ "ble_gatts.h": "c",
+ "sdk_macros.h": "c",
+ "app_util.h": "c",
+ "ble_types.h": "c",
+ "ble_db_discovery.h": "c",
+ "ble_gatt_db.h": "c",
+ "nrf_ble_gq.h": "c"
}
}
\ No newline at end of file
diff --git a/ble_app_uart_c/.vscode/keil-assistant.log b/ble_app_uart_c/.vscode/keil-assistant.log
new file mode 100644
index 0000000..b509f2e
--- /dev/null
+++ b/ble_app_uart_c/.vscode/keil-assistant.log
@@ -0,0 +1,2 @@
+[info] Log at : 2024/1/25|13:55:45|GMT+0800
+
diff --git a/ble_app_uart_c/.vscode/uv4.log.lock b/ble_app_uart_c/.vscode/uv4.log.lock
new file mode 100644
index 0000000..e69de29
diff --git a/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvguix.h_zha b/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvguix.h_zha
index d7a49b4..3fa1386 100644
--- a/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvguix.h_zha
+++ b/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvguix.h_zha
@@ -6,7 +6,7 @@
### uVision Project, (C) Keil Software
-
+ D:\workspace\nordic_wp\conduction1_dynamic_electrocardiograph\ble_app_uart_c
diff --git a/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvoptx b/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvoptx
index 2874cf3..a6f5e42 100644
--- a/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvoptx
+++ b/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvoptx
@@ -527,7 +527,7 @@
nRF_BLE_Services
- 0
+ 1
0
0
0
@@ -538,8 +538,8 @@
0
0
0
- ..\sdk\components\ble\ble_services\ble_nus_c\ble_nus_c.c
- ble_nus_c.c
+ .\zble_nus_c.c
+ zble_nus_c.c
0
0
diff --git a/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvprojx b/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvprojx
index 9d7b029..aeebc47 100644
--- a/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvprojx
+++ b/ble_app_uart_c/ble_app_uart_c_pca10100_s122.uvprojx
@@ -979,60 +979,9 @@
nRF_BLE_Services
- ble_nus_c.c
+ zble_nus_c.c
1
- ..\sdk\components\ble\ble_services\ble_nus_c\ble_nus_c.c
-
-
- 0
- 0
- 0
- 0
- 0
- 1
- 2
- 2
- 2
- 2
- 11
-
-
- 1
-
-
-
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 0
- 0
- 2
- 2
- 2
- 2
- 2
-
-
-
-
-
-
-
-
-
+ .\zble_nus_c.c
@@ -4505,60 +4454,9 @@
nRF_BLE_Services
- ble_nus_c.c
+ zble_nus_c.c
1
- ..\sdk\components\ble\ble_services\ble_nus_c\ble_nus_c.c
-
-
- 0
- 0
- 0
- 0
- 0
- 0
- 2
- 2
- 2
- 2
- 11
-
-
- 1
-
-
-
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 0
- 0
- 2
- 2
- 2
- 2
- 2
-
-
-
-
-
-
-
-
-
+ .\zble_nus_c.c
diff --git a/ble_app_uart_c/main.c b/ble_app_uart_c/main.c
index ef64d6e..30237f0 100644
--- a/ble_app_uart_c/main.c
+++ b/ble_app_uart_c/main.c
@@ -53,7 +53,7 @@
#include "nrf_sdh.h"
#include "nrf_sdh_ble.h"
#include "nrf_sdh_soc.h"
-#include "ble_nus_c.h"
+#include "zble_nus_c.h"
#include "nrf_ble_gatt.h"
#include "nrf_pwr_mgmt.h"
#include "nrf_ble_scan.h"
diff --git a/ble_app_uart_c/zble_nus_c.c b/ble_app_uart_c/zble_nus_c.c
new file mode 100644
index 0000000..fac75fc
--- /dev/null
+++ b/ble_app_uart_c/zble_nus_c.c
@@ -0,0 +1,319 @@
+/**
+ * Copyright (c) 2012 - 2021, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ * Semiconductor ASA integrated circuit in a product or a software update for
+ * such product, must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ * Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ * engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "sdk_common.h"
+#if 1
+#include
+
+#include "ble.h"
+#include "zble_nus_c.h"
+#include "ble_gattc.h"
+#include "ble_srv_common.h"
+#include "app_error.h"
+
+#define NRF_LOG_MODULE_NAME ble_nus_c
+#include "nrf_log.h"
+NRF_LOG_MODULE_REGISTER();
+
+
+/**@brief Function for intercepting the errors of GATTC and the BLE GATT Queue.
+ *
+ * @param[in] nrf_error Error code.
+ * @param[in] p_ctx Parameter from the event handler.
+ * @param[in] conn_handle Connection handle.
+ */
+static void gatt_error_handler(uint32_t nrf_error,
+ void * p_ctx,
+ uint16_t conn_handle)
+{
+ ble_nus_c_t * p_ble_nus_c = (ble_nus_c_t *)p_ctx;
+
+ NRF_LOG_DEBUG("A GATT Client error has occurred on conn_handle: 0X%X", conn_handle);
+
+ if (p_ble_nus_c->error_handler != NULL)
+ {
+ p_ble_nus_c->error_handler(nrf_error);
+ }
+}
+
+
+void ble_nus_c_on_db_disc_evt(ble_nus_c_t * p_ble_nus_c, ble_db_discovery_evt_t * p_evt)
+{
+ ble_nus_c_evt_t nus_c_evt;
+ memset(&nus_c_evt,0,sizeof(ble_nus_c_evt_t));
+
+ ble_gatt_db_char_t * p_chars = p_evt->params.discovered_db.charateristics;
+
+ // Check if the NUS was discovered.
+ if ( (p_evt->evt_type == BLE_DB_DISCOVERY_COMPLETE)
+ && (p_evt->params.discovered_db.srv_uuid.uuid == BLE_UUID_NUS_SERVICE)
+ && (p_evt->params.discovered_db.srv_uuid.type == p_ble_nus_c->uuid_type))
+ {
+ for (uint32_t i = 0; i < p_evt->params.discovered_db.char_count; i++)
+ {
+ switch (p_chars[i].characteristic.uuid.uuid)
+ {
+ case BLE_UUID_NUS_RX_CHARACTERISTIC:
+ nus_c_evt.handles.nus_rx_handle = p_chars[i].characteristic.handle_value;
+ break;
+
+ case BLE_UUID_NUS_TX_CHARACTERISTIC:
+ nus_c_evt.handles.nus_tx_handle = p_chars[i].characteristic.handle_value;
+ nus_c_evt.handles.nus_tx_cccd_handle = p_chars[i].cccd_handle;
+ break;
+
+ case BLE_UUID_NUS_TX_BLOCK_CHARACTERISTIC:
+ nus_c_evt.handles.nus_tx_block_handle = p_chars[i].characteristic.handle_value;
+ nus_c_evt.handles.nus_tx_cccd_handle = p_chars[i].cccd_handle;
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (p_ble_nus_c->evt_handler != NULL)
+ {
+ nus_c_evt.conn_handle = p_evt->conn_handle;
+ nus_c_evt.evt_type = BLE_NUS_C_EVT_DISCOVERY_COMPLETE;
+ p_ble_nus_c->evt_handler(p_ble_nus_c, &nus_c_evt);
+ }
+ }
+}
+
+/**@brief Function for handling Handle Value Notification received from the SoftDevice.
+ *
+ * @details This function uses the Handle Value Notification received from the SoftDevice
+ * and checks if it is a notification of the NUS TX characteristic from the peer.
+ * If it is, this function decodes the data and sends it to the application.
+ *
+ * @param[in] p_ble_nus_c Pointer to the NUS Client structure.
+ * @param[in] p_ble_evt Pointer to the BLE event received.
+ */
+static void on_hvx(ble_nus_c_t * p_ble_nus_c, ble_evt_t const * p_ble_evt)
+{
+ // HVX can only occur from client sending.
+ if ( (p_ble_nus_c->handles.nus_tx_handle != BLE_GATT_HANDLE_INVALID)
+ && (p_ble_evt->evt.gattc_evt.params.hvx.handle == p_ble_nus_c->handles.nus_tx_handle)
+ && (p_ble_nus_c->evt_handler != NULL))
+ {
+ ble_nus_c_evt_t ble_nus_c_evt;
+
+ ble_nus_c_evt.evt_type = BLE_NUS_C_EVT_NUS_TX_EVT;
+ ble_nus_c_evt.p_data = (uint8_t *)p_ble_evt->evt.gattc_evt.params.hvx.data;
+ ble_nus_c_evt.data_len = p_ble_evt->evt.gattc_evt.params.hvx.len;
+
+ p_ble_nus_c->evt_handler(p_ble_nus_c, &ble_nus_c_evt);
+ NRF_LOG_DEBUG("Client sending data.");
+ }
+
+ if ( (p_ble_nus_c->handles.nus_tx_block_handle != BLE_GATT_HANDLE_INVALID)
+ && (p_ble_evt->evt.gattc_evt.params.hvx.handle == p_ble_nus_c->handles.nus_tx_block_handle)
+ && (p_ble_nus_c->evt_handler != NULL))
+ {
+ ble_nus_c_evt_t ble_nus_c_evt;
+
+ ble_nus_c_evt.evt_type = BLE_NUS_C_EVT_NUS_TX_BLOCK_EVT;
+ ble_nus_c_evt.p_data = (uint8_t *)p_ble_evt->evt.gattc_evt.params.hvx.data;
+ ble_nus_c_evt.data_len = p_ble_evt->evt.gattc_evt.params.hvx.len;
+
+ p_ble_nus_c->evt_handler(p_ble_nus_c, &ble_nus_c_evt);
+ NRF_LOG_DEBUG("Client sending data.");
+ }
+}
+
+uint32_t ble_nus_c_init(ble_nus_c_t * p_ble_nus_c, ble_nus_c_init_t * p_ble_nus_c_init)
+{
+ uint32_t err_code;
+ ble_uuid_t uart_uuid;
+ ble_uuid128_t nus_base_uuid = NUS_BASE_UUID;
+
+ VERIFY_PARAM_NOT_NULL(p_ble_nus_c);
+ VERIFY_PARAM_NOT_NULL(p_ble_nus_c_init);
+ VERIFY_PARAM_NOT_NULL(p_ble_nus_c_init->p_gatt_queue);
+
+ err_code = sd_ble_uuid_vs_add(&nus_base_uuid, &p_ble_nus_c->uuid_type);
+ VERIFY_SUCCESS(err_code);
+
+ uart_uuid.type = p_ble_nus_c->uuid_type;
+ uart_uuid.uuid = BLE_UUID_NUS_SERVICE;
+
+ p_ble_nus_c->conn_handle = BLE_CONN_HANDLE_INVALID;
+ p_ble_nus_c->evt_handler = p_ble_nus_c_init->evt_handler;
+ p_ble_nus_c->error_handler = p_ble_nus_c_init->error_handler;
+ p_ble_nus_c->handles.nus_tx_handle = BLE_GATT_HANDLE_INVALID;
+ p_ble_nus_c->handles.nus_tx_block_handle = BLE_GATT_HANDLE_INVALID;
+ p_ble_nus_c->handles.nus_rx_handle = BLE_GATT_HANDLE_INVALID;
+ p_ble_nus_c->p_gatt_queue = p_ble_nus_c_init->p_gatt_queue;
+
+ return ble_db_discovery_evt_register(&uart_uuid);
+}
+
+void ble_nus_c_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context)
+{
+ ble_nus_c_t * p_ble_nus_c = (ble_nus_c_t *)p_context;
+
+ if ((p_ble_nus_c == NULL) || (p_ble_evt == NULL))
+ {
+ return;
+ }
+
+ if ( (p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID)
+ ||(p_ble_nus_c->conn_handle != p_ble_evt->evt.gap_evt.conn_handle)
+ )
+ {
+ return;
+ }
+
+ switch (p_ble_evt->header.evt_id)
+ {
+ case BLE_GATTC_EVT_HVX:
+ on_hvx(p_ble_nus_c, p_ble_evt);
+ break;
+
+ case BLE_GAP_EVT_DISCONNECTED:
+ if (p_ble_evt->evt.gap_evt.conn_handle == p_ble_nus_c->conn_handle
+ && p_ble_nus_c->evt_handler != NULL)
+ {
+ ble_nus_c_evt_t nus_c_evt;
+
+ nus_c_evt.evt_type = BLE_NUS_C_EVT_DISCONNECTED;
+
+ p_ble_nus_c->conn_handle = BLE_CONN_HANDLE_INVALID;
+ p_ble_nus_c->evt_handler(p_ble_nus_c, &nus_c_evt);
+ }
+ break;
+
+ default:
+ // No implementation needed.
+ break;
+ }
+}
+
+/**@brief Function for creating a message for writing to the CCCD. */
+static uint32_t cccd_configure(ble_nus_c_t * p_ble_nus_c, bool notification_enable)
+{
+ nrf_ble_gq_req_t cccd_req;
+ uint8_t cccd[BLE_CCCD_VALUE_LEN];
+ uint16_t cccd_val = notification_enable ? BLE_GATT_HVX_NOTIFICATION : 0;
+
+ memset(&cccd_req, 0, sizeof(nrf_ble_gq_req_t));
+
+ cccd[0] = LSB_16(cccd_val);
+ cccd[1] = MSB_16(cccd_val);
+
+ cccd_req.type = NRF_BLE_GQ_REQ_GATTC_WRITE;
+ cccd_req.error_handler.cb = gatt_error_handler;
+ cccd_req.error_handler.p_ctx = p_ble_nus_c;
+ cccd_req.params.gattc_write.handle = p_ble_nus_c->handles.nus_tx_cccd_handle;
+ cccd_req.params.gattc_write.len = BLE_CCCD_VALUE_LEN;
+ cccd_req.params.gattc_write.offset = 0;
+ cccd_req.params.gattc_write.p_value = cccd;
+ cccd_req.params.gattc_write.write_op = BLE_GATT_OP_WRITE_REQ;
+ cccd_req.params.gattc_write.flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE;
+
+ return nrf_ble_gq_item_add(p_ble_nus_c->p_gatt_queue, &cccd_req, p_ble_nus_c->conn_handle);
+}
+
+
+uint32_t ble_nus_c_tx_notif_enable(ble_nus_c_t * p_ble_nus_c)
+{
+ VERIFY_PARAM_NOT_NULL(p_ble_nus_c);
+
+ if ( (p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID)
+ ||(p_ble_nus_c->handles.nus_tx_cccd_handle == BLE_GATT_HANDLE_INVALID)
+ )
+ {
+ return NRF_ERROR_INVALID_STATE;
+ }
+ return cccd_configure(p_ble_nus_c, true);
+}
+
+
+uint32_t ble_nus_c_string_send(ble_nus_c_t * p_ble_nus_c, uint8_t * p_string, uint16_t length)
+{
+ VERIFY_PARAM_NOT_NULL(p_ble_nus_c);
+
+ nrf_ble_gq_req_t write_req;
+
+ memset(&write_req, 0, sizeof(nrf_ble_gq_req_t));
+
+ if (length > BLE_NUS_MAX_DATA_LEN)
+ {
+ NRF_LOG_WARNING("Content too long.");
+ return NRF_ERROR_INVALID_PARAM;
+ }
+ if (p_ble_nus_c->conn_handle == BLE_CONN_HANDLE_INVALID)
+ {
+ NRF_LOG_WARNING("Connection handle invalid.");
+ return NRF_ERROR_INVALID_STATE;
+ }
+
+ write_req.type = NRF_BLE_GQ_REQ_GATTC_WRITE;
+ write_req.error_handler.cb = gatt_error_handler;
+ write_req.error_handler.p_ctx = p_ble_nus_c;
+ write_req.params.gattc_write.handle = p_ble_nus_c->handles.nus_rx_handle;
+ write_req.params.gattc_write.len = length;
+ write_req.params.gattc_write.offset = 0;
+ write_req.params.gattc_write.p_value = p_string;
+ write_req.params.gattc_write.write_op = BLE_GATT_OP_WRITE_CMD;
+ write_req.params.gattc_write.flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE;
+
+ return nrf_ble_gq_item_add(p_ble_nus_c->p_gatt_queue, &write_req, p_ble_nus_c->conn_handle);
+}
+
+
+uint32_t ble_nus_c_handles_assign(ble_nus_c_t * p_ble_nus,
+ uint16_t conn_handle,
+ ble_nus_c_handles_t const * p_peer_handles)
+{
+ VERIFY_PARAM_NOT_NULL(p_ble_nus);
+
+ p_ble_nus->conn_handle = conn_handle;
+ if (p_peer_handles != NULL)
+ {
+ p_ble_nus->handles.nus_tx_cccd_handle = p_peer_handles->nus_tx_cccd_handle;
+ p_ble_nus->handles.nus_tx_handle = p_peer_handles->nus_tx_handle;
+ p_ble_nus->handles.nus_tx_block_handle = p_peer_handles->nus_tx_block_handle;
+ p_ble_nus->handles.nus_tx_block_cccd_handle = p_peer_handles->nus_tx_block_cccd_handle;
+ p_ble_nus->handles.nus_rx_handle = p_peer_handles->nus_rx_handle;
+ }
+ return nrf_ble_gq_conn_handle_register(p_ble_nus->p_gatt_queue, conn_handle);
+}
+#endif // NRF_MODULE_ENABLED(BLE_NUS_C)
diff --git a/ble_app_uart_c/zble_nus_c.h b/ble_app_uart_c/zble_nus_c.h
new file mode 100644
index 0000000..1d5c5b1
--- /dev/null
+++ b/ble_app_uart_c/zble_nus_c.h
@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) 2012 - 2021, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ * Semiconductor ASA integrated circuit in a product or a software update for
+ * such product, must reproduce the above copyright notice, this list of
+ * conditions and the following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ * Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ * engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/**@file
+ *
+ * @defgroup ble_nus_c Nordic UART Service Client
+ * @{
+ * @ingroup ble_sdk_srv
+ * @brief Nordic UART Service Client module.
+ *
+ * @details This module contains the APIs and types exposed by the Nordic UART Service Client
+ * module. The application can use these APIs and types to perform the discovery of
+ * the Nordic UART Service at the peer and to interact with it.
+ *
+ * @note The application must register this module as the BLE event observer by using the
+ * NRF_SDH_BLE_OBSERVER macro. Example:
+ * @code
+ * ble_nus_c_t instance;
+ * NRF_SDH_BLE_OBSERVER(anything, BLE_NUS_C_BLE_OBSERVER_PRIO,
+ * ble_nus_c_on_ble_evt, &instance);
+ * @endcode
+ *
+ */
+
+#ifndef BLE_NUS_C_H__
+#define BLE_NUS_C_H__
+
+#include
+#include
+
+#include "ble.h"
+#include "ble_db_discovery.h"
+#include "ble_gatt.h"
+#include "ble_srv_common.h"
+#include "nrf_ble_gq.h"
+#include "nrf_sdh_ble.h"
+#include "sdk_config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**@brief Macro for defining a ble_nus_c instance.
+ *
+ * @param _name Name of the instance.
+ * @hideinitializer
+ */
+#define BLE_NUS_C_DEF(_name) \
+ static ble_nus_c_t _name; \
+ NRF_SDH_BLE_OBSERVER(_name##_obs, BLE_NUS_C_BLE_OBSERVER_PRIO, ble_nus_c_on_ble_evt, &_name)
+
+/** @brief Macro for defining multiple ble_nus_c instances.
+ *
+ * @param _name Name of the array of instances.
+ * @param _cnt Number of instances to define.
+ * @hideinitializer
+ */
+#define BLE_NUS_C_ARRAY_DEF(_name, _cnt) \
+ static ble_nus_c_t _name[_cnt]; \
+ NRF_SDH_BLE_OBSERVERS(_name##_obs, BLE_NUS_C_BLE_OBSERVER_PRIO, ble_nus_c_on_ble_evt, &_name, _cnt)
+
+#define NUS_BASE_UUID \
+ { \
+ { 0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E } \
+ } /**< Used vendor-specific UUID. */
+
+#define BLE_UUID_NUS_SERVICE 0x0001 /**< The UUID of the Nordic UART Service. */
+#define BLE_UUID_NUS_RX_CHARACTERISTIC 0x0002 /**< The UUID of the RX Characteristic. */
+#define BLE_UUID_NUS_TX_CHARACTERISTIC 0x0003 /**< The UUID of the TX Characteristic. */
+#define BLE_UUID_NUS_TX_BLOCK_CHARACTERISTIC 0x0004 /**< The UUID of the TX Characteristic. */
+
+#define OPCODE_LENGTH 1
+#define HANDLE_LENGTH 2
+
+/**@brief Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+#if defined(NRF_SDH_BLE_GATT_MAX_MTU_SIZE) && (NRF_SDH_BLE_GATT_MAX_MTU_SIZE != 0)
+#define BLE_NUS_MAX_DATA_LEN (NRF_SDH_BLE_GATT_MAX_MTU_SIZE - OPCODE_LENGTH - HANDLE_LENGTH)
+#else
+#define BLE_NUS_MAX_DATA_LEN (BLE_GATT_MTU_SIZE_DEFAULT - OPCODE_LENGTH - HANDLE_LENGTH)
+#warning NRF_SDH_BLE_GATT_MAX_MTU_SIZE is not defined.
+#endif
+
+/**@brief NUS Client event type. */
+typedef enum {
+ BLE_NUS_C_EVT_DISCOVERY_COMPLETE, /**< Event indicating that the NUS service and its characteristics were found. */
+ BLE_NUS_C_EVT_NUS_TX_EVT, /**< Event indicating that the central received something from a peer. */
+ BLE_NUS_C_EVT_NUS_TX_BLOCK_EVT, /**< Event indicating that the central received something from a peer. */
+ BLE_NUS_C_EVT_DISCONNECTED /**< Event indicating that the NUS server disconnected. */
+} ble_nus_c_evt_type_t;
+
+/**@brief Handles on the connected peer device needed to interact with it. */
+typedef struct {
+ uint16_t nus_tx_handle; /**< Handle of the NUS TX characteristic, as provided by a discovery. */
+ uint16_t nus_tx_cccd_handle; /**< Handle of the CCCD of the NUS TX characteristic, as provided by a discovery. */
+
+ uint16_t nus_tx_block_handle; /**< Handle of the NUS TX characteristic, as provided by a discovery. */
+ uint16_t nus_tx_block_cccd_handle; /**< Handle of the CCCD of the NUS TX characteristic, as provided by a discovery. */
+
+ uint16_t nus_rx_handle; /**< Handle of the NUS RX characteristic, as provided by a discovery. */
+} ble_nus_c_handles_t;
+
+/**@brief Structure containing the NUS event data received from the peer. */
+typedef struct {
+ ble_nus_c_evt_type_t evt_type;
+ uint16_t conn_handle;
+ uint16_t max_data_len;
+ uint8_t* p_data;
+ uint16_t data_len;
+ ble_nus_c_handles_t handles; /**< Handles on which the Nordic UART service characteristics were discovered on the peer device. This is filled if the evt_type is @ref BLE_NUS_C_EVT_DISCOVERY_COMPLETE.*/
+} ble_nus_c_evt_t;
+
+// Forward declaration of the ble_nus_t type.
+typedef struct ble_nus_c_s ble_nus_c_t;
+
+/**@brief Event handler type.
+ *
+ * @details This is the type of the event handler that is to be provided by the application
+ * of this module to receive events.
+ */
+typedef void (*ble_nus_c_evt_handler_t)(ble_nus_c_t* p_ble_nus_c, ble_nus_c_evt_t const* p_evt);
+
+/**@brief NUS Client structure. */
+struct ble_nus_c_s {
+ uint8_t uuid_type; /**< UUID type. */
+ uint16_t conn_handle; /**< Handle of the current connection. Set with @ref ble_nus_c_handles_assign when connected. */
+ ble_nus_c_handles_t handles; /**< Handles on the connected peer device needed to interact with it. */
+ ble_nus_c_evt_handler_t evt_handler; /**< Application event handler to be called when there is an event related to the NUS. */
+ ble_srv_error_handler_t error_handler; /**< Function to be called in case of an error. */
+ nrf_ble_gq_t* p_gatt_queue; /**< Pointer to BLE GATT Queue instance. */
+};
+
+/**@brief NUS Client initialization structure. */
+typedef struct {
+ ble_nus_c_evt_handler_t evt_handler; /**< Application event handler to be called when there is an event related to the NUS. */
+ ble_srv_error_handler_t error_handler; /**< Function to be called in case of an error. */
+ nrf_ble_gq_t* p_gatt_queue; /**< Pointer to BLE GATT Queue instance. */
+} ble_nus_c_init_t;
+
+/**@brief Function for initializing the Nordic UART client module.
+ *
+ * @details This function registers with the Database Discovery module
+ * for the NUS. The Database Discovery module looks for the presence
+ * of a NUS instance at the peer when a discovery is started.
+ *
+ * @param[in] p_ble_nus_c Pointer to the NUS client structure.
+ * @param[in] p_ble_nus_c_init Pointer to the NUS initialization structure that contains the
+ * initialization information.
+ *
+ * @retval NRF_SUCCESS If the module was initialized successfully.
+ * @retval err_code Otherwise, this function propagates the error code
+ * returned by the Database Discovery module API
+ * @ref ble_db_discovery_evt_register.
+ */
+uint32_t ble_nus_c_init(ble_nus_c_t* p_ble_nus_c, ble_nus_c_init_t* p_ble_nus_c_init);
+
+/**@brief Function for handling events from the Database Discovery module.
+ *
+ * @details This function handles an event from the Database Discovery module, and determines
+ * whether it relates to the discovery of NUS at the peer. If it does, the function
+ * calls the application's event handler to indicate that NUS was
+ * discovered at the peer. The function also populates the event with service-related
+ * information before providing it to the application.
+ *
+ * @param[in] p_ble_nus_c Pointer to the NUS client structure.
+ * @param[in] p_evt Pointer to the event received from the Database Discovery module.
+ */
+void ble_nus_c_on_db_disc_evt(ble_nus_c_t* p_ble_nus_c, ble_db_discovery_evt_t* p_evt);
+
+/**@brief Function for handling BLE events from the SoftDevice.
+ *
+ * @details This function handles the BLE events received from the SoftDevice. If a BLE
+ * event is relevant to the NUS module, the function uses the event's data to update
+ * internal variables and, if necessary, send events to the application.
+ *
+ * @param[in] p_ble_evt Pointer to the BLE event.
+ * @param[in] p_context Pointer to the NUS client structure.
+ */
+void ble_nus_c_on_ble_evt(ble_evt_t const* p_ble_evt, void* p_context);
+
+/**@brief Function for requesting the peer to start sending notification of TX characteristic.
+ *
+ * @details This function enables notifications of the NUS TX characteristic at the peer
+ * by writing to the CCCD of the NUS TX characteristic.
+ *
+ * @param p_ble_nus_c Pointer to the NUS client structure.
+ *
+ * @retval NRF_SUCCESS If the operation was successful.
+ * @retval err_code Otherwise, this API propagates the error code returned by function @ref nrf_ble_gq_item_add.
+ */
+uint32_t ble_nus_c_tx_notif_enable(ble_nus_c_t* p_ble_nus_c);
+
+/**@brief Function for sending a string to the server.
+ *
+ * @details This function writes the RX characteristic of the server.
+ *
+ * @param[in] p_ble_nus_c Pointer to the NUS client structure.
+ * @param[in] p_string String to be sent.
+ * @param[in] length Length of the string.
+ *
+ * @retval NRF_SUCCESS If the string was sent successfully.
+ * @retval err_code Otherwise, this API propagates the error code returned by function @ref nrf_ble_gq_item_add.
+ */
+uint32_t ble_nus_c_string_send(ble_nus_c_t* p_ble_nus_c, uint8_t* p_string, uint16_t length);
+
+/**@brief Function for assigning handles to this instance of nus_c.
+ *
+ * @details Call this function when a link has been established with a peer to
+ * associate the link to this instance of the module. This makes it
+ * possible to handle several links and associate each link to a particular
+ * instance of this module. The connection handle and attribute handles are
+ * provided from the discovery event @ref BLE_NUS_C_EVT_DISCOVERY_COMPLETE.
+ *
+ * @param[in] p_ble_nus_c Pointer to the NUS client structure instance to associate with these
+ * handles.
+ * @param[in] conn_handle Connection handle to associated with the given NUS Instance.
+ * @param[in] p_peer_handles Attribute handles on the NUS server that you want this NUS client to
+ * interact with.
+ *
+ * @retval NRF_SUCCESS If the operation was successful.
+ * @retval NRF_ERROR_NULL If a p_nus was a NULL pointer.
+ * @retval err_code Otherwise, this API propagates the error code returned
+ * by function @ref nrf_ble_gq_item_add.
+ */
+uint32_t ble_nus_c_handles_assign(ble_nus_c_t* p_ble_nus_c, uint16_t conn_handle, ble_nus_c_handles_t const* p_peer_handles);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // BLE_NUS_C_H__
+
+/** @} */