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/app/src/basic/zdatachannel_service.c b/app/src/basic/zdatachannel_service.c index 9636926..0ab6a38 100644 --- a/app/src/basic/zdatachannel_service.c +++ b/app/src/basic/zdatachannel_service.c @@ -88,6 +88,7 @@ void zdatachannel_on_ble_evt(ble_evt_t const *p_ble_evt, void *p_context) { case BLE_GAP_EVT_DISCONNECTED: ZLOGI("BLE_GAP_EVT_DISCONNECTED"); p_nus->conn_handle = BLE_CONN_HANDLE_INVALID; + // ZLOGI("-----%d %d", p_datachannel->conn_handle, BLE_CONN_HANDLE_INVALID); break; case BLE_GATTS_EVT_WRITE: on_write(p_nus, p_ble_evt); @@ -98,10 +99,14 @@ void zdatachannel_on_ble_evt(ble_evt_t const *p_ble_evt, void *p_context) { } } -bool zdatachannel_is_connected() { return p_datachannel->conn_handle != BLE_CONN_HANDLE_INVALID; } +bool zdatachannel_is_connected() { + // ZLOGI("%d %d", p_datachannel->conn_handle, BLE_CONN_HANDLE_INVALID); + return p_datachannel->conn_handle != (int16_t)BLE_CONN_HANDLE_INVALID; +} uint32_t zdatachannel_init(zdatachannel_t *p_nus, zdatachannel_init_t const *p_nus_init) { - p_datachannel = p_nus; + p_datachannel = p_nus; + p_datachannel->conn_handle = BLE_CONN_HANDLE_INVALID; ret_code_t err_code; ble_uuid_t ble_uuid; ble_uuid128_t nus_base_uuid = NUS_BASE_UUID; diff --git a/app/src/one_conduction/ble_cmd_process_service.c b/app/src/one_conduction/ble_cmd_process_service.c index 271cce4..3662593 100644 --- a/app/src/one_conduction/ble_cmd_process_service.c +++ b/app/src/one_conduction/ble_cmd_process_service.c @@ -56,6 +56,9 @@ void ble_cmder_process_rx(uint8_t* rx, int len) { txheader->frame_index = rxheader->frame_index; txheader->frame_type = kifyhrs_pt_cmd_receipt; + ZLOGI("rx cmd:%d index:%d datalen:%d", cmd, rxheader->frame_index, len - sizeof(ify_hrs_packet_t)); + NRF_LOG_HEXDUMP_INFO(rxheader->data, len - sizeof(ify_hrs_packet_t)); + memset(txbuf, 0, sizeof(txbuf)); if (cmd == ify_hrs_cmd_read_device_version) { diff --git a/app/src/one_conduction/one_conduction_main.c b/app/src/one_conduction/one_conduction_main.c index b90ae08..070d79a 100644 --- a/app/src/one_conduction/one_conduction_main.c +++ b/app/src/one_conduction/one_conduction_main.c @@ -45,11 +45,9 @@ static bool plod_state_is_connected() { return m_plod_state_connected_state; static void m_plod_state_event_detect_tmr_cb(void* p_context) { // static uint32_t connecte_state_trigger_cnt = 0; - static uint32_t connecte_state_trigger_cnt_last_val = 0; static app_event_t appevent; memset(&appevent, 0, sizeof(appevent)); - connecte_state_trigger_cnt_last_val = connecte_state_trigger_cnt; if (SingleLeadECG_ecg_plod_get_connected_state()) { connecte_state_trigger_cnt++; m_connecte_state_last_trigger_timepoint = znordic_getpower_on_ms(); @@ -221,18 +219,22 @@ void app_event_process_cb(void* p_event_data, uint16_t event_size) { * 首页 * *******************************************************************************/ // 如果用户长时间不操作,自动切换到待机状态 - if (!zdatachannel_is_connected() && // - !plod_state_is_connected() && // - plod_state_has_disconnected_ms() >= 30000 && // - ds_cur_state_haspassed_ms() >= 30000) { + if (!zdatachannel_is_connected() && // + !plod_state_is_connected() && // + plod_state_has_disconnected_ms() >= 3000 && // + ds_cur_state_haspassed_ms() >= 15000) { state_machine__change_to_standby_state(); } + // 如果用户继续保持静止,切换到采集页面 else if (plod_state_is_connected() && ds_cur_state_haspassed_ms() > 1500) { // dsp_mgr_change_to_preparePage ds_change_to_state(kdevice_state_keep_still); dsp_mgr_change_to_preparePage(); } + zdatachannel_data_send2((uint8_t*)"hello", 5); + + // ZLOGI("bt:%d plod:%d has_disc:%d state:%d", zdatachannel_is_connected(), plod_state_is_connected(), plod_state_has_disconnected_ms(), ds_cur_state_haspassed_ms()); } else if (ds_now_state() == kdevice_state_keep_still) { /******************************************************************************* * 保持静止页面 * @@ -363,7 +365,9 @@ void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) { * @brief */ if (p_evt->type == ZDATACHANNEL_EVT_RX_DATA) { - ZLOGI("rx:%s", hex2str(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length)); + // ZLOGI("rx:%s:%d", hex2str(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length), p_evt->params.rx_data.length); + // NRF_LOG_HEXDUMP_INFO(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length); + ble_cmder_process_rx((uint8_t*)p_evt->params.rx_data.p_data, p_evt->params.rx_data.length); } } @@ -406,5 +410,7 @@ void one_conduction_main() { ZERROR_CHECK(app_timer_start(m_plod_state_event_detect_tmr, APP_TIMER_TICKS(30), NULL)); ZERROR_CHECK(app_timer_start(m_charge_event_detect_tmr, APP_TIMER_TICKS(100), NULL)); + + state_machine__change_to_poweroning_state(); znordic_loop(); } 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 a305a36..abe62ad 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 @@ -101,17 +101,17 @@ -1 - 169 - 542 - 1720 - 1010 + 821 + -1410 + -232 + 1662 0 - 515 - 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000003000000020000000100000053443A5C776F726B73706163655C6E6F726469635F77705C636F6E64756374696F6E315F64796E616D69635F656C656374726F63617264696F67726170685C626C655F6170705F756172745F635C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF5C443A5C776F726B73706163655C6E6F726469635F77705C636F6E64756374696F6E315F64796E616D69635F656C656374726F63617264696F67726170685C73646B5C636F6D706F6E656E74735C626F617264735C626F617264732E630000000008626F617264732E6300000000FFDC7800FFFFFFFF5C443A5C776F726B73706163655C6E6F726469635F77705C636F6E64756374696F6E315F64796E616D69635F656C656374726F63617264696F67726170685C73646B5C636F6D706F6E656E74735C626F617264735C626F617264732E680000000008626F617264732E6800000000BECEA100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000F4000000660000008007000076020000 + 634 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000004000000030000000100000053443A5C776F726B73706163655C6E6F726469635F77705C636F6E64756374696F6E315F64796E616D69635F656C656374726F63617264696F67726170685C626C655F6170705F756172745F635C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF5C443A5C776F726B73706163655C6E6F726469635F77705C636F6E64756374696F6E315F64796E616D69635F656C656374726F63617264696F67726170685C73646B5C636F6D706F6E656E74735C626F617264735C626F617264732E630000000008626F617264732E6300000000FFDC7800FFFFFFFF5C443A5C776F726B73706163655C6E6F726469635F77705C636F6E64756374696F6E315F64796E616D69635F656C656374726F63617264696F67726170685C73646B5C636F6D706F6E656E74735C626F617264735C626F617264732E680000000008626F617264732E6800000000BECEA100FFFFFFFF59443A5C776F726B73706163655C6E6F726469635F77705C636F6E64756374696F6E315F64796E616D69635F656C656374726F63617264696F67726170685C626C655F6170705F756172745F635C7A626C655F6E75735F632E63000000000C7A626C655F6E75735F632E6300000000F0A0A100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD50001000000000000000200000074F9FFFF2F0300000000000092040000 @@ -134,7 +134,7 @@ 16 - F4000000660000009005000006010000 + 7AFBFFFFA30300001600000043040000 @@ -150,7 +150,7 @@ 0 16 - 0300000066000000ED00000046020000 + 0300000066000000ED00000099010000 16 @@ -170,7 +170,7 @@ 0 16 - 0300000066000000ED00000046020000 + 0300000066000000ED00000099010000 16 @@ -450,7 +450,7 @@ 0 16 - 0300000066000000ED00000046020000 + 0300000066000000ED00000099010000 16 @@ -470,7 +470,7 @@ 0 16 - 0300000066000000ED00000046020000 + 0300000066000000ED00000099010000 16 @@ -490,7 +490,7 @@ 0 16 - 00000000770200008007000056040000 + 00000000CA01000080070000DE030000 16 @@ -530,7 +530,7 @@ 0 16 - 030000007A0200007D0700003D040000 + 03000000CD0100008704000090030000 16 @@ -1150,7 +1150,7 @@ 0 16 - 0300000066000000ED00000046020000 + 0300000066000000ED000000FF000000 16 @@ -1170,7 +1170,7 @@ 0 16 - 030000007A0200007D0700003D040000 + 03000000CD0100008704000090030000 16 @@ -1190,7 +1190,7 @@ 0 16 - 030000007A0200007D0700003D040000 + 03000000CD0100008704000090030000 16 @@ -1250,7 +1250,7 @@ 0 16 - 030000007A0200007D0700003D040000 + 03000000CD0100008704000090030000 16 @@ -1270,7 +1270,7 @@ 0 16 - 030000007A0200007D0700003D040000 + 03000000CD0100008704000090030000 16 @@ -1730,7 +1730,7 @@ 0 16 - 00000000560400008007000069040000 + 00000000DE03000080070000F1030000 16 @@ -1799,14 +1799,14 @@ 3312 - 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000EF00000090050000F3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000F4000000660000009005000006010000F40000004F00000090050000EF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A00400006D020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A0040000660000009005000084020000A00400004F000000900500006D02000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F40000005F020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000F000000076020000000000004F000000F00000005F0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000059020000900500005D02000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000000000000000000740200009005000028030000000000005D020000900500001103000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC80200005D020000CC0200001103000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000005F020000800700006302000001000000010000100400000001000000A2FCFFFF9E000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000007A020000800700006D040000000000006302000080070000560400000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000EF00000090050000F3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000007AFBFFFFA30300001600000043040000F40000004F00000090050000EF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A00400006D020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C300000180004000000000000026FFFFFFA303000016000000C1050000A00400004F000000900500006D02000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F4000000B2010000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000086FAFFFFA303000076FBFFFF6C040000000000004F000000F0000000B20100000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000059020000900500005D02000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000000000086FAFFFFB10500001600000065060000000000005D020000900500001103000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC80200005D020000CC0200001103000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000B201000080070000B601000001000000010000100400000001000000EDFCFFFF71000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000100000086FAFFFF7004000010FFFFFF6306000000000000B601000080070000DE0300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 59392 File 2537 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050FFFFFFFF0096000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 1423 @@ -1822,7 +1822,7 @@ Build 1024 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000D6E726635323833335F78786161960000000000000002000D6E726635323833335F7878616121666C6173685F733132325F6E726635325F382E302E305F736F667464657669636500000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000002001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000D6E726635323833335F78786161960000000000000002000D6E726635323833335F7878616121666C6173685F733132325F6E726635325F382E302E305F736F667464657669636500000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -3603,12 +3603,12 @@ 0 100 - 2 + 3 main.c - 0 - 1 - 1 + 13 + 331 + 344 1 0 @@ -3616,7 +3616,7 @@ ..\sdk\components\boards\boards.c 14 - 31 + 33 40 1 @@ -3625,12 +3625,21 @@ ..\sdk\components\boards\boards.h 18 - 55 + 64 71 1 0 + + .\zble_nus_c.c + 0 + 25 + 42 + 1 + + 0 + diff --git a/ble_app_uart_c/main.c b/ble_app_uart_c/main.c index 89368a2..67c5516 100644 --- a/ble_app_uart_c/main.c +++ b/ble_app_uart_c/main.c @@ -260,36 +260,37 @@ static void ble_nus_chars_received_uart_print(uint8_t * p_data, uint16_t data_le * a string. The string is sent over BLE when the last character received is a * 'new line' '\n' (hex 0x0A) or if the string reaches the maximum data length. */ + static uint8_t data_array[BLE_NUS_MAX_DATA_LEN]; + static uint16_t data_array_index = 0; + // static uint32_t void uart_event_handle(app_uart_evt_t * p_event) { - static uint8_t data_array[BLE_NUS_MAX_DATA_LEN]; - static uint16_t index = 0; + uint32_t ret_val; switch (p_event->evt_type) { /**@snippet [Handling data from UART] */ case APP_UART_DATA_READY: - UNUSED_VARIABLE(app_uart_get(&data_array[index])); - index++; + UNUSED_VARIABLE(app_uart_get(&data_array[data_array_index])); + data_array_index++; - if ((data_array[index - 1] == '\n') || - (data_array[index - 1] == '\r') || - (index >= (m_ble_nus_max_data_len))) + if ( + data_array_index >= (m_ble_nus_max_data_len)) { NRF_LOG_DEBUG("Ready to send data over BLE NUS"); - NRF_LOG_HEXDUMP_DEBUG(data_array, index); + NRF_LOG_HEXDUMP_DEBUG(data_array, data_array_index); do { - ret_val = ble_nus_c_string_send(&m_ble_nus_c, data_array, index); + ret_val = ble_nus_c_string_send(&m_ble_nus_c, data_array, data_array_index); if ( (ret_val != NRF_ERROR_INVALID_STATE) && (ret_val != NRF_ERROR_RESOURCES) ) { APP_ERROR_CHECK(ret_val); } } while (ret_val == NRF_ERROR_RESOURCES); - index = 0; + data_array_index = 0; } break; @@ -338,9 +339,9 @@ static void ble_nus_c_evt_handler(ble_nus_c_t * p_ble_nus_c, ble_nus_c_evt_t con case BLE_NUS_C_EVT_NUS_TX_EVT: ble_nus_chars_received_uart_print(p_ble_nus_evt->p_data, p_ble_nus_evt->data_len); break; - case BLE_NUS_C_EVT_NUS_TX_BLOCK_EVT: - ble_nus_chars_received_uart_print(p_ble_nus_evt->p_data, p_ble_nus_evt->data_len); - break; + // case BLE_NUS_C_EVT_NUS_TX_BLOCK_EVT: + // ble_nus_chars_received_uart_print(p_ble_nus_evt->p_data, p_ble_nus_evt->data_len); + // break; case BLE_NUS_C_EVT_DISCONNECTED: NRF_LOG_INFO("Disconnected."); @@ -655,8 +656,23 @@ static void idle_state_handle(void) nrf_pwr_mgmt_run(); } } +APP_TIMER_DEF(m_uart_send_tmr); // 状态机驱动定时器 - +static void uart_send_tmr_cb(void* p_context) { // + static uint32_t last_data_array_index; + ret_code_t ret_val; + if (data_array_index != 0 && data_array_index == last_data_array_index) { + do { + ret_val = ble_nus_c_string_send(&m_ble_nus_c, data_array, data_array_index); + if ((ret_val != NRF_ERROR_INVALID_STATE) && (ret_val != NRF_ERROR_RESOURCES)) { + APP_ERROR_CHECK(ret_val); + } + } while (ret_val == NRF_ERROR_RESOURCES); + data_array_index = 0; + last_data_array_index = 0; + } + last_data_array_index = data_array_index; +} int main(void) { // Initialize. @@ -671,6 +687,11 @@ int main(void) nus_c_init(); scan_init(); + app_timer_create(&m_uart_send_tmr, APP_TIMER_MODE_REPEATED, uart_send_tmr_cb); + app_timer_start(m_uart_send_tmr, APP_TIMER_TICKS(2), NULL); + + app_uart_put(1); + // Start execution. printf("BLE UART central example started.\r\n"); NRF_LOG_INFO("BLE UART central example started."); diff --git a/ble_app_uart_c/zble_nus_c.c b/ble_app_uart_c/zble_nus_c.c index fac75fc..539fab9 100644 --- a/ble_app_uart_c/zble_nus_c.c +++ b/ble_app_uart_c/zble_nus_c.c @@ -37,84 +37,65 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ - #include "sdk_common.h" -#if 1 +#if NRF_MODULE_ENABLED(BLE_NUS_C) #include +#include "app_error.h" #include "ble.h" -#include "zble_nus_c.h" #include "ble_gattc.h" +#include "ble_nus_c.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; +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); + 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); - } + 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; -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); - } + 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. @@ -122,198 +103,154 @@ void ble_nus_c_on_db_disc_evt(ble_nus_c_t * p_ble_nus_c, ble_db_discovery_evt_t * @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."); - } +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."); + } } -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; +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); + 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); + 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; + 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; + 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_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); + 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; +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 == 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; - } + 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; + 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; + 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; + 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; + 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; - } + 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); +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); -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); + 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_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); -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); + 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_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) + +#endif \ No newline at end of file diff --git a/ble_app_uart_c/zble_nus_c.h b/ble_app_uart_c/zble_nus_c.h index 1d5c5b1..8ca332b 100644 --- a/ble_app_uart_c/zble_nus_c.h +++ b/ble_app_uart_c/zble_nus_c.h @@ -100,10 +100,9 @@ extern "C" { { 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 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 OPCODE_LENGTH 1 #define HANDLE_LENGTH 2 @@ -120,7 +119,6 @@ extern "C" { 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; @@ -128,11 +126,7 @@ typedef enum { 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. */ + 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. */ @@ -262,7 +256,4 @@ uint32_t ble_nus_c_handles_assign(ble_nus_c_t* p_ble_nus_c, uint16_t conn_handle #ifdef __cplusplus } #endif - -#endif // BLE_NUS_C_H__ - -/** @} */ +#endif \ No newline at end of file