/// <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);
        }