This commit is contained in:
lmx
2025-10-30 11:33:38 +08:00
parent 7567ddc088
commit c21ac0ab82
34 changed files with 208045 additions and 207243 deletions

View File

@ -246,6 +246,7 @@ INCLUDES := \
-Icpu/br28/audio_hearing \
-Iinclude_lib/media/cvp \
-Iapps/earphone/xtell_Sensor \
-Iapps/earphone/xtell_Sensor \
-I$(SYS_INC_DIR) \
@ -612,6 +613,7 @@ c_SRC_FILES := \
apps/common/colorful_lights/colorful_lights.c \
apps/earphone/xtell_Sensor/LIS2DH12.c \
apps/earphone/xtell_Sensor/main.c \
apps/earphone/xtell_Sensor/circle_buffer.c
# 需要编译的 .S 文件

View File

@ -242,10 +242,6 @@ void app_main()
u32 addr = 0, size = 0;
struct intent it;
log_info("app_main\n");
app_var.start_time = timer_get_ms();
#if (defined(CONFIG_MEDIA_NEW_ENABLE) || (defined(CONFIG_MEDIA_DEVELOP_ENABLE)))
/*解码器*/
audio_enc_init();
@ -312,9 +308,14 @@ void app_main()
set_charge_event_flag(1);
#endif
log_info("app_main\n");
app_var.start_time = timer_get_ms();
void xtell_main(void);
xtell_main();
}
int __attribute__((weak)) eSystemConfirmStopStatus(void)

View File

@ -70,6 +70,9 @@
#include "bt_background.h"
#include "default_event_handler.h"
// 为xtell传感器模块声明外部SPP处理函数
extern void xtell_spp_data_handler(u8 packet_type, u16 ch, u8 *packet, u16 size);
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
extern int ais_platform_asr_open(void);
extern void ais_platform_asr_close(void);
@ -489,6 +492,11 @@ void spp_data_handler(u8 packet_type, u16 ch, u8 *packet, u16 size)
#endif
break;
}
// 将SPP事件转发给xtell传感器模块处理
if (xtell_spp_data_handler) {
xtell_spp_data_handler(packet_type, ch, packet, size);
}
}
extern const char *sdk_version_info_get(void);

View File

