actuator/screen/screen.c

510 lines
15 KiB
C
Raw Permalink 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.

#include "cmd_queue.h"
#include <stdlib.h>
#include "atcom.h"
#include "eeprom.h"
char *pEnd;
char qrstr[50];//二维码字符串
uint8_t cmd_buffer[CMD_MAX_SIZE]; //指令缓存
static uint16_t current_screen_id = 0; //当前画面ID
uint8_t years,months,weeks,days,hours,minutes,sec;
bool refresh = true;
bool qrfresh = true;
float ao_out,addr_num;
int screen_tim_cnt = 0;
/*!
* \brief 消息处理流程
* \param msg 待处理消息
* \param size 消息长度
*/
void ProcessMessage( PCTRL_MSG msg, uint16_t size )
{
uint8 cmd_type = msg->cmd_type; //指令类型
uint8 ctrl_msg = msg->ctrl_msg; //消息的类型
uint8 control_type = msg->control_type; //控件类型
uint16 screen_id = PTR2U16(&msg->screen_id); //画面ID
uint16 control_id = PTR2U16(&msg->control_id); //控件ID
uint32 value = PTR2U32(msg->param); //数值
switch(cmd_type)
{
case NOTIFY_TOUCH_PRESS: //触摸屏按下
case NOTIFY_TOUCH_RELEASE: //触摸屏松开
NotifyTouchXY(cmd_buffer[1],PTR2U16(cmd_buffer+2),PTR2U16(cmd_buffer+4));
break;
case NOTIFY_WRITE_FLASH_OK: //写FLASH成功
NotifyWriteFlash(1);
break;
case NOTIFY_WRITE_FLASH_FAILD: //写FLASH失败
NotifyWriteFlash(0);
break;
case NOTIFY_READ_FLASH_OK: //读取FLASH成功
NotifyReadFlash(1,cmd_buffer+2,size-6); //去除帧头帧尾
break;
case NOTIFY_READ_FLASH_FAILD: //读取FLASH失败
NotifyReadFlash(0,0,0);
break;
case NOTIFY_READ_RTC: //读取RTC时间
NotifyReadRTC(cmd_buffer[2],cmd_buffer[3],cmd_buffer[4],cmd_buffer[5],cmd_buffer[6],cmd_buffer[7],cmd_buffer[8]);
break;
case NOTIFY_CONTROL:
{
if(ctrl_msg==MSG_GET_CURRENT_SCREEN) //画面ID变化通知
{
NotifyScreen(screen_id); //画面切换调动的函数
}
else
{
switch(control_type)
{
case kCtrlButton: //按钮控件
NotifyButton(screen_id,control_id,msg->param[1]);
break;
case kCtrlText: //文本控件
NotifyText(screen_id,control_id,msg->param);
break;
case kCtrlProgress: //进度条控件
NotifyProgress(screen_id,control_id,value);
break;
case kCtrlSlider: //滑动条控件
NotifySlider(screen_id,control_id,value);
break;
case kCtrlMeter: //仪表控件
NotifyMeter(screen_id,control_id,value);
break;
case kCtrlMenu: //菜单控件
NotifyMenu(screen_id,control_id,msg->param[0],msg->param[1]);
break;
case kCtrlSelector: //选择控件
NotifySelector(screen_id,control_id,msg->param[0]);
break;
case kCtrlRTC: //倒计时控件
NotifyTimer(screen_id,control_id);
break;
default:
break;
}
}
break;
}
default:
break;
}
}
/*!
* \brief 画面切换通知
* \details 当前画面改变时(或调用GetScreen),执行此函数
* \param screen_id 当前画面ID
*/
void NotifyScreen(uint16_t screen_id)
{
//TODO: 添加用户代码
current_screen_id = screen_id; //在工程配置中开启画面切换通知记录当前画面ID
refresh = true;
qrfresh = true;
if(screen_id == 2)
{
screen_tim_cnt = 0;//加载页面计时
}
//二维码文本准备
sprintf(qrstr,"%d",HoldReg[37]);
strcat(qrstr,"&");
if(screen_id == 5) { strcat(qrstr,"190\0");}//全行程测试开关型
if(screen_id == 6) { strcat(qrstr,"20\0");}//全行程测试调节型
if(screen_id == 7) { strcat(qrstr,"200\0");}//2小时老化开关型
if(screen_id == 8) { strcat(qrstr,"200\0");}//2小时老化调节型
if(screen_id == 9) { strcat(qrstr,"902\0");}//综合测试开关型
if(screen_id == 10) { strcat(qrstr,"901\0");}//综合测试调节型
if(screen_id == 11) { strcat(qrstr,"40\0");}//死区测试调节型
if(screen_id == 12) { strcat(qrstr,"180\0");}//气密
}
/*!
* \brief 触摸坐标事件响应
* \param press 1按下触摸屏3松开触摸屏
* \param x x坐标
* \param y y坐标
*/
void NotifyTouchXY(uint8_t press,uint16_t x,uint16_t y)
{
//TODO: 添加用户代码
}
int pow_grade = 1;
int last_connect_state = 5;
/*!
* \brief 更新数据
*/
void UpdateUI(void)
{
//文本设置和显示 定时50ms刷新一次
if(current_screen_id == 0)
{
SetTextFloat(0,7,HoldReg[37],0,0);//设备ID
}
if(current_screen_id == 1)
{
if(refresh)
{
delay_us(10);
SetTextValue(1,8,(uchar *)wifiname);//wifi名称
SetTextValue(1,9,(uchar *)wifipassword);//wifi密码
SetTextValue(1,10,(uchar *)myip);//本地IP
SetTextValue(1,11,(uchar *)hisip);//目标IP
SetTextValue(1,12,(uchar *)port);//端口号
refresh = false;
}
if(!(last_connect_state == connect_state))
{
last_connect_state = connect_state;
refresh = true;
switch(last_connect_state)
{
case 0: SetTextValue(1,2,(uchar *)"wifi未连接"); break;
case 1: SetTextValue(1,2,(uchar *)"wifi已连接未获取IP"); break;
case 2: SetTextValue(1,2,(uchar *)"wifi已连接已获取IP"); break;
case 3: SetTextValue(1,2,(uchar *)"wifi正在连接"); break;
case 4: SetTextValue(1,2,(uchar *)"wifi断开"); break;
}
}
}
if(current_screen_id == 2)
{
if(screen_tim_cnt < 360)
{
screen_tim_cnt += 2;
SetProgressValue(2,2,screen_tim_cnt);//环形进度条
SetControlVisiable(2,3,0);//隐藏确认按钮
}
else if(screen_tim_cnt < 500)
{
SetProgressValue(2,2,360);//环形进度条
screen_tim_cnt = 600;
}
else
{
SetProgressValue(2,2,360);//环形进度条
}
if(wifi_set_state == 0)
{
refresh = true;
screen_tim_cnt = 600;
SetControlVisiable(2,3,1);//显示确认按钮
}
}
if(current_screen_id == 3)//开关型
{
AnimationPlayFrame(3,3,(DisState[0]>>0)&0x01);//开到位
AnimationPlayFrame(3,4,(DisState[0]>>1)&0x01);//关到位
SetButtonValue(3,5,(CoilState[0]>>0)&0x01);//全开
SetButtonValue(3,6,(CoilState[0]>>1)&0x01);//全关
SetButtonValue(3,7,(CoilState[0]>>2)&0x01);//ESD
SetTextFloat(3,13,InputReg[0]/1000.0,2,1);//电压输入
SetTextFloat(3,11,InputReg[1]/1000.0,3,1);//电流输入
SetTextFloat(3,17,(InputReg[13]-2000)/10.0,1,1);//温度1
SetTextFloat(3,20,(InputReg[14]-2000)/10.0,1,1);//温度2
SetTextFloat(3,23,(InputReg[15]-2000)/10.0,1,1);//温度3
}
if(current_screen_id == 4)//调节型
{
SetTextFloat(4,16,InputReg[12]/1000.0,3,1);//反馈电流
SetTextFloat(4,6,InputReg[1]/1000.0,3,1);//电流输入
SetTextFloat(4,14,InputReg[0]/1000.0,2,1);//电压输入
SetTextFloat(4,31,(InputReg[13]-2000)/10.0,1,1);//温度1
SetTextFloat(4,35,(InputReg[14]-2000)/10.0,1,1);//温度2
SetTextFloat(4,38,(InputReg[15]-2000)/10.0,1,1);//温度3
}
if(current_screen_id != 2)
AnimationPlayFrame(current_screen_id,66,HoldReg[25] - 1);//运行状态指示灯,由上位机控制
//二维码文本添加
if(qrfresh)
{
if((current_screen_id > 4) && (current_screen_id < 13))
SetTextValue(current_screen_id,2,(uchar*)qrstr);
qrfresh = false;
}
}
/*!
* \brief 按钮控件通知
* \details 当按钮状态改变(或调用GetControlValue)时,执行此函数
* \param screen_id 画面ID
* \param control_id 控件ID
* \param state 按钮状态0弹起1按下
*/
void NotifyButton(uint16_t screen_id, uint16_t control_id, uint8_t state)
{
if(screen_id == 1)//网络配置界面
{
if(control_id == 13)//重连wifi
wifi_set_state = 1;
if(control_id == 14)//重连服务器
wifi_set_state = 12;
}
if(screen_id == 3)//开关量输出
{
if(control_id ==5)//开
{
if(state)
{
CoilState[0] = CoilState[0] | 0x01;
CoilState[0] = CoilState[0] & 0xfd;
}
else
CoilState[0] = CoilState[0] & 0xfe;
}
if(control_id ==6)//关
{
if(state)
{
CoilState[0] = CoilState[0] | 0x02;
CoilState[0] = CoilState[0] & 0xfe;
}
else
CoilState[0] = CoilState[0] & 0xfd;
}
if(control_id ==7)//ESD
{
if(state)
{
CoilState[0] = CoilState[0] | 0x04;
}
else
CoilState[0] = CoilState[0] & 0xfb;
}
}
if(screen_id == 4)//电流输出
{
if(control_id > 6 && control_id < 12)
{
ao_out = (control_id - 6) * 4;//电流输出快捷键
SetTextFloat(4,17,ao_out,3,1);//输入值跟随变化
HoldReg[0] = ao_out * 1000;
}
}
if(screen_id == 12)
{
if(control_id == 10)
{
sprintf(qrstr,"%d",HoldReg[37]);
strcat(qrstr,"&");
strcat(qrstr,"181\0");//油腔
qrfresh = 1;
}
if(control_id == 11)
{
sprintf(qrstr,"%d",HoldReg[37]);
strcat(qrstr,"&");
strcat(qrstr,"182\0");//电气腔
qrfresh = 1;
}
if(control_id == 12)
{
sprintf(qrstr,"%d",HoldReg[37]);
strcat(qrstr,"&");
strcat(qrstr,"183\0");//接线腔IP防护
qrfresh = 1;
}
}
}
/*!
* \brief 文本控件通知
* \details 当文本通过键盘更新(或调用GetControlValue)时,执行此函数
* \details 文本控件的内容以字符串形式下发到MCU如果文本控件内容是浮点值
* \details 则需要在此函数中将下发字符串重新转回浮点值。
* \param screen_id 画面ID
* \param control_id 控件ID
* \param str 文本控件内容
*/
void NotifyText(uint16_t screen_id, uint16_t control_id, uint8_t *str)
{
if(screen_id == 0)
{
HoldReg[37] = strtof((const char *)str,&pEnd);//设备ID
}
if(screen_id == 1)
{
if(control_id == 8)
{
strcpy(wifiname,(const char*)str);//设置wifi名称
ee_writebytes(str,100,strlen((const char*)str)+1);//保存数据,+1为了将末尾\0同时保存
}
if(control_id == 9)
{
strcpy(wifipassword,(const char*)str);//设置wifi密码
ee_writebytes(str,200,strlen((const char*)str)+1);//保存数据,+1为了将末尾\0同时保存
}
if(control_id == 10)
{
}
if(control_id == 11)
{
strcpy(hisip,(const char*)str);//设置目标IP
ee_writebytes(str,300,strlen((const char*)str)+1);//保存数据,+1为了将末尾\0同时保存
}
if(control_id == 12)
{
strcpy(port,(const char*)str);//设置端口号
ee_writebytes(str,400,strlen((const char*)str)+1);//保存数据,+1为了将末尾\0同时保存
}
}
if(screen_id == 4)
{
if(control_id == 17)
{
HoldReg[0] = strtof((const char *)str,&pEnd) * 1000;//文本输入控制AO1电流输出
}
}
}
/*!
* \brief 进度条控件通知
* \details 调用GetControlValue时执行此函数
* \param screen_id 画面ID
* \param control_id 控件ID
* \param value 值
*/
void NotifyProgress(uint16_t screen_id, uint16_t control_id, uint32_t value)
{
//TODO: 添加用户代码
}
/*!
* \brief 滑动条控件通知
* \details 当滑动条改变(或调用GetControlValue)时,执行此函数
* \param screen_id 画面ID
* \param control_id 控件ID
* \param value 值
*/
void NotifySlider(uint16_t screen_id, uint16_t control_id, uint32_t value)
{
if(screen_id == 5)
{
}
}
/*!
* \brief 仪表控件通知
* \details 调用GetControlValue时执行此函数
* \param screen_id 画面ID
* \param control_id 控件ID
* \param value 值
*/
void NotifyMeter(uint16_t screen_id, uint16_t control_id, uint32_t value)
{
//TODO: 添加用户代码
}
/*!
* \brief 菜单控件通知
* \details 当菜单项按下或松开时,执行此函数
* \param screen_id 画面ID
* \param control_id 控件ID
* \param item 菜单项索引
* \param state 按钮状态0松开1按下
*/
void NotifyMenu(uint16_t screen_id, uint16_t control_id, uint8_t item, uint8_t state)
{
if(screen_id == 4)
{
}
}
/*!
* \brief 选择控件通知
* \details 当选择控件变化时,执行此函数
* \param screen_id 画面ID
* \param control_id 控件ID
* \param item 当前选项
*/
void NotifySelector(uint16_t screen_id, uint16_t control_id, uint8_t item)
{
}
/*!
* \brief 定时器超时通知处理
* \param screen_id 画面ID
* \param control_id 控件ID
*/
void NotifyTimer(uint16_t screen_id, uint16_t control_id)
{
}
/*!
* \brief 读取用户FLASH状态返回
* \param status 0失败1成功
* \param _data 返回数据
* \param length 数据长度
*/
void NotifyReadFlash(uint8_t status,uint8_t *_data,uint16_t length)
{
//TODO: 添加用户代码
}
/*!
* \brief 写用户FLASH状态返回
* \param status 0失败1成功
*/
void NotifyWriteFlash(uint8_t status)
{
//TODO: 添加用户代码
}
/*!
* \brief 读取RTC时间注意返回的是BCD码
* \param year 年BCD
* \param month 月BCD
* \param week 星期BCD
* \param day 日BCD
* \param hour 时BCD
* \param minute 分BCD
* \param second 秒BCD
*/
void NotifyReadRTC(uint8_t year,uint8_t month,uint8_t week,uint8_t day,uint8_t hour,uint8_t minute,uint8_t second)
{
sec =(0xff & (second>>4))*10 +(0xf & second); //BCD码转十进制
years =(0xff & (year>>4))*10 +(0xf & year);
months =(0xff & (month>>4))*10 +(0xf & month);
weeks =(0xff & (week>>4))*10 +(0xf & week);
days =(0xff & (day>>4))*10 +(0xf & day);
hours =(0xff & (hour>>4))*10 +(0xf & hour);
minutes =(0xff & (minute>>4))*10 +(0xf & minute);
}