/* * @Author: wujunchao wujunchao@wuxismart.com * @Date: 2024-12-27 11:50:56 * @LastEditors: wujunchao wujunchao@wuxismart.com * @LastEditTime: 2025-03-19 19:06:14 * @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" //用于头文件打包汇总,函数声明和变量定义 // lv_conf.h { line:282->CPU&FPS; line:289->MEM used } /**********test5**********/ MENU_DATA m5data; //界面参数初始化 PLOT_DATA pltdata; //chart绘图参数初始化 TABVIEW_DATA tabdata; //设置页面参数初始化 PHYSICAL_QUANTITY VOL[2]; //电压,VOL[0]-V, VOL[1]-mV PHYSICAL_QUANTITY CUR; //电流,mA PHYSICAL_QUANTITY RES; //电阻,Ω PHYSICAL_QUANTITY FRE; //频率,KHz PHYSICAL_QUANTITY TC[8]; //热电偶,共8种 PHYSICAL_QUANTITY RTD; //热电阻 //物理量内容初始化 //底层数据,无法通过按键&菜单修改,用户使用时,仅修改tabdata里的变量 void physical_quantity_init(void) { VOL[0].tag = SIG_VOLTAGE; VOL[0].typ = VOLTAGE_V; VOL[0].low = 0; VOL[0].up = 30; VOL[0].pv = 0; VOL[1].tag = SIG_VOLTAGE; VOL[1].typ = VOLTAGE_MV; VOL[1].low = -2500; VOL[1].up = 2500; VOL[1].pv = 0; CUR.tag = SIG_CURRENT; CUR.typ = CURRENT_MA; CUR.low = 0; CUR.up = 25; CUR.pv = 0; RES.tag = SIG_RESISTANT; RES.typ = RESISTANT_OHM; RES.low = 0; RES.up = 4000; RES.pv = 0; FRE.tag = SIG_FREQUENCE; FRE.typ = FREQUENCE_KHZ; FRE.low = 0; FRE.up = 100; FRE.pv = 0; //热电偶K TC[0].tag = SIG_TC; TC[0].typ = TC_K; TC[0].low = -270; TC[0].up = 1370; TC[0].pv = 0; //热电偶S TC[1].tag = SIG_TC; TC[1].typ = TC_S; TC[1].low = -50; TC[1].up = 1768; TC[1].pv = 0; //热电偶N TC[2].tag = SIG_TC; TC[2].typ = TC_N; TC[2].low = -270; TC[2].up = 1300; TC[2].pv = 0; //热电偶B TC[3].tag = SIG_TC; TC[3].typ = TC_B; TC[3].low = 0; TC[3].up = 1820; TC[3].pv = 0; //热电偶E TC[4].tag = SIG_TC; TC[4].typ = TC_E; TC[4].low = -270; TC[4].up = 1000; TC[4].pv = 0; //热电偶J TC[5].tag = SIG_TC; TC[5].typ = TC_J; TC[5].low = -210; TC[5].up = 1200; TC[5].pv = 0; //热电偶R TC[6].tag = SIG_TC; TC[6].typ = TC_R; TC[6].low = -50; TC[6].up = 1768; TC[6].pv = 0; //热电偶T TC[7].tag = SIG_TC; TC[7].typ = TC_T; TC[7].low = -270; TC[7].up = 400; TC[7].pv = 0; RTD.tag = SIG_RTD; RTD.typ = RTD_DC; RTD.low = -200; RTD.up = 660; RTD.pv = 0; } void menu_data_init(void) { //general m5data.scr_now = SCREEN_INIT; //初始界面为开机动画 m5data.tick_prv = -1; //前一时刻,用于计时 m5data.tick_cur = -1; //当前时刻,用于计时 m5data.menu_reset_flag = 0; //复位使能标志,置1后复位,复位完成后变回0 physical_quantity_init(); //screen_init m5data.scr_init_flag = 0; //是否进行过初始化(开机动画) m5data.scr_init_bar = 0; //进度条值,0~100 m5data.scr_init_cnt = 0; //进度条计数(控制进度条动画) //screen_main // { m5data.runtime_seconds = 0; //秒 m5data.runtime_minutes = 0; //分钟 m5data.runtime_hours = 0; //小时 memset(m5data.runtime_show, 0, 16); //存放显示时间的字符串 m5data.battery_cnt = 0; //电池计数 m5data.io_cursor = 3; //当前游标位置,[0000,000]:0~6 m5data.io_cursor_prv = 3; //前一时刻游标位置 m5data.twk_flag = 0; //0停止闪烁,1开始闪烁 m5data.twk_flip = 0; //0显示,1不显示 m5data.twk_cnt = 0; //闪烁计数 m5data.overflow_flag_low = 0; //向上溢出 m5data.overflow_flag_up = 0; //向下溢出 m5data.sign_flag_in = 0; //默认不显示符号 m5data.sign_flag_out = 0; //默认不显示符号 m5data.io_on2off = IO_OFF; //初始为关闭状态 m5data.io_mode = IO_OUTPUT; //默认工作模式,0:输入IN,1:输出OUT for(uint8_t i = 0; i < 7; i++) //用于数值显示的数组,初值为0 { m5data.i_numbers[i] = 0; //输入值/测量值 m5data.o_numbers[i] = 0; //输出值/设定值 } m5data.input_mode = VOL[0].tag; //输入功能初始为电压模式 m5data.input_mode_type = VOL[0].typ; //电压单位初始为V m5data.output_mode = VOL[0].tag; //输出功能初始为电压模式 m5data.output_mode_type = VOL[0].typ; //电压单位初始为V sig_channel_select(m5data.io_mode, m5data.output_mode_type); //chart组件显示(int),绘图值 pltdata.y_pri_low = 0; //主轴的显示下限,0,通常不做修改 pltdata.y_pri_up = 100; //主轴的显示上限,100,通常不做修改 pltdata.y_scd_low = 0; //副轴的显示下限,0,通常不做修改 pltdata.y_scd_up = 100; //副轴的显示上限,100,通常不做修改 pltdata.y_pri_value = 0; //主轴的实时显示值,0~100 pltdata.y_pri_value_prv = 0; //前一时刻的曲线绘图值 pltdata.y_scd_value = 0; //副轴的实时显示值,0~100 pltdata.y_scd_value_prv = 0; //前一时刻的曲线绘图值 pltdata.y_scd_value_prv = 0; //前一时刻的实时显示值。 pltdata.pri_wait_tick = 0; //主轴等待滴答数 pltdata.scd_wait_tick = 0; //副轴等待滴答数 //chart组件显示(int),实际值 pltdata.yreal_pri_low = VOL[0].low; //实际值的显示下限,主轴 pltdata.yreal_pri_up = VOL[0].up; //实际值的显示上限,主轴 pltdata.yreal_scd_low = VOL[0].low; //实际值的显示下限,副轴 pltdata.yreal_scd_up = VOL[0].up; //实际值的显示上限,副轴 pltdata.yreal_pri_value = VOL[0].pv; //主轴的实时值,即输出/设定值 pltdata.yreal_scd_value = VOL[0].pv; //副轴的实时值,即输入/测量值 pltdata.yreal_scd_value_prv = VOL[0].pv; //前一时刻的输入测量值 // } //screen_setting tabdata.item_cursor = 0; //选项卡的游标(焦点) tabdata.item_cursor_prv = 0; //前一刻的选项卡游标 tabdata.content_cursor = 99; //某一选项卡内部的游标 tabdata.content_cursor_prv = 99; //前一刻的~ tabdata.content_focus = 0; //默认无焦点 tabdata.content_cursor_x = 0; tabdata.content_cursor_y = 0; //设置界面的初始默认值 //ITEMS_0 选项卡0 //{ tabdata.content00 = VOLTAGE_V; //电压单位 tabdata.content01[0] = VOL[0].up; //电压V上限 tabdata.content01[1] = VOL[1].up; //电压mV上限 tabdata.content02[0] = VOL[0].low; //电压V下限 tabdata.content02[1] = VOL[1].low; //电压mV下限 tabdata.content03 = CUR.up; //电流上限 tabdata.content04 = CUR.low; //电流下限 tabdata.content05 = RES.up; //电阻上限 tabdata.content06 = RES.low; //电阻下限 tabdata.content07 = FRE.up; //频率上限 tabdata.content08 = FRE.low; //频率下限 tabdata.content09[0] = TC[0].up; //TCK上限 tabdata.content010[0] = TC[0].low; //TCK下限 tabdata.content09[1] = TC[1].up; //TCS上限 tabdata.content010[1] = TC[1].low; //TCS下限 tabdata.content09[2] = TC[2].up; //TCN上限 tabdata.content010[2] = TC[2].low; //TCN下限 tabdata.content09[3] = TC[3].up; //TCB上限 tabdata.content010[3] = TC[3].low; //TCB下限 tabdata.content09[4] = TC[4].up; //TCE上限 tabdata.content010[4] = TC[4].low; //TCE下限 tabdata.content09[5] = TC[5].up; //TCJ上限 tabdata.content010[5] = TC[5].low; //TCJ下限 tabdata.content09[6] = TC[6].up; //TCR上限 tabdata.content010[6] = TC[6].low; //TCR下限 tabdata.content09[7] = TC[7].up; //TCT上限 tabdata.content010[7] = TC[7].low; //TCT下限 tabdata.content011 = RTD.up; //RTD上限 tabdata.content012 = RTD.low; //RTD下限 tabdata.content013 = TC_K; //默认为K类型的热电偶 //} //ITEMS_1 选项卡1 //{ tabdata.light_flag = 0; //默认手电熄灭 //} } void menu_reset(void) { //界面复位 if(m5data.scr_now == SCREEN_INIT) { //如果正处于开机动画中,立即返回。 return; } //加载初始界面 setup_scr_screen_init(&guider_ui); lv_scr_load(guider_ui.screen_init); //释放内存 switch (m5data.scr_now) { case SCREEN_MAIN: { lv_obj_del(guider_ui.screen_main); } break; case SCREEN_SETTING: { lv_obj_del(guider_ui.screen_setting); } break; default: break; } //参数复位,内部会对m5data.scr_now进行更改,因此放置于最后。 menu_data_init(); } void menu_test5(void) { if(m5data.menu_reset_flag) { menu_reset(); //触发显示内容复位 m5data.menu_reset_flag = 0; return; } if(m5data.scr_init_flag == 0) { scr_init_run(); //播放开机动画 } else { switch (m5data.scr_now) { case SCREEN_MAIN: { scr_main_run(); //主界面显示 key_functions_main(); //主界面的按键功能 } break; case SCREEN_SETTING: { scr_setting_run(); //设置界面 key_functions_setting(); //设置界面的按键功能 } break; default: break; } } } //KEY_MAIN void key_functions_main(void) { uint8_t cursor_temp = 0; //临时游标,替代枚举变量进行加减运算 switch (key) { case KEY_OUT: { key = 0; //交替按下 in 和 out 时,只改变输入/输出,连续按同一个键的时候才改变类型 if(m5data.io_mode == IO_INPUT) { m5data.io_mode = IO_OUTPUT; m5data.output_mode = m5data.input_mode; io_on2off_status(); //更新状态指示 } else { cursor_temp = (uint8_t)m5data.output_mode; cursor_temp = (cursor_temp >= 5)?(0):(cursor_temp + 1); m5data.output_mode = (SIG_FUNCTIONS)cursor_temp; } switch (m5data.output_mode) { case SIG_VOLTAGE: //电压 { m5data.output_mode_type = VOLTAGE_V; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_CURRENT: //电流 { m5data.output_mode_type = CURRENT_MA; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_RESISTANT: //电阻 { m5data.output_mode_type = RESISTANT_OHM; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_FREQUENCE: //频率 { m5data.output_mode_type = FREQUENCE_KHZ; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_TC: //热电偶 { m5data.output_mode_type = TC_K; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_RTD: //热电阻 { m5data.output_mode_type = RTD_DC; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; default: break; } } break; case KEY_UP: { key = 0; if(m5data.io_mode == IO_INPUT) { return; } m5data.twk_flag = 1; // 上、下、左、右 任意一个键按下后,闪烁开始 m5data.twk_cnt = 0; //每次按下后闪烁计数清零 keyset_output(1); // uint8_t step = 1; //up键步长,默认为1 // float32 step_real = 0; //实际值步长 // float32 pv = 0, sv = 0, up = 0; // //根据当前游标位置计算步进值 // step_real = step * my_power(10, (3 - m5data.io_cursor)); // //按下up键后,即将刷新的实际值 // pv = get_output_value(); // sv = pv + step_real; // up = pltdata.yreal_pri_up; // if( sv >= up ) // { // //超过上限的情况下,直接显示上限 // sv = up; // sv *= 1000; // set_output(sv); // } // else // { // //没超过上限的情况下,仅考虑pv、0、sv三者的位置关系 // if( pv >= 0 ) // { // //一定为正数,直接调用以下函数,增加数值 // change_nixie_cube_OUT(NIXIE_INCREASE, step); // } // else // { // if( sv < 0 ) // { // //pv和sv都为负数的情况下,仅调转方向,减小数值 // change_nixie_cube_OUT(NIXIE_DECREASE, step); // } // else // { // //跨越0后,负号熄灭 // //pv变为sv后跨越了0,数值可能增大也可能减小,因此直接赋值 // sv *= 1000; // set_output(sv); // } // } // } } break; case KEY_MENU: { key = 0; //恢复默认工作模式:关闭、电压V输出 set_working_mode(SIG_VOLTAGE, VOLTAGE_V); //加载菜单界面 setup_scr_screen_setting(&guider_ui); lv_scr_load(guider_ui.screen_setting); //切换至菜单后,清除主界面对象,释放内存 lv_obj_del(guider_ui.screen_main); m5data.scr_now = SCREEN_SETTING; //当前界面为详细设置菜单 scr_setting_recover(); } break; case KEY_IN: { key = 0; 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; } switch (m5data.input_mode) { case SIG_VOLTAGE: //电压 { m5data.input_mode_type = VOLTAGE_V; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_CURRENT: //电流 { m5data.input_mode_type = CURRENT_MA; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_RESISTANT: //电阻 { m5data.input_mode_type = RESISTANT_OHM; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_FREQUENCE: //频率 { m5data.input_mode_type = FREQUENCE_KHZ; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_TC: //热电偶 { m5data.input_mode_type = TC_K; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_RTD: //热电阻 { m5data.input_mode_type = RTD_DC; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; default: break; } } break; case KEY_LEFT: { key = 0; if(m5data.io_mode == IO_INPUT) { return; } m5data.twk_flag = 1; //上、下、左、右 任意一个键按下后,闪烁开始 m5data.twk_cnt = 0; //每次按下后闪烁计数清零 //避免游标移动的瞬间,前一刻的数值处于闪烁熄灭的状态,移动游标前重新显示一次当前数值 set_nixie_cube(IO_OUTPUT, m5data.io_cursor, m5data.o_numbers[m5data.io_cursor]); m5data.io_cursor_prv = m5data.io_cursor; m5data.io_cursor = (m5data.io_cursor <= 0)?(6):(m5data.io_cursor - 1); set_cursor_position(); } break; case KEY_OK: { key = 0; //主界面用OK键控制开关ON&OFF if(m5data.io_on2off == IO_ON) { m5data.io_on2off = IO_OFF; } else { m5data.io_on2off = IO_ON; } io_on2off_status(); //更新ON/OFF/IN/OUT状态指示 } break; case KEY_RIGHT: { key = 0; if(m5data.io_mode == IO_INPUT) { return; } m5data.twk_flag = 1; // 上、下、左、右 任意一个键按下后,闪烁开始 m5data.twk_cnt = 0; //每次按下后闪烁计数清零 //避免游标移动的瞬间,前一刻的数值处于闪烁熄灭的状态,移动游标前重新显示一次当前数值 set_nixie_cube(IO_OUTPUT, m5data.io_cursor, m5data.o_numbers[m5data.io_cursor]); m5data.io_cursor_prv = m5data.io_cursor; m5data.io_cursor = (m5data.io_cursor >= 6)?(0):(m5data.io_cursor + 1); set_cursor_position(); } break; case KEY_SWITCH: { key = 0; switch (m5data.io_mode) //输入、输出模式切换 { case IO_OUTPUT: { switch (m5data.output_mode) //功能切换 { case SIG_VOLTAGE: { cursor_temp = (uint8_t)m5data.output_mode_type; cursor_temp = !cursor_temp; m5data.output_mode_type = (SIG_FUNCTIONS_TYPE)cursor_temp; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_CURRENT: { m5data.output_mode_type = CURRENT_MA; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_RESISTANT: //电阻 { m5data.output_mode_type = RESISTANT_OHM; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_FREQUENCE: //频率 { m5data.output_mode_type = FREQUENCE_KHZ; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_TC: //热电偶 { cursor_temp = (uint8_t)m5data.output_mode_type; cursor_temp = (cursor_temp >= 12)?(5):(cursor_temp + 1); m5data.output_mode_type = (SIG_FUNCTIONS_TYPE)cursor_temp; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_RTD: //热电阻 { m5data.output_mode_type = RTD_DC; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; default: break; } } break; case IO_INPUT: { switch (m5data.input_mode) { case SIG_VOLTAGE: { cursor_temp = (uint8_t)m5data.input_mode_type; cursor_temp = !cursor_temp; m5data.input_mode_type = (SIG_FUNCTIONS_TYPE)cursor_temp; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_CURRENT: { m5data.input_mode_type = CURRENT_MA; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_RESISTANT: //电阻 { m5data.input_mode_type = RESISTANT_OHM; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_FREQUENCE: //频率 { m5data.input_mode_type = FREQUENCE_KHZ; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; case SIG_TC: //热电偶 { cursor_temp = (uint8_t)m5data.output_mode_type; cursor_temp = (cursor_temp >= 7)?(5):(cursor_temp + 1); m5data.output_mode_type = (SIG_FUNCTIONS_TYPE)cursor_temp; set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case SIG_RTD: //热电阻 { m5data.input_mode_type = RTD_DC; set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; default: break; } } break; default: break; } } break; case KEY_SOURCE: { //电源开关靠硬件电路实现,此处可做预留 key = 0; } break; case KEY_DOWN: { key = 0; if(m5data.io_mode == IO_INPUT) { return; } m5data.twk_flag = 1; // 上、下、左、右 任意一个键按下后,闪烁开始 m5data.twk_cnt = 0; //每次按下后闪烁计数清零 keyset_output(-1); // uint8_t step = 1; //down键步长,默认为1 // float32 step_real = 0; //实际值步长 // float32 pv = 0, sv = 0, low = 0; // //根据当前游标位置计算步进值 // step_real = step * my_power(10, (3 - m5data.io_cursor)); // //按下down键后,即将刷新的实际值 // pv = get_output_value(); // sv = pv - step_real; // low = pltdata.yreal_pri_low; // if( sv <= low ) // { // //超过下限的情况下,直接显示下限 // sv = low; // sv *= 1000; // set_output(sv); // } // else // { // //没超过下限的情况下,仅考虑pv、0、sv三者的位置关系 // if( sv >= 0 ) // { // //一定为正数,直接调用以下函数,减小数值 // change_nixie_cube_OUT(NIXIE_DECREASE, step); // } // else // { // if( pv < 0 ) // { // //pv和sv都为负数的情况下,仅调转方向,增大数值 // change_nixie_cube_OUT(NIXIE_INCREASE, step); // } // else // { // //跨越0后,负号点亮 // //pv变为sv后跨越了0,数值可能增大也可能减小,因此直接赋值 // sv *= 1000; // set_output(sv); // } // } // } } break; case KEY_BACK: //闲置,预留 { key = 0; } break; default: { key = 0; } break; } } void scr_init_run(void) { if( m5data.scr_init_cnt <= SCREEN_INIT_CNT_MAX ) //进度条变化次数,在头文件中设置 { if( m5data.tick_prv == -1 ) { m5data.tick_prv = xTaskGetTickCount(); //记录起始时刻 }else { m5data.tick_cur = xTaskGetTickCount(); //记录当前时刻 if(m5data.tick_cur < m5data.tick_prv) //防止溢出(当前tick小于前一刻的tick) { m5data.tick_prv = -1; //溢出后复位并返回 m5data.tick_cur = -1; return; } if(m5data.tick_cur - m5data.tick_prv >= 1000) //tick间隔达到目标后,执行功能 { m5data.tick_prv = -1; m5data.tick_cur = -1; m5data.scr_init_bar = m5data.scr_init_cnt * ( 100/SCREEN_INIT_CNT_MAX ); lv_bar_set_value(guider_ui.screen_init_bar_1, m5data.scr_init_bar, LV_ANIM_OFF); m5data.scr_init_cnt ++; } } } else { // //开机动画结束后,清除初始界面内部组件,保留对象,释放内存 // lv_obj_clean(guider_ui.screen_init); //加载主界面 setup_scr_screen_main(&guider_ui); lv_scr_load(guider_ui.screen_main); //删除初始界面对象,释放剩余内存 lv_obj_del(guider_ui.screen_init); m5data.scr_init_flag = 1; //开机动画结束,只执行一次 m5data.scr_now = SCREEN_MAIN; //开机动画结束后,默认进入主界面 } } void scr_main_run(void) { //实时更新设定值 sig_sv_update(); //不做延时,尽快响应 //运行时间显示 runtime_show(); //1000ms //电池电量显示 battery_show(); //3000ms //动态曲线绘制 plot_drawing(); //1500ms //当前输入值/测量值显示 input_value_show(); //500ms //数值闪烁 num_twinkle(); //1000ms } void runtime_show(void) { if(heart_1000ms_flag) { heart_1000ms_flag = 0; m5data.runtime_seconds ++; if( m5data.runtime_seconds > 59) //秒溢出 { m5data.runtime_minutes ++; //溢出后分钟进一 m5data.runtime_seconds = 0; } if(m5data.runtime_minutes > 59) //分钟溢出 { m5data.runtime_hours ++; //溢出后小时进一 m5data.runtime_minutes = 0; } if(m5data.runtime_hours > 99) //小时溢出 { m5data.runtime_seconds = 0; //溢出后全部归零 m5data.runtime_minutes = 0; m5data.runtime_hours = 0; } // 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_time_span, m5data.runtime_show); input_value_show(); //显示当前测量值 } } void battery_show(void) { //每隔3秒读取一次当前电量 if(battery_3000ms_flag) { battery_3000ms_flag = 0; read_battery(); switch (bat_cpa) { case 0: { m5data.battery_cnt = 1; } break; case 1: { m5data.battery_cnt = 2; } break; case 3: { m5data.battery_cnt = 3; } break; case 7: { m5data.battery_cnt = 4; } break; case 15: { m5data.battery_cnt = 5; } break; default: break; } lv_img_set_src(guider_ui.screen_main_animimg_battery, screen_main_animimg_battery_imgs[m5data.battery_cnt]); } } //设置游标位置【0000.000】,0~7 //中间有个小数点,小数点的显示宽度与数字不同,间隔与两个起点在头文件中设置 // 【】IO_CURSOR_INTERVAL【】IO_CURSOR_INTERVAL【】IO_CURSOR_INTERVAL【】.【】IO_CURSOR_INTERVAL【】IO_CURSOR_INTERVAL【】 // ↑ IO_CURSOR_START1 ↑ IO_CURSOR_START2 void set_cursor_position(void) { if(m5data.io_cursor <= 3) { lv_obj_set_pos(guider_ui.screen_main_img_cursor, IO_CURSOR_START1 + IO_CURSOR_INTERVAL * m5data.io_cursor, IO_CURSOR_Y); } else { lv_obj_set_pos(guider_ui.screen_main_img_cursor, IO_CURSOR_START2 + IO_CURSOR_INTERVAL * (m5data.io_cursor - 4), IO_CURSOR_Y); } } //设置数码管符号位,0->熄灭,1->显示负号 void set_nixie_cube_sign(uint8_t on2off, uint8_t sg) { switch (on2off) { case IO_INPUT: { switch (sg) { case 0: { //熄灭负号 m5data.sign_flag_in = 0; lv_img_set_src(guider_ui.screen_main_ani_in_sign, screen_main_ani_in_sign_imgs[0]); } break; case 1: { //显示负号 m5data.sign_flag_in = 1; lv_img_set_src(guider_ui.screen_main_ani_in_sign, screen_main_ani_in_sign_imgs[1]); } break; default: break; } } break; case IO_OUTPUT: { switch (sg) { case 0: { //熄灭负号 m5data.sign_flag_out = 0; lv_img_set_src(guider_ui.screen_main_ani_out_sign, screen_main_ani_out_sign_imgs[0]); } break; case 1: { //显示负号 m5data.sign_flag_out = 1; lv_img_set_src(guider_ui.screen_main_ani_out_sign, screen_main_ani_out_sign_imgs[1]); } break; default: break; } } break; default: break; } } //设置数码管显示值:io_slc-输入/输出,pos-第几个数字(99代表全部),num->(可正可负)实际数值 void set_nixie_cube(uint8_t io_slc, uint8_t pos, int32_t num) { switch (io_slc) { case IO_INPUT: { switch (pos) { case 99: { if( (num < 0)&&(m5data.sign_flag_in == 0) ) { //出现负数并且没有显示负号时 set_nixie_cube_sign(IO_INPUT, 1); } else if(( (num >= 0)&&(m5data.sign_flag_in == 1) )) { //数值为非负数,但仍然显示负号时 set_nixie_cube_sign(IO_INPUT, 0); } //负数转正数 num = ( num >= 0 )?(num):(0 - num); int32_t temp = 0; //显示当前测量值,从左往右 0->6 temp = (num/1000000 > 9)?(0):(num/1000000); lv_img_set_src(guider_ui.screen_main_ani_in_0, screen_main_ani_in_0_imgs[temp]); m5data.i_numbers[0] = temp; temp = (num/100000) % 10; lv_img_set_src(guider_ui.screen_main_ani_in_1, screen_main_ani_in_1_imgs[temp]); m5data.i_numbers[1] = temp; temp = (num/10000) % 10; lv_img_set_src(guider_ui.screen_main_ani_in_2, screen_main_ani_in_2_imgs[temp]); m5data.i_numbers[2] = temp; temp = (num/1000) % 10; lv_img_set_src(guider_ui.screen_main_ani_in_3, screen_main_ani_in_3_imgs[temp]); m5data.i_numbers[3] = temp; temp = (num/100) % 10; lv_img_set_src(guider_ui.screen_main_ani_in_4, screen_main_ani_in_4_imgs[temp]); m5data.i_numbers[4] = temp; temp = (num/10) % 10; lv_img_set_src(guider_ui.screen_main_ani_in_5, screen_main_ani_in_5_imgs[temp]); m5data.i_numbers[5] = temp; temp = num % 10; lv_img_set_src(guider_ui.screen_main_ani_in_6, screen_main_ani_in_6_imgs[temp]); m5data.i_numbers[6] = temp; } break; default: break; } } break; //只负责数字部分,不管符号 case IO_OUTPUT: { switch (pos) { case 0: { if(num > 10) { num = 10; } else if(num < 0) { num = 0; } lv_img_set_src(guider_ui.screen_main_ani_out_0, screen_main_ani_out_0_imgs[num]); } break; case 1: { if(num > 10) { num = 10; } else if(num < 0) { num = 0; } lv_img_set_src(guider_ui.screen_main_ani_out_1, screen_main_ani_out_1_imgs[num]); } break; case 2: { if(num > 10) { num = 10; } else if(num < 0) { num = 0; } lv_img_set_src(guider_ui.screen_main_ani_out_2, screen_main_ani_out_2_imgs[num]); } break; case 3: { if(num > 10) { num = 10; } else if(num < 0) { num = 0; } lv_img_set_src(guider_ui.screen_main_ani_out_3, screen_main_ani_out_3_imgs[num]); } break; case 4: { if(num > 10) { num = 10; } else if(num < 0) { num = 0; } lv_img_set_src(guider_ui.screen_main_ani_out_4, screen_main_ani_out_4_imgs[num]); } break; case 5: { if(num > 10) { num = 10; } else if(num < 0) { num = 0; } lv_img_set_src(guider_ui.screen_main_ani_out_5, screen_main_ani_out_5_imgs[num]); } break; case 6: { if(num > 10) { num = 10; } else if(num < 0) { num = 0; } lv_img_set_src(guider_ui.screen_main_ani_out_6, screen_main_ani_out_6_imgs[num]); } break; case 99: { if( (num < 0)&&(m5data.sign_flag_out == 0) ) { //出现负数并且没有显示负号时 set_nixie_cube_sign(IO_OUTPUT, 1); } else if(( (num >= 0)&&(m5data.sign_flag_out == 1) )) { //数值为非负数,但仍然显示负号时 set_nixie_cube_sign(IO_OUTPUT, 0); } //负数转正数 num = ( num >= 0 )?(num):(0 - num); if(num > 9999999) { num = 9999999; } else if(num < 0) { num = 0; } int32_t temp = 0; //显示当前测量值,从左往右 0->6 temp = (num/1000000 > 9)?(0):(num/1000000); lv_img_set_src(guider_ui.screen_main_ani_out_0, screen_main_ani_out_0_imgs[temp]); temp = (num/100000) % 10; lv_img_set_src(guider_ui.screen_main_ani_out_1, screen_main_ani_out_1_imgs[temp]); temp = (num/10000) % 10; lv_img_set_src(guider_ui.screen_main_ani_out_2, screen_main_ani_out_2_imgs[temp]); temp = (num/1000) % 10; lv_img_set_src(guider_ui.screen_main_ani_out_3, screen_main_ani_out_3_imgs[temp]); temp = (num/100) % 10; lv_img_set_src(guider_ui.screen_main_ani_out_4, screen_main_ani_out_4_imgs[temp]); temp = (num/10) % 10; lv_img_set_src(guider_ui.screen_main_ani_out_5, screen_main_ani_out_5_imgs[temp]); temp = num % 10; lv_img_set_src(guider_ui.screen_main_ani_out_6, screen_main_ani_out_6_imgs[temp]); } break; default: break; } } break; default: break; } } //RE:按键修改输出值 void keyset_output(int8_t key_step) { float32 pv = 0, sv = 0; uint8_t cursor = 0; cursor = m5data.io_cursor; pv = get_output_value(); sv = pv + key_step * my_power(10, ( 3 - cursor ) ); if( sv > pltdata.yreal_pri_up ) sv = pltdata.yreal_pri_up; if( sv < pltdata.yreal_pri_low ) sv = pltdata.yreal_pri_low; set_output( sv ); } //设置当前的输出值(实际值-> (无符号)数组),可直接输入负数 //记录缓存变化的位置 uint8_t change_flag[7] = {0}; void set_output_array(int32_t pvo) { int32_t temp = 0; pvo = (pvo > 0)?(pvo):(0 - pvo); //将实际值转换成6个独立数字 for(uint8_t i = 0; i < 7; i++) { temp = ( pvo / (int32_t)my_power( 10,( 6 - i ) ) ) % 10; if(temp != m5data.o_numbers[i]) { m5data.o_numbers[i] = temp; change_flag[i] = 1; } } if( m5data.o_numbers[0] > 9 ) m5data.o_numbers[0] = 9; } //设置输出值:数字显示 + 符号 + 缓存,sto:实际值(有符号) void set_output(float32 sto) { if( (sto < 0)&&(m5data.sign_flag_out == 0) ) { //出现负数并且没有显示负号时 set_nixie_cube_sign(IO_OUTPUT, 1); } else if(( (sto >= 0)&&(m5data.sign_flag_out == 1) )) { //数值为非负数,但仍然显示负号时 set_nixie_cube_sign(IO_OUTPUT, 0); } //乘以1000用于绕开 int32 和 float32 之间的转换 sto *= 1000; //更新缓存 set_output_array(sto); //刷新改变的位置 for(uint8_t i = 0;i < 7;i++) { if(change_flag[i]) { set_nixie_cube(IO_OUTPUT, i, m5data.o_numbers[i]); } } } //获取当前设定的输出值 float32 get_output_value(void) { float32 pvo = 0; pvo = m5data.o_numbers[0]*1000 + m5data.o_numbers[1]*100 + 10*m5data.o_numbers[2] + \ m5data.o_numbers[3] + m5data.o_numbers[4]*(float32)0.1 + m5data.o_numbers[5]*(float32)0.01 + m5data.o_numbers[6]*(float32)0.001; pvo = (m5data.sign_flag_out)?(0 - pvo):(pvo); return pvo; } //通道选择与切换 void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type) { switch (io) { case IO_INPUT: { switch (type) { case VOLTAGE_MV: { mux_signal.channel = CH6_IN_MVOL; } break; case VOLTAGE_V: { mux_signal.channel = CH5_IN_VOL; } break; case CURRENT_MA: { mux_signal.channel = CH7_IN_CUR; } break; case RESISTANT_OHM: {} break; case FREQUENCE_KHZ: { mux_signal.channel = CH8_IN_FRE; } break; case TC_K: { mux_signal.channel = CH9_IN_TC; } break; case TC_S: { mux_signal.channel = CH9_IN_TC; } break; case TC_N: { mux_signal.channel = CH9_IN_TC; } break; case TC_B: { mux_signal.channel = CH9_IN_TC; } break; case TC_E: { mux_signal.channel = CH9_IN_TC; } break; case TC_J: { mux_signal.channel = CH9_IN_TC; } break; case TC_R: { mux_signal.channel = CH9_IN_TC; } break; case TC_T: { mux_signal.channel = CH9_IN_TC; } break; case RTD_DC: { mux_signal.channel = CH10_IN_RTD; } break; default: break; } } break; case IO_OUTPUT: { switch (type) { case VOLTAGE_MV: { mux_signal.channel = CH1_OUT_VOL_MV; } break; case VOLTAGE_V: { mux_signal.channel = CH0_OUT_VOL_V; } break; case CURRENT_MA: { mux_signal.channel = CH2_OUT_CUR; } break; case RESISTANT_OHM: { mux_signal.channel = CH4_OUT_RES; } break; case FREQUENCE_KHZ: { mux_signal.channel = CH3_OUT_FRE; } break; case TC_K: { } break; case TC_S: { } break; case TC_N: { } break; case TC_B: { } break; case TC_E: { } break; case TC_J: { } break; case TC_R: { } break; case TC_T: { } break; case RTD_DC: { } break; default: break; } } break; default: break; } } //更新设定值(根据ON\OFF状态) void sig_sv_update(void) { switch (m5data.io_on2off) { case IO_ON: { mux_signal.data_sv = real2mux( get_output_value() ); } break; case IO_OFF: { mux_signal.data_sv = 0; } break; default: break; } } //设置工作模式和工作模式类型 void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type) { //为保障安全,切换工作模式后:功能关闭,输入输出值清零 //{ //功能关闭 m5data.io_on2off = IO_OFF; io_on2off_status(); //更新ON/OFF/IN/OUT状态指示 //清空数码管输入显示值缓存 for(uint8_t i = 0; i < 7; i++) //用于数值显示的数组,初值为0 { m5data.i_numbers[i] = 0; //输入值/测量值 } //数码管输入显示置零 set_nixie_cube(IO_INPUT, 99, 0); //数码管输出值置零 set_output(0); //游标恢复至小数点前1位,个位 m5data.io_cursor = 3; m5data.io_cursor_prv = 3; set_cursor_position(); //闪烁参数清零 m5data.twk_flag = 0; //闪烁中止 m5data.twk_cnt = 0; //闪烁计数清零 m5data.twk_flip = 0; //0显示,1不显示 //曲线绘图值清零(输入缓存已经置零,绘图值不必清零) pltdata.yreal_scd_value = 0; pltdata.yreal_scd_value_prv = 0; //} switch (mode) { //电压 case SIG_VOLTAGE: { lv_label_set_text(guider_ui.screen_main_label_Mode, "Volt"); switch (type) { case VOLTAGE_MV: { lv_label_set_text(guider_ui.screen_main_label_unit, "mV"); pltdata.yreal_pri_up = tabdata.content01[1]; pltdata.yreal_scd_up = tabdata.content01[1]; pltdata.yreal_pri_low = tabdata.content02[1]; pltdata.yreal_scd_low = tabdata.content02[1]; } break; case VOLTAGE_V: { lv_label_set_text(guider_ui.screen_main_label_unit, "V"); pltdata.yreal_pri_up = tabdata.content01[0]; pltdata.yreal_scd_up = tabdata.content01[0]; pltdata.yreal_pri_low = tabdata.content02[0]; pltdata.yreal_scd_low = tabdata.content02[0]; } break; default: break; } } break; //电流 case SIG_CURRENT: { lv_label_set_text(guider_ui.screen_main_label_Mode, "Cur"); switch (type) { case CURRENT_MA: { lv_label_set_text(guider_ui.screen_main_label_unit, "mA"); pltdata.yreal_pri_up = tabdata.content03; pltdata.yreal_scd_up = tabdata.content03; pltdata.yreal_pri_low = tabdata.content04; pltdata.yreal_scd_low = tabdata.content04; } break; default: break; } } break; //电阻 case SIG_RESISTANT: { lv_label_set_text(guider_ui.screen_main_label_Mode, "Res"); switch (type) { case RESISTANT_OHM: { lv_label_set_text(guider_ui.screen_main_label_unit, "Ω"); pltdata.yreal_pri_up = tabdata.content05; pltdata.yreal_scd_up = tabdata.content05; pltdata.yreal_pri_low = tabdata.content06; pltdata.yreal_scd_low = tabdata.content06; } break; default: break; } } break; //频率 case SIG_FREQUENCE: { lv_label_set_text(guider_ui.screen_main_label_Mode, "Fre"); switch (type) { case FREQUENCE_KHZ: { lv_label_set_text(guider_ui.screen_main_label_unit, "KHz"); pltdata.yreal_pri_up = tabdata.content07; pltdata.yreal_scd_up = tabdata.content07; pltdata.yreal_pri_low = tabdata.content08; pltdata.yreal_scd_low = tabdata.content08; } break; default: break; } } break; //热电偶 case SIG_TC: { lv_label_set_text(guider_ui.screen_main_label_Mode, "Tc"); switch (type) { case TC_K: { lv_label_set_text(guider_ui.screen_main_label_unit, "K ℃"); pltdata.yreal_pri_up = tabdata.content09[0]; pltdata.yreal_scd_up = tabdata.content09[0]; pltdata.yreal_pri_low = tabdata.content010[0]; pltdata.yreal_scd_low = tabdata.content010[0]; } break; case TC_S: { lv_label_set_text(guider_ui.screen_main_label_unit, "S ℃"); pltdata.yreal_pri_up = tabdata.content09[1]; pltdata.yreal_scd_up = tabdata.content09[1]; pltdata.yreal_pri_low = tabdata.content010[1]; pltdata.yreal_scd_low = tabdata.content010[1]; } break; case TC_N: { lv_label_set_text(guider_ui.screen_main_label_unit, "N ℃"); pltdata.yreal_pri_up = tabdata.content09[2]; pltdata.yreal_scd_up = tabdata.content09[2]; pltdata.yreal_pri_low = tabdata.content010[2]; pltdata.yreal_scd_low = tabdata.content010[2]; } break; case TC_B: { lv_label_set_text(guider_ui.screen_main_label_unit, "B ℃"); pltdata.yreal_pri_up = tabdata.content09[3]; pltdata.yreal_scd_up = tabdata.content09[3]; pltdata.yreal_pri_low = tabdata.content010[3]; pltdata.yreal_scd_low = tabdata.content010[3]; } break; case TC_E: { lv_label_set_text(guider_ui.screen_main_label_unit, "E ℃"); pltdata.yreal_pri_up = tabdata.content09[4]; pltdata.yreal_scd_up = tabdata.content09[4]; pltdata.yreal_pri_low = tabdata.content010[4]; pltdata.yreal_scd_low = tabdata.content010[4]; } break; case TC_J: { lv_label_set_text(guider_ui.screen_main_label_unit, "J ℃"); pltdata.yreal_pri_up = tabdata.content09[5]; pltdata.yreal_scd_up = tabdata.content09[5]; pltdata.yreal_pri_low = tabdata.content010[5]; pltdata.yreal_scd_low = tabdata.content010[5]; } break; case TC_R: { lv_label_set_text(guider_ui.screen_main_label_unit, "R ℃"); pltdata.yreal_pri_up = tabdata.content09[6]; pltdata.yreal_scd_up = tabdata.content09[6]; pltdata.yreal_pri_low = tabdata.content010[6]; pltdata.yreal_scd_low = tabdata.content010[6]; } break; case TC_T: { lv_label_set_text(guider_ui.screen_main_label_unit, "T ℃"); pltdata.yreal_pri_up = tabdata.content09[7]; pltdata.yreal_scd_up = tabdata.content09[7]; pltdata.yreal_pri_low = tabdata.content010[7]; pltdata.yreal_scd_low = tabdata.content010[7]; } break; default: break; } } break; //热电阻 case SIG_RTD: { lv_label_set_text(guider_ui.screen_main_label_Mode, "RTD"); switch (type) { case RTD_DC: { lv_label_set_text(guider_ui.screen_main_label_unit, "℃"); pltdata.yreal_pri_up = tabdata.content011; pltdata.yreal_scd_up = tabdata.content011; pltdata.yreal_pri_low = tabdata.content012; pltdata.yreal_scd_low = tabdata.content012; } break; default: break; } } break; default: break; } //当前输入数值更新为新的上下限 pltdata.yreal_scd_value = pltdata.yreal_scd_low; pltdata.yreal_scd_value_prv = pltdata.yreal_scd_low; set_nixie_cube(IO_INPUT, 99, pltdata.yreal_scd_low*1000); //当前输出数值更新为新的上下限 set_output(pltdata.yreal_pri_low); //通道选择与切换 sig_channel_select(m5data.io_mode, type); } void input_value_show(void) { if(input_500ms_flag) { input_500ms_flag = 0; //获取输入值 pltdata.yreal_scd_value = mux2real(mux_signal.data_pv); if( MY_ABS(pltdata.yreal_scd_value - pltdata.yreal_scd_value_prv) < (float32)0.01) { //变化值过小的情况下不更新显示内容 return; } else { //记录前一时刻的值,用于计算变化量 pltdata.yreal_scd_value_prv = pltdata.yreal_scd_value; } int32_t pvi = 0; //输入显示限幅 if(pltdata.yreal_scd_value >= pltdata.yreal_scd_up) { pvi = pltdata.yreal_scd_up*1000; } else if (pltdata.yreal_scd_value <= pltdata.yreal_scd_low) { pvi = pltdata.yreal_scd_low*1000; } else { pvi = (int32_t)(pltdata.yreal_scd_value*1000); //副轴用于绘制实时输入测量值 } set_nixie_cube(IO_INPUT, 99, pvi); } } void io_on2off_status(void) { switch (m5data.io_on2off) { case IO_ON: { lv_label_set_text(guider_ui.screen_main_label_ONOFF, "ON"); switch (m5data.io_mode) { case IO_OUTPUT: { //输入变回黑色,输出变为绿色 lv_obj_set_style_text_color(guider_ui.screen_main_label_IN, lv_color_hex(0x000000), LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_text_color(guider_ui.screen_main_label_OUT, lv_color_hex(0x06ff00), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case IO_INPUT: { //输出变回黑色,输入变为绿色 lv_obj_set_style_text_color(guider_ui.screen_main_label_IN, lv_color_hex(0x06ff00), LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_text_color(guider_ui.screen_main_label_OUT, lv_color_hex(0x000000), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } } break; case IO_OFF: { lv_label_set_text(guider_ui.screen_main_label_ONOFF, "OFF"); switch (m5data.io_mode) { case IO_OUTPUT: { //输入变回黑色,输出变为红色 lv_obj_set_style_text_color(guider_ui.screen_main_label_IN, lv_color_hex(0x000000), LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_text_color(guider_ui.screen_main_label_OUT, lv_color_hex(0xff0027), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case IO_INPUT: { //输出变回黑色,输入变为红色 lv_obj_set_style_text_color(guider_ui.screen_main_label_IN, lv_color_hex(0x06ff00), LV_PART_MAIN|LV_STATE_DEFAULT); lv_obj_set_style_text_color(guider_ui.screen_main_label_OUT, lv_color_hex(0x000000), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } } break; default: break; } } //KEY_SETTING void key_functions_setting(void) { switch (key) { case KEY_BACK: { key = 0; //所有选项卡均未选中时,返回主界面,否则熄灭当前选中 if(tabdata.content_cursor == 99) { //下次进入设置页面时,从选项卡0开始 tabdata.item_cursor = 0; //加载主界面 setup_scr_screen_main(&guider_ui); lv_scr_load(guider_ui.screen_main); //切换至菜单后,清除主界面对象,释放内存 lv_obj_del(guider_ui.screen_setting); //当前界面为主界面 m5data.scr_now = SCREEN_MAIN; //恢复之前显示的数据 scr_main_recover(); } else { if(tabdata.content_focus == 0) { //当不存在焦点时 //某个选项卡被选中时,熄灭内部选中的内容 switch (tabdata.item_cursor) { case ITEMS_0: { //熄灭当前内容 setting_contents_check(99, tabdata.content_cursor); //取消内容选中与焦点 tabdata.content_cursor = 99; tabdata.content_cursor_prv = 99; tabdata.content_focus = 0; tabdata.content_cursor_x = 0; tabdata.content_cursor_y = 0; } break; case ITEMS_1: { //取消内容选中与焦点 //熄灭当前内容 setting_contents_check(99, tabdata.content_cursor); tabdata.content_cursor = 99; tabdata.content_cursor_prv = 99; tabdata.content_focus = 0; tabdata.content_cursor_x = 0; tabdata.content_cursor_y = 0; } break; case ITEMS_2: { //取消内容选中与焦点 tabdata.content_cursor = 99; tabdata.content_cursor_prv = 99; tabdata.content_focus = 0; tabdata.content_cursor_x = 0; tabdata.content_cursor_y = 0; } break; case ITEMS_3: { //取消内容选中与焦点 tabdata.content_cursor = 99; tabdata.content_cursor_prv = 99; tabdata.content_focus = 0; tabdata.content_cursor_x = 0; tabdata.content_cursor_y = 0; } break; default: break; } } else { //当存在焦点时 tabdata.content_focus = 0; setting_contents_check(tabdata.content_cursor, 99); } } } break; case KEY_UP: { key = 0; //内部游标为99时,说明未选中任何一个选项卡,此时的up和down用于切换选项卡 if(tabdata.content_cursor == 99) { tabdata.item_cursor_prv = tabdata.item_cursor; tabdata.item_cursor = (tabdata.item_cursor <= 0)?(3):(tabdata.item_cursor - 1); setting_items_check(tabdata.item_cursor, tabdata.item_cursor_prv); } else { //某个内容被焦点前,在此处选择内容值 if(tabdata.content_focus == 0) { switch (tabdata.item_cursor) { case ITEMS_0: { tabdata.content_cursor_prv = tabdata.content_cursor; tabdata.content_cursor_y = (tabdata.content_cursor_y <= 0)?(5):(tabdata.content_cursor_y - 1); tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; default: break; } } else { //某个内容被焦点后,在此处修改内容值 setting_contents_modify(tabdata.item_cursor, tabdata.content_cursor, KEY_UP, 1); } } } break; case KEY_DOWN: { key = 0; //内部游标为99时,说明未选中任何一个选项卡,此时的up和down用于切换选项卡 if(tabdata.content_cursor == 99) { tabdata.item_cursor_prv = tabdata.item_cursor; tabdata.item_cursor = (tabdata.item_cursor >= 3)?(0):(tabdata.item_cursor + 1); setting_items_check(tabdata.item_cursor, tabdata.item_cursor_prv); } else { if(tabdata.content_focus == 0) { //某个内容被焦点前,在此处选择内容值 switch (tabdata.item_cursor) { case ITEMS_0: { tabdata.content_cursor_prv = tabdata.content_cursor; tabdata.content_cursor_y = (tabdata.content_cursor_y >= 5)?(0):(tabdata.content_cursor_y + 1); tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; default: break; } } else { //某个内容被焦点后,在此处修改内容值 setting_contents_modify(tabdata.item_cursor, tabdata.content_cursor, KEY_DOWN, 1); } } } break; case KEY_OK: { key = 0; //OK键用于选择选项卡时:选项卡未选中时内部内容全部熄灭 if(tabdata.content_cursor == 99) { //选中后点亮第一个内容 switch (tabdata.item_cursor) { case ITEMS_0: { tabdata.content_cursor_x = 1; tabdata.content_cursor_y = 0; tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); tabdata.content_cursor_prv = 99; setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; case ITEMS_1: { tabdata.content_cursor_x = 1; tabdata.content_cursor_y = 0; tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); tabdata.content_cursor_prv = 99; setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; case ITEMS_2: { tabdata.content_cursor_x = 0; tabdata.content_cursor_y = 0; tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); tabdata.content_cursor_prv = 99; setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; case ITEMS_3: { tabdata.content_cursor_x = 0; tabdata.content_cursor_y = 0; tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); tabdata.content_cursor_prv = 99; setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; default: break; } } else { //进入此处说明选项卡已被选中,此时需要选择内容 //内容焦点后,通过KEY_UP和KEY_DOWN修改 //KEY_BACK按下后,取消焦点 tabdata.content_focus = 1; setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } } break; //仅用于选择内容 case KEY_LEFT: { key = 0; if( (tabdata.content_cursor == 99)||(tabdata.content_focus == 1) ) { //选项卡未选中时,直接返回 //已经存在焦点时,直接返回 return; } switch (tabdata.item_cursor) { case ITEMS_0: { tabdata.content_cursor_prv = tabdata.content_cursor; tabdata.content_cursor_x = (tabdata.content_cursor_x <= 1)?(5):(tabdata.content_cursor_x - 2); tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; case ITEMS_1: {} break; case ITEMS_2: {} break; case ITEMS_3: { } break; default: break; } } break; //仅用于选择内容 case KEY_RIGHT: { key = 0; if( (tabdata.content_cursor == 99)||(tabdata.content_focus == 1) ) { //选项卡未选中时,直接返回 //已经存在焦点时,直接返回 return; } switch (tabdata.item_cursor) { case ITEMS_0: { tabdata.content_cursor_prv = tabdata.content_cursor; tabdata.content_cursor_x = (tabdata.content_cursor_x >= 5)?(1):(tabdata.content_cursor_x + 2); tabdata.content_cursor = contents_xy2cursor(tabdata.content_cursor_x, tabdata.content_cursor_y); setting_contents_check(tabdata.content_cursor, tabdata.content_cursor_prv); } break; case ITEMS_1: {} break; case ITEMS_2: {} break; case ITEMS_3: { } break; default: break; } } break; default: { key = 0; } break; } } void setting_items_check(uint8_t cursor, uint8_t cursor_prv) { //操作选项卡 switch (cursor) //点亮当前选中目标 { case ITEMS_0: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s0, lv_color_hex(COLOR_ITEMS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case ITEMS_1: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s1, lv_color_hex(COLOR_ITEMS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case ITEMS_2: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s2, lv_color_hex(COLOR_ITEMS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case ITEMS_3: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s3, lv_color_hex(COLOR_ITEMS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } switch (cursor_prv) //熄灭前一时刻的目标 { case ITEMS_0: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s0, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case ITEMS_1: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s1, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case ITEMS_2: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s2, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case ITEMS_3: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_s3, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } contents_refresh(cursor_prv, cursor); } //设置界面选项卡内部内容选中:点亮cursor;熄灭cursor_prv;焦点focus void setting_contents_check(uint8_t cursor, uint8_t cursor_prv) { //根据焦点与否切换点亮时的颜色 uint32_t color = 0; if(tabdata.content_focus) { color = COLOR_CONTENTS_FOCUSED; } else { color = COLOR_CONTENTS_CHECKED; } //操作内容 switch (tabdata.item_cursor) { case ITEMS_0: { //点亮cursor set_contents_color(cursor, color); //熄灭cursor_prv color = COLOR_CONTENTS_UNCHECKED; set_contents_color(cursor_prv, color); } break; case ITEMS_1: { //点亮cursor set_contents_color(cursor, color); //熄灭cursor_prv color = COLOR_CONTENTS_UNCHECKED; set_contents_color(cursor_prv, color); } break; case ITEMS_2: { } break; case ITEMS_3: { } break; default: break; } } //设置界面选项卡内部内容选中之后,修改内容,修改第ite个选项卡的第con个内容 void setting_contents_modify(uint8_t ite, uint8_t con, uint8_t key_val, int8_t step) { step = (key_val == KEY_UP)?(step):(0 - step); //选中某一选项卡后,对选项卡内部的内容进行选择 switch (ite) { case ITEMS_0: { contents_modify_item_0(con, step); } break; case ITEMS_1: { contents_modify_item_1(con, step); } break; case ITEMS_2: { } break; case ITEMS_3: { } break; default: break; } } //修改选项卡0的内容 void contents_modify_item_0(uint8_t cursor, int8_t step) { switch (cursor) { case CONTENT_0_0: { if(tabdata.content00 == VOLTAGE_V) { tabdata.content00 = VOLTAGE_MV; } else { tabdata.content00 = VOLTAGE_V; } //更新显示内容 //单位改变时,相关数值也要跟随 setting_update(ITEMS_0, CONTENT_0_0); setting_update(ITEMS_0, CONTENT_0_1); setting_update(ITEMS_0, CONTENT_0_2); } break; case CONTENT_0_1: { switch (tabdata.content00) { case VOLTAGE_MV: { tabdata.content01[1] += step; //上下限幅 if( tabdata.content01[1] > VOL[1].up ) tabdata.content01[1] = VOL[1].up; if( tabdata.content01[1] < VOL[1].low ) tabdata.content01[1] = VOL[1].low; //上限不能低于下限值,避免自相矛盾 if( tabdata.content01[1] < tabdata.content02[1] ) tabdata.content01[1] = tabdata.content02[1]; } break; case VOLTAGE_V: { tabdata.content01[0] += step; //上下限幅 if( tabdata.content01[0] > VOL[0].up ) tabdata.content01[0] = VOL[0].up; if( tabdata.content01[0] < VOL[0].low ) tabdata.content01[0] = VOL[0].low; //上限不能低于下限值,避免自相矛盾 if( tabdata.content01[0] < tabdata.content02[0] ) tabdata.content01[0] = tabdata.content02[0]; } break; default: break; } //更新显示内容 setting_update(ITEMS_0, CONTENT_0_1); } break; case CONTENT_0_2: { switch (tabdata.content00) { case VOLTAGE_MV: { tabdata.content02[1] += step; //上下限幅 if( tabdata.content02[1] > VOL[1].up ) tabdata.content02[1] = VOL[1].up; if( tabdata.content02[1] < VOL[1].low ) tabdata.content02[1] = VOL[1].low; //下限不能高于下限值,避免自相矛盾 if( tabdata.content02[1] > tabdata.content01[1] ) tabdata.content02[1] = tabdata.content01[1]; } break; case VOLTAGE_V: { tabdata.content02[0] += step; //上下限幅 if( tabdata.content02[0] > VOL[0].up ) tabdata.content02[0] = VOL[0].up; if( tabdata.content02[0] < VOL[0].low ) tabdata.content02[0] = VOL[0].low; //下限不能高于下限值,避免自相矛盾 if( tabdata.content02[0] > tabdata.content01[0] ) tabdata.content02[0] = tabdata.content01[0]; } break; default: break; } //更新显示内容 setting_update(ITEMS_0, CONTENT_0_2); } break; case CONTENT_0_3: { tabdata.content03 += step; if( tabdata.content03 > CUR.up ) tabdata.content03 = CUR.up; if( tabdata.content03 < CUR.low ) tabdata.content03 = CUR.low; if( tabdata.content03 < tabdata.content04 ) tabdata.content03 = tabdata.content04; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_3); } break; case CONTENT_0_4: { tabdata.content04 += step; if( tabdata.content04 > CUR.up ) tabdata.content04 = CUR.up; if( tabdata.content04 < CUR.low ) tabdata.content04 = CUR.low; if( tabdata.content04 > tabdata.content03 ) tabdata.content04 = tabdata.content03; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_4); } break; case CONTENT_0_5: { tabdata.content05 += step; if( tabdata.content05 > RES.up ) tabdata.content05 = RES.up; if( tabdata.content05 < RES.low ) tabdata.content05 = RES.low; if( tabdata.content05 < tabdata.content06 ) tabdata.content05 = tabdata.content06; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_5); } break; case CONTENT_0_6: { tabdata.content06 += step; if( tabdata.content06 > RES.up ) tabdata.content06 = RES.up; if( tabdata.content06 < RES.low ) tabdata.content06 = RES.low; if( tabdata.content06 > tabdata.content05 ) tabdata.content06 = tabdata.content05; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_6); } break; case CONTENT_0_7: { tabdata.content07 += step; if( tabdata.content07 > FRE.up ) tabdata.content07 = FRE.up; if( tabdata.content07 < FRE.low ) tabdata.content07 = FRE.low; if( tabdata.content07 < tabdata.content08 ) tabdata.content07 = tabdata.content08; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_7); } break; case CONTENT_0_8: { tabdata.content08 += step; if( tabdata.content08 > FRE.up ) tabdata.content08 = FRE.up; if( tabdata.content08 < FRE.low ) tabdata.content08 = FRE.low; if( tabdata.content08 > tabdata.content07 ) tabdata.content08 = tabdata.content07; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_8); } break; case CONTENT_0_9: { uint8_t c09_temp = 0; c09_temp = (uint8_t)tabdata.content013; c09_temp -= 5; //[5, 12]->[0, 7] tabdata.content09[c09_temp] += step; if( tabdata.content09[c09_temp] > TC[c09_temp].up ) tabdata.content09[c09_temp] = TC[c09_temp].up; if( tabdata.content09[c09_temp] < TC[c09_temp].low ) tabdata.content09[c09_temp] = TC[c09_temp].low; if( tabdata.content010[c09_temp] > tabdata.content09[c09_temp] ) tabdata.content09[c09_temp] = tabdata.content010[c09_temp]; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_9); } break; case CONTENT_0_10: { uint8_t c010_temp = 0; c010_temp = (uint8_t)tabdata.content013; c010_temp -= 5; //[5, 12]->[0, 7] if( tabdata.content010[c010_temp] > TC[c010_temp].up ) tabdata.content010[c010_temp] = TC[c010_temp].up; if( tabdata.content010[c010_temp] < TC[c010_temp].low ) tabdata.content010[c010_temp] = TC[c010_temp].low; if( tabdata.content010[c010_temp] > tabdata.content09[c010_temp] ) tabdata.content010[c010_temp] = tabdata.content09[c010_temp]; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_10); } break; case CONTENT_0_11: { tabdata.content011 += step; if( tabdata.content011 > RTD.up ) tabdata.content011 = RTD.up; if( tabdata.content011 < RTD.low ) tabdata.content011 = RTD.low; if( tabdata.content011 < tabdata.content012 ) tabdata.content011 = tabdata.content012; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_11); } break; case CONTENT_0_12: { tabdata.content012 += step; if( tabdata.content012 > RTD.up ) tabdata.content012 = RTD.up; if( tabdata.content012 < RTD.low ) tabdata.content012 = RTD.low; if( tabdata.content012 > tabdata.content011 ) tabdata.content012 = tabdata.content011; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_12); } break; case CONTENT_0_13: { uint8_t c13_temp = 0; c13_temp = (uint8_t)tabdata.content013; c13_temp =(c13_temp >= 12)?(5):(c13_temp + 1); //不使用step tabdata.content013 = (SIG_FUNCTIONS_TYPE)c13_temp; //更新显示内容 setting_update(ITEMS_0, CONTENT_0_13); //类型改变时,相关数值也要跟随 setting_update(ITEMS_0, CONTENT_0_9); setting_update(ITEMS_0, CONTENT_0_10); } break; default: break; } } //修改选项卡1的内容 void contents_modify_item_1(uint8_t cursor, int8_t step) { switch (cursor) { case CONTENT_1_0: { tabdata.light_flag = !tabdata.light_flag; //更新显示内容 setting_update(ITEMS_1, CONTENT_1_0); } break; default: break; } } void setting_update(uint8_t ite, uint8_t con) { char str_temp[14]; switch (ite) { case ITEMS_0: { switch (con) { case CONTENT_0_0: { switch (tabdata.content00) { case VOLTAGE_MV: { lv_label_set_text(guider_ui.screen_setting_label_01, "mV"); } break; case VOLTAGE_V: { lv_label_set_text(guider_ui.screen_setting_label_01, "V"); } break; default: break; } } break; case CONTENT_0_1: { switch (tabdata.content00) { case VOLTAGE_MV: { sprintf(str_temp,"%d",tabdata.content01[1]); lv_label_set_text(guider_ui.screen_setting_label_03, str_temp); } break; case VOLTAGE_V: { sprintf(str_temp,"%d",tabdata.content01[0]); lv_label_set_text(guider_ui.screen_setting_label_03, str_temp); } break; default: break; } } break; case CONTENT_0_2: { switch (tabdata.content00) { case VOLTAGE_MV: { sprintf(str_temp,"%d",tabdata.content02[1]); lv_label_set_text(guider_ui.screen_setting_label_05, str_temp); } break; case VOLTAGE_V: { sprintf(str_temp,"%d",tabdata.content02[0]); lv_label_set_text(guider_ui.screen_setting_label_05, str_temp); } break; default: break; } } break; case CONTENT_0_3: { sprintf(str_temp,"%d",tabdata.content03); lv_label_set_text(guider_ui.screen_setting_label_13, str_temp); } break; case CONTENT_0_4: { sprintf(str_temp,"%d",tabdata.content04); lv_label_set_text(guider_ui.screen_setting_label_15, str_temp); } break; case CONTENT_0_5: { sprintf(str_temp,"%d",tabdata.content05); lv_label_set_text(guider_ui.screen_setting_label_23, str_temp); } break; case CONTENT_0_6: { sprintf(str_temp,"%d",tabdata.content06); lv_label_set_text(guider_ui.screen_setting_label_25, str_temp); } break; case CONTENT_0_7: { sprintf(str_temp,"%d",tabdata.content07); lv_label_set_text(guider_ui.screen_setting_label_33, str_temp); } break; case CONTENT_0_8: { sprintf(str_temp,"%d",tabdata.content08); lv_label_set_text(guider_ui.screen_setting_label_35, str_temp); } break; case CONTENT_0_9: { uint8_t c09_temp = 0; c09_temp = (uint8_t)tabdata.content013; c09_temp -= 5; //[5, 12]->[0, 7] sprintf(str_temp,"%d",tabdata.content09[c09_temp]); lv_label_set_text(guider_ui.screen_setting_label_43, str_temp); } break; case CONTENT_0_10: { uint8_t c10_temp = 0; c10_temp = (uint8_t)tabdata.content013; c10_temp -= 5; //[5, 12]->[0, 7] sprintf(str_temp,"%d",tabdata.content010[c10_temp]); lv_label_set_text(guider_ui.screen_setting_label_45, str_temp); } break; case CONTENT_0_11: { sprintf(str_temp,"%d",tabdata.content011); lv_label_set_text(guider_ui.screen_setting_label_53, str_temp); } break; case CONTENT_0_12: { sprintf(str_temp,"%d",tabdata.content012); lv_label_set_text(guider_ui.screen_setting_label_55, str_temp); } break; case CONTENT_0_13: { switch (tabdata.content013) { case TC_K: { lv_label_set_text(guider_ui.screen_setting_label_41, "K ℃"); } break; case TC_S: { lv_label_set_text(guider_ui.screen_setting_label_41, "S ℃"); } break; case TC_N: { lv_label_set_text(guider_ui.screen_setting_label_41, "N ℃"); } break; case TC_B: { lv_label_set_text(guider_ui.screen_setting_label_41, "B ℃"); } break; case TC_E: { lv_label_set_text(guider_ui.screen_setting_label_41, "E ℃"); } break; case TC_J: { lv_label_set_text(guider_ui.screen_setting_label_41, "J ℃"); } break; case TC_R: { lv_label_set_text(guider_ui.screen_setting_label_41, "R ℃"); } break; case TC_T: { lv_label_set_text(guider_ui.screen_setting_label_41, "T ℃"); } break; default: break; } } break; default: break; } } break; case ITEMS_1: { switch (con) { case CONTENT_1_0: { if (tabdata.light_flag) { lv_label_set_text(guider_ui.screen_setting_label_01, "ON"); } else { lv_label_set_text(guider_ui.screen_setting_label_01, "OFF"); } } break; default: break; } } break; case ITEMS_2: {} break; case ITEMS_3: {} break; default: break; } } //设置界面刷新选项卡的内容,隐藏items_prv,显示items_now void contents_refresh(uint8_t items_prv, uint8_t items_now) { char str_temp[14]; switch (items_prv) { case ITEMS_0: { lv_obj_add_flag(guider_ui.screen_setting_label_00, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_01, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_02, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_03, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_04, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_05, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_10, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_11, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_12, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_13, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_14, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_15, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_20, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_21, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_22, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_23, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_24, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_25, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_30, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_31, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_32, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_33, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_34, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_35, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_40, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_41, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_42, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_43, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_44, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_45, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_50, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_51, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_52, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_53, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_54, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_55, LV_OBJ_FLAG_HIDDEN); } break; case ITEMS_1: { lv_obj_add_flag(guider_ui.screen_setting_label_00, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(guider_ui.screen_setting_label_01, LV_OBJ_FLAG_HIDDEN); } break; default: break; } switch (items_now) { case ITEMS_0: { lv_obj_clear_flag(guider_ui.screen_setting_label_00, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_00, "电压"); lv_obj_clear_flag(guider_ui.screen_setting_label_01, LV_OBJ_FLAG_HIDDEN); switch (tabdata.content00) { case VOLTAGE_MV: { lv_label_set_text(guider_ui.screen_setting_label_01, "mV"); } break; case VOLTAGE_V: { lv_label_set_text(guider_ui.screen_setting_label_01, "V"); } break; default: break; } lv_obj_clear_flag(guider_ui.screen_setting_label_02, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_02, "上限"); lv_obj_clear_flag(guider_ui.screen_setting_label_03, LV_OBJ_FLAG_HIDDEN); switch (tabdata.content00) { case VOLTAGE_MV: { sprintf(str_temp,"%d",tabdata.content01[1]); lv_label_set_text(guider_ui.screen_setting_label_03, str_temp); } break; case VOLTAGE_V: { sprintf(str_temp,"%d",tabdata.content01[0]); lv_label_set_text(guider_ui.screen_setting_label_03, str_temp); } break; default: break; } lv_obj_clear_flag(guider_ui.screen_setting_label_04, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_04, "下限"); lv_obj_clear_flag(guider_ui.screen_setting_label_05, LV_OBJ_FLAG_HIDDEN); switch (tabdata.content00) { case VOLTAGE_MV: { sprintf(str_temp,"%d",tabdata.content02[1]); lv_label_set_text(guider_ui.screen_setting_label_05, str_temp); } break; case VOLTAGE_V: { sprintf(str_temp,"%d",tabdata.content02[0]); lv_label_set_text(guider_ui.screen_setting_label_05, str_temp); } break; default: break; } lv_obj_clear_flag(guider_ui.screen_setting_label_10, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_10, "电流"); lv_obj_clear_flag(guider_ui.screen_setting_label_11, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_11, "mA"); lv_obj_clear_flag(guider_ui.screen_setting_label_12, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_12, "上限"); lv_obj_clear_flag(guider_ui.screen_setting_label_13, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content03); lv_label_set_text(guider_ui.screen_setting_label_13, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_14, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_14, "下限"); lv_obj_clear_flag(guider_ui.screen_setting_label_15, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content04); lv_label_set_text(guider_ui.screen_setting_label_15, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_20, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_20, "电阻"); lv_obj_clear_flag(guider_ui.screen_setting_label_21, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_21, "Ω"); lv_obj_clear_flag(guider_ui.screen_setting_label_22, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_22, "上限"); lv_obj_clear_flag(guider_ui.screen_setting_label_23, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content05); lv_label_set_text(guider_ui.screen_setting_label_23, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_24, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_24, "下限"); lv_obj_clear_flag(guider_ui.screen_setting_label_25, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content06); lv_label_set_text(guider_ui.screen_setting_label_25, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_30, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_30, "频率"); lv_obj_clear_flag(guider_ui.screen_setting_label_31, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_31, "KHz"); lv_obj_clear_flag(guider_ui.screen_setting_label_32, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_32, "上限"); lv_obj_clear_flag(guider_ui.screen_setting_label_33, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content07); lv_label_set_text(guider_ui.screen_setting_label_33, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_34, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_34, "下限"); lv_obj_clear_flag(guider_ui.screen_setting_label_35, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content08); lv_label_set_text(guider_ui.screen_setting_label_35, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_40, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_40, "TC"); lv_obj_clear_flag(guider_ui.screen_setting_label_41, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_41, "℃"); lv_obj_clear_flag(guider_ui.screen_setting_label_42, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_42, "上限"); lv_obj_clear_flag(guider_ui.screen_setting_label_43, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content09[ (uint8_t)tabdata.content013 ]); lv_label_set_text(guider_ui.screen_setting_label_43, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_44, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_44, "下限"); lv_obj_clear_flag(guider_ui.screen_setting_label_45, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content010[ (uint8_t)tabdata.content013 ]); lv_label_set_text(guider_ui.screen_setting_label_45, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_50, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_50, "RTD"); lv_obj_clear_flag(guider_ui.screen_setting_label_51, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_51, "℃"); lv_obj_clear_flag(guider_ui.screen_setting_label_52, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_52, "上限"); lv_obj_clear_flag(guider_ui.screen_setting_label_53, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content011); lv_label_set_text(guider_ui.screen_setting_label_53, str_temp); lv_obj_clear_flag(guider_ui.screen_setting_label_54, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_54, "下限"); lv_obj_clear_flag(guider_ui.screen_setting_label_55, LV_OBJ_FLAG_HIDDEN); sprintf(str_temp,"%d",tabdata.content012); lv_label_set_text(guider_ui.screen_setting_label_55, str_temp); } break; case ITEMS_1: { lv_obj_clear_flag(guider_ui.screen_setting_label_00, LV_OBJ_FLAG_HIDDEN); lv_label_set_text(guider_ui.screen_setting_label_00, "照明"); lv_obj_clear_flag(guider_ui.screen_setting_label_01, LV_OBJ_FLAG_HIDDEN); if(tabdata.light_flag) { lv_label_set_text(guider_ui.screen_setting_label_01, "ON"); } else { lv_label_set_text(guider_ui.screen_setting_label_01, "OFF"); } } break; default: break; } } //将游标的横纵坐标转换成游标值,x[0,5], y[0,5], cursor[0,35] uint8_t contents_xy2cursor(uint8_t px, uint8_t py) { uint8_t result = 0; result = px + 6 * py; return result; } //设置内容的底色 void set_contents_color(uint8_t cursor, uint32_t color) { switch (cursor) { case 0: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_00, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 1: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_01, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 2: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_02, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 3: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_03, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 4: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_04, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 5: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_05, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 6: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_10, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 7: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_11, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 8: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_12, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 9: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_13, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 10: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_14, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 11: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_15, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 12: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_20, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 13: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_21, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 14: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_22, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 15: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_23, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 16: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_24, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 17: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_25, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 18: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_30, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 19: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_31, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 20: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_32, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 21: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_33, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 22: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_34, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 23: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_35, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 24: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_40, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 25: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_41, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 26: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_42, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 27: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_43, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 28: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_44, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 29: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_45, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 30: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_50, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 31: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_51, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 32: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_52, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 33: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_53, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 34: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_54, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 35: { lv_obj_set_style_bg_color(guider_ui.screen_setting_label_55, lv_color_hex(color), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } } void scr_main_recover(void) { // 运行时间 和 电池电量 在主界面的函数中已存在,无需额外恢复 // 曲线需要在 setup_scr_screen_main.c 中修改 io_on2off_status(); //IN&OUT, ON&OFF //输入&输出、工作模式&类型 switch (m5data.io_mode) //输入、输出模式切换 { case IO_OUTPUT: { set_working_mode(m5data.output_mode, m5data.output_mode_type); } break; case IO_INPUT: { set_working_mode(m5data.input_mode, m5data.input_mode_type); } break; default: break; } } //数据转换,mux_signal.pv -> real_value float32 mux2real(float32 mux_pv) { float32 result = 0; SIG_FUNCTIONS mode; SIG_FUNCTIONS_TYPE type; switch (m5data.io_mode) { case IO_INPUT: { mode = m5data.input_mode; type = m5data.input_mode_type; } break; case IO_OUTPUT: { mode = m5data.output_mode; type = m5data.output_mode_type; } break; default: break; } switch (mode) { //电压 case SIG_VOLTAGE: { switch (type) { //[-2.5, 2.5V] -> [-2500mv, 2500mv] case VOLTAGE_MV: { result = mux_pv * 1000; } break; //1:1 case VOLTAGE_V: { result = mux_pv; } break; default: break; } } break; //电流 case SIG_CURRENT: { switch (type) { //1:1 case CURRENT_MA: { result = mux_pv; } break; default: break; } } break; //电阻 case SIG_RESISTANT: { switch (type) { case RESISTANT_OHM: { result = mux_pv; } break; default: break; } } break; //频率 case SIG_FREQUENCE: { switch (type) { case FREQUENCE_KHZ: { //Hz -> KHz result = mux_pv / 1000; } break; default: break; } } break; //热电偶 case SIG_TC: { switch (type) { case TC_K: { result = mux_pv; } break; case TC_N: { result = mux_pv; } break; case TC_S: { result = mux_pv; } break; default: break; } } break; //热电阻 case SIG_RTD: { switch (type) { case RTD_DC: { result = mux_pv; } break; default: break; } } break; default: break; } return result; } //数据转换,real_value -> mux_signal.sv float32 real2mux(float32 real_value) { float32 result = 0; SIG_FUNCTIONS mode; SIG_FUNCTIONS_TYPE type; switch (m5data.io_mode) { case IO_INPUT: { mode = m5data.input_mode; type = m5data.input_mode_type; } break; case IO_OUTPUT: { mode = m5data.output_mode; type = m5data.output_mode_type; } break; default: break; } switch (mode) { //电压 case SIG_VOLTAGE: { switch (type) { //[-2500mV, 2500mV] -> [-2.5V, 2.5V] case VOLTAGE_MV: { result = real_value / (float32)1000; } break; //1:1 case VOLTAGE_V: { result = real_value; } break; default: break; } } break; //电流 case SIG_CURRENT: { switch (type) { //1:1 case CURRENT_MA: { result = real_value; } break; default: break; } } break; //电阻 case SIG_RESISTANT: { switch (type) { case RESISTANT_OHM: { result = real_value; } break; default: break; } } break; //频率 case SIG_FREQUENCE: { switch (type) { case FREQUENCE_KHZ: { //KHz -> Hz result = real_value * 1000; } break; default: break; } } break; //热电偶 case SIG_TC: { switch (type) { case TC_K: { result = real_value; } break; case TC_N: { result = real_value; } break; case TC_S: { result = real_value; } break; default: break; } } break; //热电阻 case SIG_RTD: { switch (type) { case RTD_DC: { result = real_value; } break; default: break; } } break; default: break; } return result; } void num_twinkle(void) //数值闪烁 { if(m5data.twk_flag == 0) { //不需要闪烁的情况下直接返回 return; } else { if(twk_1000ms_flag) { twk_1000ms_flag = 0; //闪烁开始 switch (m5data.io_cursor) //闪烁指定位置 { case 0: { if(m5data.twk_flip) { set_nixie_cube(IO_OUTPUT, 0, m5data.o_numbers[0]); m5data.twk_flip = 0; }else { set_nixie_cube(IO_OUTPUT, 0, 10); m5data.twk_flip = 1; } } break; case 1: { if(m5data.twk_flip) { set_nixie_cube(IO_OUTPUT, 1, m5data.o_numbers[1]); m5data.twk_flip = 0; }else { set_nixie_cube(IO_OUTPUT, 1, 10); m5data.twk_flip = 1; } } break; case 2: { if(m5data.twk_flip) { set_nixie_cube(IO_OUTPUT, 2, m5data.o_numbers[2]); m5data.twk_flip = 0; }else { set_nixie_cube(IO_OUTPUT, 2, 10); m5data.twk_flip = 1; } } break; case 3: { if(m5data.twk_flip) { set_nixie_cube(IO_OUTPUT,3, m5data.o_numbers[3]); m5data.twk_flip = 0; }else { set_nixie_cube(IO_OUTPUT, 3, 10); m5data.twk_flip = 1; } } break; case 4: { if(m5data.twk_flip) { set_nixie_cube(IO_OUTPUT, 4, m5data.o_numbers[4]); m5data.twk_flip = 0; }else { set_nixie_cube(IO_OUTPUT, 4, 10); m5data.twk_flip = 1; } } break; case 5: { if(m5data.twk_flip) { set_nixie_cube(IO_OUTPUT, 5, m5data.o_numbers[5]); m5data.twk_flip = 0; }else { set_nixie_cube(IO_OUTPUT, 5, 10); m5data.twk_flip = 1; } } break; case 6: { if(m5data.twk_flip) { set_nixie_cube(IO_OUTPUT, 6, m5data.o_numbers[6]); m5data.twk_flip = 0; }else { set_nixie_cube(IO_OUTPUT, 6, 10); m5data.twk_flip = 1; } } break; default: break; } m5data.twk_cnt++; } } 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) //防止空白残留 { case 0: { set_nixie_cube(IO_OUTPUT, 0, m5data.o_numbers[0]); } break; case 1: { set_nixie_cube(IO_OUTPUT, 1, m5data.o_numbers[1]); } break; case 2: { set_nixie_cube(IO_OUTPUT, 2, m5data.o_numbers[2]); } break; case 3: { set_nixie_cube(IO_OUTPUT, 3, m5data.o_numbers[3]); } break; case 4: { set_nixie_cube(IO_OUTPUT, 4, m5data.o_numbers[4]); } break; case 5: { set_nixie_cube(IO_OUTPUT, 5, m5data.o_numbers[5]); } break; case 6: { set_nixie_cube(IO_OUTPUT, 6, m5data.o_numbers[6]); } break; default: break; } } } //实时曲线绘制 //将实际值线性转换成绘图值 void plot_drawing(void) { if(plot_1500ms_flag) { plot_1500ms_flag = 0; //输出曲线 //{ //将独立数字转换成实际值 pltdata.yreal_pri_value = get_output_value(); //改变之前先记录前一时刻的绘图值 pltdata.y_pri_value_prv = pltdata.y_pri_value; //将实际值线性转换成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( MY_ABS(pltdata.y_pri_value - pltdata.y_pri_value_prv) < 1 ) { //变化幅度小的情况下不更新显示值 //等待一段时间后不再更新 if(pltdata.pri_wait_tick < PLOT_WAIT_TICK_MAX) { pltdata.pri_wait_tick++; //数值限幅 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); } } else { //变化幅度较大时,等待计数清零 pltdata.pri_wait_tick = 0; //数值限幅 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_prv = 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( MY_ABS(pltdata.y_scd_value - pltdata.y_scd_value_prv) < 1 ) { //变化幅度小的情况下不更新显示值 //等待一段时间后不再更新 if(pltdata.scd_wait_tick < PLOT_WAIT_TICK_MAX) { pltdata.scd_wait_tick++; //数值限幅 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); } } else { pltdata.scd_wait_tick = 0; //数值限幅 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); } //} } } void scr_setting_recover(void) { //在这里恢复选项卡0的显示内容 //ITEMS_0 setting_update(ITEMS_0, CONTENT_0_0); setting_update(ITEMS_0, CONTENT_0_1); setting_update(ITEMS_0, CONTENT_0_2); setting_update(ITEMS_0, CONTENT_0_3); setting_update(ITEMS_0, CONTENT_0_4); setting_update(ITEMS_0, CONTENT_0_5); setting_update(ITEMS_0, CONTENT_0_6); setting_update(ITEMS_0, CONTENT_0_7); setting_update(ITEMS_0, CONTENT_0_8); setting_update(ITEMS_0, CONTENT_0_9); setting_update(ITEMS_0, CONTENT_0_10); setting_update(ITEMS_0, CONTENT_0_11); setting_update(ITEMS_0, CONTENT_0_12); setting_update(ITEMS_0, CONTENT_0_13); } //计算a的b次方 float32 my_power(int a, int b) { if(a == 0) { return 0; } if(b == 0) { return 1; } float32 result = 1; if( b > 0 ) { for(uint8_t i = 0; i < b; i++) { result *= a; } } else { for(uint8_t i = 0; i < (-b); i++) { result /= (float32)a; } } return result; } void scr_setting_run(void) //详细设置界面 { //照明控制 if(tabdata.light_flag) { LIGHT_ON; } else { LIGHT_OFF; } } /**********test5**********/