@ -1,10 +1,10 @@
//LIS2DH12驱动
// LIS2DH12驱动 - 由Kilo Code注释
#include "gSensor/gSensor_manage.h"
#include "app_config.h"
#include "math.h"
#include "LIS2DH12.h"
#include "colorful_lights/colorful_lights.h"
#include <string.h> // For memcpy
#include <string.h> // 用于 memcpy
#define ENABLE_XLOG 1
#ifdef xlog
@ -16,269 +16,138 @@
#define xlog(format, ...) ((void)0)
#endif
// #define SAMPLE_COUNT 25 // 定义静止状态检测所需的样本数量
// --- 运动检测核心参数 ---
#define SAMPLE_COUNT 6 // 定义静止状态检测所需的样本数量
// #define THRESHOLD 2.00f // 定义静止状态检测的阈值单位g
#define THRESHOLD 10.00f // 定义静止状态检测的阈值, 三轴传感器数据的方差
#define STATIC_MAX_TIME 60*5*5 //传感器静止最大时间,单位 200ms 超过这个值就发数据通知AI询问用户是否需要帮助
#define DORMANCY_MAX_TIME 60*5 //三个角度超过一分钟没有更新就关闭当前灯效,如果有数据刷新就恢复之前的灯效,单位200ms
u8 dormancy_flag = 0; //标识
#define THRESHOLD 50.00f // 定义静止状态检测的阈值(三轴数据方差),值越大,对微小抖动的容忍度越高
#define LPF_ALPHA 0.95f // 低通滤波系数越接近1滤波效果越强重力估算越平滑
#define DEADZONE_MSS 0.2f // 加速度死区阈值 (m/s^2),低于此值的线性加速度被视为噪声并忽略
// --- 原有业务逻辑宏定义 ---
#define STATIC_MAX_TIME 60*5*5 // 传感器静止最大时间,单位 200ms
#define DORMANCY_MAX_TIME 60*5 // 休眠检测时间,单位 200ms
u8 dormancy_flag = 0; // 休眠标识
u8 dormancy_ago_moedl = 0; // 记录休眠前灯效
u16 gsensor_static_flag; // 记录传感器静止的时间,单位 200ms
axis_info_t current_data[32]; // 全局变量存储当前数据
// Global variables for motion data
static motion_data_t motion_data = {{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}}; // 存储运动数据
static axis_info_xtell gravity_vector = {0.0f, 0.0f, 0.0f};// 存储估算的重力方向
static bool sensor_is_stable = false;
axis_info_t current_data[32]; // 用于存储从FIFO读取的原始传感器数据
// --- 运动数据全局变量 ---
static motion_data_t motion_data = {{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}}; // 存储最终计算出的速度和距离
static axis_info_xtell gravity_vector = {0.0f, 0.0f, -GRAVITY_EARTH}; // 存储估算出的重力向量初始假设Z轴朝下
static bool sensor_is_stable = false; // 传感器是否静止的标志
static axis_info_xtell linear_accel_global = {0.0f, 0.0f, 0.0f}; // 存储移除重力后的线性加速度,用于日志打印
static axis_info_xtell zero_g_offset = {0.0f, 0.0f, 0.0f}; // 存储开机校准测得的零点偏移量
u8 gsensor_alarm;
// u8 xtell_uart_Gsensor_static[5]={0xAA,0x55,0x0F,0x55,0xAA}; //发现用户长时间静止时串口发数据给AI芯片
axis_info_xtell gsensor_xtell; // 存储is_sensor_stable计算出的平均值
// 假设当前设置的满量程范围
const scale_t CURRENT_SCALE = SCALE_8G;
#define LIS2DH12_FROM_FS_8g_HR_TO_mg(lsb) (float)((int16_t)lsb>>4) * 4.0f
axis_info_xtell gsensor_xtell;
/***使用驱动前请根据实际接线情况配置7bitIIC地址******/
/** LIS2DH12 的SDO 脚接地: 0x30****************/
/** LIS2DH12 的SDO 脚接电源: 0x31****************/
// #define LIS2DH12_W_ADDR (0x31U << 1 | 0x0)
// #define LIS2DH12_R_ADDR (0x31U << 1 | 0x1)
// --- I2C地址定义 ---
#define LIS2DH12_W_ADDR 0x32
#define LIS2DH12_R_ADDR 0x33
/**IIC 寄存器地址宏定义***************/
#define LIS2DH12_OUT_TEMP_L 0x0C //温度数据低位
#define LIS2DH12_OUT_TEMP_H 0x0D //温度数据高位
#define LIS2DH12_WHO_AM_I 0x0F //读IIC寄存器 自身地址的值正确应该是0x33
#define LIS2DH12_CTRL_RGE0 0x1E //设置SDO 内部上/下拉
#define LIS2DH12_TEMP_CFG_REG 0x1F //使能温度传感器
// --- IIC 寄存器地址宏定义 ---
#define LIS2DH12_WHO_AM_I 0x0F
#define LIS2DH12_CTRL_REG1 0x20
#define LIS2DH12_CTRL_REG2 0x21
#define LIS2DH12_CTRL_REG3 0x22
#define LIS2DH12_CTRL_REG4 0x23
#define LIS2DH12_CTRL_REG5 0x24
#define LIS2DH12_CTRL_REG6 0x25
#define LIS2DH12_REFERENCE 0x26
#define LIS2DH12_STATUS_REG 0x27
#define LIS2DH12_OUT_X_L 0x28
#define LIS2DH12_OUT_X_H 0x29
#define LIS2DH12_OUT_Y_L 0x2A
#define LIS2DH12_OUT_Y_H 0x2B
#define LIS2DH12_OUT_Z_L 0x2C
#define LIS2DH12_OUT_Z_H 0x2D
#define LIS2DH12_FIFO_CTRL_REG 0x2E
#define LIS2DH12_SRC_REG 0x2F
#define LIS2DH12_INT1_CFG 0x30
#define LIS2DH12_INT1_SRC 0x31
#define LIS2DH12_INT1_THS 0x32
#define LIS2DH12_INT1_DURATION 0x33
#define LIS2DH12_INT2_CFG 0x34
#define LIS2DH12_INT2_SRC 0x35
#define LIS2DH12_INT2_THS 0x36
#define LIS2DH12_INT2_DURATION 0x37
#define LIS2DH12_CLICK_CFG 0x38
#define LIS2DH12_CLICK_SRC 0x39
#define LIS2DH12_CLICK_THS 0x3A
#define LIS2DH12_TIME_LIMIT 0x3B
#define LIS2DH12_TIME_LATENCY 0x3C
#define LIS2DH12_TIME_WINDOW 0x3D
#define LIS2DH12_ACT_THS 0x3E
#define LIS2DH12_ACT_DUR 0x3F
u32 SL_MEMS_i2cRead(u8 addr, u8 reg, u8 len, u8 *buf)
{
// --- I2C底层函数封装 ---
u32 SL_MEMS_i2cRead(u8 addr, u8 reg, u8 len, u8 *buf) {
return _gravity_sensor_get_ndata(addr, reg, buf, len);
}
u8 SL_MEMS_i2cWrite(u8 addr, u8 reg, u8 data)
{
u8 SL_MEMS_i2cWrite(u8 addr, u8 reg, u8 data) {
gravity_sensor_command(addr, reg, data);
return 0;
}
/***传感器校验 读 读IIC寄存器 自身地址的值*/
char LIS2DH12_Check()
{
// 检查传感器ID确认设备是否正常连接
char LIS2DH12_Check() {
u8 reg_value = 0;
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_WHO_AM_I, 1, &reg_value);
xlog("xtell LIS2DH12_Check: reg WHO_AM_I value = %x H\n", reg_value);
if (reg_value == 0x33) {
return 0x01;
} else {
}
return 0x00;
}
}
/*
传感器配置 初始化
*/
u8 LIS2DH12_Config(void)
{
u8 Check_Flag = 0;
u8 write_num = 0, i = 0;
// u8 ODR = 0x77; //数据速率400HZ 正常模式(低功耗-> 0x7F
u8 ODR = 0x37; //速率25hz,
u8 HP = 0x03; //开启高通滤波 HPCF位对应的表格没找到
// u8 click_int = 0x04; //将Click中断映射到INT1 OVERRUN
u8 range = 0xA0; //8g量程块使能正常模式(10位数据)
u8 fifo_en = 0x40; //使能FIFO模式
u8 fifo_mode = 0x80;//0x40; //流模式
// u8 click_mode = 0x15; //单击3轴触发
Check_Flag = LIS2DH12_Check();
if (Check_Flag == 1) {
// SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_TEMP_CFG_REG, 0xC0); //开启温度传感器
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG1, ODR);
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG2, HP);
// SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG3, click_int);// 中断的使能,默认都是禁用
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG4, range); //
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG5, fifo_en);
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_FIFO_CTRL_REG, fifo_mode);
/*
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CLICK_CFG, click_mode);//单Z轴
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CLICK_THS, LIS2DH12_CLICK_TH);//62.6mg(4g)*10
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_TIME_LIMIT, LIS2DH12_CLICK_WINDOWS);
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_TIME_LATENCY, LIS2DH12_CLICK_LATENCY);
*/
// SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG6, LIS2DH12_INT_LEVEL);
xlog(" LIS2DH12 i2c check ok\n");
return 0;
} else {
xlog(" LIS2DH12 i2c check fail\n");
return -1;
}
}
u8 LIS2DH12_disable(void)
{
u8 Check_Flag = LIS2DH12_Check();
if (Check_Flag == 1) {
u8 ODR = 0x00;
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG1, ODR);
xlog("check ok,LIS2DH12_disable\n");
return 0;
} else {
xlog("check fail\n");
return -1;
}
}
void LIS2DH12_read_data_old(axis_info_t *sl_accel)
{
u8 data[6];
u8 fifo_len = 0;
u8 STATUS_REG_data =0;
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_SRC_REG, 1, &fifo_len);
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_STATUS_REG, 1, &STATUS_REG_data);
xlog("STATUS_REG vlau = %xH\n",STATUS_REG_data);
xlog("FIFO vlau = %xH\n",fifo_len);
if ((fifo_len & 0x40) == 0x40) { //FIFO 溢出标志
fifo_len = 32;
xlog("FIFO is full\n");
} else {
fifo_len = fifo_len & 0x1f;
}
for (u8 i = 0; i < fifo_len; i++) {
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_OUT_X_L, 6, data);
sl_accel[i].x = (short)((data[1] << 8) | data[0]);
// sl_accel[i].x = sl_accel[i].x >> 4;
sl_accel[i].y = (short)((data[3] << 8) | data[2]);
// sl_accel[i].y = sl_accel[i].y >> 4;
sl_accel[i].z = (short)((data[5] << 8) | data[4]);
// sl_accel[i].z = sl_accel[i].z >> 4;
// xlog("group:%2d,sl_accel_x:%5d, sl_accel_y:%5d, sl_accel_z:%5d\n", i, sl_accel[i].x, sl_accel[i].y, sl_accel[i].z);
}
xlog("group:%2d,sl_accel_x:%5d, sl_accel_y:%5d, sl_accel_z:%5d\n", sl_accel[fifo_len -1].x, sl_accel[fifo_len -1].y, sl_accel[fifo_len -1].z);
}
//8.1 小李
// 获取三轴传感器的x,y,z加速度值
/**
* @brief 获取三轴传感器的x,y,z加速度值
*
* @param axis_info_t 参数是axis_info_t类型结构体变量用于存放x,y,z的加速度值
* @return void 此函数无返回值
*/
extern u16 High_g;
void LIS2DH12_read_data(axis_info_t *sl_accel)
{
// 从传感器FIFO读取一批原始数据
void LIS2DH12_read_data(axis_info_t *sl_accel) {
u8 fifo_src = 0;
u8 samples_available = 0;
u8 data[192]; //32*6
u8 data[192];
s16 raw_x,raw_y,raw_z;
// print_register_values(); // 打印寄存器值
// 读取FIFO状态
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_SRC_REG, 1, &fifo_src);
// xlog("FIFO_SRC_REG: 0x%02X\n", fifo_src);
// 检查FIFO是否为空
// if (fifo_src & 0x20) {
// xlog("FIFO is empty\n");
// LIS2DH12_reinit_fifo(); //重新启用FIFO
// 尝试重新初始化FIFO
// SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG5, 0x40); // 使能FIFO
// SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_FIFO_CTRL_REG, 0x40); // FIFO模式
// return;
// }
// 获取可用样本数
samples_available = fifo_src & 0x1F;
// xlog("Available samples: %d\n", samples_available);
if (samples_available == 0) return;
// 一次性读取所有FIFO数据
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_OUT_X_L | 0x80, samples_available * 6, data);
// if (SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_OUT_X_L | 0x80, samples_available * 6, data) != 0) {
// xlog("Error reading FIFO data\n");
// return;
// }
// 解析数据
for (u8 i = 0; i < samples_available; i++) {
raw_x = (int16_t)((data[i * 6 + 1] << 8) | data[i * 6]) >> 6; //传感器输出的是10位数据
// 数据处理方式与 +/-8g 普通模式(10位) 匹配
raw_x = (int16_t)((data[i * 6 + 1] << 8) | data[i * 6]) >> 6;
raw_y = (int16_t)((data[i * 6 + 3] << 8) | data[i * 6 + 2]) >> 6;
raw_z = (int16_t)((data[i * 6 + 5] << 8) | data[i * 6 + 4]) >> 6;
raw_x =convert_10bit_2s_complement(raw_x);
raw_y =convert_10bit_2s_complement(raw_y);
raw_z =convert_10bit_2s_complement(raw_z);
sl_accel[i].x = raw_x;
sl_accel[i].y = raw_y;
sl_accel[i].z = raw_z;
// if (raw_z > 0) {
// // High_g = raw_z * 0.16f;
// High_g = (u8)((float)raw_z * 0.16f);
// } else {
// // High_g = -1.0f * raw_z * 0.16f;
// High_g = (u8)((-1.0f * (float)raw_z) * 0.16f);
// }
// xlog("###High_g == %d\n",High_g);
// xlog("\nSample %d: X=%d, Y=%d, Z=%d\n", i, sl_accel[i].x, sl_accel[i].y, sl_accel[i].z); //打印从寄存器读到的数据
// gsensor_xtell.x = raw_x;
// gsensor_xtell.y = raw_y;
// gsensor_xtell.z = raw_z;
// sl_accel[i].x = raw_x;
// sl_accel[i].y = raw_y;
// sl_accel[i].z = raw_z;
// sl_accel[i].x = (float)raw_x *0.16f; //实际的加速度值 8g 量程
// sl_accel[i].y = (float)raw_y *0.16f;
// sl_accel[i].z = (float)raw_z *0.16f;
// xlog("Sample %d: X=%.2f g, Y=%.2f g, Z=%.2f g\n", i, sl_accel[i].x, sl_accel[i].y, sl_accel[i].z);
}
}
// 判断传感器是否长期静止的函数
// 开机校准函数:测量传感器的静态零点偏移
void LIS2DH12_calibrate() {
xlog("开始传感器校准...\n");
axis_info_t cal_data[32];
long x_sum = 0, y_sum = 0;
const int num_samples = 32;
delay_2ms(100); // 等待约200ms让FIFO填满数据
LIS2DH12_read_data(cal_data);
for (int i = 0; i < num_samples; i++) {
x_sum += cal_data[i].x;
y_sum += cal_data[i].y;
}
zero_g_offset.x = (float)x_sum / num_samples;
zero_g_offset.y = (float)y_sum / num_samples;
zero_g_offset.z = 0; // Z轴主要受重力影响不进行校准
xlog("校准完成. X轴偏移: %.2f, Y轴偏移: %.2f\n", zero_g_offset.x, zero_g_offset.y);
}
// 初始化并配置LIS2DH12传感器
u8 LIS2DH12_Config(void) {
if (LIS2DH12_Check() != 1) {
xlog("LIS2DH12 I2C检查失败\n");
return -1;
}
// 统一配置: 25Hz采样率, +/-8g量程, 普通模式(10位)
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG1, 0x37); // 25 Hz ODR
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG4, 0x20); // +/-8g, BDU enabled
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG5, 0x40); // 使能FIFO
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_FIFO_CTRL_REG, 0x80); // 流模式
// 执行开机校准
LIS2DH12_calibrate();
xlog("LIS2DH12 I2C检查成功\n");
return 0;
}
// 判断传感器是否处于静止状态
bool is_sensor_stable(axis_info_t *accel_data, int sample_count) {
float mean_x = 0, mean_y = 0, mean_z = 0;
float variance_x = 0, variance_y = 0, variance_z = 0;
// 计算每个轴的均值
if (sample_count <= 1) return true;
// 1. 计算均值
for (int i = 0; i < sample_count; i++) {
mean_x += accel_data[i].x;
mean_y += accel_data[i].y;
@ -287,12 +156,12 @@ bool is_sensor_stable(axis_info_t *accel_data, int sample_count) {
mean_x /= sample_count;
mean_y /= sample_count;
mean_z /= sample_count;
// xlog("Mean X: %.2f, Y: %.2f, Z: %.2f\n", mean_x, mean_y, mean_z); //平均数
gsensor_xtell.x = mean_x;
gsensor_xtell.y = mean_y;
gsensor_xtell.z = mean_z;
// 计算每个轴的方差
// 2. 计算方差
for (int i = 0; i < sample_count; i++) {
variance_x += (accel_data[i].x - mean_x) * (accel_data[i].x - mean_x);
variance_y += (accel_data[i].y - mean_y) * (accel_data[i].y - mean_y);
@ -302,209 +171,86 @@ bool is_sensor_stable(axis_info_t *accel_data, int sample_count) {
variance_y /= (sample_count - 1);
variance_z /= (sample_count - 1);
// 打印均值和方差,用于调试
// xlog("Variance X: %.2f, Y: %.2f, Z: %.2f\n", variance_x, variance_y, variance_z);
// 判断方差是否在阈值范围内
//非静止状态
// 3. 如果方差大于阈值,则认为在运动
if (variance_x > THRESHOLD || variance_y > THRESHOLD || variance_z > THRESHOLD) {
gsensor_static_flag = 0;
gsensor_alarm =0;
// xlog("**********Sensor is not stable\n");
//超过预设值休眠后重新有数据刷新
if(dormancy_flag){
dormancy_flag = 0;
set_rgb(dormancy_ago_moedl);
dormancy_ago_moedl = 0;
}
return false;
}else { //静止状态
gsensor_static_flag++;
if(gsensor_static_flag >= STATIC_MAX_TIME){
gsensor_alarm =0xFF;
// xlog("@@@Do you need help?@@@");
// gsensor_static_flag =0;
}
#if 0 //0表示测试 1表示正式代码
if(gsensor_static_flag >= DORMANCY_MAX_TIME){ //静止时间超过预设值就关闭灯效,有数据刷新再打开之前灯效
if(dormancy_ago_moedl != RGB_model){ //休眠时灯效和当前灯效 不一致就关闭灯效
dormancy_ago_moedl = RGB_model;
dormancy_flag =1;
colorful_lights_function().update_display_mode(COLORFUL_LIGHTS_DISPLAY_NULL); //关闭灯效
// xlog("dormancy close LED\n");
}
}
#endif
return true; // 传感器处于静止状态
}
}
void print_register_values(){
u8 ctrl_reg1, ctrl_reg3, ctrl_reg5, fifo_ctrl;
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_CTRL_REG1, 1, &ctrl_reg1);
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_CTRL_REG3, 1, &ctrl_reg3);
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_CTRL_REG5, 1, &ctrl_reg5);
SL_MEMS_i2cRead(LIS2DH12_R_ADDR, LIS2DH12_FIFO_CTRL_REG, 1, &fifo_ctrl);
// xlog("CTRL_REG1: 0x%02X, CTRL_REG3: 0x%02X, CTRL_REG5: 0x%02X, FIFO_CTRL_REG: 0x%02X\n", ctrl_reg1, ctrl_reg3, ctrl_reg5, fifo_ctrl);
return true;
}
void LIS2DH12_reinit_fifo() {
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG5, 0x00); // 禁用FIFO
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_FIFO_CTRL_REG, 0x00); // 禁用FIFO模式
delay_2ms(1);
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_CTRL_REG5, 0x40); // 重新使能FIFO
SL_MEMS_i2cWrite(LIS2DH12_W_ADDR, LIS2DH12_FIFO_CTRL_REG, 0x40); // 重新设置FIFO模式
}
// 转换函数
float convert_to_g_old(int16_t raw_value, scale_t scale) {
// 将 16 位有符号整数转换为浮点数
float sensitivity;
switch(scale) {
case SCALE_2G:
sensitivity = 1.0f / 16384.0f; // ±2g 范围下的灵敏度
break;
case SCALE_4G:
sensitivity = 1.0f / 8192.0f; // ±4g 范围下的灵敏度
break;
case SCALE_8G:
sensitivity = 1.0f / 4096.0f; // ±8g 范围下的灵敏度
break;
case SCALE_16G:
sensitivity = 1.0f / 2048.0f; // ±16g 范围下的灵敏度
break;
default:
sensitivity = 1.0f / 16384.0f; // 默认使用 ±2g 范围
}
return (float)raw_value * sensitivity * scale / 2.0f;
}
//10位2补码转换
int16_t convert_10bit_2s_complement(int16_t data) {
if (data & 0x200) { // 判断最高位符号位是否为1符号位为1表示2补码时负数
// 如果2补码是负数把2补码转成原码
data = ~(data - 1); // 先减1再按位取反
data &= 0x3FF; // 保留低10位
data = -data; // 加上负号
}
return data;
}
// 将原始数据转换为实际加速度值的函数
float convert_to_g(int16_t raw_value) {
float sensitivity = 0.016f; // 16 mg/digit
// switch(CURRENT_SCALE) {
// case SCALE_2G:
// sensitivity = 0.001f; // 4 mg/digit
// break;
// case SCALE_4G:
// sensitivity = 0.008f; // 8 mg/digit
// break;
// case SCALE_8G:
// sensitivity = 0.016f; // 16 mg/digit
// break;
// case SCALE_16G:
// sensitivity = 0.048f; // 48 mg/digit
// break;
// default:
// sensitivity = 0.004f; // Default to ±2g range
// }
if (raw_value & 0x200) { // 判断最高位符号位是否为1符号位为1表示2补码时负数
// 如果2补码是负数把2补码转成原码
raw_value = ~(raw_value - 1); // 先减1再按位取反
raw_value &= 0x3FF; // 保留低10位
raw_value = -raw_value; // 加上负号
}
// xlog("raw value= %d",raw_value);
// Convert to g
return (float)raw_value * sensitivity;
}
// 读取传感器数据的定时器回调函数
// 在全局变量区域添加:
axis_info_t last_accel_data = {0.0f, 0.0f, 0.0f}; // 用于存储上一时刻的加速度
// --- New functions for motion tracking ---
/**
* @brief 获取当前加速度值,单位 m/s^2
* @return axis_info_xtell 包含x,y,z轴加速度的结构体
*/
// 获取当前的总加速度(包含重力),单位 m/s^2
axis_info_xtell get_current_accel_mss(void) {
axis_info_xtell accel_mss;
// 1 LSb = 62 mg @ FS = 8 g
// 8g量程: 16 mg/LSB == 0.016 g/LSB
//gADC / (灵敏度LSB/g) = ADC * X g/LSB
//实际加速度 = g * 9.8 m/s^2
accel_mss.x = (float)gsensor_xtell.x * 0.016f * GRAVITY_EARTH;
accel_mss.y = (float)gsensor_xtell.y * 0.016f * GRAVITY_EARTH;
accel_mss.z = (float)gsensor_xtell.z * 0.016f * GRAVITY_EARTH;
// 灵敏度 @ +/-8g 普通模式 (10-bit) = 12 mg/LSB
const float sensitivity_g_per_lsb = 0.012f;
// 在转换前,先减去校准测得的零点偏移
accel_mss.x = ((float)gsensor_xtell.x - zero_g_offset.x) * sensitivity_g_per_lsb * GRAVITY_EARTH;
accel_mss.y = ((float)gsensor_xtell.y - zero_g_offset.y) * sensitivity_g_per_lsb * GRAVITY_EARTH;
accel_mss.z = (float)gsensor_xtell.z * sensitivity_g_per_lsb * GRAVITY_EARTH;
return accel_mss;
}
/**
* @brief 获取计算出的运动数据(速度和距离)
* @param data 指向 motion_data_t 结构体的指针,用于存放结果
*/
// 获取计算好的运动数据(速度和距离)
void get_motion_data(motion_data_t *data) {
if (data) {
// Use a critical section or disable interrupts if this can be called from another thread
memcpy(data, &motion_data, sizeof(motion_data_t));
}
}
// 获取移除重力后的线性加速度
axis_info_xtell get_linear_accel_mss(void) {
return linear_accel_global;
}
// 核心计算任务,由定时器周期性调用
void xtell_i2c_test() {
// 获取LIS2DH12三轴加速度
// 1. 读取一批最新的传感器数据
LIS2DH12_read_data(current_data);
//判断是否静止, is_sensor_stable会更新全局变量gsensor_xtell
// 2. 判断传感器当前是否静止
sensor_is_stable = is_sensor_stable(current_data, SAMPLE_COUNT);
// 3. 获取校准和转换后的总加速度 (m/s^2)
axis_info_xtell current_accel_mss = get_current_accel_mss();
axis_info_xtell linear_accel;
// 低通滤波器,把运动产生的加速度和地球重力产生的加速度分开
// 4. 使用低通滤波器估算重力向量
gravity_vector.x = LPF_ALPHA * gravity_vector.x + (1.0f - LPF_ALPHA) * current_accel_mss.x;
gravity_vector.y = LPF_ALPHA * gravity_vector.y + (1.0f - LPF_ALPHA) * current_accel_mss.y;
gravity_vector.z = LPF_ALPHA * gravity_vector.z + (1.0f - LPF_ALPHA) * current_accel_mss.z;
// 总加速度中减去重力
linear_accel.x = current_accel_mss.x - gravity_vector.x;
linear_accel.y = current_accel_mss.y - gravity_vector.y;
linear_accel.z = current_accel_mss.z - gravity_vector.z;
// 5. 从总加速度中减去重力,得到线性加速度
linear_accel_global.x = current_accel_mss.x - gravity_vector.x;
linear_accel_global.y = current_accel_mss.y - gravity_vector.y;
linear_accel_global.z = current_accel_mss.z - gravity_vector.z;
// 积分得到速度
motion_data.velocity.x += linear_accel.x * SAMPLING_PERIOD_S;
motion_data.velocity.y += linear_accel.y * SAMPLING_PERIOD_S;
motion_data.velocity.z += linear_accel.z * SAMPLING_PERIOD_S;
// 6. 应用死区:忽略过小的加速度值(噪声)
if (fabsf(linear_accel_global.x) < DEADZONE_MSS) linear_accel_global.x = 0.0f;
if (fabsf(linear_accel_global.y) < DEADZONE_MSS) linear_accel_global.y = 0.0f;
if (fabsf(linear_accel_global.z) < DEADZONE_MSS) linear_accel_global.z = 0.0f;
// 静止
// 7. 积分线性加速度,得到速度
motion_data.velocity.x += linear_accel_global.x * SAMPLING_PERIOD_S;
motion_data.velocity.y += linear_accel_global.y * SAMPLING_PERIOD_S;
motion_data.velocity.z += linear_accel_global.z * SAMPLING_PERIOD_S;
// 8. 如果传感器静止,重置速度和距离以消除漂移
if (sensor_is_stable) {
xlog("stop now\n");
motion_data.velocity.x = 0.0f;
motion_data.velocity.y = 0.0f;
motion_data.velocity.z = 0.0f;
motion_data.distance.x = 0.0f;
motion_data.distance.y = 0.0f;
motion_data.distance.z = 0.0f;
}
// 再次积分得到距离
// 9. 积分速度,得到距离
motion_data.distance.x += motion_data.velocity.x * SAMPLING_PERIOD_S;
motion_data.distance.y += motion_data.velocity.y * SAMPLING_PERIOD_S;
motion_data.distance.z += motion_data.velocity.z * SAMPLING_PERIOD_S;
// 10. 计算并打印总的移动距离(可选,用于调试)
float total_distance_magnitude = sqrtf(motion_data.distance.x * motion_data.distance.x +
motion_data.distance.y * motion_data.distance.y +
motion_data.distance.z * motion_data.distance.z);
xlog("================================================================\n");
xlog("Total Distance Magnitude: %.2f m\n", total_distance_magnitude);
xlog("================================================================\n");
// xlog("Total distance traveled: %.2f m\n", total_distance_magnitude);
}

