From a8fddb422069948b848880cdb72de31e1745ded7 Mon Sep 17 00:00:00 2001 From: ipason Date: Wed, 23 Apr 2025 13:18:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9bs=E6=B5=8B=E8=AF=95=E4=B8=AD?= =?UTF-8?q?=E9=80=94=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 6 +- components/FluxProtocol/FluxProtocol.c | 117 +++++++++++++++++++++++- components/FluxProtocol/FluxProtocol.h | 60 ++++++++++++ components/FluxUI/screens/ui_pageHome.c | 26 +++++- components/FluxUI/ui.c | 2 + components/FluxUI/ui.h | 2 + components/FluxUI/ui_event_homePage.c | 29 +----- main/main.cpp | 4 + 8 files changed, 215 insertions(+), 31 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 047223f..7dfa96f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -48,6 +48,10 @@ "time.h": "c", "types.h": "c", "timespec.h": "c", - "fluxprotocol.h": "c" + "fluxprotocol.h": "c", + "fluxsd.h": "c", + "bitset": "c", + "algorithm": "c", + "format": "c" } } diff --git a/components/FluxProtocol/FluxProtocol.c b/components/FluxProtocol/FluxProtocol.c index c57ebaa..289e129 100644 --- a/components/FluxProtocol/FluxProtocol.c +++ b/components/FluxProtocol/FluxProtocol.c @@ -19,9 +19,17 @@ float Spirit3_Volume[4] = { 210,420,630,750}; float Spirit6_Volume[6] = { 210,420,630,840,1050,1200}; float YULite8_Volume[6] = { 210,420,630,840,1050,1200}; +/* 流量计六个挡位测试时间序列 */ +int flux_test_time_series[6] = {40,30,24,20,18,15}; +/* 定于用于存储当前测试阶段的枚举变量 */ +enum Bs_test_Stage currentTestStage = BS_STAGE_NONE; + /* 应用 event_homePage 中的测试状态显示变量 */ extern bool is_bs_test_ing; +/* 定义控制LED小灯的任务句柄 */ +TaskHandle_t bs_stateLED_task_handle; + /* * @brief 拼接测试过程中用于展示的字符串 * 1.时间设置发送成功 Time setting sent successfully @@ -50,9 +58,40 @@ struct FluxProtocol fluxProtocol; */ void bs_test_task(void* arg) { + /* 进行6次循环测计数 */ + uint8_t testCount = 0; + while(1) { + /* 恢复LED显示任务 */ + vTaskResume(bs_stateLED_task_handle); + currentTestStage = BS_STAGE_START; + + for ( testCount = 0; testCount < sizeof(flux_test_time_series); testCount++) + { + + } + + /* 显示测试开始 */ + BS_HOMEPAGE_SHOW("15BPM start testing..."); + FLUX_PROGRESS_BAR_CONTROL(10); + + /* 测试开始 15BPM */ + /* 下发测试时间 */ + flux_test_time_set(flux_test_time_series[0]); vTaskDelay(1000 / portTICK_PERIOD_MS); + /* 下发启动指令 */ + flux_test_start(); + currentTestStage = BS_STAGE_15BPM; + /* 等待测试时间 */ + vTaskDelay(flux_test_time_series[0]*1000 / portTICK_PERIOD_MS); + vTaskDelay(2000 / portTICK_PERIOD_MS); + /* 15BPM测试结束 显示测试结束 */ + BS_HOMEPAGE_SHOW("15BPM end test"); + FLUX_PROGRESS_BAR_CONTROL(20); + /* 读取测试结果 */ + flux_test_result_get(); + ESP_LOGI("bs_test_task", "bs_test_task"); @@ -81,7 +120,12 @@ void bs_test_task(void* arg) /* 任务测试完毕 删除任务 */ lv_label_set_text(ui_pageHome_labelStartTest1,"Start Test BS"); is_bs_test_ing = false; + + /* 挂起LED显示任务 */ + BS_STATE_LED_TASK_SUSPEND; + vTaskDelete(NULL); + } } @@ -98,10 +142,75 @@ void bs_test_led_task(void* arg) { while(1) { - vTaskDelay(1000 / portTICK_PERIOD_MS); - ESP_LOGI("bs_test_led_task", "bs_test_led_task"); + vTaskDelay(BS_LED_BLINK_INTERVAL_MS / portTICK_PERIOD_MS); + lv_obj_set_style_bg_color(ui_pageHome_panelBSLEDing,lv_color_hex(0x00FF00),LV_PART_MAIN); - vTaskDelay(1000 / portTICK_PERIOD_MS); - ESP_LOGI("bs_test_led_task", "bs_test_led_task end?"); + vTaskDelay(BS_LED_BLINK_INTERVAL_MS / portTICK_PERIOD_MS); + lv_obj_set_style_bg_color(ui_pageHome_panelBSLEDing,lv_color_hex(0xFFFFFF),LV_PART_MAIN); } +} + +/** + * @brief 向流量计下发测试时间 + * + * 时间下发 + * + * @param[in] time 向流量计下发测试的时间 + * + */ +void flux_test_time_set(float var_time) +{ + /* 设置15BPM测试时间 */ + uint8_t bytes[4]; + float time = var_time; + memcpy(bytes, &time, 4); + + /* 下发命令 */ + flux_frame.ADDR = FLUX_ADDR; + flux_frame.FUNC = FLUX_FUNC_SET_SINGLE; + flux_frame.DATA[0] = 0x00; + flux_frame.DATA[1] = 0x02; + flux_frame.DATA[2] = bytes[3]; + flux_frame.DATA[3] = bytes[2]; + + /* 下发15BPM测试时间指令*/ + ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame)); + +} + +/** + * @brief 向流量计下发启动测试指令 + * + */ +void flux_test_start(void) +{ + /* 下发启动测试指令 */ + flux_frame_start.ADDR = FLUX_ADDR; + flux_frame_start.FUNC = FLUX_FUNC_SET_SINGLE; + flux_frame_start.DATA[0] = 0x00; + flux_frame_start.DATA[1] = 0x01; + flux_frame_start.DATA[2] = 0x00; + flux_frame_start.DATA[3] = 0x01; + ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame_start)); + +} + +/** + * @brief 向流量计下获取测试结果指令 + * + */ +void flux_test_result_get(void) +{ + /*下发数据获取指令*/ + /* 起始地址为 0x00 */ + flux_frame.DATA[0] = 0; + flux_frame.DATA[1] = 0; + + /* 数据长度为 120 */ + flux_frame.DATA[2] = 0; + flux_frame.DATA[3] = 120; + flux_frame.FUNC = FLUX_FUNC_READ; + + /*下发问询120个参数*/ + ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame)); } \ No newline at end of file diff --git a/components/FluxProtocol/FluxProtocol.h b/components/FluxProtocol/FluxProtocol.h index 64bee99..62073b8 100644 --- a/components/FluxProtocol/FluxProtocol.h +++ b/components/FluxProtocol/FluxProtocol.h @@ -39,6 +39,27 @@ extern float YULite8_Volume[6]; /* 导出消息数据*/ extern char *test_info[]; +/* 导出LED小灯控制句柄 */ +extern TaskHandle_t bs_stateLED_task_handle; + +/* 定义LED小灯闪烁时间间隔 ms */ +#define BS_LED_BLINK_INTERVAL_MS 500 + +/* 定义枚举用于标记当前测试阶段 */ +typedef enum Bs_test_Stage{ + BS_STAGE_15BPM, + BS_STAGE_20BPM, + BS_STAGE_25BPM, + BS_STAGE_30BPM, + BS_STAGE_35BPM, + BS_STAGE_40BPM, + BS_STAGE_MAX, + BS_STAGE_NONE, + BS_STAGE_ERROR, + BS_STAGE_FINISH, + BS_STAGE_START, +}; + /* 声明设备类型 */ typedef enum DeviceType{ Spirit3, @@ -96,6 +117,13 @@ typedef struct FluxCommand lv_label_set_text(ui_pageHome_LabelRate35Result, "0");\ lv_label_set_text(ui_pageHome_LabelRate40Result, "0"); +/* 创建led任务挂起宏函数 */ +#define BS_STATE_LED_TASK_SUSPEND vTaskSuspend(bs_stateLED_task_handle);\ + lv_obj_set_style_bg_color(ui_pageHome_panelBSLEDing,lv_color_hex(0xFFFFFF),LV_PART_MAIN); + +/* BS测试过程中快速显示测试状态 */ +#define BS_HOMEPAGE_SHOW(x) lv_label_set_text(ui_pageHome_labelBSInfo,x); + /** * @brief 新建用于进行带BS测试的任务函数 * @@ -114,6 +142,38 @@ void bs_test_task(void* arg); */ void bs_test_led_task(void* arg); +/** + * @brief 测试状态显示线程 + * + * 设置一个LED小灯,测试的时候bling bling 闪 + * + * @param[in] arg not used + * + */ +void bs_test_led_task(void* arg); + +/** + * @brief 向流量计下发测试时间 + * + * 时间下发 + * + * @param[in] time 向流量计下发测试的时间 + * + */ +void flux_test_time_set(float var_time); + +/** + * @brief 向流量计下发启动测试指令 + * + */ +void flux_test_start(void); + +/** + * @brief 向流量计下获取测试结果指令 + * + */ +void flux_test_result_get(void); + #ifdef __cplusplus } /*extern "C"*/ #endif diff --git a/components/FluxUI/screens/ui_pageHome.c b/components/FluxUI/screens/ui_pageHome.c index 71325d1..e257fa9 100644 --- a/components/FluxUI/screens/ui_pageHome.c +++ b/components/FluxUI/screens/ui_pageHome.c @@ -609,6 +609,19 @@ void ui_pageHome_screen_init(void) lv_label_set_text(ui_pageHome_LabelRate35DOWN, "70.5"); lv_obj_set_style_text_font(ui_pageHome_LabelRate35DOWN, &lv_font_montserrat_14, LV_PART_MAIN | LV_STATE_DEFAULT); + ui_pageHome_panelBSLEDing = lv_obj_create(ui_pageHome_panelResult1); + lv_obj_set_width(ui_pageHome_panelBSLEDing, 25); + lv_obj_set_height(ui_pageHome_panelBSLEDing, 25); + lv_obj_set_x(ui_pageHome_panelBSLEDing, 103); + lv_obj_set_y(ui_pageHome_panelBSLEDing, 90); + lv_obj_set_align(ui_pageHome_panelBSLEDing, LV_ALIGN_CENTER); + lv_obj_clear_flag(ui_pageHome_panelBSLEDing, LV_OBJ_FLAG_SCROLLABLE); /// Flags + lv_obj_set_style_radius(ui_pageHome_panelBSLEDing, 15, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_color(ui_pageHome_panelBSLEDing, lv_color_hex(0xC4C3C3), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_opa(ui_pageHome_panelBSLEDing, 255, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_width(ui_pageHome_panelBSLEDing, 1, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_side(ui_pageHome_panelBSLEDing, LV_BORDER_SIDE_FULL, LV_PART_MAIN | LV_STATE_DEFAULT); + ui_pageHome_LabelRate40DOWN = lv_label_create(ui_pageHome_panelResult1); lv_obj_set_width(ui_pageHome_LabelRate40DOWN, LV_SIZE_CONTENT); /// 1 lv_obj_set_height(ui_pageHome_LabelRate40DOWN, LV_SIZE_CONTENT); /// 1 @@ -638,8 +651,8 @@ void ui_pageHome_screen_init(void) lv_dropdown_set_options(ui_pageHome_DropdownTestTypeBS, "Spirit-3\nSpirit-6\nYu-Lite8"); lv_obj_set_width(ui_pageHome_DropdownTestTypeBS, 100); lv_obj_set_height(ui_pageHome_DropdownTestTypeBS, 30); - lv_obj_set_x(ui_pageHome_DropdownTestTypeBS, -6); - lv_obj_set_y(ui_pageHome_DropdownTestTypeBS, 90); + lv_obj_set_x(ui_pageHome_DropdownTestTypeBS, -10); + lv_obj_set_y(ui_pageHome_DropdownTestTypeBS, 91); lv_obj_set_align(ui_pageHome_DropdownTestTypeBS, LV_ALIGN_CENTER); lv_obj_add_flag(ui_pageHome_DropdownTestTypeBS, LV_OBJ_FLAG_SCROLL_ON_FOCUS); /// Flags lv_obj_set_style_text_align(ui_pageHome_DropdownTestTypeBS, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN | LV_STATE_DEFAULT); @@ -684,6 +697,15 @@ void ui_pageHome_screen_init(void) lv_label_set_text(ui_pageHome_labelstr23, "测试结果:"); lv_obj_set_style_text_font(ui_pageHome_labelstr23, &ui_font_MiSansN, LV_PART_MAIN | LV_STATE_DEFAULT); + ui_pageHome_labelstr22 = lv_label_create(ui_pageHome_panelResult1); + lv_obj_set_width(ui_pageHome_labelstr22, LV_SIZE_CONTENT); /// 1 + lv_obj_set_height(ui_pageHome_labelstr22, LV_SIZE_CONTENT); /// 1 + lv_obj_set_x(ui_pageHome_labelstr22, 65); + lv_obj_set_y(ui_pageHome_labelstr22, 90); + lv_obj_set_align(ui_pageHome_labelstr22, LV_ALIGN_CENTER); + lv_label_set_text(ui_pageHome_labelstr22, "State"); + lv_obj_set_style_text_font(ui_pageHome_labelstr22, &ui_font_MiSansN14, LV_PART_MAIN | LV_STATE_DEFAULT); + ui_pageHome_panelStageBS = lv_obj_create(ui_pageHome_panelCenter); lv_obj_set_width(ui_pageHome_panelStageBS, 266); lv_obj_set_height(ui_pageHome_panelStageBS, 98); diff --git a/components/FluxUI/ui.c b/components/FluxUI/ui.c index 909493e..b19a35d 100644 --- a/components/FluxUI/ui.c +++ b/components/FluxUI/ui.c @@ -87,6 +87,7 @@ lv_obj_t * ui_pageHome_LabelRate20DOWN; lv_obj_t * ui_pageHome_LabelRate25DOWN; lv_obj_t * ui_pageHome_LabelRate30DOWN; lv_obj_t * ui_pageHome_LabelRate35DOWN; +lv_obj_t * ui_pageHome_panelBSLEDing; lv_obj_t * ui_pageHome_LabelRate40DOWN; lv_obj_t * ui_pageHome_labelstr20; lv_obj_t * ui_pageHome_BarTestProgBS; @@ -96,6 +97,7 @@ lv_obj_t * ui_pageHome_labelstr21; lv_obj_t * ui_pageHome_labelstr7; lv_obj_t * ui_pageHome_labelBSInfo; lv_obj_t * ui_pageHome_labelstr23; +lv_obj_t * ui_pageHome_labelstr22; lv_obj_t * ui_pageHome_panelStageBS; void ui_event_pageHome_buttonMinusBS(lv_event_t * e); lv_obj_t * ui_pageHome_buttonMinusBS; diff --git a/components/FluxUI/ui.h b/components/FluxUI/ui.h index 35986ee..d7df437 100644 --- a/components/FluxUI/ui.h +++ b/components/FluxUI/ui.h @@ -97,6 +97,7 @@ extern lv_obj_t * ui_pageHome_LabelRate20DOWN; extern lv_obj_t * ui_pageHome_LabelRate25DOWN; extern lv_obj_t * ui_pageHome_LabelRate30DOWN; extern lv_obj_t * ui_pageHome_LabelRate35DOWN; +extern lv_obj_t * ui_pageHome_panelBSLEDing; extern lv_obj_t * ui_pageHome_LabelRate40DOWN; extern lv_obj_t * ui_pageHome_labelstr20; extern lv_obj_t * ui_pageHome_BarTestProgBS; @@ -106,6 +107,7 @@ extern lv_obj_t * ui_pageHome_labelstr21; extern lv_obj_t * ui_pageHome_labelstr7; extern lv_obj_t * ui_pageHome_labelBSInfo; extern lv_obj_t * ui_pageHome_labelstr23; +extern lv_obj_t * ui_pageHome_labelstr22; extern lv_obj_t * ui_pageHome_panelStageBS; void ui_event_pageHome_buttonMinusBS(lv_event_t * e); extern lv_obj_t * ui_pageHome_buttonMinusBS; diff --git a/components/FluxUI/ui_event_homePage.c b/components/FluxUI/ui_event_homePage.c index a1e20a7..2541d82 100644 --- a/components/FluxUI/ui_event_homePage.c +++ b/components/FluxUI/ui_event_homePage.c @@ -482,15 +482,18 @@ void on_buttonStartTestBS_clicked(lv_event_t * e) { /* 如果正在测试,按下后取消测试 */ vTaskDelete(bs_test_task_handle); + /* 挂起LED闪烁 */ + BS_STATE_LED_TASK_SUSPEND; /* 等待开始测试 */ is_bs_test_ing = false; /* 清空已完成的测试结果 */ BS_ALL_RESULT_CLEAR; + lv_label_set_text(ui_pageHome_labelStartTest1,"Start Test BS"); }else{ /* 如果没有测试,按下后开始测试 */ - + /* 创建BS测试任务 */ xTaskCreate(bs_test_task, "bs_test_task", 1024*4, NULL, 5, &bs_test_task_handle); @@ -499,33 +502,11 @@ void on_buttonStartTestBS_clicked(lv_event_t * e) } #if 0 - /* 设置15BPM测试时间 */ - uint8_t bytes[4]; - float time = 40.0; - memcpy(bytes, &time, 4); - - /* 下发命令 */ - flux_frame.ADDR = FLUX_ADDR; - flux_frame.FUNC = FLUX_FUNC_SET_SINGLE; - flux_frame.DATA[0] = 0x00; - flux_frame.DATA[1] = 0x02; - flux_frame.DATA[2] = bytes[3]; - flux_frame.DATA[3] = bytes[2]; - - /* 下发15BPM测试时间指令*/ - ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame)); /* 屏幕中显示下发成功 */ lv_label_set_text(ui_pageHome_labelBSInfo,test_info[0]); - /* 下发启动测试指令 */ - flux_frame_start.ADDR = FLUX_ADDR; - flux_frame_start.FUNC = FLUX_FUNC_SET_SINGLE; - flux_frame_start.DATA[0] = 0x00; - flux_frame_start.DATA[1] = 0x01; - flux_frame_start.DATA[2] = 0x00; - flux_frame_start.DATA[3] = 0x01; - ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame_start)); + /* 屏幕中显示下发成功 */ lv_label_set_text(ui_pageHome_labelBSInfo,test_info[1]); diff --git a/main/main.cpp b/main/main.cpp index 46719d1..9537c25 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -102,6 +102,10 @@ extern "C" void app_main(void) /*创建本地时间同步任务*/ xTaskCreate(time_synic_task, "time_synic_task", 8*1024, NULL, 10, NULL); + /* 创建BS测试LED闪烁任务,同时挂起 */ + xTaskCreate(bs_test_led_task, "bs_test_led_task", 4 * 1024, NULL, 2, &bs_stateLED_task_handle); + vTaskSuspend(bs_stateLED_task_handle); + #if 0/*暂时不支持呼吸模拟器*/ /*创建UART2响应任务*/ xTaskCreate(uart2_echoTask, "uart2_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL);