#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); }