sggt/App/APP_WU/Inc/apps_gather.h

453 lines
15 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.

/*
* @Author: wujunchao wujunchao@wuxismart.com
* @Date: 2024-12-27 11:51:06
* @LastEditors: wujunchao wujunchao@wuxismart.com
* @LastEditTime: 2025-03-14 10:33:11
* @FilePath: \signal_generator\App\APP_WU\Inc\apps_gather.h
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#ifndef __APPS_GATHER_H
#define __APPS_GATHER_H
//provided by ZhangXiaoMing
//{
#include "main.h"
#include "tm1650.h"
#include "mux_signal.h"
#include "JLX240-00301-BN.h"
#include <string.h>
#include "gpio.h"
#include "modbus.h"
#include "ble.h"
#include "hart.h"
#include "rn7302.h"
#include "SIG24130.h"
#include "FreeRTOS.h"
#include "task.h"
#if 0
// typedef enum
// {
// CH0_OUT_VOL_V = 0,
// CH1_OUT_VOL_MV,
// CH2_OUT_CUR,
// CH3_OUT_FRE,
// CH4_OUT_RES,
// CH5_IN_VOL,
// CH6_IN_MVOL,
// CH7_IN_CUR,
// CH8_IN_FRE,
// CH9_IN_TC,
// CH10_IN_RTD,
// CH11_IN_HART,
// CHX_IN_MAX,
// } CHANNEL;
// typedef struct
// {
// uint8_t capture_cnt;
// uint8_t over_cnt;
// float32 high_time; // 高电平时间
// float32 duty_time; // 周期
// float32 freq;
// float32 capture_buf[3];
// } st_freq_signal;
// typedef struct
// {
// CHANNEL channel;
// float32 data_sv;
// float32 data_pv;
// float32 pwr_delay;
// } st_mux_signal;
// extern st_freq_signal freq_signal;
// extern st_mux_signal mux_signal;
#endif
//}
//LVGL
#include "lvgl.h" // 它为整个LVGL提供了更完整的头文件引用
#include "lv_port_disp.h" // LVGL的显示
#include "gui_guider.h" // Gui Guider 生成的界面和控件的声明
#include "events_init.h" // Gui Guider 生成的初始化事件、回调函数
extern lv_ui guider_ui;
extern const lv_img_dsc_t * screen_main_animimg_battery_imgs[6];
extern const lv_img_dsc_t * screen_main_ani_in_0_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_in_1_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_in_2_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_in_3_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_in_4_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_in_5_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_in_6_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_out_0_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_out_1_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_out_2_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_out_3_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_out_4_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_out_5_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_out_6_imgs[11];
extern const lv_img_dsc_t * screen_main_ani_in_sign_imgs[3];
extern const lv_img_dsc_t * screen_main_ani_out_sign_imgs[3];
//written bt WuJunChao
#include "timer.h"
#include "stdio.h"
#include "ip5310_i2c.h"
//#include "lv_demo_benchmark.h"
/**********test5**********/
//按键值
#define KEY_OUT 76
#define KEY_UP 84
#define KEY_MENU 68
#define KEY_IN 78
#define KEY_LEFT 77
#define KEY_OK 85
#define KEY_RIGHT 94
#define KEY_SWITCH 69
#define KEY_SOURCE -1
#define KEY_DOWN 86
#define KEY_BACK 70
//绝对值计算
#define MY_ABS(pa) ( ( (pa) >= 0 )?( (pa) ):( 0 - (pa) ) )
//初始界面
//{
//初始界面编号0开机动画
#define SCREEN_INIT 0
//开机动画进度条计数次数
#define SCREEN_INIT_CNT_MAX 4
//}
//主界面
//{
//主界面编号1信号输入输出示波器显示
#define SCREEN_MAIN 1
//游标-横线起点1小数点的宽度与数字不一样因此分成左右两半
#define IO_CURSOR_START1 136
//游标-横线起点2
#define IO_CURSOR_START2 244
//游标-数字之间间隔大小
#define IO_CURSOR_INTERVAL 24
//游标-y轴坐标值
#define IO_CURSOR_Y 230
//闪烁次数上限
#define TWINKLE_CNT_MAX 10
//绘图等待滴答数上限
#define PLOT_WAIT_TICK_MAX 5
//数码管数值增加(正负情况交替时up和down两个键起到的作用会对调因此专门定义参数用于区分数值的增减)
#define NIXIE_INCREASE 1
//数码管数值增加(正负情况交替时up和down两个键起到的作用会对调因此专门定义参数用于区分数值的增减)
#define NIXIE_DECREASE 0
//}
//设置界面
//{
//设置界面编号2详细设置菜单
#define SCREEN_SETTING 2
//主界面ON
#define IO_ON 1
//主界面OFF
#define IO_OFF 0
//主界面,输入模式
#define IO_INPUT 0
//主界面,输出模式
#define IO_OUTPUT 1
//设置界面选项卡0从上往下数
#define ITEMS_0 0
//选项卡 0 内部的第 0 个内容
#define CONTENT_0_0 0
//选项卡 0 内部的第 1 个内容
#define CONTENT_0_1 1
//选项卡 0 内部的第 2 个内容
#define CONTENT_0_2 2
#define ITEMS_1 1
//设置界面选项卡1从上往下数
#define ITEMS_2 2
//设置界面选项卡2从上往下数
#define ITEMS_3 3
//设置界面选项卡2从上往下数
//选项卡未选中时的底色0xffffff0x000000
#define COLOR_ITEMS_UNCHECKED 0xffffff
//选项卡选中时的底色
#define COLOR_ITEMS_CHECKED 0xcbefff
//内容未选中时的底色
#define COLOR_CONTENTS_UNCHECKED 0xffffff
//内容选中时的底色
#define COLOR_CONTENTS_CHECKED 0xcbefff
//内容焦点后的底色
#define COLOR_CONTENTS_FOCUSED 0X9dffb0
//}
typedef enum
{
SIG_VOLTAGE = 0, //电压
SIG_CURRENT, //电流
SIG_RESISTANT, //电阻
SIG_FREQUENCE, //频率
SIG_TC, //热电偶
SIG_RTD //热电阻
}SIG_FUNCTIONS;
typedef enum
{
VOLTAGE_MV = 0, //电压mV
VOLTAGE_V, //电压V
CURRENT_MA, //电流mA
RESISTANT_OHM, //电阻Ω
FREQUENCE_KHZ, //频率KHz
TC_K, //热电偶K
TC_S, //热电偶S
TC_N, //热电偶N
RTD_DC //热电阻摄氏度
}SIG_FUNCTIONS_TYPE;
typedef struct
{
SIG_FUNCTIONS tag; //物理量标签
SIG_FUNCTIONS_TYPE typ; //类型
int16_t up; //上限
int16_t low; //下限
float32 pv; //当前值
}PHYSICAL_QUANTITY;
typedef struct
{
//general
uint8_t scr_now; //当前屏幕,通过按键切换, [0->init, 1->main, 2->setting]
int tick_prv; //前一个时刻
int tick_cur; //当前时刻
uint8_t menu_reset_flag; //复位标志在keil的debug中手动写入
//screen_init
uint8_t scr_init_flag; //初始界面标志,是否播放过开机动画
uint8_t scr_init_bar; //进度条实时值
uint8_t scr_init_cnt; //进度条计数
//screen_main
uint8_t runtime_seconds;
uint8_t runtime_minutes;
uint8_t runtime_hours;
char runtime_show[16]; //存放运行时间转化得到的字符串
uint8_t battery_cnt; //电池计数
uint8_t io_cursor; //当前游标位置, [000,000], 0~5整数表示6个位置
uint8_t io_cursor_prv; //前一时刻的游标位置
uint8_t i_numbers[7]; //实时显示的字符,输入
uint8_t o_numbers[7]; //实时显示的字符,输出
uint8_t io_on2off; //ON & OFF
uint8_t io_mode; //当前工作模式0输入1输出
SIG_FUNCTIONS input_mode; //当前的输入模式
SIG_FUNCTIONS_TYPE input_mode_type; //当前输入模式的类型
SIG_FUNCTIONS output_mode; //当前的输出模式
SIG_FUNCTIONS_TYPE output_mode_type; //当前输出模式的类型
uint8_t twk_flag; //闪烁使能标志
uint8_t twk_flip; //0-1变量用于控制显示内容翻转显示/不显示)
uint8_t twk_cnt; //闪烁计数,计数达到上限后闪烁停止
uint8_t overflow_flag_up; //向上溢出标志
uint8_t overflow_flag_low; //向下溢出标志
uint8_t sign_flag_in; //输入信号符号位标志0->不显示1->显示负号
uint8_t sign_flag_out; //输出信号符号位标志0->不显示1->显示负号
//screen_setting
}MENU_DATA;
typedef struct
{
//lv_chart_set_range(ui->screen_main_chart_1, LV_CHART_AXIS_PRIMARY_Y, y_pri_low, y_pri_up);
uint8_t y_pri_up; //纵轴(主)上限,一般不做修改
uint8_t y_pri_low; //纵轴(主)下限,一般不做修改
int16_t yreal_pri_up; //实际值y上限
int16_t yreal_pri_low; //实际值y下限
//lv_chart_set_range(ui->screen_main_chart_1, LV_CHART_AXIS_SECONDARY_Y, y_scd_low, y_scd_up);
uint8_t y_scd_up; //纵轴(副)上限,一般不做修改
uint8_t y_scd_low; //纵轴(副)下限,一般不做修改
int16_t yreal_scd_up; //实际值y上限
int16_t yreal_scd_low; //实际值y下限
//lv_chart_set_next_value(ui->screen_main_chart_1, ui->screen_main_chart_1_0, 1);
uint8_t pri_wait_tick; //主轴等待滴答数,一段时间没变化后不更新曲线
uint8_t y_pri_value; //0号曲线的下一个点主y轴
uint8_t y_pri_value_prv; //前一时刻的点,用于判断是否需要更新内容
float32 yreal_pri_value; //0号曲线的下一个实际值
//lv_chart_set_next_value(ui->screen_main_chart_1, ui->screen_main_chart_1_1, 1);
uint8_t scd_wait_tick; //副轴等待滴答数,一段时间没变化后不更新曲线
uint8_t y_scd_value; //1号曲线的下一个点副y轴
uint8_t y_scd_value_prv; //前一时刻的点,用于判断是否需要更新内容
float32 yreal_scd_value; //1号曲线的下一个实际值
float32 yreal_scd_value_prv; //前一时刻的点,用于判断是否需要更新内容
}PLOT_DATA;
typedef struct
{
uint8_t item_cursor; //选项卡游标,后续根据实际需求进行宏定义
uint8_t item_cursor_prv; //前一时刻的选项卡游标
uint8_t content_cursor; //选项内部的游标, 最大范围0~356行6列从左至右从上至下99代表未选中。
uint8_t content_cursor_prv; //前一时刻的内部游标
uint8_t content_focus; //内容焦点
uint8_t content_cursor_x; //游标的横坐标从左至右最大范围0~5
uint8_t content_cursor_y; //游标的纵坐标从上至下最大范围0~5
//ITEMS0
SIG_FUNCTIONS_TYPE content00; //暂定电压单位V/mV
int16_t content01[2]; //暂定电压上限, [0]->V-30, [1]->mV-500
int16_t content02[2]; //暂定电压下限, [0]->V-30, [1]->mV-500
}TABVIEW_DATA;
//模拟正式产品,实现基本功能
void menu_test5(void);
//计算a的b次方
float32 my_power(int a, int b);
//物理量内容初始化
void physical_quantity_init(void);
//菜单数据初始化
void menu_data_init(void);
//界面复位
void menu_reset(void);
//开机动画
void scr_init_run(void);
//主界面
void scr_main_run(void);
//详细设置界面
void scr_setting_run(void);
//运行时间显示
void runtime_show(void);
//电池电量显示
void battery_show(void);
//按键功能,主界面
void key_functions_main(void);
//按键功能,详细设置菜单界面
void key_functions_setting(void);
//数值闪烁数值发生变化后开始闪烁10秒无动作后闪烁停止游标移动后恢复前一时刻位置的数值
void num_twinkle(void);
//实时曲线绘制
void plot_drawing(void);
//设置游标位置【0000.000】0~7
void set_cursor_position(void);
//设置数码管符号位0->熄灭1->显示负号
void set_nixie_cube_sign(uint8_t on2off, uint8_t sg);
//设置数码管显示值io_slc->输入/输出pos->第几个数字num->数值
//补充说明pos = 99时num=[00000009999999]pos = 10时数值显示为空白。
//该部分未对输出缓存数组做处理
void set_nixie_cube(uint8_t io_slc, uint8_t pos, int32_t num);
//获取当前设定的输出值(数组&符号 -> (有符号)实际值)
float32 get_output_value(void);
//设置当前的输出值(实际值*1000 -> (无符号)数组),可直接输入负数
void set_output_value(int32_t pvo);
//设置输出值:数字显示 + 符号 + 缓存
void set_output(int32_t sto);
//改变数码管的显示与缓存值dir增加或减少(NIXIE_INCREASE & NIXIE_DECREASEval改变量通常为1
//该函数仅适用于改变前后符号相同的情况
void change_nixie_cube_OUT(uint8_t dir, uint8_t val);
//通道选择与切换
void sig_channel_select(uint8_t io, SIG_FUNCTIONS_TYPE type);
//更新设定值根据ON\OFF状态
void sig_sv_update(void);
//设置工作模式和工作模式类型
void set_working_mode(SIG_FUNCTIONS mode, SIG_FUNCTIONS_TYPE type);
//恢复主界面的各项参数显示,用于界面切换(设置界面->主界面)
void scr_main_recover(void);
//恢复设置界面的各项参数显示,用于界面切换(主界面->设置界面)
void scr_setting_recover(void);
//显示当前测量值
void input_value_show(void);
//输入输出、ON&OFF状态指示
void io_on2off_status(void);
//设置界面选项卡选中点亮cursor熄灭cursor_prv
void setting_items_check(uint8_t cursor, uint8_t cursor_prv);
//设置界面选项卡内部内容选中点亮cursor熄灭cursor_prv焦点focus
void setting_contents_check(uint8_t cursor, uint8_t cursor_prv);
//设置界面选项卡内部内容选中之后修改内容修改第ite个选项卡的第con个内容
void setting_contents_modify(uint8_t ite, uint8_t con, uint8_t key_val);
//返回键按下后将设置项的内容更新更新第ite个选项卡的第con个内容
void setting_update(uint8_t ite, uint8_t con);
//将游标的横纵坐标转换成游标值x[0,5], y[0,5], cursor[0,35]
uint8_t contents_xy2cursor(uint8_t px, uint8_t py);
//设置内容的底色
void set_contents_color(uint8_t cursor, uint32_t color);
/**********test5**********/
#endif