#include "cmd_queue.h" #include char *pEnd; char ipaddr[32] = ""; //存储字符串IP char gw_ipaddr[32] = ""; //存储字符串IP char ipmask[32] = ""; //存储字符串IP uint8_t cmd_buffer[CMD_MAX_SIZE]; //指令缓存 static uint16_t current_screen_id = 0; //当前画面ID uint8_t years,months,weeks,days,hours,minutes,sec; uint8_t power_state = 5,power_flag = 0; int angular_travel_flag = 1;//是否启用角行程 int straight_travel_flag = 1;//是否启用直行程 int current_calib[4]; //电流校准值 int pressure_calib[4]; //气压校准值 float ao_out; int unit_pulse = 100; //编码器单位脉冲数 float gear_ratio = 60; //角行程阀轴直径 int power_cnt = 0; bool change_flag = false; extern bool cal_change_flag; extern void get_power_state(void); /*! * \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 change_flag = true; if(screen_id == 0) { AnimationPlayFrame(0,99,power_state - 1); //电量 } if(screen_id == 1) { AnimationPlayFrame(1,99,power_state - 1); //电量 } if(screen_id == 2) { AnimationPlayFrame(2,99,power_state - 1); //电量 } if(screen_id == 3) { AnimationPlayFrame(3,99,power_state - 1); //电量 } if(screen_id == 4) { AnimationPlayFrame(4,99,power_state - 1); //电量 } } /*! * \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; /*! * \brief 更新数据 */ void UpdateUI(void) { //文本设置和显示 定时20ms刷新一次 if(current_screen_id == 0) { if(DisState[0] & 0x20) { power_cnt++; if(power_cnt < 5) AnimationPlayFrame(0,98,1); else AnimationPlayFrame(0,98,0); if(power_cnt > 10) { power_cnt = 0; power_state--; } if(power_state < 1) power_state = 3; } else { get_power_state(); AnimationPlayFrame(0,98,3); } AnimationPlayFrame(0,99,power_state - 1); //电量 } if(current_screen_id == 1) { if(DisState[0] & 0x20) { power_cnt++; if(power_cnt < 5) AnimationPlayFrame(1,98,1); else AnimationPlayFrame(1,98,0); if(power_cnt > 10) { power_cnt = 0; power_state--; } if(power_state < 1) power_state = 3; } else { get_power_state(); AnimationPlayFrame(1,98,2); } AnimationPlayFrame(1,99,power_state - 1); //电量 SetTextInt32(1,9,HoldReg[0],0,0); SetTextInt32(1,15,HoldReg[1],0,0); if(InputReg[1] > 1000) { SetTextInt32(1,24,InputReg[1],0,0); } else { SetTextInt32(1,24,0,0,0); } if(InputReg[2] > 1000) { SetTextInt32(1,25,InputReg[2],0,0); } else { SetTextInt32(1,25,0,0,0); } SetTextFloat(1,10,ao1_offsets,0,0); SetTextFloat(1,16,ao2_offsets,0,0); if(HoldReg[0] > 4000) SetSliderValue(1,1,HoldReg[0]-4000); else SetSliderValue(1,1,0); if(HoldReg[1] > 4000) SetSliderValue(1,14,HoldReg[1]-4000); else SetSliderValue(1,14,0); } if(current_screen_id == 2) { if(DisState[0] & 0x20) { power_cnt++; if(power_cnt < 5) AnimationPlayFrame(2,98,1); else AnimationPlayFrame(2,98,0); if(power_cnt > 10) { power_cnt = 0; power_state--; } if(power_state < 1) power_state = 3; } else { get_power_state(); AnimationPlayFrame(2,98,2); } AnimationPlayFrame(2,99,power_state - 1); //电量 if(InputReg[12] > 500) { SetTextFloat(2,3,InputReg[12] / 1000.0,3,0);//输入电流 } else { SetTextFloat(2,3,0,0,0);//输入电流 } SetTextFloat(2,6,((float)InputReg[8] / 10),1,1);//环境压力 SetTextFloat(2,7,((float)(InputReg[5] - InputReg[8]) / 10),1,1); // A口压力 SetTextFloat(2,8,((float)(InputReg[6] - InputReg[8]) / 10),1,1); // B口压力 SetTextFloat(2,9,((float)(InputReg[7] - InputReg[8]) / 10),1,1); //气源压力 if(straight_travel_flag) { SetTextFloat(2,4,(((float)((long)(InputReg[10]*65536) + InputReg[11]) - 10000000) / HoldReg[2]),2,1);//编码器(直行程) } else { SetTextFloat(2,4,0,2,1);//编码器(直行程) } if(angular_travel_flag) { SetTextFloat(2,5,((((float)((long)(InputReg[10]*65536) + InputReg[11]) - 10000000) / HoldReg[2]) * (60 / (HoldReg[13]/100.0))),2,1);//编码器 (角行程) } else { SetTextFloat(2,5,0,2,1);//编码器 (角行程) } if(CoilState[0] & 0x20) SetButtonValue(2,2,1); else SetButtonValue(2,2,0); if(DisState[0] & 0x80) AnimationPlayFrame(2,12,1); else AnimationPlayFrame(2,12,0); if(DisState[0] & 0x40) AnimationPlayFrame(2,13,1); else AnimationPlayFrame(2,13,0); } if(current_screen_id == 3) { if(DisState[0] & 0x20) { power_cnt++; if(power_cnt < 5) AnimationPlayFrame(3,98,1); else AnimationPlayFrame(3,98,0); if(power_cnt > 10) { power_cnt = 0; power_state--; } if(power_state < 1) power_state = 3; } else { get_power_state(); AnimationPlayFrame(3,98,2); } AnimationPlayFrame(3,99,power_state - 1); //电量 if(CoilState[0] & 0x80) SetButtonValue(3,4,1); else SetButtonValue(3,4,0); } if(current_screen_id == 4) { if(DisState[0] & 0x20) { power_cnt++; if(power_cnt < 5) AnimationPlayFrame(4,98,1); else AnimationPlayFrame(4,98,0); if(power_cnt > 10) { power_cnt = 0; power_state--; } if(power_state < 1) power_state = 3; } else { get_power_state(); AnimationPlayFrame(4,98,2); } AnimationPlayFrame(4,99,power_state - 1); //电量 if(InputReg[12] > 500) { SetTextInt32(4,2,InputReg[12],0,0);//输入电流 } else { SetTextInt32(4,2,0,0,0);//输入电流 } SetTextFloat(4,3,((float)InputReg[8] / 10),1,1);//环境压力 SetTextFloat(4,4,((float)(InputReg[5] - InputReg[8]) / 10),1,1); // A口压力 SetTextFloat(4,5,((float)(InputReg[6] - InputReg[8]) / 10),1,1); // B口压力 SetTextFloat(4,6,((float)(InputReg[7] - InputReg[8]) / 10),1,1); //气源压力 SetTextInt32(4,12,HoldReg[2],0,0);//单位脉冲 SetTextInt32(4,13,HoldReg[13]/100,0,0);//阀杆直径 } if(current_screen_id == 5) { if(DisState[0] & 0x20) { power_cnt++; if(power_cnt < 5) AnimationPlayFrame(5,98,1); else AnimationPlayFrame(5,98,0); if(power_cnt > 10) { power_cnt = 0; power_state--; } if(power_state < 1) power_state = 3; } else { get_power_state(); AnimationPlayFrame(5,98,2); } AnimationPlayFrame(5,99,power_state - 1); //电量 } if(current_screen_id == 6) { if(change_flag) { //整形转字符串 sprintf(ipaddr,"%d.%d.%d.%d", HoldReg[40], HoldReg[41], HoldReg[42], HoldReg[43]); sprintf(gw_ipaddr,"%d.%d.%d.%d", HoldReg[44], HoldReg[45], HoldReg[46], HoldReg[47]); sprintf(ipmask,"%d.%d.%d.%d", HoldReg[48], HoldReg[49], HoldReg[50], HoldReg[51]); SetTextValue(6,9,(uchar *)ipaddr); SetTextValue(6,10,(uchar *)gw_ipaddr); SetTextValue(6,11,(uchar *)ipmask); SetTextInt32(6,12,HoldReg[52],0,0); SetTextInt32(6,13,HoldReg[53],0,0); change_flag = 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)//开关量输出 { switch(control_id) { case 3: { HoldReg[0] = 4000; } break; case 4: { HoldReg[0] = 8000; } break; case 5: { HoldReg[0] = 12000; } break; case 6: { HoldReg[0] = 16000; } break; case 7: { HoldReg[0] = 20000; } break; case 11: { if(state) { ao1_offsets += 1; cal_change_flag = true; } } break; case 12: { if(state) { ao1_offsets -= 1; cal_change_flag = true; } } break; case 17: { if(state) { ao2_offsets += 1; cal_change_flag = true; } } break; case 18: { if(state) { ao2_offsets -= 1; cal_change_flag = true; } } break; case 19: { HoldReg[1] = 4000; } break; case 20: { HoldReg[1] = 8000; } break; case 21: { HoldReg[1] = 12000; } break; case 22: { HoldReg[1] = 16000; } break; case 23: { HoldReg[1] = 20000; } break; } } if(screen_id == 2) { if(control_id == 11) { __HAL_TIM_SetCounter(&htim1, 0x9718); //初始化计数值 cnt_update = 152; } if(control_id == 2) { if(state) CoilState[0] = CoilState[0] | 0x20; else CoilState[0] = CoilState[0] & 0xDF; } } if(screen_id == 3) { if(control_id == 4) { if(state) CoilState[0] = CoilState[0] | 0x80; else CoilState[0] = CoilState[0] & 0x7F; } } if(screen_id == 4)//开关量输出 { switch(control_id) { case 16: { InputReg[12] = InputReg[12] - current_offsets[0]; current_offsets[0] = current_calib[0] - InputReg[12]; if(current_offsets[0] >= 0) { HoldReg[5] = current_offsets[0]; } else { int coff_num = -current_offsets[0]; HoldReg[5] = (uint16_t)((0xFFFF - coff_num) + 1); } } break; case 17: { InputReg[8] = InputReg[8] - pressure_offsets[0]; pressure_offsets[0] = pressure_calib[0] - InputReg[8]; if(pressure_offsets[0] >= 0) { HoldReg[9] = pressure_offsets[0]; } else { int poff_num = -pressure_offsets[0]; HoldReg[9] = (uint16_t)((0xFFFF - poff_num) + 1); } } break; case 18: { InputReg[5] = InputReg[5] - pressure_offsets[1]; pressure_offsets[1] = pressure_calib[1] + InputReg[8] - InputReg[5]; if(pressure_offsets[1] >= 0) { HoldReg[10] = pressure_offsets[1]; } else { int poff_num = -pressure_offsets[1]; HoldReg[10] = (uint16_t)((0xFFFF - poff_num) + 1); } } break; case 19: { InputReg[6] = InputReg[6] - pressure_offsets[2]; pressure_offsets[2] = pressure_calib[2] + InputReg[8] - InputReg[6]; if(pressure_offsets[2] >= 0) { HoldReg[11] = pressure_offsets[2]; } else { int poff_num = -pressure_offsets[2]; HoldReg[11] = (uint16_t)((0xFFFF - poff_num) + 1); } } break; case 20: { InputReg[7] = InputReg[7] - pressure_offsets[3]; pressure_offsets[3] = pressure_calib[3] + InputReg[8] - InputReg[7]; if(pressure_offsets[3] >= 0) { HoldReg[12] = pressure_offsets[3]; } else { int poff_num = -pressure_offsets[3]; HoldReg[12] = (uint16_t)((0xFFFF - poff_num) + 1); } } break; case 21: { for(int n = 5;n < 13;n++) { HoldReg[n] = 0; } } break; } } if(screen_id == 5) { if(control_id == 2) { net_status = state;//网络开启状态 0-未开启 1-初始化 2-已开启 } } if(screen_id == 6)//网络配置 { HoldReg[54] = 1;//初始为0,赋值1让改动数据存入本地,之后数值变为2 } } int net_data[4] = {0}; /*! * \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 == 1) { ao_out = strtof((const char *)str,&pEnd); if(control_id == 9) { HoldReg[0] = ao_out;//AO1电流输出 } if(control_id == 10) { ao1_offsets = ao_out;//AO1电流输出 if(ao1_offsets >= 0) { HoldReg[3] = ao1_offsets;//AO1输出补偿 } else { int aoff_num = -ao1_offsets; HoldReg[3] = (uint16_t)((0xFFFF - aoff_num) + 1);//AO1输出补偿 } } if(control_id == 15) { HoldReg[1] = ao_out;//AO1电流输出 } if(control_id == 16) { ao2_offsets = ao_out;//AO1电流输出 if(ao2_offsets >= 0) { HoldReg[4] = ao2_offsets;//AO2输出补偿 } else { int aoff_num = -ao2_offsets; HoldReg[4] = (uint16_t)((0xFFFF - aoff_num) + 1);//AO2输出补偿 } } } if(screen_id == 4) { if(control_id == 7) { current_calib[0] = strtof((const char *)str,&pEnd); } if(control_id == 8) { pressure_calib[0] = strtof((const char *)str,&pEnd) * 10; } if(control_id == 9) { pressure_calib[1] = strtof((const char *)str,&pEnd) * 10; } if(control_id == 10) { pressure_calib[2] = strtof((const char *)str,&pEnd) * 10; } if(control_id == 11) { pressure_calib[3] = strtof((const char *)str,&pEnd) * 10; } if(control_id == 12) { unit_pulse = strtof((const char *)str,&pEnd); HoldReg[2] = unit_pulse;//单位脉冲 } if(control_id == 13) { gear_ratio = strtof((const char *)str,&pEnd);; HoldReg[13] = gear_ratio * 100;//阀杆直径 } } if(screen_id == 6)//网络配置 { if(control_id == 9)//IP { sscanf((const char *)str,"%d.%d.%d.%d",&net_data[0],&net_data[1],&net_data[2],&net_data[3]); for(int n = 0;n < 4;n++) { HoldReg[40 + n] = net_data[n]; } } if(control_id == 10)//GWIP { sscanf((const char *)str,"%d.%d.%d.%d",&net_data[0],&net_data[1],&net_data[2],&net_data[3]); for(int n = 0;n < 4;n++) { HoldReg[44 + n] = net_data[n]; } } if(control_id == 11)//IPMASK { sscanf((const char *)str,"%d.%d.%d.%d",&net_data[0],&net_data[1],&net_data[2],&net_data[3]); for(int n = 0;n < 4;n++) { HoldReg[48 + n] = net_data[n]; } } if(control_id == 12)//端口1 { HoldReg[52] = strtof((const char *)str,&pEnd); } if(control_id == 13)//端口2 { HoldReg[53] = strtof((const char *)str,&pEnd); } } } /*! * \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 == 1) { if(control_id == 1) { HoldReg[0] = 4000 + value; } if(control_id == 14) { HoldReg[1] = 4000 + value; } } if(screen_id == 5) { if(control_id == 1) SetBackLight(255 - value*2); } } /*! * \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) { if(item) { angular_travel_flag = 1; straight_travel_flag = 0; } else { angular_travel_flag = 0; straight_travel_flag = 1; } } } /*! * \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); } void get_power_state(void) { if(!power_flag) { power_flag = 1; if(InputReg[0] > 3000) power_state = 1; else if(InputReg[0] > 2750) power_state = 2; else if(InputReg[0] > 2500) power_state = 3; else if(InputReg[0] > 2250) power_state = 4; else if(InputReg[0] > 2000) power_state = 5; } else { if(InputReg[0] > 2960) power_state = 1; else if(InputReg[0] > 2710 && InputReg[0] < 2940) power_state = 2; else if(InputReg[0] > 2460 && InputReg[0] < 2690) power_state = 3; else if(InputReg[0] > 2210 && InputReg[0] < 2440) power_state = 4; else if(InputReg[0] > 2000 && InputReg[0] < 2190) power_state = 5; } }