523 lines
17 KiB
C
523 lines
17 KiB
C
/*
|
||
* @Author: wujunchao wujunchao@wuxismart.com
|
||
* @Date: 2024-12-27 11:51:06
|
||
* @LastEditors: wujunchao wujunchao@wuxismart.com
|
||
* @LastEditTime: 2025-03-19 11:29:20
|
||
* @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 "eeprom_spi.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 1
|
||
|
||
//选项卡 0 内部的第 1 个内容的游标位置
|
||
#define CONTENT_0_1 3
|
||
|
||
//选项卡 0 内部的第 2 个内容的游标位置
|
||
#define CONTENT_0_2 5
|
||
|
||
//选项卡 0 内部的第 3 个内容的游标位置
|
||
#define CONTENT_0_3 9
|
||
|
||
//选项卡 0 内部的第 4 个内容的游标位置
|
||
#define CONTENT_0_4 11
|
||
|
||
//选项卡 0 内部的第 5 个内容的游标位置
|
||
#define CONTENT_0_5 15
|
||
|
||
//选项卡 0 内部的第 6 个内容的游标位置
|
||
#define CONTENT_0_6 17
|
||
|
||
//选项卡 0 内部的第 7 个内容的游标位置
|
||
#define CONTENT_0_7 21
|
||
|
||
//选项卡 0 内部的第 8 个内容的游标位置
|
||
#define CONTENT_0_8 23
|
||
|
||
//选项卡 0 内部的第 9 个内容的游标位置
|
||
#define CONTENT_0_9 27
|
||
|
||
//选项卡 0 内部的第 10 个内容的游标位置
|
||
#define CONTENT_0_10 29
|
||
|
||
//选项卡 0 内部的第 11 个内容的游标位置
|
||
#define CONTENT_0_11 33
|
||
|
||
//选项卡 0 内部的第 12 个内容的游标位置
|
||
#define CONTENT_0_12 35
|
||
|
||
//选项卡 0 内部的第 13 个内容的游标位置
|
||
#define CONTENT_0_13 25
|
||
//}
|
||
|
||
#define ITEMS_1 1
|
||
//设置界面,选项卡1(从上往下数)
|
||
//{
|
||
#define CONTENT_1_0 1
|
||
//}
|
||
|
||
#define ITEMS_2 2
|
||
//设置界面,选项卡2(从上往下数)
|
||
|
||
#define ITEMS_3 3
|
||
//设置界面,选项卡2(从上往下数)
|
||
|
||
//选项卡未选中时的底色(白:0xffffff,黑:0x000000)
|
||
#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
|
||
TC_B, //热电偶B
|
||
TC_E, //热电偶E
|
||
TC_J, //热电偶J
|
||
TC_R, //热电偶R
|
||
TC_T, //热电偶T
|
||
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~35(6行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
|
||
|
||
//ITEMS_0
|
||
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
|
||
uint8_t content03; //电流上限
|
||
uint8_t content04; //电流下限
|
||
uint16_t content05; //电阻上限
|
||
uint16_t content06; //电阻下限
|
||
uint8_t content07; //频率上限
|
||
uint8_t content08; //频率下限
|
||
int16_t content09[8]; //TC上限, [0, 7]->[K, S, N, B, E, J, R, T]
|
||
int16_t content010[8]; //TC下限
|
||
int16_t content011; //RTD上限
|
||
int16_t content012; //RTD下限
|
||
SIG_FUNCTIONS_TYPE content013; //TC类型, [5, 12]->[K, S, N, B, E, J, R, T]
|
||
|
||
//ITEMS_1
|
||
uint8_t light_flag; //照明状态标志,0熄灭,1开启
|
||
|
||
}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=[0000000,9999999];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_DECREASE),val:改变量(通常为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);
|
||
|
||
//设置界面选项卡内部内容选中之后,根据键值key_val和步长step修改内容,修改第ite个选项卡的第con个内容
|
||
void setting_contents_modify(uint8_t ite, uint8_t con, uint8_t key_val, int8_t step);
|
||
|
||
//此处仅用于修改设置界面的显示内容,修改后的内容会在返回主界面时(KEY_BACK)再更新
|
||
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);
|
||
|
||
//修改选项卡0的内容
|
||
void contents_modify_item_0(uint8_t cursor, int8_t step);
|
||
|
||
//修改选项卡1的内容
|
||
void contents_modify_item_1(uint8_t cursor, int8_t step);
|
||
|
||
//设置界面刷新选项卡的内容,隐藏items_prv,显示items_now
|
||
void contents_refresh(uint8_t items_prv, uint8_t items_now);
|
||
|
||
//数据转换,mux_signal.pv -> real_value
|
||
float32 mux2real(float32 mux_pv);
|
||
|
||
//数据转换,real_value -> mux_signal.sv
|
||
float32 real2mux(float32 real_value);
|
||
|
||
/**********test5**********/
|
||
|
||
|
||
|
||
|
||
|
||
#endif
|
||
|
||
|