FluxDC/components/FluxUI/ui_events.c

477 lines
13 KiB
C
Raw Normal View History

// This file was generated by SquareLine Studio
// SquareLine Studio version: SquareLine Studio 1.5.1
// LVGL version: 8.3.6
// Project name: ESP32S3_UI
#include "ui.h"
2025-03-07 16:26:42 +08:00
#include "driver/ledc.h"
#include "esp_err.h"
#include "esp_log.h"
#include "FluxWifi.h"
2025-03-13 10:26:19 +08:00
#include "FluxUart.h"
#include "FluxSD.h"
#include "esp_vfs_fat.h"
#include "sdmmc_cmd.h"
#include "driver/sdmmc_host.h"
2025-03-08 10:23:13 +08:00
#include "FluxProtocol.h"
2025-03-27 14:57:30 +08:00
/*包含SNTP的头文件*/
#include "lwip/apps/sntp.h"
#include <time.h>
#define LOWERST_LIGHT_LEVEL (7222)
/*更新当前测试标准*/
static void standardVolumeRefresh(void);
/*根据呼吸频率调整积分时间*/
static void comulateTimeSend(void);
2025-03-25 15:42:11 +08:00
/*创建定时器*/
static void comulateResultRead(lv_timer_t * timer)
{
/*下发数据获取指令*/
flux_frame.DATA[1] = 0;
flux_frame.DATA[3] = 120;
flux_frame.FUNC = 0x03;
/*下发问询120个参数*/
ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame));
lv_label_set_text(ui_pageHome_labelStartTest,"Test Complete!");
}
/*亮度调节回调函数*/
void on_sliderLight_valueChanged(lv_event_t * e)
{
2025-03-07 17:42:37 +08:00
uint32_t value = 8192-lv_slider_get_value(e->target);
2025-03-07 17:42:37 +08:00
if (value>LOWERST_LIGHT_LEVEL)
{
value = LOWERST_LIGHT_LEVEL;
}
2025-03-07 16:26:42 +08:00
ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, value));
// Update duty to apply the new value
ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
}
2025-03-08 14:45:49 +08:00
/*设备类型选择回调函数*/
void on_dropdownDeviceType_valueChanged(lv_event_t * e)
2025-03-08 14:45:49 +08:00
{
char buf[32]={};
2025-03-17 09:50:22 +08:00
uint16_t index = lv_dropdown_get_selected(e->target);
2025-03-08 14:45:49 +08:00
lv_dropdown_get_selected_str(e->target,buf,32);
lv_label_set_text(ui_pageHome_labelTitle, buf);
2025-03-08 14:45:49 +08:00
2025-03-19 18:46:29 +08:00
if (index == Spirit3)
2025-03-17 09:50:22 +08:00
{
lv_spinbox_set_range(ui_pageHome_spinboxStage,1,4);
}else{
lv_spinbox_set_range(ui_pageHome_spinboxStage,1,6);
}
2025-03-11 18:55:34 +08:00
}
/*SD卡读取回调函数*/
void on_buttonReadSDCard_clicked(lv_event_t * e)
2025-03-11 18:55:34 +08:00
{
/*首先清空显示页面*/
lv_textarea_set_text(ui_pageSDCard_textAreaSDCard,"");
esp_vfs_fat_info(MOUNT_POINT,&total_bytes,&free_bytes);
free_percent = (float)free_bytes / (float)total_bytes * 100;
printf("total:%llu free:%llu\n",total_bytes,free_bytes);
lv_label_set_text_fmt(ui_pageSDCard_labelSDCardFree,"%.2f free",free_percent);
lv_label_set_text_fmt(ui_pageSDCard_labelSDCardUsed,"used: %.2f GB",(double)(total_bytes-free_bytes)/(1024*1024*1024.0));
lv_label_set_text_fmt(ui_pageSDCard_labelSDCardSize,"size: %.2f GB",(double)total_bytes/(1024*1024*1024.0));
lv_arc_set_value(ui_pageSDCard_arcSDCardFree,free_percent);
2025-03-11 18:55:34 +08:00
}
/************************************ 测试流程函数 ******************************************* */
/*pageHome 开始测试按键按下回调函数*/
int32_t timeS = 0;
void on_buttonStartTest_clicked(lv_event_t * e)
{
/*下发积分时间*/
2025-03-25 15:57:51 +08:00
#if 1
2025-03-25 15:42:11 +08:00
comulateTimeSend();
2025-03-25 10:22:43 +08:00
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));
2025-03-25 15:42:11 +08:00
#endif
2025-03-25 15:42:11 +08:00
/*基于定时器进行任务调用*/
lv_timer_t * comulateResultReadTimer;
comulateResultReadTimer = lv_timer_create(comulateResultRead, 500, NULL);
lv_timer_set_repeat_count(comulateResultReadTimer, 1);
2025-03-25 10:22:43 +08:00
timeS = lv_spinbox_get_value(ui_pageFluxRead_spinboxTime);
2025-03-26 10:07:54 +08:00
lv_timer_set_period(comulateResultReadTimer, timeS*1000+2000);
/*下发启动测试指令*/
2025-03-25 15:42:11 +08:00
flux_frame_start.ADDR = FLUX_ADDR;
flux_frame_start.FUNC = FLUX_FUNC_SET_SINGLE;
flux_frame_start.DATA[0] = 0x00;
flux_frame_start.DATA[1] = 0x01;
flux_frame_start.DATA[2] = 0x00;
flux_frame_start.DATA[3] = 0x01;
ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame_start));
lv_label_set_text(ui_pageHome_labelStartTest,"Testing...");
2025-03-25 15:42:11 +08:00
lv_timer_enable(comulateResultReadTimer);
}
2025-03-15 15:51:44 +08:00
/*pageHome 呼吸频率减操作*/
2025-03-15 15:51:44 +08:00
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);
}
/*pageHome 呼吸频率加操作*/
2025-03-15 15:51:44 +08:00
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);
}
2025-03-17 09:50:22 +08:00
/*pageHome 切换挡位之后*/
2025-03-17 09:50:22 +08:00
void on_spinboxStage_valueChanged(lv_event_t * e)
{
/*获取当前挡位并更新标准体积数据*/
2025-03-17 09:50:22 +08:00
int32_t value = lv_spinbox_get_value(e->target);
lv_label_set_text_fmt(ui_pageHome_labelResultStage,"%ld",value);
standardVolumeRefresh();
2025-03-17 09:50:22 +08:00
}
/*pageHome 频率值改变*/
2025-03-17 09:50:22 +08:00
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);
/*刷新标准体积数据*/
standardVolumeRefresh();
/*下发测试时间*/
comulateTimeSend();
2025-03-26 10:07:54 +08:00
2025-03-25 15:42:11 +08:00
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));
}
/*pageHome 标准体积数据刷新*/
static void standardVolumeRefresh(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();
2025-03-24 08:08:44 +08:00
}
/*pageFluxRead 获取当前流量数据*/
2025-03-24 08:08:44 +08:00
void on_buttonReadFlux_clicked(lv_event_t * e)
{
flux_frame.DATA[1] = 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));
}
/*更新测试结果 —— 功能已屏蔽*/
void on_labelTestVolume_valueChanged(lv_event_t * e)
{
#if 0
/* 测试结果刷新放到label更新函数中 */
RefreshResult();
#endif
}
/*更新工作模式 —— 功能已屏蔽*/
void on_dropDownWorkmode_valueChanged(lv_event_t * e)
{
#if 0
FluxMachineData.workMode = (enum FluxMachineWorkMode)lv_dropdown_get_selected(e->target);
#endif
}
/*向流量计下发计时时间*/
void on_spinboxTime_valueChanged(lv_event_t * e)
{
#if 0
/* 0x10 设置多个参数报文格式 */
/* 地址 功能码 起始地址 寄存器数量 字节计数(写入寄存器数量*2 数据1 数据2 。。。 CRC */
/* 0x01 0x10 0x00 02 0x00 02 0x04 0x0078 0x0077 CRC*/
/*下发配置参数(其实只是配置时间)*/
flux_frame2Reg.ADDR = FLUX_ADDR;
flux_frame2Reg.FUNC = FLUX_FUNC_SET;
/*时间寄存器起始地址*/
flux_frame2Reg.regAddr = 0x0002;
flux_frame2Reg.regNum = 0x0002;
flux_frame2Reg.ByteNum = 0x04;
/*将时间的浮点数转为字节数组*/
uint8_t bytes[4];
float time = (float)lv_spinbox_get_value(e->target);
memcpy(bytes, &time, 4);
ESP_LOGI("FluxProtocol", "time:%f", time);
ESP_LOGI("FluxProtocol", "time:0-%02x 1-%02x 2-%02x 3-%02x", bytes[0],bytes[1],bytes[2],bytes[3]);
flux_frame2Reg.DATA[0] = bytes[3];
flux_frame2Reg.DATA[1] = bytes[2];
flux_frame2Reg.DATA[2] = bytes[1];
flux_frame2Reg.DATA[3] = bytes[0];
ESP_ERROR_CHECK(ModbusRTU_Send_0x10(ECHO_UART_PORT_NUM1,&flux_frame2Reg));
2025-03-25 15:42:11 +08:00
#elif 0
2025-03-25 10:22:43 +08:00
/*使用0306报文格式*/
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));
#endif
}
/*启动流量计*/
void on_buttonFluxStart_clicked(lv_event_t * e)
{
FLUX_TEST_START;
}
/*根据spinbox中的值下发积分时间*/
/*注意此处修改了spinboxTime 的值不可以在spinboxTime_valueChanged中调用*/
static void comulateTimeSend(void)
{
/*获取当前呼吸频率*/
FluxMachineData.breathRate = lv_spinbox_get_value(ui_pageHome_spinboxRate);
2025-03-26 10:07:54 +08:00
uint16_t currntTimes = lv_dropdown_get_selected(ui_pageFluxRead_dropdownPulseTimes);
ESP_LOGI("comulateTimeSend","currentTimes:%d",currntTimes);
if (currntTimes == 0)
{
2025-03-26 10:07:54 +08:00
/* 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;
}
}
2025-03-26 10:07:54 +08:00
}
/*获取呼吸脉冲次数*/
void on_dropdownPulseTimes_valueChanged(lv_event_t * e)
{
/*下发测试时间*/
comulateTimeSend();
2025-03-26 10:07:54 +08:00
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));
}