View File

@ -1,57 +1,59 @@
#ifndef LIS2DH12_H
#define LIS2DH12_H
#include "gSensor/gSensor_manage.h"
// #include <stdatomic.h>
#include "le_rcsp_adv_module.h"
// --- 物理常量定义 ---
#define GRAVITY_EARTH 9.80665f // 地球重力加速度 (m/s^2)
#define SAMPLING_PERIOD_S 0.2f // 采样周期 (对应于200ms的定时器)
// Constants
#define GRAVITY_EARTH 9.80665f // m/s^2
#define SAMPLING_PERIOD_S 2 // 采样周期s
#define LPF_ALPHA 0.8f // 低通滤波系数
// --- 数据结构定义 ---
// 三轴数据结构体 (可用于加速度、速度、距离)
typedef struct {
float x;
float y;
float z;
} axis_info_xtell;
// 运动数据结构体,包含速度和距离
typedef struct {
axis_info_xtell velocity; // m/s
axis_info_xtell distance; // m
axis_info_xtell velocity; // 速度 (m/s)
axis_info_xtell distance; // 距离 (m)
} motion_data_t;
// --- API 函数声明 ---
// 定义可能的满量程范围
typedef enum {
SCALE_2G = 2,
SCALE_4G = 4,
SCALE_8G = 8,
SCALE_16G = 16
} scale_t;
/**
* @brief 初始化并配置LIS2DH12传感器
* @return 0 表示成功, -1 表示失败
*/
unsigned char LIS2DH12_Config(void);
char LIS2DH12_Check();
unsigned char LIS2DH12_disable(void);
void LIS2DH12_read_data(axis_info_t *sl_accel);
void print_register_values();
void LIS2DH12_reinit_fifo();
// float convert_to_g(int16_t raw_value, scale_t scale);
float convert_to_g(int16_t raw_value);
void xtell_i2c_test();
// 获取运动数据
/**
* @brief 核心计算任务,应由定时器周期性调用
*/
void xtell_i2c_test(void);
// --- 数据获取函数声明 ---
/**
* @brief 获取计算好的运动数据(速度和距离)
* @param data 指向 motion_data_t 结构体的指针,用于存放结果
*/
void get_motion_data(motion_data_t *data);
/**
* @brief 获取当前的总加速度(包含重力),单位 m/s^2
* @return axis_info_xtell 包含x,y,z轴总加速度的结构体
*/
axis_info_xtell get_current_accel_mss(void);
//10位2补码转换
int16_t convert_10bit_2s_complement(int16_t data);
// typedef struct {
// short x;
// short y;
// short z;
// } axis_info_t;
/**
* @brief 获取当前移除重力后的线性加速度,单位 m/s^2
* @return axis_info_xtell 包含x,y,z轴线性加速度的结构体
*/
axis_info_xtell get_linear_accel_mss(void);
#endif

View File

@ -0,0 +1,81 @@
#include "circle_buffer.h"
#include <string.h>
// 初始化环形缓冲区
void circle_buffer_init(circle_buffer_t *cb, u8 *buffer, u16 capacity) {
cb->buffer = buffer;
cb->capacity = capacity;
cb->head = 0;
cb->tail = 0;
cb->size = 0;
}
// 向环形缓冲区写入数据
u16 circle_buffer_write(circle_buffer_t *cb, const u8 *data, u16 length) {
if (length > circle_buffer_get_free_space(cb)) {
// 如果剩余空间不足,则只写入能放下的部分
length = circle_buffer_get_free_space(cb);
}
if (length == 0) {
return 0;
}
// 检查是否需要回环
if (cb->head + length > cb->capacity) {
u16 part1_len = cb->capacity - cb->head;
u16 part2_len = length - part1_len;
memcpy(cb->buffer + cb->head, data, part1_len);
memcpy(cb->buffer, data + part1_len, part2_len);
cb->head = part2_len;
} else {
memcpy(cb->buffer + cb->head, data, length);
cb->head += length;
if (cb->head == cb->capacity) {
cb->head = 0;
}
}
cb->size += length;
return length;
}
// 从环形缓冲区读取数据
u16 circle_buffer_read(circle_buffer_t *cb, u8 *data, u16 length) {
if (length > cb->size) {
// 如果要读取的长度超过了已有的数据,则只读取已有的部分
length = cb->size;
}
if (length == 0) {
return 0;
}
// 检查是否需要回环
if (cb->tail + length > cb->capacity) {
u16 part1_len = cb->capacity - cb->tail;
u16 part2_len = length - part1_len;
memcpy(data, cb->buffer + cb->tail, part1_len);
memcpy(data + part1_len, cb->buffer, part2_len);
cb->tail = part2_len;
} else {
memcpy(data, cb->buffer + cb->tail, length);
cb->tail += length;
if (cb->tail == cb->capacity) {
cb->tail = 0;
}
}
cb->size -= length;
return length;
}
// 获取已用空间的大小
u16 circle_buffer_get_size(circle_buffer_t *cb) {
return cb->size;
}
// 获取剩余空间的大小
u16 circle_buffer_get_free_space(circle_buffer_t *cb) {
return cb->capacity - cb->size;
}

