From 42739b7babbfceea31e5a91095a926ef2dc70eed Mon Sep 17 00:00:00 2001 From: "jxh@lovelyqi" Date: Tue, 19 Aug 2025 11:55:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=BB=E6=9C=BA=E7=AB=AF0x?= =?UTF-8?q?9C=E4=B8=8E0x9D=E5=8A=9F=E8=83=BD=E7=A0=81=200x9C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=BF=83=E7=8E=87=E6=8B=9F=E5=90=88=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=200x9D=E5=91=8A=E7=9F=A5=E6=B2=BB=E7=96=97=E9=98=B6=E6=AE=B5?= =?UTF-8?q?=E4=B8=8E=E7=96=BE=E7=97=85=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NTK_NFY_Communication_Protocol.md | 142 ++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 15 deletions(-) diff --git a/NTK_NFY_Communication_Protocol.md b/NTK_NFY_Communication_Protocol.md index c6be67e..d9eb26a 100644 --- a/NTK_NFY_Communication_Protocol.md +++ b/NTK_NFY_Communication_Protocol.md @@ -29,6 +29,7 @@ To view a copy of this license, visit [https://creativecommons.org/licenses/by-n 2.增加头戴设备部分功能码 * V0.4: 2025.0729.1457 江鑫辉 1.增加头戴设备功能控制指令 +2.增加主机端0x9C与0x9D功能码 --- @@ -128,16 +129,18 @@ HEX: 5A 01 FF 40 00 64 00 00 00 93 9E FF 3F 93 9E FF 3F 93 9E FF 3F 7F 4B 00 00 #### 5.1. 0x80~0x9f: 向头戴设备发送数据或指令 -| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 | -| ------ | ------------------ | -------------- | -------------- | ---------------------------------------------------- | -| 0x80 | 一个表示正常的编码 | 0 | \\ | 直接被头戴设备丢弃 | -| 0x81 | 接收的信息出错 | 1 | uint8_t | 提示接收出现问题,不一定被处理 | -| 0x90 | 启动配对流程 | 0 | \\ | 头戴设备接收此指令后清除设备ID等信息,并重新尝试配对 | -| 0x91 | 告知设备ID | 1 | uint8_t | 告知设备ID | -| 0x98 | 控制开启下位机功能 | 1 | uint16_t | 开启 FFT LPF HPF NOTCH 等功能 | -| 0x99 | 控制关闭下位机功能 | 1 | uint16_t | 关闭 FFT LPF HPF NOTCH 等功能 | -| 0x9A | 控制下位机灯光 | 1 | uint8_t | 控制LED灯 | -| 0x9B | 控制播放音频与音量 | 2 | uint8_t | | +| 功能码 | 功能名称 | 数据段数据个数 | 每个数据的类型 | 备注 | +| ------ | ---------------------- | -------------- | -------------- | ---------------------------------------------------- | +| 0x80 | 一个表示正常的编码 | 0 | \\ | 直接被头戴设备丢弃 | +| 0x81 | 接收的信息出错 | 1 | uint8_t | 提示接收出现问题,不一定被处理 | +| 0x90 | 启动配对流程 | 0 | \\ | 头戴设备接收此指令后清除设备ID等信息,并重新尝试配对 | +| 0x91 | 告知设备ID | 1 | uint8_t | 告知设备ID | +| 0x98 | 控制开启下位机功能 | 1 | uint16_t | 开启 FFT LPF HPF NOTCH 等功能 | +| 0x99 | 控制关闭下位机功能 | 1 | uint16_t | 关闭 FFT LPF HPF NOTCH 等功能 | +| 0x9A | 控制下位机灯光 | 1 | uint8_t | 控制LED灯 可用于寻找设备 | +| 0x9B | 控制播放音频与音量 | 2 | uint8_t | | +| 0x9C | 修改下位机心率拟合系数 | 9 | int32_t | 微调心率计算结果 | +| 0x9D | 告知治疗阶段与疾病类型 | 2 | uint8_t | 告知治疗阶段与疾病类型 | ### 5.2 功能码详解 @@ -218,17 +221,17 @@ HEX: 5A 00 00 98 00 02 00 00 00 data1_L data1_H crc16_L crc16_H A5 **data1参数值对应功能描述:** -| bit Num | 对应功能 | 参数值对应功能描述 | -| ---------- | ------------- | ------------------ | -| MSB ==> 15 | 暂无 | | -| 7~14 | 暂无 | | +| bit Num | 对应功能 | 参数值对应功能描述 | +| ---------- | -------------- | ------------------ | +| MSB ==> 15 | 暂无 | | +| 7~14 | 暂无 | | | 6 | EMG 带通滤波器 | NOTCH | | 5 | EMG 高通滤波器 | HPF | | 4 | EMG 低通滤波器 | LPF | | 3 | EEG 带通滤波器 | NOTCH | | 2 | EEG 高通滤波器 | HPF | | 1 | EEG 低通滤波器 | LPF | -| LSB ==> 0 | FFT 脑波分解 | | +| LSB ==> 0 | FFT 脑波分解 | | #### 5.2. 0x99 控制关闭下位机功能 @@ -282,6 +285,113 @@ HEX: 5A 00 00 9B 00 02 00 00 00 audio_id volume crc16_L crc16_H A5 | volume | 设置音量 | uint8_t | 0xFF | 不设置音量仅播放音频 | | crc16 | crc16校验值 | uint16_t | xx | \\ | +#### 5.2. 0x9C 微调心率计算结果 + +数据帧示例: + +``` HEX +HEX: 5A 00 00 9C 00 24 00 00 00 data1_LL data1_LH data1_HL data1_HH (data2_ * 4) (data3_ * 4) ... (data9_ * 4) crc16_L crc16_H A5 +``` + +| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 | +| -------- | ------------------ | -------- | --------- | ----------------------------------------------------------------------------------------------------- | +| data_n | 对应下方公式的参数 | uint8_t | 0x00~0xFE | 接收到的9个数据会作为数组传入下方代码中的HR_fitting_update_parameters (int32 *HR_fitting_parameters); | +| crc16 | crc16校验值 | uint16_t | xx | \\ | + +```C + // ====== HR 三段拟合的9个参数 ======= + // a与b需乘以0.000001保证小数点后6位 + static int32_t HR_fitting_parameters_f1; + static float HR_fitting_parameters_a1; + static float HR_fitting_parameters_b1; + + static int32_t HR_fitting_parameters_f2; + static float HR_fitting_parameters_a2; + static float HR_fitting_parameters_b2; + + static int32_t HR_fitting_parameters_f3; + static float HR_fitting_parameters_a3; + static float HR_fitting_parameters_b3; + // ===== 更新 HR 三段拟合的9个参数 ======== + static void + HR_fitting_update_parameters (int32 *HR_fitting_parameters) + { + HR_fitting_parameters_f1 = HR_fitting_parameters[0]; + HR_fitting_parameters_a1 = HR_fitting_parameters[1] * 0.000001; + HR_fitting_parameters_b1 = HR_fitting_parameters[2] * 0.000001; + HR_fitting_parameters_f2 = HR_fitting_parameters[3]; + HR_fitting_parameters_a2 = HR_fitting_parameters[4] * 0.000001; + HR_fitting_parameters_b2 = HR_fitting_parameters[5] * 0.000001; + HR_fitting_parameters_f3 = HR_fitting_parameters[6]; + HR_fitting_parameters_a3 = HR_fitting_parameters[7] * 0.000001; + HR_fitting_parameters_b3 = HR_fitting_parameters[8] * 0.000001; + WriteParametersIntoFlash (); // 保存参数 + }; + // ===== HR 三段拟合 ======== + static void + HR_fitting (uint16_t *inputHR_p, uint16_t *outputHR_p) + { + uint16_t HR_temp = *inputHR_p; + + if (HR_temp < HR_fitting_parameters_f1) + { + *outputHR_p = (uint16_t)(HR_fitting_parameters_a1 * HR_temp + + HR_fitting_parameters_b1); + } + else if (HR_temp < HR_fitting_parameters_f2) + { + *outputHR_p = (uint16_t)(HR_fitting_parameters_a2 * HR_temp + + HR_fitting_parameters_b2); + } + else if (HR_temp < HR_fitting_parameters_f3) + { + *outputHR_p = (uint16_t)(HR_fitting_parameters_a3 * HR_temp + + HR_fitting_parameters_b3); + } + else + { + *outputHR_p = HR_temp; + } + } +``` + +```mermaid +flowchart TD + A[开始] --> B{更新矫正参数} + B --> C[从输入获取新参数] + C --> D[对a/b乘以0.000001转小数] + D --> E[保存到存储器] + E --> F[参数更新完成] + + G[心率矫正] --> H{判断心率值} + H --> |心率 < f1| I[用第一段公式矫正:\n输出 = a1*心率 + b1] + H --> |f1 ≤ 心率 < f2| J[用第二段公式矫正:\n输出 = a2*心率 + b2] + H --> |f2 ≤ 心率 < f3| K[用第三段公式矫正:\n输出 = a3*心率 + b3] + H --> |心率 ≥ f3| L[直接输出原始心率] + L --> M[矫正结束] +``` + +#### 5.2. 0x9D 告诉下位机当前治疗阶段与疾病类型 + +数据帧示例: + +``` HEX +HEX: 5A 00 00 9D 00 02 00 00 00 TreatmentPhase DiseaseTypes crc16_L crc16_H A5 +``` + +| 参数名称 | 参数描述 | 参数类型 | 参数值 | 参数值对应功能描述 | +| -------------- | -------------- | -------- | --------- | ------------------------------------------------ | +| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x00 | 待机阶段 用于停止基线采集 或 仅指定疾病类型 | +| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x01 | 前基线评估 开始记录各指标平均值 直到切换模式结束 | +| TreatmentPhase | 治疗阶段的编号 | uint8_t | 0x02 | 后基线评估 开始记录各指标平均值 直到切换模式结束 | +| DiseaseTypes | 疾病类型编号 | uint8_t | 0x00 | 不传输疾病类型 仅传输治疗阶段的编号 | +| DiseaseTypes | 疾病类型编号 | uint8_t | 0x01~0xFE | 疾病类型编号 | +| crc16 | crc16校验值 | uint16_t | xx | \\ | + +治疗阶段的编号 + +疾病类型编号 + ## 六.头戴设备功能码表 当连接建立后,头戴设备向电脑发送数据时的功能码对应的功能 @@ -504,3 +614,5 @@ HEX: 5A 01 ID 60 00 02 00 00 00 AA_L AA_H crc16_L crc16_H A5 ### 7.1 TODO --TODO + +## 附录