From c1348ad2ee1a51bdcaf806bc9883edd0ee4b7613 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 20 Jan 2024 17:17:31 +0800 Subject: [PATCH] update --- .gitmodules | 3 + .vscode/c_cpp_properties.json | 2 + .vscode/settings.json | 7 +- app/app.uvoptx | 160 ++++++----- app/app.uvprojx | 38 ++- app/main.c | 638 +----------------------------------------- app/src/version.h | 3 + app/src/zble_service copy.c | 584 ++++++++++++++++++++++++++++++++++++++ app/src/zble_service.c | 284 +++++++++++++++++++ app/src/zble_service.h | 27 ++ 10 files changed, 1050 insertions(+), 696 deletions(-) create mode 100644 app/src/version.h create mode 100644 app/src/zble_service copy.c create mode 100644 app/src/zble_service.c create mode 100644 app/src/zble_service.h diff --git a/.gitmodules b/.gitmodules index 478cd16..b409ede 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "sdk"] path = sdk url = zwsd@192.168.1.3:p_dynamic_electrocardiograph/nrf5_sdk_17_1_0.git +[submodule "libznordic"] + path = libznordic + url = zwsd@192.168.1.3:p_dynamic_electrocardiograph/libznordic.git diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index e1794c8..263d9f6 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -3,7 +3,9 @@ { "name": "nrf52833_xxaa", "includePath": [ + "libznordic\\include", "sdk\\config", + "app\\src", "sdk\\components", "sdk\\components\\ble\\ble_advertising", "sdk\\components\\ble\\ble_dtm", diff --git a/.vscode/settings.json b/.vscode/settings.json index 9f16f33..08b16d9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -25,6 +25,11 @@ "core_cm4.h": "c", "nrf52_to_nrf52833.h": "c", "compare": "c", - "type_traits": "c" + "type_traits": "c", + "stdint.h": "c", + "sys.h": "c", + "nrf_log.h": "c", + "version.h": "c", + "zble_service.h": "c" } } \ No newline at end of file diff --git a/app/app.uvoptx b/app/app.uvoptx index ad8ad06..58fd267 100644 --- a/app/app.uvoptx +++ b/app/app.uvoptx @@ -75,7 +75,7 @@ 1 0 - 0 + 1 5 @@ -253,9 +253,9 @@ 0 - 0 + 1 0 - 1 + 0 5 @@ -391,17 +391,29 @@ 0 0 + + 1 + 3 + 1 + 0 + 0 + 0 + .\src\zble_service.c + zble_service.c + 0 + 0 + Board Definition - 1 + 0 0 0 0 2 - 3 + 4 1 0 0 @@ -415,13 +427,13 @@ Board Support - 1 + 0 0 0 0 3 - 4 + 5 1 0 0 @@ -433,7 +445,7 @@ 3 - 5 + 6 1 0 0 @@ -447,13 +459,13 @@ UTF8/UTF16 converter - 1 + 0 0 0 0 4 - 6 + 7 1 0 0 @@ -467,13 +479,13 @@ nRF_BLE - 1 + 0 0 0 0 5 - 7 + 8 1 0 0 @@ -485,7 +497,7 @@ 5 - 8 + 9 1 0 0 @@ -497,7 +509,7 @@ 5 - 9 + 10 1 0 0 @@ -509,7 +521,7 @@ 5 - 10 + 11 1 0 0 @@ -521,7 +533,7 @@ 5 - 11 + 12 1 0 0 @@ -533,7 +545,7 @@ 5 - 12 + 13 1 0 0 @@ -545,7 +557,7 @@ 5 - 13 + 14 1 0 0 @@ -557,7 +569,7 @@ 5 - 14 + 15 1 0 0 @@ -577,7 +589,7 @@ 0 6 - 15 + 16 1 0 0 @@ -597,7 +609,7 @@ 0 7 - 16 + 17 1 0 0 @@ -609,7 +621,7 @@ 7 - 17 + 18 1 0 0 @@ -621,7 +633,7 @@ 7 - 18 + 19 1 0 0 @@ -633,7 +645,7 @@ 7 - 19 + 20 1 0 0 @@ -645,7 +657,7 @@ 7 - 20 + 21 1 0 0 @@ -657,7 +669,7 @@ 7 - 21 + 22 1 0 0 @@ -669,7 +681,7 @@ 7 - 22 + 23 1 0 0 @@ -681,7 +693,7 @@ 7 - 23 + 24 1 0 0 @@ -701,7 +713,7 @@ 0 8 - 24 + 25 1 0 0 @@ -713,7 +725,7 @@ 8 - 25 + 26 1 0 0 @@ -725,7 +737,7 @@ 8 - 26 + 27 1 0 0 @@ -737,7 +749,7 @@ 8 - 27 + 28 1 0 0 @@ -749,7 +761,7 @@ 8 - 28 + 29 1 0 0 @@ -761,7 +773,7 @@ 8 - 29 + 30 1 0 0 @@ -773,7 +785,7 @@ 8 - 30 + 31 1 0 0 @@ -785,7 +797,7 @@ 8 - 31 + 32 1 0 0 @@ -797,7 +809,7 @@ 8 - 32 + 33 1 0 0 @@ -809,7 +821,7 @@ 8 - 33 + 34 1 0 0 @@ -821,7 +833,7 @@ 8 - 34 + 35 1 0 0 @@ -833,7 +845,7 @@ 8 - 35 + 36 1 0 0 @@ -845,7 +857,7 @@ 8 - 36 + 37 1 0 0 @@ -857,7 +869,7 @@ 8 - 37 + 38 1 0 0 @@ -869,7 +881,7 @@ 8 - 38 + 39 1 0 0 @@ -881,7 +893,7 @@ 8 - 39 + 40 1 0 0 @@ -893,7 +905,7 @@ 8 - 40 + 41 1 0 0 @@ -905,7 +917,7 @@ 8 - 41 + 42 1 0 0 @@ -917,7 +929,7 @@ 8 - 42 + 43 1 0 0 @@ -929,7 +941,7 @@ 8 - 43 + 44 1 0 0 @@ -941,7 +953,7 @@ 8 - 44 + 45 1 0 0 @@ -953,7 +965,7 @@ 8 - 45 + 46 1 0 0 @@ -965,7 +977,7 @@ 8 - 46 + 47 1 0 0 @@ -977,7 +989,7 @@ 8 - 47 + 48 1 0 0 @@ -989,7 +1001,7 @@ 8 - 48 + 49 1 0 0 @@ -1009,7 +1021,7 @@ 0 9 - 49 + 50 1 0 0 @@ -1021,7 +1033,7 @@ 9 - 50 + 51 1 0 0 @@ -1033,7 +1045,7 @@ 9 - 51 + 52 1 0 0 @@ -1045,7 +1057,7 @@ 9 - 52 + 53 1 0 0 @@ -1057,7 +1069,7 @@ 9 - 53 + 54 1 0 0 @@ -1077,7 +1089,7 @@ 0 10 - 54 + 55 1 0 0 @@ -1089,7 +1101,7 @@ 10 - 55 + 56 1 0 0 @@ -1101,7 +1113,7 @@ 10 - 56 + 57 1 0 0 @@ -1121,7 +1133,7 @@ 0 11 - 57 + 58 1 0 0 @@ -1133,7 +1145,7 @@ 11 - 58 + 59 1 0 0 @@ -1145,7 +1157,7 @@ 11 - 59 + 60 1 0 0 @@ -1158,6 +1170,26 @@ + libznordic + 1 + 0 + 0 + 0 + + 12 + 61 + 1 + 0 + 0 + 0 + ..\libznordic\src\sys.c + sys.c + 0 + 0 + + + + ::CMSIS 0 0 diff --git a/app/app.uvprojx b/app/app.uvprojx index d35d7d6..135b2c0 100644 --- a/app/app.uvprojx +++ b/app/app.uvprojx @@ -336,10 +336,10 @@ 0 0 - --reduce_paths - 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 + --reduce_paths --diag_suppress=1295 --diag_suppress=1 + 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 - ..\sdk\config;..\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;.\config\ + ..\sdk\config;..\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;.\config\;.\src\;..\libznordic\include @@ -355,7 +355,7 @@ 1 --cpreproc_opts=-DAPP_TIMER_V2,-DAPP_TIMER_V2_RTC1_ENABLED,-DBOARD_PCA10100,-DCONFIG_GPIO_AS_PINRESET,-DFLOAT_ABI_HARD,-DNRF52833_XXAA,-DNRF_SD_BLE_API_VERSION=7,-DS140,-DSOFTDEVICE_PRESENT,-D__HEAP_SIZE=2048,-D__STACK_SIZE=2048 - 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 + 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 ..\sdk\config;..\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;.\config\ @@ -393,6 +393,11 @@ 1 main.c + + zble_service.c + 1 + .\src\zble_service.c + @@ -3638,6 +3643,16 @@ + libznordic + + + sys.c + 1 + ..\libznordic\src\sys.c + + + + ::CMSIS @@ -4032,6 +4047,11 @@ 1 main.c + + zble_service.c + 1 + .\src\zble_service.c + @@ -7277,6 +7297,16 @@ + libznordic + + + sys.c + 1 + ..\libznordic\src\sys.c + + + + ::CMSIS diff --git a/app/main.c b/app/main.c index 65c5813..f0c4dc1 100644 --- a/app/main.c +++ b/app/main.c @@ -1,632 +1,16 @@ -/** - * Copyright (c) 2014 - 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_sdk_uart_over_ble_main main.c - * @{ - * @ingroup ble_sdk_app_nus_eval - * @brief UART over BLE application main file. - * - * This file contains the source code for a sample application that uses the Nordic UART service. - * This application uses the @ref srvlib_conn_params module. - */ +#include "sys.h" +#include "version.h" +#include "zble_service.h" -#include -#include +zble_service_cfg_t cfg = {.deviceName = "iflytop"}; -#include "app_timer.h" -#include "app_uart.h" -#include "app_util_platform.h" -#include "ble_advdata.h" -#include "ble_advertising.h" -#include "ble_conn_params.h" -#include "ble_hci.h" -#include "ble_nus.h" -#include "bsp_btn_ble.h" -#include "nordic_common.h" -#include "nrf.h" -#include "nrf_ble_gatt.h" -#include "nrf_ble_qwr.h" -#include "nrf_pwr_mgmt.h" -#include "nrf_sdh.h" -#include "nrf_sdh_ble.h" -#include "nrf_sdh_soc.h" - -#if defined(UART_PRESENT) -#include "nrf_uart.h" -#endif -#if defined(UARTE_PRESENT) -#include "nrf_uarte.h" -#endif - -#include "nrf_log.h" -#include "nrf_log_ctrl.h" -#include "nrf_log_default_backends.h" - -#define APP_BLE_CONN_CFG_TAG 1 /**< A tag identifying the SoftDevice BLE configuration. */ - -#define DEVICE_NAME "Nordic_UART" /**< Name of device. Will be included in the advertising data. */ -#define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**< UUID type for the Nordic UART Service (vendor specific). */ - -#define APP_BLE_OBSERVER_PRIO 3 /**< Application's BLE observer priority. You shouldn't need to modify this value. */ - -#define APP_ADV_INTERVAL 64 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */ - -#define APP_ADV_DURATION 18000 /**< The advertising duration (180 seconds) in units of 10 milliseconds. */ - -#define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */ -#define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */ -#define SLAVE_LATENCY 0 /**< Slave latency. */ -#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */ -#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */ -#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */ -#define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */ - -#define DEAD_BEEF 0xDEADBEEF /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */ - -#define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */ -#define UART_RX_BUF_SIZE 256 /**< UART RX buffer size. */ - -BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT); /**< BLE NUS service instance. */ -NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */ -NRF_BLE_QWR_DEF(m_qwr); /**< Context for the Queued Write module.*/ -BLE_ADVERTISING_DEF(m_advertising); /**< Advertising module instance. */ - -static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**< Handle of the current connection. */ -static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3; /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */ -static ble_uuid_t m_adv_uuids[] = /**< Universally unique service identifier. */ - {{BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}}; - -/**@brief Function for assert macro callback. - * - * @details This function will be called in case of an assert in the SoftDevice. - * - * @warning This handler is an example only and does not fit a final product. You need to analyse - * how your product is supposed to react in case of Assert. - * @warning On assert from the SoftDevice, the system can only recover on reset. - * - * @param[in] line_num Line number of the failing ASSERT call. - * @param[in] p_file_name File name of the failing ASSERT call. - */ -void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name) { app_error_handler(DEAD_BEEF, line_num, p_file_name); } - -/**@brief Function for initializing the timer module. - */ -static void timers_init(void) { - ret_code_t err_code = app_timer_init(); - APP_ERROR_CHECK(err_code); -} - -/**@brief Function for the GAP initialization. - * - * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of - * the device. It also sets the permissions and appearance. - */ -static void gap_params_init(void) { - uint32_t err_code; - ble_gap_conn_params_t gap_conn_params; - ble_gap_conn_sec_mode_t sec_mode; - - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); - - err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME)); - APP_ERROR_CHECK(err_code); - - memset(&gap_conn_params, 0, sizeof(gap_conn_params)); - - gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; - gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; - gap_conn_params.slave_latency = SLAVE_LATENCY; - gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; - - err_code = sd_ble_gap_ppcp_set(&gap_conn_params); - APP_ERROR_CHECK(err_code); -} - -/**@brief Function for handling Queued Write Module errors. - * - * @details A pointer to this function will be passed to each service which may need to inform the - * application about an error. - * - * @param[in] nrf_error Error code containing information about what went wrong. - */ -static void nrf_qwr_error_handler(uint32_t nrf_error) { APP_ERROR_HANDLER(nrf_error); } - -/**@brief Function for handling the data from the Nordic UART Service. - * - * @details This function will process the data received from the Nordic UART BLE Service and send - * it to the UART module. - * - * @param[in] p_evt Nordic UART Service event. - */ -/**@snippet [Handling the data received over BLE] */ -static void nus_data_handler(ble_nus_evt_t *p_evt) { - if (p_evt->type == BLE_NUS_EVT_RX_DATA) { - uint32_t err_code; - - NRF_LOG_DEBUG("Received data from BLE NUS. Writing data on UART."); - NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length); - - for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++) { - do { - err_code = app_uart_put(p_evt->params.rx_data.p_data[i]); - if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY)) { - NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code); - APP_ERROR_CHECK(err_code); - } - } while (err_code == NRF_ERROR_BUSY); - } - if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '\r') { - while (app_uart_put('\n') == NRF_ERROR_BUSY) - ; - } - } -} -/**@snippet [Handling the data received over BLE] */ - -/**@brief Function for initializing services that will be used by the application. - */ -static void services_init(void) { - uint32_t err_code; - ble_nus_init_t nus_init; - nrf_ble_qwr_init_t qwr_init = {0}; - - // Initialize Queued Write Module. - qwr_init.error_handler = nrf_qwr_error_handler; - - err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init); - APP_ERROR_CHECK(err_code); - - // Initialize NUS. - memset(&nus_init, 0, sizeof(nus_init)); - - nus_init.data_handler = nus_data_handler; - - err_code = ble_nus_init(&m_nus, &nus_init); - APP_ERROR_CHECK(err_code); -} - -/**@brief Function for handling an event from the Connection Parameters Module. - * - * @details This function will be called for all events in the Connection Parameters Module - * which are passed to the application. - * - * @note All this function does is to disconnect. This could have been done by simply setting - * the disconnect_on_fail config parameter, but instead we use the event handler - * mechanism to demonstrate its use. - * - * @param[in] p_evt Event received from the Connection Parameters Module. - */ -static void on_conn_params_evt(ble_conn_params_evt_t *p_evt) { - uint32_t err_code; - - if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED) { - err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE); - APP_ERROR_CHECK(err_code); - } -} - -/**@brief Function for handling errors from the Connection Parameters module. - * - * @param[in] nrf_error Error code containing information about what went wrong. - */ -static void conn_params_error_handler(uint32_t nrf_error) { APP_ERROR_HANDLER(nrf_error); } - -/**@brief Function for initializing the Connection Parameters module. - */ -static void conn_params_init(void) { - uint32_t err_code; - ble_conn_params_init_t cp_init; - - memset(&cp_init, 0, sizeof(cp_init)); - - cp_init.p_conn_params = NULL; - cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; - cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; - cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; - cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; - cp_init.disconnect_on_fail = false; - cp_init.evt_handler = on_conn_params_evt; - cp_init.error_handler = conn_params_error_handler; - - err_code = ble_conn_params_init(&cp_init); - APP_ERROR_CHECK(err_code); -} - -/**@brief Function for putting the chip into sleep mode. - * - * @note This function will not return. - */ -static void sleep_mode_enter(void) { - uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE); - APP_ERROR_CHECK(err_code); - - // Prepare wakeup buttons. - err_code = bsp_btn_ble_sleep_mode_prepare(); - APP_ERROR_CHECK(err_code); - - // Go to system-off mode (this function will not return; wakeup will cause a reset). - err_code = sd_power_system_off(); - APP_ERROR_CHECK(err_code); -} - -/**@brief Function for handling advertising events. - * - * @details This function will be called for advertising events which are passed to the application. - * - * @param[in] ble_adv_evt Advertising event. - */ -static void on_adv_evt(ble_adv_evt_t ble_adv_evt) { - uint32_t err_code; - - switch (ble_adv_evt) { - case BLE_ADV_EVT_FAST: - err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING); - APP_ERROR_CHECK(err_code); - break; - case BLE_ADV_EVT_IDLE: - sleep_mode_enter(); - break; - default: - break; - } -} - -/**@brief Function for handling BLE events. - * - * @param[in] p_ble_evt Bluetooth stack event. - * @param[in] p_context Unused. - */ -static void ble_evt_handler(ble_evt_t const *p_ble_evt, void *p_context) { - uint32_t err_code; - - switch (p_ble_evt->header.evt_id) { - case BLE_GAP_EVT_CONNECTED: - NRF_LOG_INFO("Connected"); - err_code = bsp_indication_set(BSP_INDICATE_CONNECTED); - APP_ERROR_CHECK(err_code); - m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle; - err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle); - APP_ERROR_CHECK(err_code); - break; - - case BLE_GAP_EVT_DISCONNECTED: - NRF_LOG_INFO("Disconnected"); - // LED indication will be changed when advertising starts. - m_conn_handle = BLE_CONN_HANDLE_INVALID; - break; - - case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { - NRF_LOG_DEBUG("PHY update request."); - ble_gap_phys_t const phys = { - .rx_phys = BLE_GAP_PHY_AUTO, - .tx_phys = BLE_GAP_PHY_AUTO, - }; - err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys); - APP_ERROR_CHECK(err_code); - } break; - - case BLE_GAP_EVT_SEC_PARAMS_REQUEST: - // Pairing not supported - err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); - APP_ERROR_CHECK(err_code); - break; - - case BLE_GATTS_EVT_SYS_ATTR_MISSING: - // No system attributes have been stored. - err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0); - APP_ERROR_CHECK(err_code); - break; - - case BLE_GATTC_EVT_TIMEOUT: - // Disconnect on GATT Client timeout event. - err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); - APP_ERROR_CHECK(err_code); - break; - - case BLE_GATTS_EVT_TIMEOUT: - // Disconnect on GATT Server timeout event. - err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); - APP_ERROR_CHECK(err_code); - break; - - default: - // No implementation needed. - break; - } -} - -/**@brief Function for the SoftDevice initialization. - * - * @details This function initializes the SoftDevice and the BLE event interrupt. - */ -static void ble_stack_init(void) { - ret_code_t err_code; - - err_code = nrf_sdh_enable_request(); - APP_ERROR_CHECK(err_code); - - // Configure the BLE stack using the default settings. - // Fetch the start address of the application RAM. - uint32_t ram_start = 0; - err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start); - APP_ERROR_CHECK(err_code); - - // Enable BLE stack. - err_code = nrf_sdh_ble_enable(&ram_start); - APP_ERROR_CHECK(err_code); - - // Register a handler for BLE events. - NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL); -} - -/**@brief Function for handling events from the GATT library. */ -void gatt_evt_handler(nrf_ble_gatt_t *p_gatt, nrf_ble_gatt_evt_t const *p_evt) { - if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED)) { - m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH; - NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len); - } - NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x", p_gatt->att_mtu_desired_central, p_gatt->att_mtu_desired_periph); -} - -/**@brief Function for initializing the GATT library. */ -void gatt_init(void) { - ret_code_t err_code; - - err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler); - APP_ERROR_CHECK(err_code); - - err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE); - APP_ERROR_CHECK(err_code); -} - -/**@brief Function for handling events from the BSP module. - * - * @param[in] event Event generated by button press. - */ -void bsp_event_handler(bsp_event_t event) { - uint32_t err_code; - switch (event) { - case BSP_EVENT_SLEEP: - sleep_mode_enter(); - break; - - case BSP_EVENT_DISCONNECT: - err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); - if (err_code != NRF_ERROR_INVALID_STATE) { - APP_ERROR_CHECK(err_code); - } - break; - - case BSP_EVENT_WHITELIST_OFF: - if (m_conn_handle == BLE_CONN_HANDLE_INVALID) { - err_code = ble_advertising_restart_without_whitelist(&m_advertising); - if (err_code != NRF_ERROR_INVALID_STATE) { - APP_ERROR_CHECK(err_code); - } - } - break; - - default: - break; - } -} - -/**@brief Function for handling app_uart events. - * - * @details This function will receive a single character from the app_uart module and append it to - * a string. The string will be be sent over BLE when the last character received was a - * 'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length. - */ -/**@snippet [Handling the data received over UART] */ -void uart_event_handle(app_uart_evt_t *p_event) { - static uint8_t data_array[BLE_NUS_MAX_DATA_LEN]; - static uint8_t index = 0; - uint32_t err_code; - - switch (p_event->evt_type) { - case APP_UART_DATA_READY: - UNUSED_VARIABLE(app_uart_get(&data_array[index])); - index++; - - if ((data_array[index - 1] == '\n') || (data_array[index - 1] == '\r') || (index >= m_ble_nus_max_data_len)) { - if (index > 1) { - NRF_LOG_DEBUG("Ready to send data over BLE NUS"); - NRF_LOG_HEXDUMP_DEBUG(data_array, index); - - do { - uint16_t length = (uint16_t)index; - err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle); - if ((err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_RESOURCES) && (err_code != NRF_ERROR_NOT_FOUND)) { - APP_ERROR_CHECK(err_code); - } - } while (err_code == NRF_ERROR_RESOURCES); - } - - index = 0; - } - break; - - case APP_UART_COMMUNICATION_ERROR: - APP_ERROR_HANDLER(p_event->data.error_communication); - break; - - case APP_UART_FIFO_ERROR: - APP_ERROR_HANDLER(p_event->data.error_code); - break; - - default: - break; - } -} -/**@snippet [Handling the data received over UART] */ - -/**@brief Function for initializing the UART module. - */ -/**@snippet [UART Initialization] */ -static void uart_init(void) { - uint32_t err_code; - app_uart_comm_params_t const comm_params = { - .rx_pin_no = RX_PIN_NUMBER, - .tx_pin_no = TX_PIN_NUMBER, - .rts_pin_no = RTS_PIN_NUMBER, - .cts_pin_no = CTS_PIN_NUMBER, - .flow_control = APP_UART_FLOW_CONTROL_DISABLED, - .use_parity = false, -#if defined(UART_PRESENT) - .baud_rate = NRF_UART_BAUDRATE_115200 -#else - .baud_rate = NRF_UARTE_BAUDRATE_115200 -#endif - }; - - APP_UART_FIFO_INIT(&comm_params, UART_RX_BUF_SIZE, UART_TX_BUF_SIZE, uart_event_handle, APP_IRQ_PRIORITY_LOWEST, err_code); - APP_ERROR_CHECK(err_code); -} -/**@snippet [UART Initialization] */ - -/**@brief Function for initializing the Advertising functionality. - */ -static void advertising_init(void) { - uint32_t err_code; - ble_advertising_init_t init; - - memset(&init, 0, sizeof(init)); - - init.advdata.name_type = BLE_ADVDATA_FULL_NAME; - init.advdata.include_appearance = false; - init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE; - - init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); - init.srdata.uuids_complete.p_uuids = m_adv_uuids; - - init.config.ble_adv_fast_enabled = true; - init.config.ble_adv_fast_interval = APP_ADV_INTERVAL; - init.config.ble_adv_fast_timeout = APP_ADV_DURATION; - init.evt_handler = on_adv_evt; - - err_code = ble_advertising_init(&m_advertising, &init); - APP_ERROR_CHECK(err_code); - - ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG); -} - -/**@brief Function for initializing buttons and leds. - * - * @param[out] p_erase_bonds Will be true if the clear bonding button was pressed to wake the application up. - */ -static void buttons_leds_init(bool *p_erase_bonds) { - bsp_event_t startup_event; - - uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler); - APP_ERROR_CHECK(err_code); - - err_code = bsp_btn_ble_init(NULL, &startup_event); - APP_ERROR_CHECK(err_code); - - *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA); -} - -/**@brief Function for initializing the nrf log module. - */ -static void log_init(void) { - ret_code_t err_code = NRF_LOG_INIT(NULL); - APP_ERROR_CHECK(err_code); - - NRF_LOG_DEFAULT_BACKENDS_INIT(); -} - -/**@brief Function for initializing power management. - */ -static void power_management_init(void) { - ret_code_t err_code; - err_code = nrf_pwr_mgmt_init(); - APP_ERROR_CHECK(err_code); -} - -/**@brief Function for handling the idle state (main loop). - * - * @details If there is no pending log operation, then sleep until next the next event occurs. - */ -static void idle_state_handle(void) { - if (NRF_LOG_PROCESS() == false) { - nrf_pwr_mgmt_run(); - } -} - -/**@brief Function for starting advertising. - */ -static void advertising_start(void) { - uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST); - APP_ERROR_CHECK(err_code); -} - -/**@brief Application main function. - */ int main(void) { - bool erase_bonds; - // Initialize. - uart_init(); - log_init(); + zsys_init(); - timers_init(); - buttons_leds_init(&erase_bonds); - power_management_init(); - ble_stack_init(); - gap_params_init(); - gatt_init(); - services_init(); - advertising_init(); - conn_params_init(); - - // Start execution. - printf("\r\nUART started.\r\n"); - NRF_LOG_INFO("Debug logging for UART over RTT started."); - advertising_start(); - - // Enter main loop. - for (;;) { - idle_state_handle(); - } + NRF_LOG_INFO("compile time :%s", __TIME__); + NRF_LOG_INFO("Version :%d", VERSION); + NRF_LOG_INFO("Manufacturer :%s", MANUFACTURER_NAME); + + zble_service_init(&cfg); + zsys_loop(); } - -/** - * @} - */ diff --git a/app/src/version.h b/app/src/version.h new file mode 100644 index 0000000..0c3edf1 --- /dev/null +++ b/app/src/version.h @@ -0,0 +1,3 @@ +#pragma once +#define VERSION 1 +#define MANUFACTURER_NAME "iflytop" \ No newline at end of file diff --git a/app/src/zble_service copy.c b/app/src/zble_service copy.c new file mode 100644 index 0000000..b098a86 --- /dev/null +++ b/app/src/zble_service copy.c @@ -0,0 +1,584 @@ + + +#include +#include + +#include "app_timer.h" +#include "app_uart.h" +#include "app_util_platform.h" +#include "ble_advdata.h" +#include "ble_advertising.h" +#include "ble_conn_params.h" +#include "ble_hci.h" +#include "ble_nus.h" +#include "bsp_btn_ble.h" +#include "nordic_common.h" +#include "nrf.h" +#include "nrf_ble_gatt.h" +#include "nrf_ble_qwr.h" +#include "nrf_pwr_mgmt.h" +#include "nrf_sdh.h" +#include "nrf_sdh_ble.h" +#include "nrf_sdh_soc.h" + +#if defined(UART_PRESENT) +#include "nrf_uart.h" +#endif +#if defined(UARTE_PRESENT) +#include "nrf_uarte.h" +#endif + +#include "nrf_log.h" +#include "nrf_log_ctrl.h" +#include "nrf_log_default_backends.h" + +#define APP_BLE_CONN_CFG_TAG 1 /**< A tag identifying the SoftDevice BLE configuration. */ + +#define DEVICE_NAME "Nordic_UART" /**< Name of device. Will be included in the advertising data. */ +#define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**< UUID type for the Nordic UART Service (vendor specific). */ + +#define APP_BLE_OBSERVER_PRIO 3 /**< Application's BLE observer priority. You shouldn't need to modify this value. */ + +#define APP_ADV_INTERVAL 64 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */ + +#define APP_ADV_DURATION 18000 /**< The advertising duration (180 seconds) in units of 10 milliseconds. */ + +#define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */ +#define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */ +#define SLAVE_LATENCY 0 /**< Slave latency. */ +#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */ +#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */ +#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */ +#define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */ + +#define DEAD_BEEF 0xDEADBEEF /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */ + +#define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */ +#define UART_RX_BUF_SIZE 256 /**< UART RX buffer size. */ + +BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT); /**< BLE NUS service instance. */ +NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */ +NRF_BLE_QWR_DEF(m_qwr); /**< Context for the Queued Write module.*/ +BLE_ADVERTISING_DEF(m_advertising); /**< Advertising module instance. */ + +static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**< Handle of the current connection. */ +static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3; /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */ +static ble_uuid_t m_adv_uuids[] = /**< Universally unique service identifier. */ + {{BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}}; + +/**@brief Function for assert macro callback. + * + * @details This function will be called in case of an assert in the SoftDevice. + * + * @warning This handler is an example only and does not fit a final product. You need to analyse + * how your product is supposed to react in case of Assert. + * @warning On assert from the SoftDevice, the system can only recover on reset. + * + * @param[in] line_num Line number of the failing ASSERT call. + * @param[in] p_file_name File name of the failing ASSERT call. + */ +void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name) { app_error_handler(DEAD_BEEF, line_num, p_file_name); } + +/**@brief Function for initializing the timer module. + */ +static void timers_init(void) { + ret_code_t err_code = app_timer_init(); + APP_ERROR_CHECK(err_code); +} + +/**@brief Function for the GAP initialization. + * + * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of + * the device. It also sets the permissions and appearance. + */ +static void gap_params_init(void) { + uint32_t err_code; + ble_gap_conn_params_t gap_conn_params; + ble_gap_conn_sec_mode_t sec_mode; + + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); + + err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME)); + APP_ERROR_CHECK(err_code); + + memset(&gap_conn_params, 0, sizeof(gap_conn_params)); + + gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; + gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; + gap_conn_params.slave_latency = SLAVE_LATENCY; + gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; + + err_code = sd_ble_gap_ppcp_set(&gap_conn_params); + APP_ERROR_CHECK(err_code); +} + +/**@brief Function for handling Queued Write Module errors. + * + * @details A pointer to this function will be passed to each service which may need to inform the + * application about an error. + * + * @param[in] nrf_error Error code containing information about what went wrong. + */ +static void nrf_qwr_error_handler(uint32_t nrf_error) { APP_ERROR_HANDLER(nrf_error); } + +/**@brief Function for handling the data from the Nordic UART Service. + * + * @details This function will process the data received from the Nordic UART BLE Service and send + * it to the UART module. + * + * @param[in] p_evt Nordic UART Service event. + */ +/**@snippet [Handling the data received over BLE] */ +static void nus_data_handler(ble_nus_evt_t *p_evt) { + if (p_evt->type == BLE_NUS_EVT_RX_DATA) { + uint32_t err_code; + + NRF_LOG_DEBUG("Received data from BLE NUS. Writing data on UART."); + NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length); + + for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++) { + do { + err_code = app_uart_put(p_evt->params.rx_data.p_data[i]); + if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY)) { + NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code); + APP_ERROR_CHECK(err_code); + } + } while (err_code == NRF_ERROR_BUSY); + } + if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '\r') { + while (app_uart_put('\n') == NRF_ERROR_BUSY) + ; + } + } +} +/**@snippet [Handling the data received over BLE] */ + +/**@brief Function for initializing services that will be used by the application. + */ +static void services_init(void) { + uint32_t err_code; + ble_nus_init_t nus_init; + nrf_ble_qwr_init_t qwr_init = {0}; + + // Initialize Queued Write Module. + qwr_init.error_handler = nrf_qwr_error_handler; + + err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init); + APP_ERROR_CHECK(err_code); + + // Initialize NUS. + memset(&nus_init, 0, sizeof(nus_init)); + + nus_init.data_handler = nus_data_handler; + + err_code = ble_nus_init(&m_nus, &nus_init); + APP_ERROR_CHECK(err_code); +} + +/**@brief Function for handling an event from the Connection Parameters Module. + * + * @details This function will be called for all events in the Connection Parameters Module + * which are passed to the application. + * + * @note All this function does is to disconnect. This could have been done by simply setting + * the disconnect_on_fail config parameter, but instead we use the event handler + * mechanism to demonstrate its use. + * + * @param[in] p_evt Event received from the Connection Parameters Module. + */ +static void on_conn_params_evt(ble_conn_params_evt_t *p_evt) { + uint32_t err_code; + + if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED) { + err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE); + APP_ERROR_CHECK(err_code); + } +} + +/**@brief Function for handling errors from the Connection Parameters module. + * + * @param[in] nrf_error Error code containing information about what went wrong. + */ +static void conn_params_error_handler(uint32_t nrf_error) { APP_ERROR_HANDLER(nrf_error); } + +/**@brief Function for initializing the Connection Parameters module. + */ +static void conn_params_init(void) { + uint32_t err_code; + ble_conn_params_init_t cp_init; + + memset(&cp_init, 0, sizeof(cp_init)); + + cp_init.p_conn_params = NULL; + cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; + cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; + cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; + cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; + cp_init.disconnect_on_fail = false; + cp_init.evt_handler = on_conn_params_evt; + cp_init.error_handler = conn_params_error_handler; + + err_code = ble_conn_params_init(&cp_init); + APP_ERROR_CHECK(err_code); +} + +/**@brief Function for putting the chip into sleep mode. + * + * @note This function will not return. + */ +static void sleep_mode_enter(void) { + uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE); + APP_ERROR_CHECK(err_code); + + // Prepare wakeup buttons. + err_code = bsp_btn_ble_sleep_mode_prepare(); + APP_ERROR_CHECK(err_code); + + // Go to system-off mode (this function will not return; wakeup will cause a reset). + err_code = sd_power_system_off(); + APP_ERROR_CHECK(err_code); +} + +/**@brief Function for handling advertising events. + * + * @details This function will be called for advertising events which are passed to the application. + * + * @param[in] ble_adv_evt Advertising event. + */ +static void on_adv_evt(ble_adv_evt_t ble_adv_evt) { + uint32_t err_code; + + switch (ble_adv_evt) { + case BLE_ADV_EVT_FAST: + err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING); + APP_ERROR_CHECK(err_code); + break; + case BLE_ADV_EVT_IDLE: + sleep_mode_enter(); + break; + default: + break; + } +} + +/**@brief Function for handling BLE events. + * + * @param[in] p_ble_evt Bluetooth stack event. + * @param[in] p_context Unused. + */ +static void ble_evt_handler(ble_evt_t const *p_ble_evt, void *p_context) { + uint32_t err_code; + + switch (p_ble_evt->header.evt_id) { + case BLE_GAP_EVT_CONNECTED: + NRF_LOG_INFO("Connected"); + err_code = bsp_indication_set(BSP_INDICATE_CONNECTED); + APP_ERROR_CHECK(err_code); + m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle; + err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle); + APP_ERROR_CHECK(err_code); + break; + + case BLE_GAP_EVT_DISCONNECTED: + NRF_LOG_INFO("Disconnected"); + // LED indication will be changed when advertising starts. + m_conn_handle = BLE_CONN_HANDLE_INVALID; + break; + + case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { + NRF_LOG_DEBUG("PHY update request."); + ble_gap_phys_t const phys = { + .rx_phys = BLE_GAP_PHY_AUTO, + .tx_phys = BLE_GAP_PHY_AUTO, + }; + err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys); + APP_ERROR_CHECK(err_code); + } break; + + case BLE_GAP_EVT_SEC_PARAMS_REQUEST: + // Pairing not supported + err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); + APP_ERROR_CHECK(err_code); + break; + + case BLE_GATTS_EVT_SYS_ATTR_MISSING: + // No system attributes have been stored. + err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0); + APP_ERROR_CHECK(err_code); + break; + + case BLE_GATTC_EVT_TIMEOUT: + // Disconnect on GATT Client timeout event. + err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); + APP_ERROR_CHECK(err_code); + break; + + case BLE_GATTS_EVT_TIMEOUT: + // Disconnect on GATT Server timeout event. + err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); + APP_ERROR_CHECK(err_code); + break; + + default: + // No implementation needed. + break; + } +} + +/**@brief Function for the SoftDevice initialization. + * + * @details This function initializes the SoftDevice and the BLE event interrupt. + */ +static void ble_stack_init(void) { + ret_code_t err_code; + + err_code = nrf_sdh_enable_request(); + APP_ERROR_CHECK(err_code); + + // Configure the BLE stack using the default settings. + // Fetch the start address of the application RAM. + uint32_t ram_start = 0; + err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start); + APP_ERROR_CHECK(err_code); + + // Enable BLE stack. + err_code = nrf_sdh_ble_enable(&ram_start); + APP_ERROR_CHECK(err_code); + + // Register a handler for BLE events. + NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL); +} + +/**@brief Function for handling events from the GATT library. */ +void gatt_evt_handler(nrf_ble_gatt_t *p_gatt, nrf_ble_gatt_evt_t const *p_evt) { + if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED)) { + m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH; + NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len); + } + NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x", p_gatt->att_mtu_desired_central, p_gatt->att_mtu_desired_periph); +} + +/**@brief Function for initializing the GATT library. */ +void gatt_init(void) { + ret_code_t err_code; + + err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler); + APP_ERROR_CHECK(err_code); + + err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE); + APP_ERROR_CHECK(err_code); +} + +/**@brief Function for handling events from the BSP module. + * + * @param[in] event Event generated by button press. + */ +void bsp_event_handler(bsp_event_t event) { + uint32_t err_code; + switch (event) { + case BSP_EVENT_SLEEP: + sleep_mode_enter(); + break; + + case BSP_EVENT_DISCONNECT: + err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); + if (err_code != NRF_ERROR_INVALID_STATE) { + APP_ERROR_CHECK(err_code); + } + break; + + case BSP_EVENT_WHITELIST_OFF: + if (m_conn_handle == BLE_CONN_HANDLE_INVALID) { + err_code = ble_advertising_restart_without_whitelist(&m_advertising); + if (err_code != NRF_ERROR_INVALID_STATE) { + APP_ERROR_CHECK(err_code); + } + } + break; + + default: + break; + } +} + +/**@brief Function for handling app_uart events. + * + * @details This function will receive a single character from the app_uart module and append it to + * a string. The string will be be sent over BLE when the last character received was a + * 'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length. + */ +/**@snippet [Handling the data received over UART] */ +void uart_event_handle(app_uart_evt_t *p_event) { + static uint8_t data_array[BLE_NUS_MAX_DATA_LEN]; + static uint8_t index = 0; + uint32_t err_code; + + switch (p_event->evt_type) { + case APP_UART_DATA_READY: + UNUSED_VARIABLE(app_uart_get(&data_array[index])); + index++; + + if ((data_array[index - 1] == '\n') || (data_array[index - 1] == '\r') || (index >= m_ble_nus_max_data_len)) { + if (index > 1) { + NRF_LOG_DEBUG("Ready to send data over BLE NUS"); + NRF_LOG_HEXDUMP_DEBUG(data_array, index); + + do { + uint16_t length = (uint16_t)index; + err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle); + if ((err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_RESOURCES) && (err_code != NRF_ERROR_NOT_FOUND)) { + APP_ERROR_CHECK(err_code); + } + } while (err_code == NRF_ERROR_RESOURCES); + } + + index = 0; + } + break; + + case APP_UART_COMMUNICATION_ERROR: + APP_ERROR_HANDLER(p_event->data.error_communication); + break; + + case APP_UART_FIFO_ERROR: + APP_ERROR_HANDLER(p_event->data.error_code); + break; + + default: + break; + } +} +/**@snippet [Handling the data received over UART] */ + +/**@brief Function for initializing the UART module. + */ +/**@snippet [UART Initialization] */ +static void uart_init(void) { + uint32_t err_code; + app_uart_comm_params_t const comm_params = { + .rx_pin_no = RX_PIN_NUMBER, + .tx_pin_no = TX_PIN_NUMBER, + .rts_pin_no = RTS_PIN_NUMBER, + .cts_pin_no = CTS_PIN_NUMBER, + .flow_control = APP_UART_FLOW_CONTROL_DISABLED, + .use_parity = false, +#if defined(UART_PRESENT) + .baud_rate = NRF_UART_BAUDRATE_115200 +#else + .baud_rate = NRF_UARTE_BAUDRATE_115200 +#endif + }; + + APP_UART_FIFO_INIT(&comm_params, UART_RX_BUF_SIZE, UART_TX_BUF_SIZE, uart_event_handle, APP_IRQ_PRIORITY_LOWEST, err_code); + APP_ERROR_CHECK(err_code); +} +/**@snippet [UART Initialization] */ + +/**@brief Function for initializing the Advertising functionality. + */ +static void advertising_init(void) { + uint32_t err_code; + ble_advertising_init_t init; + + memset(&init, 0, sizeof(init)); + + init.advdata.name_type = BLE_ADVDATA_FULL_NAME; + init.advdata.include_appearance = false; + init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE; + + init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); + init.srdata.uuids_complete.p_uuids = m_adv_uuids; + + init.config.ble_adv_fast_enabled = true; + init.config.ble_adv_fast_interval = APP_ADV_INTERVAL; + init.config.ble_adv_fast_timeout = APP_ADV_DURATION; + init.evt_handler = on_adv_evt; + + err_code = ble_advertising_init(&m_advertising, &init); + APP_ERROR_CHECK(err_code); + + ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG); +} + +/**@brief Function for initializing buttons and leds. + * + * @param[out] p_erase_bonds Will be true if the clear bonding button was pressed to wake the application up. + */ +static void buttons_leds_init(bool *p_erase_bonds) { + bsp_event_t startup_event; + + uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler); + APP_ERROR_CHECK(err_code); + + err_code = bsp_btn_ble_init(NULL, &startup_event); + APP_ERROR_CHECK(err_code); + + *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA); +} + +/**@brief Function for initializing the nrf log module. + */ +static void log_init(void) { + ret_code_t err_code = NRF_LOG_INIT(NULL); + APP_ERROR_CHECK(err_code); + + NRF_LOG_DEFAULT_BACKENDS_INIT(); +} + +/**@brief Function for initializing power management. + */ +static void power_management_init(void) { + ret_code_t err_code; + err_code = nrf_pwr_mgmt_init(); + APP_ERROR_CHECK(err_code); +} + +/**@brief Function for handling the idle state (main loop). + * + * @details If there is no pending log operation, then sleep until next the next event occurs. + */ +static void idle_state_handle(void) { + if (NRF_LOG_PROCESS() == false) { + nrf_pwr_mgmt_run(); + } +} + +/**@brief Function for starting advertising. + */ +static void advertising_start(void) { + uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST); + APP_ERROR_CHECK(err_code); +} + +/**@brief Application main function. + */ +int main(void) { + bool erase_bonds; + // // Initialize. + // uart_init(); + // log_init(); + + // timers_init(); + // buttons_leds_init(&erase_bonds); + // power_management_init(); + // ble_stack_init(); + // gap_params_init(); + // gatt_init(); + services_init(); + advertising_init(); + conn_params_init(); + + // Start execution. + printf("\r\nUART started.\r\n"); + NRF_LOG_INFO("Debug logging for UART over RTT started."); + advertising_start(); + + // Enter main loop. + for (;;) { + idle_state_handle(); + } +} + +/** + * @} + */ diff --git a/app/src/zble_service.c b/app/src/zble_service.c new file mode 100644 index 0000000..3910973 --- /dev/null +++ b/app/src/zble_service.c @@ -0,0 +1,284 @@ + + +#include "zble_service.h" + +#include +#include + +#include "sys.h" +BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT); /**< BLE NUS service instance. */ +NRF_BLE_QWR_DEF(m_qwr); /**< Context for the Queued Write module.*/ +/******************************************************************************* + * 广播包配置 * + *******************************************************************************/ +#define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */ +#define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */ +#define SLAVE_LATENCY 0 /**< Slave latency. */ +#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */ +#define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**< UUID type for the Nordic UART Service (vendor specific). */ +static ble_uuid_t m_adv_uuids[] = /**< Universally unique service identifier. */ + {{BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}}; +#define APP_ADV_INTERVAL 64 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */ +#define APP_ADV_DURATION 18000 /**< The advertising duration (180 seconds) in units of 10 milliseconds. */ +BLE_ADVERTISING_DEF(m_advertising); /**< Advertising module instance. */ +#define APP_BLE_CONN_CFG_TAG 1 /**< A tag identifying the SoftDevice BLE configuration. */ + +/******************************************************************************* + * GATT配置 * + *******************************************************************************/ +NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */ + +/******************************************************************************* + * 连接参数配置 * + *******************************************************************************/ +#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */ +#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */ +#define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */ + +/******************************************************************************* + * CODE * + *******************************************************************************/ + +static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**< 当前连接句柄 */ +static uint16_t m_mtu_size = BLE_GATT_ATT_MTU_DEFAULT - 3; + +/**@brief Function for putting the chip into sleep mode. + * + * @note This function will not return. + */ +static void sleep_mode_enter(void) { +#if 0 + uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE); + APP_ERROR_CHECK(err_code); + + // Prepare wakeup buttons. + err_code = bsp_btn_ble_sleep_mode_prepare(); + APP_ERROR_CHECK(err_code); + + // Go to system-off mode (this function will not return; wakeup will cause a reset). + err_code = sd_power_system_off(); + APP_ERROR_CHECK(err_code); +#endif +} + +static void ble_evt_handler(ble_evt_t const* p_ble_evt, void* p_context) { + uint32_t err_code; + switch (p_ble_evt->header.evt_id) { + case BLE_GAP_EVT_CONNECTED: + NRF_LOG_INFO("Connected"); + m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle; + break; + + case BLE_GAP_EVT_DISCONNECTED: + NRF_LOG_INFO("Disconnected"); + m_conn_handle = BLE_CONN_HANDLE_INVALID; + break; + + case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { + NRF_LOG_DEBUG("PHY update request."); + ble_gap_phys_t const phys = { + .rx_phys = BLE_GAP_PHY_AUTO, + .tx_phys = BLE_GAP_PHY_AUTO, + }; + err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys); + APP_ERROR_CHECK(err_code); + } break; + + case BLE_GAP_EVT_SEC_PARAMS_REQUEST: + // Pairing not supported + err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); + APP_ERROR_CHECK(err_code); + break; + + case BLE_GATTS_EVT_SYS_ATTR_MISSING: + // No system attributes have been stored. + err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0); + APP_ERROR_CHECK(err_code); + break; + + case BLE_GATTC_EVT_TIMEOUT: + // Disconnect on GATT Client timeout event. + err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); + APP_ERROR_CHECK(err_code); + break; + + case BLE_GATTS_EVT_TIMEOUT: + // Disconnect on GATT Server timeout event. + err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); + APP_ERROR_CHECK(err_code); + break; + + default: + // No implementation needed. + break; + } +} +static void gatt_evt_handler(nrf_ble_gatt_t* p_gatt, nrf_ble_gatt_evt_t const* p_evt) { + /******************************************************************************* + * MTU SIZE 更新 * + *******************************************************************************/ + if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED)) { + m_mtu_size = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH; + NRF_LOG_DEBUG("ATT MTU exchange completed. central %d peripheral %d", p_gatt->att_mtu_desired_central, p_gatt->att_mtu_desired_periph); + } +} +static void on_conn_params_evt(ble_conn_params_evt_t* p_evt) { + uint32_t err_code; + if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED) { + err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE); + APP_ERROR_CHECK(err_code); + } +} +static void conn_params_error_handler(uint32_t nrf_error) { APP_ERROR_HANDLER(nrf_error); } +static void on_adv_evt(ble_adv_evt_t ble_adv_evt) { + uint32_t err_code; + switch (ble_adv_evt) { + case BLE_ADV_EVT_FAST: + err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING); + APP_ERROR_CHECK(err_code); + break; + case BLE_ADV_EVT_IDLE: + sleep_mode_enter(); + break; + default: + break; + } +} + +void zble_service_start_adv() { + uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST); + APP_ERROR_CHECK(err_code); +} +void zble_service_stop_adv() {} + +/******************************************************************************* + * INIT * + *******************************************************************************/ +void zble_service_init(zble_service_cfg_t* cfg) { + /** + * @brief + * 初始化蓝牙协议栈,并注册蓝牙事件处理函数,固定代码,勿修改 + */ + { + ret_code_t err_code; + err_code = nrf_sdh_enable_request(); + APP_ERROR_CHECK(err_code); + uint32_t ram_start = 0; + err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start); + APP_ERROR_CHECK(err_code); + // Enable BLE stack. + err_code = nrf_sdh_ble_enable(&ram_start); + APP_ERROR_CHECK(err_code); + // Register a handler for BLE events. + NRF_SDH_BLE_OBSERVER(m_ble_observer, 3, ble_evt_handler, NULL); + } + /******************************************************************************* + * GAP初始化 * + *******************************************************************************/ + { + uint32_t err_code; + ble_gap_conn_params_t gap_conn_params; + ble_gap_conn_sec_mode_t sec_mode; + + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); + + err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t*)cfg->deviceName, strlen(cfg->deviceName)); + APP_ERROR_CHECK(err_code); + + memset(&gap_conn_params, 0, sizeof(gap_conn_params)); + + gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; + gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; + gap_conn_params.slave_latency = SLAVE_LATENCY; + gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; + + err_code = sd_ble_gap_ppcp_set(&gap_conn_params); + APP_ERROR_CHECK(err_code); + } + + /******************************************************************************* + * GATT 初始化 * + *******************************************************************************/ + { + ret_code_t err_code; + + err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler); + APP_ERROR_CHECK(err_code); + + err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE); + APP_ERROR_CHECK(err_code); + } + + /******************************************************************************* + * 蓝牙服务初始化 * + *******************************************************************************/ + { + uint32_t err_code; + ble_nus_init_t nus_init; + nrf_ble_qwr_init_t qwr_init = {0}; + + // Initialize Queued Write Module. + qwr_init.error_handler = NULL; + + err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init); + APP_ERROR_CHECK(err_code); + + // Initialize NUS. + memset(&nus_init, 0, sizeof(nus_init)); + + nus_init.data_handler = NULL; + + err_code = ble_nus_init(&m_nus, &nus_init); + APP_ERROR_CHECK(err_code); + } + + /******************************************************************************* + * 广播初始化 * + *******************************************************************************/ + { + uint32_t err_code; + ble_advertising_init_t init; + + memset(&init, 0, sizeof(init)); + + init.advdata.name_type = BLE_ADVDATA_FULL_NAME; + init.advdata.include_appearance = false; + init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE; + + init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); + init.srdata.uuids_complete.p_uuids = m_adv_uuids; + + init.config.ble_adv_fast_enabled = true; + init.config.ble_adv_fast_interval = APP_ADV_INTERVAL; + init.config.ble_adv_fast_timeout = APP_ADV_DURATION; + init.evt_handler = on_adv_evt; + + err_code = ble_advertising_init(&m_advertising, &init); + APP_ERROR_CHECK(err_code); + + ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG); + } + /******************************************************************************* + * 连接参数初始化 * + *******************************************************************************/ + { + uint32_t err_code; + ble_conn_params_init_t cp_init; + + memset(&cp_init, 0, sizeof(cp_init)); + + cp_init.p_conn_params = NULL; + cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; + cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; + cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; + cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; + cp_init.disconnect_on_fail = false; + cp_init.evt_handler = on_conn_params_evt; + cp_init.error_handler = conn_params_error_handler; + + err_code = ble_conn_params_init(&cp_init); + APP_ERROR_CHECK(err_code); + } + + zble_service_start_adv(); +} \ No newline at end of file diff --git a/app/src/zble_service.h b/app/src/zble_service.h new file mode 100644 index 0000000..e5564d1 --- /dev/null +++ b/app/src/zble_service.h @@ -0,0 +1,27 @@ +#pragma once +#include + +typedef struct { + uint8_t mark; // 占位 + // const char *service_uuid; // 服务UUID + // const char *cmd_tx_uuid; // + // const char *cmd_rx_uuid; + // const char *special_tx_uuid; + + const char* deviceName; + +} zble_service_cfg_t; + +typedef enum { + konconnect, + kdisconnect, +} event_t; + +typedef void (*zble_service_cmd_rx_cb_t)(uint8_t* data, uint32_t len); + +void zble_service_init(zble_service_cfg_t* cfg); +void zble_service_send_by_cmd_channel(uint8_t* data, uint32_t len); +void zble_service_send_by_record_channel(uint8_t* data, uint32_t len); + +void zble_service_start_adv(); +void zble_service_stop_adv();