From 13369ef45b22dd6b40c5fa66229114fe56776579 Mon Sep 17 00:00:00 2001 From: wujunchao Date: Fri, 7 Mar 2025 15:28:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/APP_WU/Src/apps_gather.c | 134 ++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 42 deletions(-) diff --git a/App/APP_WU/Src/apps_gather.c b/App/APP_WU/Src/apps_gather.c index f61253c6..8f48f36a 100644 --- a/App/APP_WU/Src/apps_gather.c +++ b/App/APP_WU/Src/apps_gather.c @@ -2,22 +2,22 @@ * @Author: wujunchao wujunchao@wuxismart.com * @Date: 2024-12-27 11:50:56 * @LastEditors: wujunchao wujunchao@wuxismart.com - * @LastEditTime: 2025-03-06 18:48:20 + * @LastEditTime: 2025-03-07 15:27:25 * @FilePath: \signal_generator\App\APP_WU\Src\apps_gather.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ -#include "apps_gather.h" //用于头文件打包汇总,函数和变量注释 +#include "apps_gather.h" //用于头文件打包汇总,函数声明和变量定义 // lv_conf.h { line:282->CPU&FPS; line:289->MEM used } /**********test5**********/ -MENU_DATA m5data; -PLOT_DATA pltdata; -TABVIEW_DATA tabdata; +MENU_DATA m5data; //界面参数初始化 +PLOT_DATA pltdata; //chart绘图参数初始化 +TABVIEW_DATA tabdata; //设置页面参数初始化 void menu_data_init(void) { //general - m5data.scr_now = SCREEN_INIT; + m5data.scr_now = SCREEN_INIT; //初始界面为开机动画 m5data.tick_prv = -1; //前一时刻,用于计时 m5data.tick_cur = -1; //当前时刻,用于计时 m5data.menu_reset_flag = 0; //复位使能标志,置1后复位,复位完成后变回0 @@ -89,6 +89,12 @@ void menu_data_init(void) void menu_reset(void) { //界面复位 + if(m5data.scr_now == SCREEN_INIT) + { + //如果正处于开机动画中,立即返回。 + return; + } + //加载初始界面 setup_scr_screen_init(&guider_ui); lv_scr_load(guider_ui.screen_init); @@ -112,7 +118,7 @@ void menu_reset(void) break; } - //参数复位 + //参数复位,内部会对m5data.scr_now进行更改,因此放置于最后。 menu_data_init(); } @@ -231,8 +237,10 @@ void key_functions_main(void) m5data.twk_flag = 1; // 上、下、左、右 任意一个键按下后,闪烁开始 m5data.twk_cnt = 0; //每次按下后闪烁计数清零 + //该部分需要作溢出判断:第0个数字达到9之后不作循环处理,第1~5个数字达到9后循环计数并向前进1(直至第0个为9) switch (m5data.io_cursor) { + //达到9之后保持不变,不作循环处理 case 0: { m5data.o_numbers[0] = (m5data.o_numbers[0] >= 9)?(9):(m5data.o_numbers[0] + 1); @@ -241,6 +249,7 @@ void key_functions_main(void) } break; + //当前面(第0个)数字不全为9时,循环计数,溢出标志置1,否则保持9不变。 case 1: { if(m5data.o_numbers[1] >= 9) @@ -263,6 +272,7 @@ void key_functions_main(void) } break; + //当前面(第0~1个)数字不全为9时,循环计数,溢出标志置1,否则保持9不变。 case 2: { if(m5data.o_numbers[2] >= 9) @@ -285,6 +295,7 @@ void key_functions_main(void) } break; + //当前面(第0~2个)数字不全为9时,循环计数,溢出标志置1,否则保持9不变。 case 3: { if(m5data.o_numbers[3] >= 9) @@ -307,6 +318,7 @@ void key_functions_main(void) } break; + //当前面(第0~3个)数字不全为9时,循环计数,溢出标志置1,否则保持9不变。 case 4: { if(m5data.o_numbers[4] >= 9) @@ -329,6 +341,7 @@ void key_functions_main(void) } break; + //当前面(第0~4个)数字不全为9时,循环计数,溢出标志置1,否则保持9不变。 case 5: { if(m5data.o_numbers[5] >= 9) @@ -355,12 +368,15 @@ void key_functions_main(void) break; } - if(m5data.overflow_flag_up) //发生向上溢出 + //发生向上溢出时,根据溢出的位置对实际数值进行处理 + if(m5data.overflow_flag_up) { int oftemp = 0; + //还原成实际数值 oftemp = 100000*m5data.o_numbers[0] + 10000*m5data.o_numbers[1] + 1000*m5data.o_numbers[2] + \ 100*m5data.o_numbers[3] + 10*m5data.o_numbers[4] + m5data.o_numbers[5]; + //根据溢出的位置对实际值进行计算 switch (m5data.overflow_flag_up) { case 1: @@ -397,6 +413,7 @@ void key_functions_main(void) break; } + //将实际值转换成6个独立数字 m5data.o_numbers[0] = (oftemp/100000 > 9)?(9):(oftemp/100000); lv_img_set_src(guider_ui.screen_main_animimg_2, screen_main_animimg_2_imgs[ m5data.o_numbers[0] ]); m5data.o_numbers[1] = (oftemp/10000) % 10; @@ -410,6 +427,7 @@ void key_functions_main(void) m5data.o_numbers[5] = oftemp % 10; lv_img_set_src(guider_ui.screen_main_animimg_7, screen_main_animimg_7_imgs[ m5data.o_numbers[5] ]); + //溢出处理完成,标志清零 m5data.overflow_flag_up = 0; } } @@ -426,9 +444,9 @@ void key_functions_main(void) m5data.i_numbers[i] = 0; //输入值/测量值 m5data.o_numbers[i] = 0; //输出值/设定值 } - m5data.twk_flag = 0; //闪烁中止 - m5data.twk_cnt = 0; //闪烁计数清零 - m5data.twk_flip = 0; //0显示,1不显示 + m5data.twk_flag = 0; //闪烁中止 + m5data.twk_cnt = 0; //闪烁计数清零 + m5data.twk_flip = 0; //0显示,1不显示 //加载菜单界面 setup_scr_screen_setting(&guider_ui); @@ -450,12 +468,15 @@ void key_functions_main(void) if(m5data.io_mode == IO_OUTPUT) { m5data.io_mode = IO_INPUT; + + //继承之前的输出类型 m5data.input_mode = m5data.output_mode; io_on2off_status(); //更新状态指示 } else { + //枚举类型不能直接运算,于是使用临时变量cursor_temp cursor_temp = (uint8_t)m5data.input_mode; cursor_temp = (cursor_temp >= 5)?(0):(cursor_temp + 1); m5data.input_mode = (SIG_FUNCTIONS)cursor_temp; @@ -510,9 +531,9 @@ void key_functions_main(void) key = 0; m5data.twk_flag = 1; //上、下、左、右 任意一个键按下后,闪烁开始 - m5data.twk_cnt = 0; //每次按下后闪烁计数清零 + m5data.twk_cnt = 0; //每次按下后闪烁计数清零 - switch (m5data.io_cursor) //避免游标移动的瞬间数值处于闪烁熄灭的状态,移动游标前重新显示一次当前数值 + switch (m5data.io_cursor) //避免游标移动的瞬间,前一刻的数值处于闪烁熄灭的状态,移动游标前重新显示一次当前数值 { case 0: { @@ -557,7 +578,9 @@ void key_functions_main(void) m5data.io_cursor_prv = m5data.io_cursor; m5data.io_cursor = (m5data.io_cursor <= 0)?(5):(m5data.io_cursor - 1); - + //中间有个小数点,小数点的显示宽度与数字不同,间隔与两个起点在头文件中设置 + // 【】IO_CURSOR_INTERVAL【】IO_CURSOR_INTERVAL【】.【】IO_CURSOR_INTERVAL【】IO_CURSOR_INTERVAL【】 + // ↑ IO_CURSOR_START1 ↑ IO_CURSOR_START2 if(m5data.io_cursor <= 2) { lv_obj_set_pos(guider_ui.screen_main_img_3, IO_CURSOR_START1 + IO_CURSOR_INTERVAL * m5data.io_cursor, IO_CURSOR_Y); @@ -574,6 +597,7 @@ void key_functions_main(void) { key = 0; + //主界面用OK键控制开关ON&OFF if(m5data.io_on2off == IO_ON) { m5data.io_on2off = IO_OFF; @@ -594,7 +618,7 @@ void key_functions_main(void) key = 0; m5data.twk_flag = 1; // 上、下、左、右 任意一个键按下后,闪烁开始 - m5data.twk_cnt = 0; //每次按下后闪烁计数清零 + m5data.twk_cnt = 0; //每次按下后闪烁计数清零 switch (m5data.io_cursor) //避免游标移动的瞬间数值处于闪烁熄灭的状态,移动游标前重新显示一次当前数值 { @@ -656,7 +680,7 @@ void key_functions_main(void) { key = 0; - switch (m5data.io_mode) //输入、输出模式切换 + switch (m5data.io_mode) //输入、输出模式切换 { case IO_OUTPUT: { @@ -788,6 +812,7 @@ void key_functions_main(void) case KEY_SOURCE: { + //电源开关靠硬件电路实现,此处可做预留 key = 0; } break; @@ -799,6 +824,7 @@ void key_functions_main(void) m5data.twk_flag = 1; // 上、下、左、右 任意一个键按下后,闪烁开始 m5data.twk_cnt = 0; //每次按下后闪烁计数清零 + //溢出处理方式同KEY_UP,Line:233 switch (m5data.io_cursor) { case 0: @@ -1011,7 +1037,7 @@ void key_functions_main(void) void scr_init_run(void) { - if( m5data.scr_init_cnt <= SCREEN_INIT_CNT_MAX ) + if( m5data.scr_init_cnt <= SCREEN_INIT_CNT_MAX ) //进度条变化次数,在头文件中设置 { if( m5data.tick_prv == -1 ) { @@ -1100,7 +1126,7 @@ void runtime_show(void) m5data.runtime_hours = 0; } - // 00:00:00 + // 00:00:00,该字符串的长度大于8,因此runtime_show应该分配大于8的内存 sprintf(m5data.runtime_show, "%02d:%02d:%02d",m5data.runtime_hours, m5data.runtime_minutes, m5data.runtime_seconds); lv_span_set_text(guider_ui.screen_main_spangroup_1_span, m5data.runtime_show); @@ -1124,17 +1150,22 @@ void input_value_show(void) { int32_t pvi = 0; pvi = (int32_t)(pltdata.yreal_scd_value * 1000); //副轴用于绘制实时输入测量值 - //显示当前测量值 + //显示当前测量值,从左往右 0->5 m5data.i_numbers[0] = (pvi/100000 > 9)?(0):(pvi/100000); lv_img_set_src(guider_ui.screen_main_animimg_9, screen_main_animimg_9_imgs[ m5data.i_numbers[0] ]); + m5data.i_numbers[1] = (pvi/10000) % 10; lv_img_set_src(guider_ui.screen_main_animimg_10, screen_main_animimg_10_imgs[ m5data.i_numbers[1] ]); + m5data.i_numbers[2] = (pvi/1000) % 10; lv_img_set_src(guider_ui.screen_main_animimg_11, screen_main_animimg_11_imgs[ m5data.i_numbers[2] ]); + m5data.i_numbers[3] = (pvi/100) % 10; lv_img_set_src(guider_ui.screen_main_animimg_12, screen_main_animimg_12_imgs[ m5data.i_numbers[3] ]); + m5data.i_numbers[4] = (pvi/10) % 10; lv_img_set_src(guider_ui.screen_main_animimg_13, screen_main_animimg_13_imgs[ m5data.i_numbers[4] ]); + m5data.i_numbers[5] = pvi % 10; lv_img_set_src(guider_ui.screen_main_animimg_14, screen_main_animimg_14_imgs[ m5data.i_numbers[5] ]); } @@ -1208,9 +1239,10 @@ void key_functions_setting(void) { key = 0; - //所有选项卡均未选中时,返回主界面,否则熄灭当前选中 + //所有选项卡均未选中时,返回主界面,否则熄灭当前选中 if(tabdata.tab_cursor_inner == 99) { + //下次进入设置页面时,从选项卡0开始 tabdata.tab_cursor = 0; //加载主界面 @@ -1220,9 +1252,11 @@ void key_functions_setting(void) //切换至菜单后,清除主界面对象,释放内存 lv_obj_del(guider_ui.screen_setting); - m5data.scr_now = SCREEN_MAIN; //当前界面为主界面 + //当前界面为主界面 + m5data.scr_now = SCREEN_MAIN; - scr_main_recover(); //恢复之前显示的数据 + //恢复之前显示的数据 + scr_main_recover(); } else { @@ -1231,7 +1265,8 @@ void key_functions_setting(void) { case ITEMS_0: { - setting_items_check(99, tabdata.tab_cursor_inner, 1); //熄灭当前内容 + //熄灭当前内容 + setting_items_check(99, tabdata.tab_cursor_inner, 1); tabdata.tab_cursor_inner = 99; tabdata.tab_cursor_inner_prv = 99; @@ -1271,7 +1306,8 @@ void key_functions_setting(void) { key = 0; - if(tabdata.tab_cursor_inner == 99) //内部游标为99时,说明未选中任何一个选项卡,此时的up和down用于切换选项卡 + //内部游标为99时,说明未选中任何一个选项卡,此时的up和down用于切换选项卡 + if(tabdata.tab_cursor_inner == 99) { tabdata.tab_cursor_prv = tabdata.tab_cursor; tabdata.tab_cursor = (tabdata.tab_cursor <= 0)?(3):(tabdata.tab_cursor - 1); @@ -1522,8 +1558,10 @@ void key_functions_setting(void) void setting_items_check(uint8_t cursor, uint8_t cursor_prv, uint8_t tab_cont) { - if(tab_cont) //内容点亮和熄灭 - { + //需要操作的是内容还是选项卡 + if(tab_cont) + { + //操作内容 switch (tabdata.tab_cursor) { case ITEMS_0: @@ -1600,8 +1638,9 @@ void setting_items_check(uint8_t cursor, uint8_t cursor_prv, uint8_t tab_cont) break; } } - else //标签点亮和熄灭 + else { + //操作选项卡 switch (cursor) //点亮当前选中目标 { case ITEMS_0: @@ -1778,6 +1817,7 @@ void scr_main_recover(void) lv_label_set_text(guider_ui.screen_main_label_Mode, "Volt"); switch (m5data.output_mode_type) //功能类型切换,电压V/mV { + //切换单位后,坐标轴随之切换 case VOLTAGE_MV: { lv_label_set_text(guider_ui.screen_main_label_unit, "mV"); @@ -1932,6 +1972,7 @@ void num_twinkle(void) //数值闪烁 { if(m5data.twk_flag == 0) { + //不需要闪烁的情况下直接返回 return; } else @@ -2063,14 +2104,14 @@ void num_twinkle(void) //数值闪烁 } } - if(m5data.twk_cnt > TWINKLE_CNT_MAX) // 10秒无动作(上、下、左、右无按下)后停止闪烁 + if(m5data.twk_cnt > TWINKLE_CNT_MAX) // (TWINKLE_CNT_MAX)秒无动作(上、下、左、右无按下)后停止闪烁 { m5data.twk_cnt = 0; m5data.twk_flip = 0; m5data.twk_flag = 0; m5data.io_cursor_prv = m5data.io_cursor; - switch (m5data.io_cursor) //防止空白残留 + switch (m5data.io_cursor) //防止空白残留 { case 0: { @@ -2124,23 +2165,32 @@ void plot_drawing(void) plot_1500ms_flag = 0; //输出曲线 - pltdata.yreal_pri_value = m5data.o_numbers[0]*100 + m5data.o_numbers[1]*10 + m5data.o_numbers[2] + \ - m5data.o_numbers[3]*(float32)0.1 + m5data.o_numbers[4]*(float32)0.01 + m5data.o_numbers[5]*(float32)0.001; + //{ + //将独立数字转换成实际值 + pltdata.yreal_pri_value = m5data.o_numbers[0]*100 + m5data.o_numbers[1]*10 + m5data.o_numbers[2] + \ + m5data.o_numbers[3]*(float32)0.1 + m5data.o_numbers[4]*(float32)0.01 + m5data.o_numbers[5]*(float32)0.001; - pltdata.y_pri_value = ( pltdata.y_pri_up - pltdata.y_pri_low ) * \ - ( pltdata.yreal_pri_value - pltdata.yreal_pri_low ) / ( pltdata.yreal_pri_up - pltdata.yreal_pri_low ); + //将实际值线性转换成chart组件上的绘图值(pltdata.y_pri_low~up,一般0~100) + pltdata.y_pri_value = ( pltdata.y_pri_up - pltdata.y_pri_low ) * \ + ( pltdata.yreal_pri_value - pltdata.yreal_pri_low ) / ( pltdata.yreal_pri_up - pltdata.yreal_pri_low ); - if(pltdata.y_pri_value >= pltdata.y_pri_up) pltdata.y_pri_value = pltdata.y_pri_up; - if(pltdata.y_pri_value <= pltdata.y_pri_low) pltdata.y_pri_value = pltdata.y_pri_low; - lv_chart_set_next_value(guider_ui.screen_main_chart_1, guider_ui.screen_main_chart_1_0, pltdata.y_pri_value); + //数值限幅 + if(pltdata.y_pri_value >= pltdata.y_pri_up) pltdata.y_pri_value = pltdata.y_pri_up; + if(pltdata.y_pri_value <= pltdata.y_pri_low) pltdata.y_pri_value = pltdata.y_pri_low; + lv_chart_set_next_value(guider_ui.screen_main_chart_1, guider_ui.screen_main_chart_1_0, pltdata.y_pri_value); + //} //输入曲线 - pltdata.y_scd_value = ( pltdata.y_scd_up - pltdata.y_scd_low ) * \ - ( pltdata.yreal_scd_value - pltdata.yreal_scd_low ) / ( pltdata.yreal_scd_up - pltdata.yreal_scd_low ); - - if(pltdata.y_scd_value >= pltdata.y_scd_up) pltdata.y_scd_value = pltdata.y_scd_up; - if(pltdata.y_scd_value <= pltdata.y_scd_low) pltdata.y_scd_value = pltdata.y_scd_low; - lv_chart_set_next_value(guider_ui.screen_main_chart_1, guider_ui.screen_main_chart_1_1, pltdata.y_scd_value); + //{ + //将实际值线性转换成chart组件上的绘图值(pltdata.y_pri_low~up,一般0~100) + pltdata.y_scd_value = ( pltdata.y_scd_up - pltdata.y_scd_low ) * \ + ( pltdata.yreal_scd_value - pltdata.yreal_scd_low ) / ( pltdata.yreal_scd_up - pltdata.yreal_scd_low ); + + //数值限幅 + if(pltdata.y_scd_value >= pltdata.y_scd_up) pltdata.y_scd_value = pltdata.y_scd_up; + if(pltdata.y_scd_value <= pltdata.y_scd_low) pltdata.y_scd_value = pltdata.y_scd_low; + lv_chart_set_next_value(guider_ui.screen_main_chart_1, guider_ui.screen_main_chart_1_1, pltdata.y_scd_value); + //} } }