View File

@ -0,0 +1,55 @@
#ifndef CIRCLE_BUFFER_H
#define CIRCLE_BUFFER_H
#include "system/includes.h"
// 定义环形缓冲区的结构体
typedef struct {
u8 *buffer; // 缓冲区指针
u16 capacity; // 缓冲区总容量
u16 head; // 头部指针(写入位置)
u16 tail; // 尾部指针(读取位置)
u16 size; // 当前已用大小
} circle_buffer_t;
/**
* @brief 初始化环形缓冲区
* @param cb 指向环形缓冲区结构体的指针
* @param buffer 外部提供的缓冲区内存
* @param capacity 缓冲区的总容量
*/
void circle_buffer_init(circle_buffer_t *cb, u8 *buffer, u16 capacity);
/**
* @brief 向环形缓冲区写入数据
* @param cb 指向环形缓冲区结构体的指针
* @param data 要写入的数据的指针
* @param length 要写入的数据的长度
* @return 实际写入的字节数
*/
u16 circle_buffer_write(circle_buffer_t *cb, const u8 *data, u16 length);
/**
* @brief 从环形缓冲区读取数据
* @param cb 指向环形缓冲区结构体的指针
* @param data 用于存放读取数据的缓冲区的指针
* @param length 想要读取的数据的长度
* @return 实际读取的字节数
*/
u16 circle_buffer_read(circle_buffer_t *cb, u8 *data, u16 length);
/**
* @brief 获取环形缓冲区中已用空间的大小
* @param cb 指向环形缓冲区结构体的指针
* @return 已用空间的大小
*/
u16 circle_buffer_get_size(circle_buffer_t *cb);
/**
* @brief 获取环形缓冲区中剩余空间的大小
* @param cb 指向环形缓冲区结构体的指针
* @return 剩余空间的大小
*/
u16 circle_buffer_get_free_space(circle_buffer_t *cb);
#endif // CIRCLE_BUFFER_H

View File

