HL-PDJ-1/app/main.c

884 lines
27 KiB
C
Raw Permalink Normal View History

2025-08-19 09:49:41 +08:00
/****************************************Copyright (c)************************************************
** [<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҽ<EFBFBD><EFBFBD>]
**--------------File Info-----------------------------------------------------------------------------
** File name : main.c
** Last modified Date:
** Last Version :
** Descriptions : ʹ<EFBFBD>õ<EFBFBD>SDK<EFBFBD>-SDK_17.0.2
**----------------------------------------------------------------------------------------------------
** Created by :
** Created date :
** Version : 1.0
** Descriptions : 2021.4.6<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PM_EVT_CONN_SEC_CONFIG_REQ<EFBFBD><EFBFBD><EFBFBD>޸IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ʵ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2021.4.7<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ3<EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD>оƬ<EFBFBD><EFBFBD><EFBFBD>߲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ187.5ms
<EFBFBD><EFBFBD>BLE<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pm_handler_secure_on_connection<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD><EFBFBD><EFBFBD>
2021.4.9<EFBFBD><EFBFBD><EFBFBD><EFBFBD>GATT<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>nrf_ble_gatt_att_mtu_periph_set()<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>MTU<EFBFBD><EFBFBD>С
2021.4.12:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>PWM<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD>ڶ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>PWM<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD>
2021.5.12<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ300ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>MTU<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**---------------------------------------------------------------------------------------------------*/
//<2F><><EFBFBD>õ<EFBFBD>C<EFBFBD><43>ͷ<EFBFBD>ļ<EFBFBD>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
//APP<50><50>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "bsp_btn_ble.h"
//<2F><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "nrf_pwr_mgmt.h"
//SoftDevice handler configuration<6F><6E>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "nrf_sdh.h"
#include "nrf_sdh_soc.h"
#include "nrf_sdh_ble.h"
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "nrf_ble_qwr.h"
//GATT<54><54>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "nrf_ble_gatt.h"
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "ble_conn_params.h"
//<2F><EFBFBD><E3B2A5>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "ble_advdata.h"
#include "ble_advertising.h"
//<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "drv_uart.h"
//<2F><><EFBFBD><EFBFBD>FDSͷ<53>ļ<EFBFBD>
#include "fds.h"
//<2F><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "peer_manager.h"
#include "peer_manager_handler.h"
//WDTͷ<54>ļ<EFBFBD>
#include "nrfx_wdt.h"
#include "nrf_drv_clock.h"
#include "IoControl.h"
#include "IIR.h"
/***********************************************/
#define DEVICE_NAME "HL-PDJ-A" // <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
#define UARTS_SERVICE_UUID_TYPE BLE_UUID_TYPE_BLE // <20><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UUID<49><44><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>UUID
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) // <20><>С<EFBFBD><D0A1><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> (0.1 <20><>)
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> (0.2 <20><>)
#define SLAVE_LATENCY 0 // <20>ӻ<EFBFBD><D3BB>ӳ<EFBFBD>
#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) // <20><EFBFBD><E0B6BD>ʱ(4 <20><>)
#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) // <20><><EFBFBD><EFBFBD><EFBFBD>״ε<D7B4><CEB5><EFBFBD>sd_ble_gap_conn_param_update()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD>䣨5<E4A3A8>
#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) // <20><><EFBFBD><EFBFBD>ÿ<EFBFBD>ε<EFBFBD><CEB5><EFBFBD>sd_ble_gap_conn_param_update()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD>䣨30<33>
#define MAX_CONN_PARAMS_UPDATE_COUNT 3 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD>Σ<EFBFBD>
#define APP_ADV_INTERVAL 160 // <20><EFBFBD><E3B2A5><EFBFBD><EFBFBD> (100 ms)<29><><EFBFBD><EFBFBD>λ0.625 ms
#define APP_ADV_DURATION 0 // <20><EFBFBD><E3B2A5><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC>λ<EFBFBD><CEBB>10ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʱ
#define SEC_PARAM_BOND 1 //<2F>Ƿ<EFBFBD>֧<EFBFBD>ְ󶨣<D6B0>1<EFBFBD><31>֧<EFBFBD>֣<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>
#define SEC_PARAM_MITM 0 //<2F>Ƿ<EFBFBD>֧<EFBFBD><D6A7>MITM<54><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>֧<EFBFBD>֣<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>
#define SEC_PARAM_LESC 0 //<2F>Ƿ<EFBFBD>ʹ<EFBFBD>ð<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>LESC<53><43><EFBFBD><EFBFBD>1<EFBFBD><31>ʹ<EFBFBD><CAB9>LESC<53><43>0<EFBFBD><30>ʹ<EFBFBD>ô<EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD>
#define SEC_PARAM_KEYPRESS 0 //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ɰ<EFBFBD><C9B0><EFBFBD>֪ͨ<CDA8><D6AA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_NONE //IO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define SEC_PARAM_OOB 0 //<2F>Ƿ<EFBFBD>֧<EFBFBD><D6A7>OOB<4F><42>1<EFBFBD><31>֧<EFBFBD>֣<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>
#define SEC_PARAM_MIN_KEY_SIZE 7 //<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>С
#define SEC_PARAM_MAX_KEY_SIZE 16 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>С
#define APP_BLE_OBSERVER_PRIO 3 //Ӧ<>ó<EFBFBD><C3B3><EFBFBD>BLE<4C>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸ĸ<DEB8><C4B8><EFBFBD>ֵ
#define APP_BLE_CONN_CFG_TAG 1 //SoftDevice BLE<4C><45><EFBFBD>ñ<EFBFBD>־
//<2F><><EFBFBD><EFBFBD>stack dump<6D>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ʱȷ<CAB1><C8B7><EFBFBD><EFBFBD>ջλ<D5BB><CEBB>
#define DEAD_BEEF 0xDEADBEEF
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ID<49>͸<EFBFBD><CDB8>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>¼<EFBFBD><C2BC>KEY
#define DEVICE_FILE (0x1000)//<2F>ļ<EFBFBD>ID
#define DEVICE_SCHEME_KEY (0x1001)//<2F><>¼KEY<45><59><EFBFBD>ü<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ŵ<EFBFBD><C5B5>ļ<EFBFBD>ID=0X1001
ble_gap_addr_t addr_ios;
uint8_array_t address_ios;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ļ<EFBFBD>¼
fds_record_t const m_SchemePara =
{
.file_id = DEVICE_FILE,
.key = DEVICE_SCHEME_KEY,
.data.p_data = &SchemePara,
//<2F><>¼<EFBFBD>ij<EFBFBD><C4B3>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڣ<D6BD><DAA3>֣<EFBFBD>Ϊ<EFBFBD><CEAA>λ
.data.length_words = (sizeof(SchemePara) + 3) / sizeof(uint32_t),
};
//BLE<4C><45><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD>UUID<49>б<EFBFBD>
static ble_uuid_t m_adv_uuids[] =
{
{BLE_UUID_NUS_SERVICE,UARTS_SERVICE_UUID_TYPE}
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ι<EFBFBD><CEB9>ͨ<EFBFBD><CDA8>
nrfx_wdt_channel_id m_channel_id;
/*<2A><><EFBFBD><EFBFBD><EFBFBD>Ĺ۲<C4B9><DBB2>ߺ<EFBFBD><DFBA><EFBFBD>*/
NRF_BLE_GATT_DEF(m_gatt); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊm_gatt<74><74>GATTģ<54><C4A3>ʵ<EFBFBD><CAB5>
NRF_BLE_QWR_DEF(m_qwr); //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊm_qwr<77><72><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4>ʵ<EFBFBD><CAB5>
BLE_ADVERTISING_DEF(m_advertising); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊm_advertising<6E>Ĺ㲥ģ<E3B2A5><C4A3>ʵ<EFBFBD><CAB5>
void WdtFeed(void);
//GATT<54>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTU<54><55><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B7A2>MTU<54><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD>MTU-opcode-handle<6C><65>
m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;///247<34>ֽ<EFBFBD>
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);
}
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ӡģ<D3A1><C4A3>
static void log_init(void)
{
//<2F><>ʼ<EFBFBD><CABC>log<6F><67><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
ret_code_t err_code = NRF_LOG_INIT(NULL);
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD><EFBFBD>log<6F><67><EFBFBD><EFBFBD><EFBFBD>նˣ<D5B6><CBA3><EFBFBD><EFBFBD><EFBFBD>sdk_config.h<>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ն<EFBFBD>ΪUART<52><54><EFBFBD><EFBFBD>RTT<54><54>
NRF_LOG_DEFAULT_BACKENDS_INIT();
}
//GAP Generic Access Profile<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>GAP<41><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>
static void gap_params_init(void)
{
ret_code_t err_code;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ble_gap_conn_params_t gap_conn_params;
ble_gap_conn_sec_mode_t sec_mode;
//<2F><><EFBFBD><EFBFBD>GAP<41>İ<EFBFBD>ȫģʽ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дȨ<D0B4>ޣ<EFBFBD><DEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ǰ<EFBFBD>ȫģʽ1<CABD>ȼ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ް<EFBFBD>ȫ<EFBFBD><C8AB>
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
//<2F><><EFBFBD><EFBFBD>GAP<41><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
err_code = sd_ble_gap_device_name_set(&sec_mode,
(const uint8_t *)DEVICE_NAME,
strlen(DEVICE_NAME));
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>µĴ<C2B5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/* err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_);
APP_ERROR_CHECK(err_code); */
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>gap_conn_params
memset(&gap_conn_params, 0, sizeof(gap_conn_params));
gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;//<2F><>С<EFBFBD><D0A1><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD>
gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;//<2F><>С<EFBFBD><D0A1><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD>
gap_conn_params.slave_latency = SLAVE_LATENCY; //<2F>ӻ<EFBFBD><D3BB>ӳ<EFBFBD>
gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; //<2F><EFBFBD><E0B6BD>ʱ
//<2F><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>ջAPI sd_ble_gap_ppcp_set<65><74><EFBFBD><EFBFBD>GAP<41><50><EFBFBD><EFBFBD>
err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
APP_ERROR_CHECK(err_code);
}
//<2F><>ʼ<EFBFBD><CABC>GATT<54><54><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
static void gatt_init(void)
{
//<2F><>ʼ<EFBFBD><CABC>GATT<54><54><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
//<2F><><EFBFBD><EFBFBD><E9BAAF><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD>˵<EFBFBD>Ĭ<EFBFBD><C4AC>MTU<54><55>С
err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
APP_ERROR_CHECK(err_code);
}
//<2F><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˯<EFBFBD><CBAF>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ
static void idle_state_handle(void)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>log
if (NRF_LOG_PROCESS() == false)
{
//<2F><><EFBFBD>е<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
nrf_pwr_mgmt_run();
}
}
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
static void delete_bonds(void)
{
ret_code_t err_code;
err_code = pm_peers_delete();
APP_ERROR_CHECK(err_code);
}
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
static void power_management_init(void)
{
ret_code_t err_code;
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
err_code = nrf_pwr_mgmt_init();
//<2F><><EFBFBD><EFBFBD><E9BAAF><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
APP_ERROR_CHECK(err_code);
}
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nrf_error<6F><72><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬ͨ<EBA3AC><CDA8>nrf_error<6F><72><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
static void conn_params_error_handler(uint32_t nrf_error)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
APP_ERROR_HANDLER(nrf_error);
}
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ģ<EFBFBD><C4A3><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
{
ret_code_t err_code;
//<2F>ж<EFBFBD><D0B6>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ʧ<EFBFBD><CAA7>
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);
}
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD>̳ɹ<CCB3>
if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_SUCCEEDED)
{
//<2F><><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD>;
}
}
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD>̹<EFBFBD><CCB9>̣<EFBFBD>
static void conn_params_init(void)
{
ret_code_t err_code;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><E1B9B9>
ble_conn_params_init_t cp_init;
//<2F><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(&cp_init, 0, sizeof(cp_init));
//<2F><><EFBFBD><EFBFBD>ΪNULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>
cp_init.p_conn_params = NULL;
//<2F><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD>״η<D7B4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ5<CEAA><35>
cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
//ÿ<>ε<EFBFBD><CEB5><EFBFBD>sd_ble_gap_conn_param_update()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>30<33><30>
cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>3<EFBFBD><33>
cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ʼ<EFBFBD><CABC>ʱ
cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܲ<EFBFBD><DCB2>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>
cp_init.disconnect_on_fail = false;
//ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
cp_init.evt_handler = on_conn_params_evt;
//ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
cp_init.error_handler = conn_params_error_handler;
//<2F><><EFBFBD>ÿ⺯<C3BF><E2BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><E1B9B9>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD><D0AD>ģ<EFBFBD><C4A3>
err_code = ble_conn_params_init(&cp_init);
APP_ERROR_CHECK(err_code);
}
//BLE<4C>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
ret_code_t err_code = NRF_SUCCESS;
//<2F><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>BLE_GAP_EVT_CONNECTED<45><44>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ԣ<EFBFBD>
pm_handler_secure_on_connection(p_ble_evt);
//<2F>ж<EFBFBD>BLE<4C>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
switch (p_ble_evt->header.evt_id)
{
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
case BLE_GAP_EVT_DISCONNECTED:
//<2F><>ӡ<EFBFBD><D3A1>ʾ<EFBFBD><CABE>Ϣ
NRF_LOG_INFO("Disconnected.");
DeviceConnectState = DisconnectState;
DisconnectControl();
break;
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
case BLE_GAP_EVT_CONNECTED:
NRF_LOG_INFO("Connected.");
DeviceConnectState = ConnectState;
DisconnectControl();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD>
m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4>ʵ<EFBFBD><CAB5><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><E3B5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
APP_ERROR_CHECK(err_code);
break;
//PHY<48><59><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
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,
};
//<2F><>ӦPHY<48><59><EFBFBD>¹<EFBFBD><C2B9><EFBFBD>
err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
APP_ERROR_CHECK(err_code);
} break;
//GATT<54>ͻ<EFBFBD><CDBB>˳<EFBFBD>ʱ<EFBFBD>¼<EFBFBD>
case BLE_GATTC_EVT_TIMEOUT:
NRF_LOG_DEBUG("GATT Client Timeout.");
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
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;
//GATT<54><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>¼<EFBFBD>
case BLE_GATTS_EVT_TIMEOUT:
NRF_LOG_DEBUG("GATT Server Timeout.");
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
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:
break;
}
}
//<2F><>ʼ<EFBFBD><CABC>BLEЭ<45><D0AD>ջ
static void ble_stack_init(void)
{
ret_code_t err_code;
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>SoftDevice<63><65><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>sdk_config.h<>ļ<EFBFBD><C4BC>е<EFBFBD>Ƶʱ<C6B5>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>Ƶʱ<C6B5><CAB1>
err_code = nrf_sdh_enable_request();
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD><EFBFBD><E5B1A3>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>RAM<41><4D>ʼ<EFBFBD><CABC>ַ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
uint32_t ram_start = 0;
//ʹ<><CAB9>sdk_config.h<>ļ<EFBFBD><C4BC><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ȡӦ<C8A1>ó<EFBFBD><C3B3><EFBFBD>RAM<41><4D>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B5BD><EFBFBD><EFBFBD>ram_start
err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
APP_ERROR_CHECK(err_code);
//ʹ<><CAB9>BLEЭ<45><D0AD>ջ
err_code = nrf_sdh_ble_enable(&ram_start);
APP_ERROR_CHECK(err_code);
//ע<><D7A2>BLE<4C>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
}
//<2F><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
{
ret_code_t err_code;
//<2F>жϹ<CFB9>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
switch (ble_adv_evt)
{
//<2F><><EFBFBD>ٹ㲥<D9B9><E3B2A5><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٹ㲥<D9B9><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
case BLE_ADV_EVT_FAST:
NRF_LOG_INFO("Fast advertising.");
//<2F><><EFBFBD>ù㲥ָʾ<D6B8><CABE>Ϊ<EFBFBD><CEAA><EFBFBD>ڹ㲥<DAB9><E3B2A5>D1ָʾ<D6B8><CABE><EFBFBD><EFBFBD>˸<EFBFBD><CBB8>
// err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
// APP_ERROR_CHECK(err_code);
break;
//<2F>㲥IDLE<4C>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><E3B2A5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
case BLE_ADV_EVT_IDLE:
//<2F>ϵ<EFBFBD>
NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
nrf_gpio_pin_clear(KEY_POWER);
break;
default:
break;
}
}
//<2F><EFBFBD><E3B2A5>ʼ<EFBFBD><CABC>
static void advertising_init(void)
{
uint32_t err_code;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B2A5>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ýṹ<C3BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ble_advertising_init_t init;
err_code = sd_ble_gap_addr_get(&addr_ios);
APP_ERROR_CHECK(err_code);
address_ios.size = 6;
address_ios.p_data = addr_ios.addr;
ble_advdata_manuf_data_t test;
test.company_identifier = 0x1122;
test.data = address_ios;
//<2F><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset(&init, 0, sizeof(init));
//<2F><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ȫ<EFBFBD><C8AB>
init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۣ<EFBFBD><DBA3><EFBFBD><EFBFBD><EFBFBD>
init.advdata.include_appearance = false;
//<2F><><EFBFBD><EFBFBD>ble<6C><EFBFBD><E8B1B8>ַ
// init.advdata.include_ble_device_addr = true;
init.advdata.p_manuf_specific_data = &test;
init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids)/sizeof(m_adv_uuids[0]);
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
//Flag:һ<><D2BB><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>BR/EDR
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
//<2F><><EFBFBD>ù㲥ģʽΪ<CABD><CEAA><EFBFBD>ٹ㲥
init.config.ble_adv_fast_enabled = true;
//<2F><><EFBFBD>ù㲥<C3B9><E3B2A5><EFBFBD><EFBFBD><EFBFBD>͹㲥<CDB9><E3B2A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
//<2F><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
init.evt_handler = on_adv_evt;
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>
err_code = ble_advertising_init(&m_advertising, &init);
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD>ù㲥<C3B9><E3B2A5><EFBFBD>ñ<EFBFBD><C3B1>ǡ<EFBFBD>APP_BLE_CONN_CFG_TAG<41><47><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>ٹ㲥<D9B9><E3B2A5><EFBFBD>õı<C3B5><C4B1>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD>Ϊδ<CEAA><CEB4>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>SoftDevice<63><EFBFBD>У<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>sd_ble_gap_adv_set_configure()<29><><EFBFBD><EFBFBD><EFBFBD>µĹ㲥<C4B9><E3B2A5><EFBFBD><EFBFBD>
//<2F><>ǰSoftDevice<63><EFBFBD><E6B1BE>S132 V7.2.0<EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>APP_BLE_CONN_CFG_TAGֻ<EFBFBD><EFBFBD>д1<EFBFBD><EFBFBD>
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B2A5><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>͹㲥<CDB9><E3B2A5>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĹ㲥ģʽһ<CABD><D2BB>
static void advertising_start(bool erase_bonds)
{
if(erase_bonds == true)
{
//ɾ<><C9BE>flash<73>д洢<D0B4><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>󣬻<EFBFBD><F3A3ACBB><EFBFBD><EFBFBD><EFBFBD>PM_EVT_PEERS_DELETE_SUCCEEDED<45>¼<EFBFBD><C2BC><EFBFBD>
//<2F>ڸ<EFBFBD><DAB8>¼<EFBFBD><C2BC>»<EFBFBD><C2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
delete_bonds();
}
else
{
//ʹ<>ù㲥<C3B9><E3B2A5>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĹ㲥ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>
ret_code_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
//<2F><><EFBFBD><EFBFBD><E9BAAF><EFBFBD><EFBFBD><EFBFBD>صĴ<D8B5><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
APP_ERROR_CHECK(err_code);
}
}
//<2F>Ŷ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4>ģ<EFBFBD><C4A3><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
static void nrf_qwr_error_handler(uint32_t nrf_error)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
APP_ERROR_HANDLER(nrf_error);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4>ģ<EFBFBD><C4A3><EFBFBD>ͳ<EFBFBD>ʼ<EFBFBD><CABC>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ʹ<EFBFBD>õķ<C3B5><C4B7><EFBFBD>
static void services_init(void)
{
ret_code_t err_code;
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nrf_ble_qwr_init_t qwr_init = {0};
//<2F>Ŷ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
qwr_init.error_handler = nrf_qwr_error_handler;
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>Ŷ<EFBFBD>д<EFBFBD><D0B4>ģ<EFBFBD><C4A3>
err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
service_nus_init();
}
#if 1
//<2F><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void pm_evt_handler(pm_evt_t const * p_evt)
{
//1<><31><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>־ 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>豸ʱ<E8B1B8><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3<><33><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pm_handler_on_pm_evt(p_evt);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>flash<73>еı<D0B5><C4B1><EFBFBD><EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>flash<73><EFBFBD>ռ<D5BC><E4B2BB>ʱɾ<CAB1><C9BE>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ϣ
pm_handler_flash_clean(p_evt);
switch(p_evt->evt_id)
{
//<2F><EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>ѳɹ<D1B3>ɾ<EFBFBD><C9BE>
case PM_EVT_PEERS_DELETE_SUCCEEDED:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱִ<CAB1><D6B4><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
advertising_start(false);
break;
case PM_EVT_CONN_SEC_CONFIG_REQ:
{
// <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>󶨶Եȷ<D4B5><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true};
pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);
} break;
default:
break;
}
}
#endif
//<2F><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
static void peer_manager_init(void)
{
ble_gap_sec_params_t sec_param;
ret_code_t err_code;
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
err_code = pm_init();
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD>ð<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9>sec_param
memset(&sec_param, 0, sizeof(ble_gap_sec_params_t));
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ȫ<EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><E1B9B9>,
sec_param.bond = SEC_PARAM_BOND; //֧<>ְ<EFBFBD><D6B0><EFBFBD>
sec_param.mitm = SEC_PARAM_MITM; //<2F><>MITM<54><4D><EFBFBD><EFBFBD>
sec_param.lesc = SEC_PARAM_LESC; //<2F><>֧<EFBFBD>ְ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD>ʹ<EFBFBD>ô<EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD>
sec_param.keypress = SEC_PARAM_KEYPRESS; //<2F>ް<EFBFBD><DEB0><EFBFBD>֪ͨ
sec_param.io_caps = SEC_PARAM_IO_CAPABILITIES; //<2F><>IO<49><4F><EFBFBD><EFBFBD>
sec_param.oob = SEC_PARAM_OOB; //<2F><>֧<EFBFBD><D6A7>OOB
sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE; //<2F><>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>С<EFBFBD><D0A1>7<EFBFBD>ֽ<EFBFBD>
sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF>С<EFBFBD><D0A1>16<31>ֽ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
sec_param.kdist_own.enc = 1; //<2F>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>LTK
sec_param.kdist_own.id = 1; //<2F>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>IRK
//<2F>Զ<EFBFBD><D4B6><EFBFBD>Կ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
sec_param.kdist_peer.enc = 1; //Ҫ<><D2AA><EFBFBD>Է<EFBFBD><D4B7>ַ<EFBFBD>LTK
sec_param.kdist_peer.id = 1; //Ҫ<><D2AA><EFBFBD>Է<EFBFBD><D4B7>ַ<EFBFBD>IRK
//<2F><><EFBFBD>ð<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
err_code = pm_sec_params_set(&sec_param);
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
err_code = pm_register(pm_evt_handler);
APP_ERROR_CHECK(err_code);
}
//FDS<44>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void fds_evt_handler(fds_evt_t const * p_evt)
{
//<2F>ж<EFBFBD><D0B6>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
switch (p_evt->id)
{
case FDS_EVT_INIT://FDS<44><53>ʼ<EFBFBD><CABC><EFBFBD>¼<EFBFBD>
if (p_evt->result == NRF_SUCCESS)//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
{
my_fds_info.busy = false;
}
break;
case FDS_EVT_WRITE://FDSд<53><D0B4>¼<EFBFBD>¼<EFBFBD>
{
if (p_evt->result == NRF_SUCCESS)//д<><D0B4>¼<EFBFBD>ɹ<EFBFBD>
{
my_fds_info.busy = false;
}
} break;
case FDS_EVT_UPDATE://FDS<44><53><EFBFBD>¼<EFBFBD>¼<EFBFBD>¼<EFBFBD>
{
if (p_evt->result == NRF_SUCCESS)//д<><D0B4>¼<EFBFBD>ɹ<EFBFBD>
{
my_fds_info.busy = false;
}
} break;
case FDS_EVT_GC://FDS<44><53>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
{
if (p_evt->result == NRF_SUCCESS)//<2F><>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
{
my_fds_info.busy = false;
}
} break;
default:
break;
}
}
//<2F>ȴ<EFBFBD>FDS<44><53>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void wait_for_fds_ready(void)
{
while (my_fds_info.busy)
{
(void) sd_app_evt_wait();
}
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><D2B7><EFBFBD>
void read_scheme(void)
{
ret_code_t rc;
//<2F><><EFBFBD><EFBFBD><E5B2A2>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fds_record_desc_t desc = {0};
//<2F><><EFBFBD><EFBFBD><E5B2A2>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<C6BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fds_find_token_t tok = {0};
uint16_t tempidvalue;
//<2F><><EFBFBD><EFBFBD>tok<6F><6B><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
memset(&tok, 0x00, sizeof(fds_find_token_t));
//<2F><>DEVICE_FILE<4C>ļ<EFBFBD><C4BC>в<EFBFBD><D0B2>Ҽ<EFBFBD>¼m_version_record
rc = fds_record_find(DEVICE_FILE, DEVICE_SCHEME_KEY, &desc, &tok);
//<2F><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>¼<EFBFBD>󣬶<EFBFBD>ȡ<EFBFBD><C8A1>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
if(rc == NRF_SUCCESS)
{
fds_flash_record_t temp = {0};
//<2F>򿪼<EFBFBD>¼<EFBFBD><C2BC>ȡ<EFBFBD><C8A1>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
rc = fds_record_open(&desc, &temp);
APP_ERROR_CHECK(rc);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
memcpy(&SchemeData, temp.p_data, sizeof(SchemeData_t));
//<2F><>ȡ<EFBFBD>󣬹رռ<D8B1>¼
rc = fds_record_close(&desc);
APP_ERROR_CHECK(rc);
// <20><><EFBFBD><EFBFBD>״̬<D7B4>·<EFBFBD><C2B7>ͷ<EFBFBD><CDB7><EFBFBD>ID
if(DeviceConnectState == ConnectState)
{
SchemeQuery(SchemeData.SchemeIDMSB,SchemeData.SchemeIDLSB);
}
// δ<><CEB4><EFBFBD><EFBFBD>״̬<D7B4>¸<EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>
else
{
StimStateInfoStructInit(SchemeData);
}
}
}
// <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FdsHandler(fds_record_desc_t *Desc,fds_find_token_t *Tok)
{
ret_code_t rc;
if(my_fds_info.read == true)//<2F><>ȡ<EFBFBD><C8A1>¼
{
my_fds_info.read = false;
read_scheme();//<2F><>ȡ<EFBFBD><C8A1>¼<EFBFBD><C2BC><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//<2F><><EFBFBD>¼<EFBFBD>¼m_fw_record
if((my_fds_info.scheme_update == true) && (my_fds_info.busy == false))
{
//<2F><><EFBFBD><EFBFBD>tok<6F><6B><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
memset(Tok, 0x00, sizeof(fds_find_token_t));
//<2F><>DEVICE_FILE<4C>ļ<EFBFBD><C4BC>в<EFBFBD><D0B2>Ҽ<EFBFBD>¼m_fw_record
rc = fds_record_find(DEVICE_FILE, DEVICE_SCHEME_KEY, Desc, Tok);
if (rc == NRF_SUCCESS)
{
my_fds_info.busy = true;
my_fds_info.scheme_update = false;
//<2F><><EFBFBD>¼<EFBFBD>¼m_fw_record
rc = fds_record_update(Desc, &m_SchemePara);
APP_ERROR_CHECK(rc);
wait_for_fds_ready();
NRF_LOG_INFO("fds_record_update");
}
}
}
void wdt_event_handler(void)
{
}
void WdtInit(void)
{
ret_code_t err_code = NRF_SUCCESS;
//<2F><><EFBFBD><EFBFBD>WDT<44><54><EFBFBD>ýṹ<C3BD>ʹ<E5B2A2><CAB9>
nrfx_wdt_config_t config = NRFX_WDT_DEAFULT_CONFIG;
//<2F><>ʼ<EFBFBD><CABC>WDT
err_code = nrfx_wdt_init(&config, wdt_event_handler);
//<2F><><EFBFBD><EFBFBD>ι<EFBFBD><CEB9>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ĸ<EFBFBD>
err_code = nrfx_wdt_channel_alloc(&m_channel_id);
APP_ERROR_CHECK(err_code);
//<2F><><EFBFBD><EFBFBD>WDT
nrfx_wdt_enable();
}
//ι<><CEB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WdtFeed(void)
{
//ι<><CEB9>
nrfx_wdt_channel_feed(m_channel_id);
}
void clocks_start(void)
{
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶʱ<C6B5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
NRF_CLOCK->TASKS_HFCLKSTART = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶʱ<C6B5><CAB1>
//<2F>ȴ<EFBFBD><C8B4><EFBFBD>Ƶʱ<C6B5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
void DeviceInit(void)
{
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>gpio */
GpioInit();
clocks_start();
EXIT_KEY_Init();
/* <20><>ʼ<EFBFBD><CABC>APP<50><50>ʱ<EFBFBD><CAB1> */
AppTimersInit();
timer3_rms_init();
/* DACPWM<57><4D>ʼ<EFBFBD><CABC> */
// PwmDACInit();
/* SAADC<44><43>ʼ<EFBFBD><CABC> */
battery_adc_init();
rms_saadc_init();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PPI<50><49>ʼ<EFBFBD><CABC> */
//PPIPwmInit();
PPIEegAdcInit();
/* GPIOTE<54><45>ʼ<EFBFBD><CABC> */
GpioteInit();
// nrf_gpio_pin_clear(H_CTL1_PWM);
// nrf_gpio_pin_clear(H_CTL2_PWM);
/* <20>̼<EFBFBD>PWM<57><4D>ʼ<EFBFBD><CABC> */
pwm0_common_init();
pwm2common_init();
//timer1_output_ctrl_init();
/* ι<><CEB9><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
WdtInit();
}
//<2F><EFBFBD><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC<41><43>ַ
void MacSet(void)
{
ble_gap_addr_t addr;
uint32_t err_code = sd_ble_gap_addr_get(&addr);
APP_ERROR_CHECK(err_code);
memcpy(BLE_MAC,addr.addr,BLE_GAP_ADDR_LEN);
err_code = sd_ble_gap_addr_set(&addr);
APP_ERROR_CHECK(err_code);
}
void StartAdv(void)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>
advertising_start(false);
}
// <20>رչ㲥
void StopAdv(void)
{
NRF_LOG_INFO("StopAdv!");
sd_ble_gap_adv_stop(m_advertising.adv_handle);
}
void user_ble_init(void)
{
//<2F><>ʼ<EFBFBD><CABC>Э<EFBFBD><D0AD>ջ
ble_stack_init();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
VariableInit();
//<2F><><EFBFBD><EFBFBD>GAP<41><50><EFBFBD><EFBFBD>
gap_params_init();
//<2F><>ʼ<EFBFBD><CABC>GATT
gatt_init();
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
services_init();
//<2F>ڹ㲥<DAB9><E3B2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC<41><43>ַ
MacSet();
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>
advertising_init();
//<2F><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>Э<EFBFBD>̳<EFBFBD>ʼ<EFBFBD><CABC>
conn_params_init();
//<2F><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
peer_manager_init();
//LOG<4F><47>ӡ<EFBFBD><D3A1>Ϣ
NRF_LOG_INFO("BLE started.");
}
//fds<64><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
void fdsInit(ret_code_t rec,fds_record_desc_t desct,fds_find_token_t token)
{
//ע<><D7A2>FDS<44>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FS<46>¼<EFBFBD>
(void)fds_register(fds_evt_handler);
my_fds_info.busy = true;
rec = fds_init();//<2F><>ʼ<EFBFBD><CABC>FDS
APP_ERROR_CHECK(rec);//<2F>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//FDS<44><53>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȴ<EFBFBD>FDS<44><53>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wait_for_fds_ready();
//<2F><><EFBFBD><EFBFBD>tok<6F><6B><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
memset(&token, 0x00, sizeof(fds_find_token_t));
//<2F><>DEVICE_FILE<4C>ļ<EFBFBD><C4BC>в<EFBFBD><D0B2>Ҽ<EFBFBD>¼m_desp_record
rec = fds_record_find(DEVICE_FILE, DEVICE_SCHEME_KEY, &desct, &token);
NRF_LOG_INFO("rec = %d",rec);
//û<>в<EFBFBD><D0B2>ҵ<EFBFBD>m_desp_record<72><64>¼<EFBFBD><C2BC>д<EFBFBD><D0B4><EFBFBD><EFBFBD>¼
if (rec != NRF_SUCCESS)
{
my_fds_info.busy = true;
StimStateInfoStructInit(PreStorageSchemeData); // <20><>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
memcpy(SchemePara.text,&PreStorageSchemeData,sizeof(PreStorageSchemeData));
rec = fds_record_write(&desct, &m_SchemePara);
APP_ERROR_CHECK(rec);
wait_for_fds_ready();
}
else
{
my_fds_info.read = true;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int main(void)
{
ret_code_t rc;
//<2F><><EFBFBD><EFBFBD><E5B2A2>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fds_record_desc_t desc = {0};
//<2F><><EFBFBD><EFBFBD><E5B2A2>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<C6BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fds_find_token_t tok = {0};
//<2F><>ʼ<EFBFBD><CABC>log<6F><67><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
log_init();
//<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
FilterInit();
// <20>豸Ԥ<E8B1B8><D4A4><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʼ<EFBFBD><CABC>ID :101 <20><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PreStorageSchemeDataInit();
//fds<64><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
fdsInit(rc,desc,tok);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
DeviceInit();
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
power_management_init();
user_ble_init();
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>APP<50><50>ʱ<EFBFBD><CAB1>
ApplicationTimersStart();
//<2F><>ѭ<EFBFBD><D1AD>
while(true)
{
// <20><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FdsHandler(&desc,&tok);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LOG<4F><47><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>
idle_state_handle();
WdtFeed();
if(POWER_CLOSE == DeviceState)
{
continue;
}
KeyPinHandler();// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵缫Ƭ<E7BCAB><C6AC><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD>ϴ<EFBFBD> */
if(AdapterState == LastAdapterState)
{
StateUpLoad(AdapterState,ElectrodeStatusInfo);
if(AdapterState == AdapterConnected)
{
LastAdapterState = AdapterNotConnected;
}
else
{
LastAdapterState = AdapterConnected;
}
}
if(ElectrodeStatusInfo == LastElectrodeStatusInfo)
{
StateUpLoad(AdapterState,ElectrodeStatusInfo);
if(ElectrodeStatusInfo == ElectrodeFalloff)
{
LastElectrodeStatusInfo = ElectrodeConnectted;
}
else
{
LastElectrodeStatusInfo = ElectrodeFalloff;
}
}
}
}