FluxDC/components/FluxUI/ui_event_homePage.c

426 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file ui_event_homePage.c
* @brief 此文件中实现了主页的UI事件处理函数
*
* 核心逻辑1.处理标准变更事件2.处理测试指令下发事件
*
* @author wang xiang en
* @date 2025-04-19
* @version 版本号
* @copyright 版权声明((C)2025, YUWELL MEDTECH Co.ltd
*/
#include "ui.h"
#include "FluxProtocol.h"
/* 使用定时器 */
#include <time.h>
#include "FluxSD.h"
/* 声明需要调用的静态函数 */
static void comulate_time_set(void);
/* 更新当前标准体积数据 */
static void standard_volume_refresh(void);
/* 定时器执行函数声明 */
static void comulate_result_read(lv_timer_t * timer);
/************************************ 呼吸频率更改响应函数 start ******************************************* */
/**
* @brief 呼吸频率减操作
*
* 只对Spinbox进行-5协议发送在Spinbox的值更改响应事件中。
*
* @param[in] e not used
*/
void on_buttonRateMinus_clicked(lv_event_t * e)
{
uint16_t value = lv_spinbox_get_value(ui_pageHome_spinboxRate);
lv_spinbox_set_value(ui_pageHome_spinboxRate,value-5);
#if LOG_RECORD_ENABLE
example_write_log("on_buttonRateMinus_clicked 频率减事件");
#endif
}
/**
* @brief 呼吸频率加操作
*
* 只对Spinbox进行+5协议发送在Spinbox的值更改响应事件中。
*
* @param[in] e not used
*/
void on_buttonRatePlus_clicked(lv_event_t * e)
{
uint16_t value = lv_spinbox_get_value(ui_pageHome_spinboxRate);
lv_spinbox_set_value(ui_pageHome_spinboxRate,value+5);
#if LOG_RECORD_ENABLE
example_write_log("on_buttonRatePlus_clicked 频率加事件");
#endif
}
/**
* @brief 呼吸频率值改变响应事件,向流量计下发累时。
*
* 通过485协议下发命令实现流量计的累时。
* 使用0x06指令只修改单个16bit寄存器
*
* @note 协议格式:
* 例如01 06 00 02 41 F0 18 1E
*
* 意思是:
* 01设备地址
* 06功能码修改单个寄存器
* 00 02寄存器地址0x00 02
* 41 F0需要发送的数据 41 F0 00 00 对应浮点数 30
*
* @param[in] e not used
*/
void on_spinboxRate_valueChanged(lv_event_t * e)
{
/* 更改下方测试结果部分的频率信息 */
FluxMachineData.breathRate = lv_spinbox_get_value(e->target);
lv_label_set_text_fmt(ui_pageHome_labelResultRate,"%ld",FluxMachineData.breathRate);
/* 刷新标准体积数据,频率不同标准体积也不同。 */
standard_volume_refresh();
/* 根据设定的出气次数设定积分时间 */
comulate_time_set();
/* 下发计算好的积分时间*/
uint8_t bytes[4];
float time = (float)lv_spinbox_get_value(ui_pageFluxRead_spinboxTime);
memcpy(bytes, &time, 4);
/* 下发命令 */
flux_frame.ADDR = FLUX_ADDR;
/* 0x06指令 */
flux_frame.FUNC = FLUX_FUNC_SET_SINGLE;
/* 寄存器地址 0x00 02 */
flux_frame.DATA[0] = 0x00;
flux_frame.DATA[1] = 0x02;
/* 只修改时间寄存器32bit的前两个字节数据16bit */
flux_frame.DATA[2] = bytes[3];
flux_frame.DATA[3] = bytes[2];
ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame));
/* 更新SD卡中需要存储的频率数据 */
sdData.flux_test_result.current_rate = FluxMachineData.breathRate;
}
/**
* @brief 根据spinbox中的值修改 pageFluxRead 页中的显示积分时间
*
* @attention 不能在spinboxTime_valueChanged中调用
* 否则容易造成 死循环。
*
*/
static void comulate_time_set(void)
{
/* 获取当前呼吸频率 */
FluxMachineData.breathRate = lv_spinbox_get_value(ui_pageHome_spinboxRate);
uint16_t currntTimes = lv_dropdown_get_selected(ui_pageFluxRead_dropdownPulseTimes);
ESP_LOGI("comulateTimeSend","currentTimes:%d",currntTimes);
if (currntTimes == 0)//进行十次积分
{
/* 10次脉冲计量 */
switch (FluxMachineData.breathRate)
{
case 15:
/*呼吸频率为15BPM时积分时间设定为40秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,40);
break;
case 20:
/*呼吸频率为20BPM时积分时间设定为30秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,30);
break;
case 25:
/*呼吸频率为25BPM时积分时间设定为24秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,24);
break;
case 30:
/*呼吸频率为30BPM时积分时间设定为20秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,20);
break;
case 35:
/*呼吸频率为35BPM时积分时间设定为16秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,18);
break;
case 40:
/*呼吸频率为40BPM时积分时间设定为15秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,15);
break;
default:
break;
}
}else if (currntTimes == 1)
{
/* 20次脉冲 */
switch (FluxMachineData.breathRate)
{
case 15:
/*呼吸频率为15BPM时积分时间设定为40秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,80);
break;
case 20:
/*呼吸频率为20BPM时积分时间设定为30秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,60);
break;
case 25:
/*呼吸频率为25BPM时积分时间设定为24秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,48);
break;
case 30:
/*呼吸频率为30BPM时积分时间设定为20秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,40);
break;
case 35:
/*呼吸频率为35BPM时积分时间设定为16秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,36);
break;
case 40:
/*呼吸频率为40BPM时积分时间设定为15秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,30);
break;
default:
break;
}
}else if (currntTimes == 2)
{
/* 30次脉冲 */
switch (FluxMachineData.breathRate)
{
case 15:
/*呼吸频率为15BPM时积分时间设定为40秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,120);
break;
case 20:
/*呼吸频率为20BPM时积分时间设定为30秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,90);
break;
case 25:
/*呼吸频率为25BPM时积分时间设定为24秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,72);
break;
case 30:
/*呼吸频率为30BPM时积分时间设定为20秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,60);
break;
case 35:
/*呼吸频率为35BPM时积分时间设定为16秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,54);
break;
case 40:
/*呼吸频率为40BPM时积分时间设定为15秒*/
lv_spinbox_set_value(ui_pageFluxRead_spinboxTime,45);
break;
default:
break;
}
}
#if LOG_RECORD_ENABLE
example_write_log("comulate_time_set 重置脉冲次数");
#endif
}
/**
* @brief 更新测试时间
*
* 修改单次测试脉冲总数10 20 30 次后,更新测试时间,
* 向流量计下发测试时间。
*
* @param[in] e not used
*/
void on_dropdownPulseTimes_valueChanged(lv_event_t * e)
{
/* 根据脉冲次数设置测试时间 */
comulate_time_set();
/* 下发测试时间 */
uint8_t bytes[4];
float time = (float)lv_spinbox_get_value(ui_pageFluxRead_spinboxTime);
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];
ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame));
}
/************************************ 呼吸频率更改响应函数 end ******************************************* */
/************************************ 挡位更改响应函数 start ******************************************* */
/**
* @brief 挡位切换后的响应事件
*
* 只更新标准不通过485下发数据。
*
* @note 加减操作已在SquareLine工程内部实现无需手动调用。
* @param[in] e not used
*/
void on_spinboxStage_valueChanged(lv_event_t * e)
{
/*获取当前挡位并更新标准体积数据*/
int32_t value = lv_spinbox_get_value(e->target);
lv_label_set_text_fmt(ui_pageHome_labelResultStage,"%ld",value);
standard_volume_refresh();
/* 更新当前挡位数据 */
sdData.flux_test_result.current_stage = value;
}
/**
* @brief 标准体积数据刷新
*
* 修改标准体积数据,设置最大最小值。
* 最后根据标准判定当前读取到的体积流量是否合格
*
*/
static void standard_volume_refresh(void)
{
/*获取当前的呼吸频率及挡位*/
fluxProtocol.currentBPM = lv_spinbox_get_value(ui_pageHome_spinboxRate);
fluxProtocol.currentStage = lv_spinbox_get_value(ui_pageHome_spinboxStage);
/*获取当前测试设备类型*/
fluxProtocol.currentDevice = lv_dropdown_get_selected(ui_pageSetting_dropdownDeviceType);
if (fluxProtocol.currentDevice == Spirit3)
{
/*判定当前测试设备为Spirit-3*/
/*获取标准体积数据*/
fluxProtocol.nominalVolumeStage = Spirit3_Volume[fluxProtocol.currentStage-1];
}else if (fluxProtocol.currentDevice == Spirit6)
{
/*判定当前测试设备为Spirit-6*/
fluxProtocol.nominalVolumeStage = Spirit6_Volume[fluxProtocol.currentStage-1];
}else if(fluxProtocol.currentDevice == YU_Lite8)
{
/*判定当前测试设备为YU-Lite-8*/
fluxProtocol.nominalVolumeStage = YULite8_Volume[fluxProtocol.currentStage-1];
}
float Volume_nominal = fluxProtocol.nominalVolumeStage /fluxProtocol.currentBPM*1.0;
float VolumeMax = Volume_nominal*1.15;
float VolumeMin = Volume_nominal*0.85;
lv_label_set_text_fmt(ui_pageHome_labelNominalVolume,"%.2f",Volume_nominal);
lv_label_set_text_fmt(ui_pageHome_labelNominalVolumeMax,"%.2f",VolumeMax);
lv_label_set_text_fmt(ui_pageHome_labelNominalVolumeMin,"%.2f",VolumeMin);
/*根据标准值判定当前检测结果是否合格*/
RefreshResult();
#if LOG_RECORD_ENABLE
example_write_log("standard_volume_refresh 刷新标准体积");
#endif
}
/************************************ 挡位更改响应函数 end ******************************************* */
/************************************ 开始测试按键按下 start ******************************************* */
/**
* @brief 开始测试按键按下后响应事件
*
* @details 执行流程:
* 1. 下发测试时间,确保测试时间正确
* 2. 创建定时器,配置定时器计时时间
* 3. 下发启动测试指令
*
* @param[in] e not used
*/
void on_buttonStartTest_clicked(lv_event_t * e)
{
/* 开始测试前 下发积分时间,确保测试时间正确 */
comulate_time_set();
uint8_t bytes[4];
float time = (float)lv_spinbox_get_value(ui_pageFluxRead_spinboxTime);
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];
ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame));
/*创建定时器*/
lv_timer_t * comulateResultReadTimer;
/* 基于定时器进行任务调用 */
comulateResultReadTimer = lv_timer_create(comulate_result_read, 500, NULL);
/* 只重复一次 */
lv_timer_set_repeat_count(comulateResultReadTimer, 1);
/* 根据测试时间确定定时器延时 */
int32_t timeS = lv_spinbox_get_value(ui_pageFluxRead_spinboxTime);
lv_timer_set_period(comulateResultReadTimer, timeS*1000+2000);
/*下发启动测试指令*/
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));
/* 修改Label 开始测试 */
lv_label_set_text(ui_pageHome_labelStartTest,"Testing...");
/* 开始计时 */
lv_timer_enable(comulateResultReadTimer);
}
/**
* @brief 定时器响应函数
*
* 时间到达后执行
* 定时器响应函数,用于定时获取测试结果,并更新界面。
*
* @param[in] timer not used
*/
static void comulate_result_read(lv_timer_t * timer)
{
/*下发数据获取指令*/
/* 起始地址为 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));
lv_label_set_text(ui_pageHome_labelStartTest,"Test Complete!");
}