@ -0,0 +1,101 @@
#include "system/includes.h"
#include "media/includes.h"
#include "tone_player.h"
#include "earphone.h"
#include "app_config.h"
#include "app_action.h"
#include "app_task.h"
#include "btstack/avctp_user.h"
#include "btstack/btstack_task.h"
#include "btctrler/btctrler_task.h"
#include "btstack/frame_queque.h"
#include "user_cfg.h"
#include "aec_user.h"
#include "classic/hci_lmp.h"
#include "bt_common.h"
#include "bt_ble.h"
#include "bt_tws.h"
#include "pbg_user.h"
#include "btstack/bluetooth.h"
#include "colorful_lights/colorful_lights.h"
#if TCFG_AUDIO_ANC_ENABLE
#include "audio_anc.h"
#endif/*TCFG_AUDIO_ANC_ENABLE*/
#if TCFG_ANC_BOX_ENABLE
#include "app_ancbox.h"
#endif
#if TCFG_USER_TWS_ENABLE
#include "bt_tws.h"
#endif
#if TCFG_AUDIO_SPATIAL_EFFECT_ENABLE
#include "spatial_imu_trim.h"
#endif /*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
#include "include/bt_ble.h"
#endif
#if TCFG_AUDIO_CVP_DUT_ENABLE
#include "audio_cvp_dut.h"
#endif /*TCFG_AUDIO_CVP_DUT_ENABLE*/
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE
#include "app_chargestore.h"
#endif
#include "jl_kws/jl_kws_api.h"
#include "asm/charge.h"
#include "app_charge.h"
#include "ui_manage.h"
#include "app_chargestore.h"
#include "app_umidigi_chargestore.h"
#include "app_testbox.h"
#include "app_online_cfg.h"
#include "app_main.h"
#include "app_power_manage.h"
#include "gSensor/gSensor_manage.h"
#include "key_event_deal.h"
#include "classic/tws_api.h"
#include "asm/pwm_led.h"
#include "ir_sensor/ir_manage.h"
#include "in_ear_detect/in_ear_manage.h"
#include "vol_sync.h"
#include "bt_background.h"
#include "default_event_handler.h"
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
extern int ais_platform_asr_open(void);
extern void ais_platform_asr_close(void);
#endif /*CONFIG_BOARD_AISPEECH_VAD_ASR*/
#define LOG_TAG_CONST EARPHONE
#define LOG_TAG "[EARPHONE]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
static const struct application_operation app_earphone_ops = {
.state_machine = state_machine,
.event_handler = event_handler,
};
/*
* 注册earphone模式
*/
REGISTER_APPLICATION(app_BLE) = {
.name = "BLE",
.action = ACTION_EARPHONE_MAIN,
.ops = &app_earphone_ops,
.state = APP_STA_DESTROY,
};

View File

@ -1,5 +1,4 @@
#include "system/includes.h"
/*#include "btcontroller_config.h"*/
#include "btstack/btstack_task.h"
#include "app_config.h"
#include "app_action.h"
@ -17,46 +16,161 @@
#include "dev_manager/dev_manager.h"
#include "update_loader_download.h"
#include "LIS2DH12.h"
#include "circle_buffer.h"
#include "circle_buffer.h"
#include "btstack/avctp_user.h"
#define xlog(format, ...) printf("[%s] " format, __func__, ##__VA_ARGS__)
// --- 任务ID ---
static u16 xtell_i2c_test_id;
static u16 collect_data_id;
static u16 send_data_id;
u16 xtell_i2c_test_id;
u16 print_motion_data_id;
// --- 环形缓冲区 ---
#define SENSOR_DATA_BUFFER_SIZE 512
static u8 sensor_data_buffer[SENSOR_DATA_BUFFER_SIZE];
static circle_buffer_t sensor_cb;
// Task to print motion data periodically
void print_motion_data_task(void) {
motion_data_t current_motion;
axis_info_xtell current_accel;
// --- 蓝牙SPP ---
static u8 spp_connected = 0;
// Get the latest motion data
get_motion_data(&current_motion);
current_accel = get_current_accel_mss();
xlog("--- Motion Data ---\n");
xlog("Accel (m/s^2): X=%.2f, Y=%.2f, Z=%.2f\n", current_accel.x, current_accel.y, current_accel.z);
xlog("Velo (m/s): X=%.2f, Y=%.2f, Z=%.2f\n", current_motion.velocity.x, current_motion.velocity.y, current_motion.velocity.z);
xlog("Dist (m): X=%.2f, Y=%.2f, Z=%.2f\n", current_motion.distance.x, current_motion.distance.y, current_motion.distance.z);
xlog("-------------------\n");
//处理从手机接收到的SPP命令
static void handle_spp_command(u8 *packet, u16 size) {
if (size == 10 && strncmp((const char *)packet, "disconnect", 10) == 0) {
xlog("Received the 'disconnect' command, preparing to terminate the connection...\n");
// 发送一个通用的断开连接命令
user_send_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
}
else {
xlog("Received an unknown SPP command. The content is as follows:\n");
put_buf(packet, size);
}
}
void create_process(u16* pid,char* name, void *priv, void (*func)(void *priv), u32 msec){
xlog("1 name=%s, pid =%d\n",name,*pid);
// SPP事件处理 (移除static使其全局可见)
void xtell_spp_data_handler(u8 packet_type, u16 ch, u8 *packet, u16 size) {
xlog("xtell_spp_data_handler\n");
switch (packet_type) {
case 1: // SPP_CONNECT
xlog("SPP connected\n");
spp_connected = 1;
break;
case 2: // SPP_DISCONNECT
xlog("SPP disconnected\n");
spp_connected = 0;
break;
case 7: // SPP_DATA
// 调用命令处理函数
handle_spp_command(packet, size);
break;
default:
xlog("spp event error\n");
break;
}
}
// 采集传感器数据并存入环形缓冲区的任务
void collect_and_buffer_sensor_data_task(void) {
if (!spp_connected) {
xlog("SPP not connected. Skipping data collection.\n");
return; // 如果未连接,则不采集数据
}
motion_data_t current_motion;
axis_info_xtell total_accel;
axis_info_xtell linear_accel;
char data_string[256];
// 从驱动获取最新的运动数据
get_motion_data(&current_motion);
total_accel = get_current_accel_mss();
linear_accel = get_linear_accel_mss();
// 将浮点数据转换为整数乘以100以保留两位小数进行格式化
int len = snprintf(data_string, sizeof(data_string),
"T:%d,%d,%d;L:%d,%d,%d;V:%d,%d,%d;D:%d,%d,%d\n",
(int)(total_accel.x * 100), (int)(total_accel.y * 100), (int)(total_accel.z * 100),
(int)(linear_accel.x * 100), (int)(linear_accel.y * 100), (int)(linear_accel.z * 100),
(int)(current_motion.velocity.x * 100), (int)(current_motion.velocity.y * 100), (int)(current_motion.velocity.z * 100),
(int)(current_motion.distance.x * 100), (int)(current_motion.distance.y * 100), (int)(current_motion.distance.z * 100));
// 写入环形缓冲区
u16 written = circle_buffer_write(&sensor_cb, (u8*)data_string, len);
if (written < len) {
xlog("The circular buffer is full!\n");
}
}
// 从环形缓冲区读取数据并通过SPP发送的任务
void send_sensor_data_task(void) {
// xlog("发送任务执行,连接状态: %d, 缓冲区大小: %d\n", spp_connected, circle_buffer_get_size(&sensor_cb));
if (!spp_connected || circle_buffer_get_size(&sensor_cb) == 0) {
return;
}
#define MAX_SPP_PACKET_SIZE 128 // 根据实际情况调整
u8 send_buf[MAX_SPP_PACKET_SIZE];
u16 len_to_read = circle_buffer_get_size(&sensor_cb);
if (len_to_read > MAX_SPP_PACKET_SIZE) {
len_to_read = MAX_SPP_PACKET_SIZE;
}
u16 read_len = circle_buffer_read(&sensor_cb, send_buf, len_to_read);
if (read_len > 0) {
user_send_cmd_prepare(USER_CTRL_SPP_SEND_DATA, read_len, send_buf);
}
xlog("send data by spp\n");
}
void create_process(u16* pid, const char* name, void *priv, void (*func)(void *priv), u32 msec){
xlog("Create Task: %s, pid=%d\n", name, *pid);
if (*pid != 0) return;
*pid = sys_timer_add(priv, func, msec);
xlog("2 name=%s, pid =%d\n",name,*pid);
xlog("Task %s is created, pid=%d\n", name, *pid);
}
void rcsp_adv_fill_mac_addr(u8 *mac_addr_buf) //by xtell
{
swapX(bt_get_mac_addr(), mac_addr_buf, 6);
}
void xtell_main(void){
soft_iic_init(0); // 引脚选择在demo_cf.h中
u8 mac_data[6];
soft_iic_init(0);
extern u8 LIS2DH12_Config(void);
LIS2DH12_Config();
// This task runs every 200ms to perform the calculations
create_process(&xtell_i2c_test_id, "xtell_i2c_test",NULL, xtell_i2c_test, SAMPLING_PERIOD_S*1000);
rcsp_adv_fill_mac_addr(mac_data); //读取MAC地址
xlog("xtell BT mac data:%x:%x:%x:%x:%x:%x",mac_data[0],mac_data[1],mac_data[2],mac_data[3],mac_data[4],mac_data[5]);
// This task runs every 1000ms to print the results
create_process(&print_motion_data_id, "print_motion_data_task", NULL, print_motion_data_task, 1000);
//开经典蓝牙
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL); //打开蓝牙可发现,已连接时不能操作
delay_2ms(50);
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL); //打开蓝牙可连接
delay_2ms(50);
// connect_last_device_from_vm(); //自动回连上一个设备
// 初始化环形缓冲区
circle_buffer_init(&sensor_cb, sensor_data_buffer, SENSOR_DATA_BUFFER_SIZE);
// 注册SPP数据处理回调 (此操作已由earphone.c统一处理此处不再需要)
/* spp_data_deal_handle_register(xtell_spp_data_handler); */
// 创建一个定时器每200ms调用一次核心计算任务
create_process(&xtell_i2c_test_id, "xtell_i2c_test", NULL, xtell_i2c_test, (u32)(SAMPLING_PERIOD_S * 1000));
// 创建一个定时器每1000ms采集一次数据
create_process(&collect_data_id, "collect_data", NULL, collect_and_buffer_sensor_data_task, 1000);
// 创建一个定时器每200ms尝试发送一次数据
create_process(&send_data_id, "send_data", NULL, send_sensor_data_task, 200);
}

