/// <summary> /// 检查VOBC产品是否全部更新成功 /// </summary> /// <returns></returns> //public bool IsFileUpdateResultChecked() //{ // //记录日志 // LogManager.InfoLog.LogProcInfo("VOBCProduct", "IsFileChecked", "检查VOBC产品:" + m_productID + "的部署文件是否全部更新成功"); // //返回值定义 // bool rtnValue = true; // //计算校验结果 // foreach (string type in base.CSelectedDeviceType) // { // rtnValue &= CheckUpdateResultTypeFile(type); // } // //记录日志 // LogManager.InfoLog.LogProcInfo("VOBCProduct", "IsFileChecked", "VOBC产品" + m_productID + "的部署文件校验结果为" + rtnValue.ToString()); // return rtnValue; //} /// <summary> /// 等待VOBC子子系统烧录结果 /// </summary> public override void WaitForUpdateResult() { //foreach(vobcSystemType type in GetVobcSystemListByType(vobcSystemType sType)) //如有任一子设备更新失败则认为该产品全部更新失败,因此反向判断:回复的VOBC产品下的子子系统更新结果存在失败的,更新失败 Modified @ 4.25 if (this.CSelectedDevice.FindAll(tar => tar.State == "更新失败").Count > 0) { //记录部署失败日志信息 LogManager.InfoLog.LogProcError("VOBCProduct", "WaitForUpdateResult", "接收到VOBC产品:" + m_productID + "的部署更新失败消息"); if (InProcess == true) { //该产品已部署失败就停止并禁用心跳计时器 timerHB.Close(); timerEnable = false; //刷新界面日志信息 Report.ReportWindow("VOBC" + m_productID + "更新失败!请重启车载设备重新开始部署"); SkipFlag = true; InProcess = false; //StepOne = true; CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); //CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); //CDeviceDataFactory.Instance.VobcContainer.dataModify.ColorEvent(); //DataModify.ColorEventHandler //断开TCP连接并释放资源 Modified @ 7.7 CTcpClient.Socket_TCPClient_Dispose(); //释放内存 GC.Collect(); } ////记录部署成功日志信息 //LogManager.InfoLog.LogProcError("VOBCProduct", "WaitForUpdateResult", "VOBC产品:" + m_productID + "的部署更新成功,发送重置命令"); ////发送复位指令 //VOBCCommand resetCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.systemReset); //CommandQueue.instance.m_CommandQueue.Enqueue(resetCommand); ////刷新界面日志信息 //Report.ReportWindow("VOBC设备" + m_productID + "更新成功!"); ////跳出循环标志置为true //rev = true; } //VOBC产品下的子子系统跟新结果均为 更新成功 else if ((this.CSelectedDevice.FindAll(tar => tar.State == "更新成功").Count == CSelectedDevice.Count) && (this.CSelectedDevice.FindAll(tar => tar.State == "更新成功").Count != 0)) { //该产品已完成部署就停止并禁用心跳计时器 timerHB.Close(); timerEnable = false; //刷新界面日志信息 Report.ReportWindow("VOBC" + m_productID + "更新成功!"); InProcess = false; //StepOne = true; CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新成功"); CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); //记录部署成功日志信息 //LogManager.InfoLog.LogProcError("VOBCProduct", "WaitForUpdateResult", "VOBC产品:" + m_productID + "的部署更新成功,发送重置命令"); //发送复位指令 VOBCCommand resetCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.systemReset); CommandQueue.instance.m_CommandQueue.Enqueue(resetCommand); //断开TCP连接并释放资源 Modified @ 7.7 CTcpClient.Socket_TCPClient_Dispose(); //释放内存 GC.Collect(); } else { //需要修改外层等待更新成功开始的时机是更新进度100%后 //Thread.Sleep(1000); } }
/// <summary> /// 实现文件更新执行接口方法 /// </summary> protected override bool FileUpdateExec() { bool result = true; Report.ReportWindow("VOBC" + m_productID + "更新标识已下发至通信控制器,请勿终止部署.如此阶段发生异常情况,请重启车载设备两次再重新开始部署!"); LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "发送VOBC产品" + m_productID + "的文件更新命令"); VOBCCommand fileUpdateCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.startUpdateFile); CommandQueue.instance.m_CommandQueue.Enqueue(fileUpdateCommand); ///等待待重启状态 bool rev = false; int skipCount = 0; do { ///如果文件状态为true if (ProductState == "待重启") { LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "处于待重启状态,发送循环建链,已结束部署第一阶段"); rev = true; StepOne = false; } else { //计数15次 未收到允许更新就跳出循环结束 if (skipCount > 30) { SkipFlag = true; InProcess = false; //StepOne = true; skipCount = 0; result = false; Report.ReportWindow("未收到VOBC" + m_productID + "的允许更新回复超时"); //LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "未收到VOBC产品" + m_productID + "的允许更新回复超时"); CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(Ip, Convert.ToInt32(Port), "更新失败"); CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); //Modified @ 7.25 //断开连接 CTcpClient.Socket_TCPClient_Dispose(); timerHB.Dispose(); CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); return(result); } else { //跳出计数+1 skipCount++; //休眠1秒 Thread.Sleep(1000); } } } while (rev == false); //待重启状态后,等待80秒发送一次建链帧至命令队列 //Thread.Sleep(80000); //从待重启状态开始pingVOBC的IP端口网络,直至ping不通则证明已关机 bool online = true; Ping ping = new Ping(); do { PingReply reply = ping.Send(m_ip); if (reply.Status != IPStatus.Success) { online = false; LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "已关闭"); } else { Thread.Sleep(3000); } } while (online == true); //进入重连 do { if (!StepOne) { PingReply reply = ping.Send(m_ip); if (reply.Status == IPStatus.Success) { online = true; LogManager.InfoLog.LogCommunicationInfo("VOBCProduct", "FileUpdateExec", "二次建链ping通,等待5秒开始执行建链"); Report.ReportWindow("VOBC产品" + m_productID + "二次建链ping通,等待5秒开始执行建链"); Thread.Sleep(5000); } else { Thread.Sleep(3000); } } else { result = false; return(result); } } while (online == false); VOBCCommand buildCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.rebuildLink); CommandQueue.instance.m_CommandQueue.Enqueue(buildCommand); skipCount = 0; rev = false; do { ///如果文件状态为true if (ProductState == "正常") { Report.ReportWindow("VOBC产品" + m_productID + "已完成重连,开始执行第二阶段程序"); LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "完成第二阶段重连"); rev = true; } else { //重连倒计时 if (skipCount > 15) { //SkipFlag = true; skipCount = 0; //result = false; //Report.ReportWindow("VOBC产品" + m_productID + "第二阶段网络重连超时!继续重连"); //CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip,Convert.ToInt32(Port), "重连失败"); //CDeviceDataFactory.Instance.VobcContainer.dataModify.Modify(); //return result; for (int i = 0; i < 3; i++) { if (ProductState != "正常") { CommandQueue.instance.m_CommandQueue.Enqueue(new VOBCCommand(Ip, Convert.ToInt32(Port), ProductID, vobcCommandType.rebuildLink)); Thread.Sleep(15000); } else { Report.ReportWindow("VOBC产品" + m_productID + "已完成重连,开始执行第二阶段程序"); result = true; return(result); } } if (ProductState != "正常") { Report.ReportWindow("VOBC产品" + m_productID + "第二阶段网络重连超时,更新失败!请重启车载设备两次再重新开始部署"); SkipFlag = true; InProcess = false; //Modified @ 7.24 StepOne = true; result = false; //Modified @ 9.10 CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(Ip, Convert.ToInt32(Port), "更新失败"); CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); return(result); } else { Report.ReportWindow("VOBC产品" + m_productID + "已完成重连,开始执行第二阶段程序"); result = true; return(result); } } else { //跳出计数+1 skipCount++; //休眠1秒 Thread.Sleep(1000); } } } while (rev == false); //记录日志 //LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "处于正常状态"); ///进入下一个产品的部署过程之前,等待当前产品的更新状态回复结果 //LogManager.InfoLog.LogProcInfo("VOBCProduct", "WaitForUpdateResult", "等待VOBC产品:" + m_productID + "的部署更新结果"); ///WaitForUpdateResult(); return(result); }
/// <summary> /// VOBC子子系统设备校验文件的虚方法 /// </summary> public virtual bool CheckFile(VOBCProduct vobc) { //执行结果 bool excuteResult = false; //重置接收校验状态为false Modified @ 11.9 vobc.CheckState = false; //文件校验请求日志记录 LogManager.InfoLog.LogProcInfo(this.GetType().Name, "CheckFile", "发送VOBC产品:" + base.BelongProduct.ProductID + "的部署文件校验信息请求"); Thread.Sleep(20000); //设置烧录子子系统在界面中的显示状态--文件校验中 CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(vobc.Ip, Convert.ToInt32(vobc.Port), CommonMethod.GetVobcSystemListByType(m_vobcCheckFile.vobcSystemType), Convert.ToString(CommonMethod.GetVobcDeployNameByType(vobcSystemDeployState.FileCheck))); CDeviceDataFactory.Instance.VobcContainer.dataModify.Modify(); //发送校验请求 VOBCCommand checkCommand = new VOBCCommand(vobc.Ip, Convert.ToInt32(vobc.Port), vobc.ProductID, vobcCommandType.checkFile, m_vobcCheckFile); CommandQueue.instance.m_CommandQueue.Enqueue(checkCommand); //计数 非正常情况跳出循环 int skipCount = 0; //do while循环正常执行跳出的条件 bool rev = false; do { ///如果接收校验状态为true if (vobc.CheckState) { //记录日志 LogManager.InfoLog.LogProcInfo(this.GetType().Name, "CheckFile", "已收到VOBC产品:" + base.BelongProduct.ProductID + "的部署文件校验回复"); //设置处理标志为true rev = true; //根据子子系统类型 设置相应帧标志 switch (vobcSysType) { case vobcSystemType.ATP_1: vobc.SentCheckState.m_atpSent = true; break; case vobcSystemType.ATO_1: vobc.SentCheckState.m_atoSent = true; break; case vobcSystemType.CCOV: vobc.SentCheckState.m_ccovSent = true; break; case vobcSystemType.COM_1: vobc.SentCheckState.m_comSent = true; break; case vobcSystemType.MMI: vobc.SentCheckState.m_mmiSent = true; break; default: //TODO break; } excuteResult = true; } else { //计数15次 未收到校验通过更新就跳出循环结束 Modified @ 9.28 if ((skipCount > 30) || (vobc.SkipFlag)) { //vobc.SkipFlag = true; excuteResult = false; break; } else { //跳出计数+1 skipCount++; //休眠1秒 Thread.Sleep(1000); } } } while (rev == false); return(excuteResult); }
/// <summary> /// 实现生成互联互通产品线配置文件的接口方法 /// </summary> protected override void GenConfigHLHT() { try { //用户勾选了配置文件 才去生成配置文件 if (DeployConfigCheck.IsIniCheck) { //刷新界面上的日志信息 Report.ReportWindow("VOBC" + m_productID + "正在生成配置文件"); //当前正在处理的VOBC产品 LogManager.InfoLog.LogProcInfo("VOBCProduct", "GenConfigHLHT", "正在生成ATPATO配置文件......"); //分别生成ATP ATO 的读写配置文件 GenATPATOConfig(); //生成CCOV配置文件 GenCCOV(); //刷新界面上的日志信息 Report.ReportWindow("VOBC" + m_productID + "配置文件生成完毕!"); } else { //未勾选配置文件选项 不处理 } //每次检测FileState前先进行重置 FileState = false; //发送文件传输请求 VOBCCommand requestCommasd = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.fileTransRequest); CommandQueue.instance.m_CommandQueue.Enqueue(requestCommasd); ///重置子子系统文件发送校验状态 SentCheckState = new VobcSentCheckState(); //清空校验信息列表 m_checkFileList.Clear(); int skipCount = 0; while (FileState == false) { if (skipCount > skipCountMax) { SkipFlag = true; InProcess = false; //StepOne = true; skipCount = 0; LogManager.InfoLog.LogProcInfo("VOBCProduct", "GenConfigHLHT", "未收到下位机允许上传回复超时或下位机拒绝上传文件"); Report.ReportWindow("VOBC" + m_productID + "未收到下位机允许上传回复超时或下位机拒绝上传文件"); CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); //CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); break; } else { //跳出计数+1 skipCount++; //休眠1秒 Thread.Sleep(1000); } } } catch (MyException e) { LogManager.InfoLog.LogCommunicationError("VOBCProduct", "GenConfigHLHT", e.Message); SkipFlag = true; InProcess = false; //StepOne = true; CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); } }
/// <summary> /// VOBC子子系统设备发送部署文件的虚方法 /// </summary> public virtual bool SendFile(VOBCProduct vobc) { //执行结果 bool excuteResult = false; //计数 非正常情况跳出循环 int skipCount = 0; //do while循环正常执行跳出的条件 bool rev = false; do { ///如果文件状态为true if (vobc.FileState) { //日志记录 LogManager.InfoLog.LogProcInfo("VOBCATODevice", "SendFile", "已收到文件请求回复,发送VOBC产品:" + base.BelongProduct.ProductID + "的部署文件"); //界面信息打印 vobc.Report.ReportWindow("VOBC" + vobc.ProductID + " 子子系统设备:" + DeviceType + "正在发送部署文件......"); //设置烧录子子系统在界面中的显示状态--文件上传中 CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(vobc.Ip, Convert.ToInt32(vobc.Port), CommonMethod.GetVobcSystemListByType(m_vobcCheckFile.vobcSystemType), Convert.ToString(CommonMethod.GetVobcDeployNameByType(vobcSystemDeployState.FileUploading))); CDeviceDataFactory.Instance.VobcContainer.dataModify.Modify(); //创建发送文件数据帧 VOBCCommand sendFileCommand = new VOBCCommand(vobc.Ip, Convert.ToInt32(vobc.Port), vobc.ProductID, vobcCommandType.sendFile, m_vobcCheckFile); //添加命令到队列中 CommandQueue.instance.m_CommandQueue.Enqueue(sendFileCommand); excuteResult = true; //执行成功 修改标志 rev = true; } else { //计数15次 跳出循环 Modified @ 9.28 if ((skipCount > skipCountMax) || (vobc.SkipFlag)) { //vobc.SkipFlag = true; excuteResult = false; break; } else { //跳出计数+1 skipCount++; //休眠1秒 Thread.Sleep(1000); } } } while (rev == false); return(excuteResult); }