190 lines
5.8 KiB
C
190 lines
5.8 KiB
C
#include "system/includes.h"
|
||
#include "btstack/btstack_task.h"
|
||
#include "app_config.h"
|
||
#include "app_action.h"
|
||
#include "asm/pwm_led.h"
|
||
#include "tone_player.h"
|
||
#include "ui_manage.h"
|
||
#include "gpio.h"
|
||
#include "app_main.h"
|
||
#include "asm/charge.h"
|
||
#include "update.h"
|
||
#include "app_power_manage.h"
|
||
#include "audio_config.h"
|
||
#include "app_charge.h"
|
||
#include "bt_profile_cfg.h"
|
||
#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"
|
||
#include "calculate/skiing_tracker.h"
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||
//宏定义
|
||
#define ENABLE_XLOG 1
|
||
#ifdef xlog
|
||
#undef xlog
|
||
#endif
|
||
#if ENABLE_XLOG
|
||
#define xlog(format, ...) printf("[XT:%s] " format, __func__, ##__VA_ARGS__)
|
||
#else
|
||
#define xlog(format, ...) ((void)0)
|
||
#endif
|
||
//
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||
//START -- 函数定义
|
||
void send_data_to_ble_client(const u8* data, u16 length);
|
||
extern void create_process(u16* pid, const char* name, void *priv, void (*func)(void *priv), u32 msec);
|
||
//END -- 函数定义
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||
//START -- 变量定义
|
||
|
||
// --- 任务ID ---
|
||
static u16 xtell_i2c_test_id;
|
||
static u16 collect_data_id;
|
||
static u16 send_data_id;
|
||
|
||
// --- 环形缓冲区 ---
|
||
#define SENSOR_DATA_BUFFER_SIZE 512
|
||
static u8 sensor_data_buffer[SENSOR_DATA_BUFFER_SIZE];
|
||
static circle_buffer_t sensor_cb;
|
||
|
||
|
||
//--- test ---
|
||
static SkiingTracker skiing_data;
|
||
static char ble_send_data[50];
|
||
//END -- 变量定义
|
||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
// 从环形缓冲区读取数据并发送
|
||
void send_sensor_data_task(void) {
|
||
// printf("xtell_ble_send\n");
|
||
}
|
||
|
||
|
||
void sensor_test(){
|
||
|
||
// signed short acc_raw[3], gyr_raw[3];
|
||
|
||
// // 读取原始数据
|
||
// SL_SC7U22_RawData_Read(acc_raw, gyr_raw);
|
||
|
||
// // 将原始数据送入追踪器进行处理
|
||
// SkiingTracker_Update(&skiing_data, acc_raw, gyr_raw);
|
||
|
||
// // c. 打印状态和结果
|
||
const char* state_str = "UNKNOWN";
|
||
switch(skiing_data.state) {
|
||
case STATE_UNCALIBRATED: state_str = "UNCALIBRATED"; break;
|
||
case STATE_CALIBRATING: state_str = "CALIBRATING..."; break;
|
||
case STATE_READY: state_str = "READY"; break;
|
||
case STATE_SKIING: state_str = "SKIING"; break;
|
||
case STATE_STOPPED: state_str = "STOPPED"; break;
|
||
}
|
||
|
||
// // 转换为 km/h
|
||
// float velocity_kmh = skiing_data.velocity * 3.6f;
|
||
|
||
// printf("State: %s, Slope: %.1f deg, Vel: %.2f km/h, Dist: %.2f m\n",
|
||
// state_str,
|
||
// skiing_data.slope_angle_deg,
|
||
// velocity_kmh,
|
||
// skiing_data.distance);
|
||
|
||
|
||
|
||
|
||
signed short acc_raw[3], gyr_raw[3];
|
||
|
||
// 读取原始数据
|
||
SL_SC7U22_RawData_Read(acc_raw, gyr_raw);
|
||
|
||
// 将原始数据送入追踪器进行处理
|
||
SkiingTracker_Update(&skiing_data, acc_raw, gyr_raw);
|
||
|
||
// 清空发送缓冲区
|
||
memset(ble_send_data, 0, sizeof(ble_send_data));
|
||
|
||
// 准备要填充的数据
|
||
// 状态
|
||
char state_code = (char)skiing_data.state;
|
||
|
||
// 坡度 (舍弃小数)
|
||
char slope_angle = (char)skiing_data.slope_angle_deg;
|
||
|
||
// 速度 km/h (舍弃小数)
|
||
float velocity_kmh_float = skiing_data.velocity * 3.6f;
|
||
// 使用 uint16_t 来存储速度,因为它可能超过255
|
||
uint16_t velocity_kmh_int = (uint16_t)velocity_kmh_float;
|
||
|
||
// 距离 (m)
|
||
// 使用 uint32_t 来存储距离,因为它会变得很大
|
||
uint32_t distance_int = (uint32_t)skiing_data.distance;
|
||
|
||
// 按顺序填充到 ble_send_data 数组中
|
||
int index = 0;
|
||
|
||
// 字节 0: 状态码 (1 byte)
|
||
ble_send_data[index++] = state_code;
|
||
|
||
// 字节 1: 坡度 (1 byte)
|
||
ble_send_data[index++] = slope_angle;
|
||
|
||
// 字节 2-3: 速度 (2 bytes, 小端模式)
|
||
// 将 16 位的速度拆分成两个 8 位的 char
|
||
ble_send_data[index++] = (char)(velocity_kmh_int & 0xFF); // 低8位
|
||
ble_send_data[index++] = (char)((velocity_kmh_int >> 8) & 0xFF); // 高8位
|
||
|
||
// 字节 4-7: 距离 (4 bytes, 小端模式)
|
||
// 将 32 位的距离拆分成四个 8 位的 char
|
||
ble_send_data[index++] = (char)(distance_int & 0xFF); // 最低8位
|
||
ble_send_data[index++] = (char)((distance_int >> 8) & 0xFF);
|
||
ble_send_data[index++] = (char)((distance_int >> 16) & 0xFF);
|
||
ble_send_data[index++] = (char)((distance_int >> 24) & 0xFF); // 最高8位
|
||
|
||
send_data_to_ble_client(ble_send_data, index);
|
||
|
||
printf("State: %s, Slope: %.1f deg, Vel: %.2f km/h, Dist: %.2f m\n",
|
||
state_str,
|
||
skiing_data.slope_angle_deg,
|
||
velocity_kmh_float,
|
||
skiing_data.distance);
|
||
|
||
}
|
||
u16 test_id=0;
|
||
void xtell_task_create(void){
|
||
|
||
// int ret = hw_iic_init(0);
|
||
// xlog("hw_iic_init result:%d\n",ret);
|
||
// //初始化传感器
|
||
// SL_SC7U22_Config();
|
||
|
||
soft_iic_init(0);
|
||
gpio_set_direction(IO_PORTE_05,0); //设置PE5 输出模式
|
||
gpio_set_pull_up(IO_PORTE_05,1);
|
||
gpio_direction_output(IO_PORTE_05,1);
|
||
|
||
SL_SC7U22_Config();
|
||
// extern u8 LIS2DH12_Config(void);
|
||
// LIS2DH12_Config();
|
||
|
||
xlog("xtell_task_create\n");
|
||
// 初始化环形缓冲区
|
||
circle_buffer_init(&sensor_cb, sensor_data_buffer, SENSOR_DATA_BUFFER_SIZE);
|
||
|
||
|
||
//初始化滑雪追踪器
|
||
// SkiingTracker_Init(&skiing_data);
|
||
xlog("SkiingTracker_Init\n");
|
||
|
||
create_process(&test_id, "test",NULL, sensor_test, 10);
|
||
|
||
}
|