View File

@ -392,11 +392,11 @@ int lp_touch_key_online_debug_exit(void)
extern u8 testbox_get_key_action_test_flag(void *priv);
extern void eartch_state_update(u8 state);
__attribute__((weak))
u32 user_send_cmd_prepare(USER_CMD_TYPE cmd, u16 param_len, u8 *param)
{
return 0;
}
// __attribute__((weak))
// u32 user_send_cmd_prepare(USER_CMD_TYPE cmd, u16 param_len, u8 *param)
// {
// return 0;
// }
u8 lp_touch_key_testbox_remote_test(u8 ch, u8 event)
{

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -2865,7 +2865,6 @@ objs/apps/earphone/app_main.c.o
-r=objs/apps/earphone/app_main.c.o,power_set_soft_poweroff,l
-r=objs/apps/earphone/app_main.c.o,get_charge_online_flag,l
-r=objs/apps/earphone/app_main.c.o,app_main,pl
-r=objs/apps/earphone/app_main.c.o,timer_get_ms,l
-r=objs/apps/earphone/app_main.c.o,audio_enc_init,l
-r=objs/apps/earphone/app_main.c.o,audio_dec_init,l
-r=objs/apps/earphone/app_main.c.o,update_result_deal,l
@ -2874,6 +2873,7 @@ objs/apps/earphone/app_main.c.o
-r=objs/apps/earphone/app_main.c.o,check_power_on_voltage,l
-r=objs/apps/earphone/app_main.c.o,ui_manage_init,l
-r=objs/apps/earphone/app_main.c.o,ui_update_status,l
-r=objs/apps/earphone/app_main.c.o,timer_get_ms,l
-r=objs/apps/earphone/app_main.c.o,xtell_main,l
-r=objs/apps/earphone/app_main.c.o,eSystemConfirmStopStatus,pl
-r=objs/apps/earphone/app_main.c.o,get_charge_full_flag,l
@ -3134,6 +3134,7 @@ objs/apps/earphone/earphone.c.o
-r=objs/apps/earphone/earphone.c.o,link_fix_rx_update_result,
-r=objs/apps/earphone/earphone.c.o,printf,l
-r=objs/apps/earphone/earphone.c.o,spp_data_handler,pl
-r=objs/apps/earphone/earphone.c.o,xtell_spp_data_handler,l
-r=objs/apps/earphone/earphone.c.o,bredr_handle_register,pl
-r=objs/apps/earphone/earphone.c.o,spp_data_deal_handle_register,l
-r=objs/apps/earphone/earphone.c.o,bt_fast_test_handle_register,l
@ -5550,9 +5551,9 @@ objs/cpu/br28/lp_touch_key_tool.c.o
-r=objs/cpu/br28/lp_touch_key_tool.c.o,lpctmu_tws_send_event_data,pl
-r=objs/cpu/br28/lp_touch_key_tool.c.o,tws_api_get_tws_state,l
-r=objs/cpu/br28/lp_touch_key_tool.c.o,lpctmu_tws_send_res_data,pl
-r=objs/cpu/br28/lp_touch_key_tool.c.o,user_send_cmd_prepare,l
-r=objs/cpu/br28/lp_touch_key_tool.c.o,lp_touch_key_testbox_remote_test,pl
-r=objs/cpu/br28/lp_touch_key_tool.c.o,log_print,l
-r=objs/cpu/br28/lp_touch_key_tool.c.o,user_send_cmd_prepare,l
-r=objs/cpu/br28/lp_touch_key_tool.c.o,lp_touch_key_testbox_inear_trim,pl
-r=objs/cpu/br28/lp_touch_key_tool.c.o,set_lpkey_active,
-r=objs/cpu/br28/lp_touch_key_tool.c.o,local_irq_disable,l
@ -6284,44 +6285,56 @@ objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,SL_MEMS_i2cWrite,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,gravity_sensor_command,l
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_Check,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,printf,l
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_Config,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_disable,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_read_data_old,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_read_data,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,convert_10bit_2s_complement,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,is_sensor_stable,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,set_rgb,
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,print_register_values,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_reinit_fifo,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_calibrate,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,printf,l
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,delay_2ms,l
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,convert_to_g_old,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,convert_to_g,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,LIS2DH12_Config,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,is_sensor_stable,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,get_current_accel_mss,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,get_motion_data,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,get_linear_accel_mss,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,xtell_i2c_test,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,fabsf,l
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,sqrtf,l
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,dormancy_flag,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,dormancy_ago_moedl,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,CURRENT_SCALE,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,gsensor_xtell,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,current_data,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,gsensor_static_flag,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,gsensor_alarm,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,last_accel_data,pl
-r=objs/apps/earphone/xtell_Sensor/LIS2DH12.c.o,current_data,pl
objs/apps/earphone/xtell_Sensor/main.c.o
-r=objs/apps/earphone/xtell_Sensor/main.c.o,print_motion_data_task,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,xtell_spp_data_handler,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,printf,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,collect_and_buffer_sensor_data_task,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,get_motion_data,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,get_current_accel_mss,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,printf,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,get_linear_accel_mss,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,snprintf,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,circle_buffer_write,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,send_sensor_data_task,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,circle_buffer_get_size,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,circle_buffer_read,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,user_send_cmd_prepare,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,create_process,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,sys_timer_add,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,rcsp_adv_fill_mac_addr,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,swapX,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,bt_get_mac_addr,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,xtell_main,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,soft_iic_init,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,LIS2DH12_Config,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,delay_2ms,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,circle_buffer_init,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,xtell_i2c_test,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,xtell_i2c_test_id,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,print_motion_data_id,pl
-r=objs/apps/earphone/xtell_Sensor/main.c.o,strncmp,l
-r=objs/apps/earphone/xtell_Sensor/main.c.o,put_buf,l
objs/apps/earphone/xtell_Sensor/circle_buffer.c.o
-r=objs/apps/earphone/xtell_Sensor/circle_buffer.c.o,circle_buffer_init,pl
-r=objs/apps/earphone/xtell_Sensor/circle_buffer.c.o,circle_buffer_write,pl
-r=objs/apps/earphone/xtell_Sensor/circle_buffer.c.o,circle_buffer_get_free_space,pl
-r=objs/apps/earphone/xtell_Sensor/circle_buffer.c.o,circle_buffer_read,pl
-r=objs/apps/earphone/xtell_Sensor/circle_buffer.c.o,circle_buffer_get_size,pl
cpu/br28/liba/cpu.a.llvm.19376.crc16.c
-r=cpu/br28/liba/cpu.a.llvm.19376.crc16.c,__crc16_mutex_init,pl
-r=cpu/br28/liba/cpu.a.llvm.19376.crc16.c,os_mutex_create,l

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,102 @@
objs/apps/earphone/xtell_Sensor/circle_buffer.c.o: \
apps/earphone/xtell_Sensor/circle_buffer.c \
apps/earphone/xtell_Sensor/circle_buffer.h \
include_lib\system/includes.h include_lib/system/init.h \
include_lib/system/event.h include_lib/system/generic/typedef.h \
include_lib/driver/cpu/br28\asm/cpu.h \
include_lib/driver/cpu/br28\asm/br28.h \
include_lib/driver/cpu/br28\asm/io_omap.h \
include_lib/driver/cpu/br28\asm/io_imap.h \
include_lib/driver/cpu/br28\asm/csfr.h \
include_lib/driver/cpu/br28\asm/cache.h \
include_lib/driver/cpu/br28\asm/irq.h \
include_lib/driver/cpu/br28\asm/hwi.h \
include_lib/system\generic/printf.h include_lib\system/generic/log.h \
include_lib/system\generic/errno-base.h \
C:/JL/pi32/pi32v2-include\string.h C:/JL/pi32/pi32v2-include/_ansi.h \
C:/JL/pi32/pi32v2-include\newlib.h \
C:/JL/pi32/pi32v2-include\sys/config.h \
C:/JL/pi32/pi32v2-include\machine/ieeefp.h \
C:/JL/pi32/pi32v2-include\sys/features.h \
C:/JL/pi32/pi32v2-include\sys/reent.h \
C:/JL/pi32/pi32v2-include\sys/_types.h \
C:/JL/pi32/pi32v2-include\machine/_types.h \
C:/JL/pi32/pi32v2-include\machine/_default_types.h \
C:/JL/pi32/pi32v2-include\sys/lock.h \
C:/JL/pi32/pi32v2-include\sys/cdefs.h \
C:/JL/pi32/pi32v2-include\sys/string.h \
C:/JL/pi32/pi32v2-include\strings.h \
C:/JL/pi32/pi32v2-include\sys/types.h \
C:/JL/pi32/pi32v2-include\sys/_stdint.h \
C:/JL/pi32/pi32v2-include\machine/types.h include_lib\system/malloc.h \
include_lib/system/generic/list.h include_lib/system/generic/rect.h \
include_lib/system/spinlock.h include_lib/system/generic\cpu.h \
include_lib/system/generic\irq.h include_lib/system/task.h \
include_lib/system/os/os_api.h include_lib/system\os/os_cpu.h \
include_lib/system/generic\jiffies.h include_lib/system\os/os_error.h \
include_lib/system\os/os_type.h include_lib/system\os/ucos_ii.h \
include_lib/system\os/os_cfg.h include_lib/system\os/os_api.h \
include_lib/system/timer.h include_lib/system/wait.h \
include_lib/system/app_core.h include_lib/system/app_msg.h \
include_lib/system/database.h include_lib/system/fs/fs.h \
include_lib/system\generic/ioctl.h include_lib/system\generic/atomic.h \
include_lib\system/sys_time.h include_lib/system/fs/fs_file_name.h \
include_lib/system/fs/sdfile.h include_lib/system/power_manage.h \
include_lib/system/syscfg_id.h include_lib/system/bank_switch.h \
include_lib/system/generic/includes.h \
include_lib/system/generic/ascii.h include_lib/system/generic/gpio.h \
include_lib/driver/cpu/br28\asm/gpio.h \
include_lib/system/generic/version.h include_lib/system/generic/lbuf.h \
include_lib/system/generic/lbuf_lite.h \
include_lib/system/generic/circular_buf.h \
include_lib/system/generic/index.h \
include_lib/system/generic/debug_lite.h \
include_lib/system/device/includes.h \
include_lib/system/device/device.h \
include_lib/system\device/ioctl_cmds.h \
include_lib/system/device/key_driver.h \
include_lib/system/device/iokey.h include_lib/system/device/irkey.h \
include_lib/system/device/adkey.h \
include_lib/driver/cpu/br28\asm/adc_api.h \
include_lib/system/device/slidekey.h \
include_lib/system/device/touch_key.h \
include_lib/driver/cpu/br28\asm/plcnt.h \
include_lib/system/device/rdec_key.h \
include_lib/driver/cpu/br28\asm/rdec.h \
include_lib/driver/cpu/br28\asm/includes.h \
include_lib/driver/cpu/br28\asm/crc16.h \
include_lib/driver/cpu/br28\asm/clock.h \
include_lib/driver/cpu/br28\asm/clock_hw.h \
include_lib/driver/cpu/br28\asm/clock_define.h \
include_lib/driver/cpu/br28\asm/uart.h \
include_lib/driver\device/uart.h \
include_lib/driver/cpu/br28\asm/uart_dev.h \
include_lib/driver/cpu/br28\asm/spiflash.h \
include_lib/driver\device/spiflash.h \
include_lib/driver/cpu/br28\asm/power_interface.h \
include_lib/driver/cpu/br28\asm/power/p33.h \
include_lib/driver/cpu/br28/asm/power/p33_sfr.h \
include_lib/driver/cpu/br28/asm/power/p33_app.h \
include_lib/driver/cpu/br28/asm/power/p33_io_app.h \
include_lib/driver/cpu/br28/asm/power/rtc_app.h \
include_lib/driver/cpu/br28\asm/power/p11.h \
include_lib/driver/cpu/br28/asm/power/p11_csfr.h \
include_lib/driver/cpu/br28/asm/power/p11_sfr.h \
include_lib/driver/cpu/br28/asm/power/p11_io_omap.h \
include_lib/driver/cpu/br28/asm/power/p11_io_imap.h \
include_lib/driver/cpu/br28/asm/power/p11_app.h \
include_lib/driver/cpu/br28/asm/power/p11.h \
include_lib/driver/cpu/br28\asm/power/power_api.h \
include_lib/driver/cpu/br28\asm/power/power_port.h \
include_lib/driver/cpu/br28\asm/power/power_wakeup.h \
include_lib/driver/cpu/br28\asm/power/power_reset.h \
include_lib/driver/cpu/br28\asm/power/power_compat.h \
include_lib/driver/cpu/br28\asm/power/lp_ipc.h \
include_lib/driver/cpu/br28/asm/power/m2p_msg.h \
include_lib/driver/cpu/br28/asm/power/p2m_msg.h \
include_lib/driver/cpu/br28\asm/efuse.h \
include_lib/driver/cpu/br28\asm/wdt.h \
include_lib/driver/cpu/br28\asm/debug.h \
include_lib/driver/cpu/br28\asm/timer.h \
include_lib/driver/cpu/br28\asm/rtc.h \
include_lib/driver\device/sdio_host_init.h

Binary file not shown.

View File

@ -154,4 +154,6 @@ objs/apps/earphone/xtell_Sensor/main.c.o: \
include_lib/media/media_new\media/audio_cfifo.h \
apps/common/icsd/anc/icsd_anc.h C:/JL/pi32/pi32v2-include\math.h \
apps/common/icsd/anc/icsd_anc_client_board.h \
cpu/br28/audio_anc_fade_ctr.h
cpu/br28/audio_anc_fade_ctr.h \
apps/earphone/xtell_Sensor/circle_buffer.h \
include_lib\btstack/avctp_user.h include_lib/btstack/btstack_typedef.h

Binary file not shown.