xm
2020-07-21 9a4b76398009cf76c508d61f7e48fb6f5cb7ac2d
ZigbeeApp/Shared/Phone/UserCenter/Gateway/Add/WiredGatewaySearchForm.cs
New file
@@ -0,0 +1,441 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using ZigBee.Device;
namespace Shared.Phone.UserCenter.GatewayAdd
{
    /// <summary>
    /// 网关搜索中
    /// </summary>
    public class WiredGatewaySearchForm : EditorCommonForm
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 网关的主键(value:剩余检测次数,用于对应异常的网关)
        /// </summary>
        private Dictionary<string, int> dicIdCheckCount = new Dictionary<string, int>();
        /// <summary>
        /// 搜索到的网关列表
        /// </summary>
        private List<ZbGateway> listZbGateway = new List<ZbGateway>();
        /// <summary>
        /// 搜索到的网关类别  0:第一次绑定 1:已经绑定 2:需要换绑
        /// </summary>
        private Dictionary<string, int> dicZbGatewayDiv = new Dictionary<string, int>();
        /// <summary>
        /// 获取得到了新网关
        /// </summary>
        private bool newGatewayGetting = false;
        /// <summary>
        /// 网关搜索中
        /// </summary>
        private bool isGatewaySearching = true;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 画面显示(底层会固定调用此方法,借以完成画面创建)
        /// </summary>
        public void ShowForm()
        {
            //设置标题信息
            base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAddWiredGateway));
            //初始化初始中部控件
            this.InitDefultMiddleFrame();
        }
        /// <summary>
        /// 初始化初始中部控件
        /// </summary>
        private void InitDefultMiddleFrame()
        {
            //清空bodyFrame
            this.ClearBodyFrame();
            //图标
            var picGwImage = new FrameLayout();
            picGwImage.Width = this.GetPictrueRealSize(861);
            picGwImage.Height = this.GetPictrueRealSize(478);
            picGwImage.Y = Application.GetRealHeight(251);
            picGwImage.Gravity = Gravity.CenterHorizontal;
            picGwImage.BackgroundImagePath = "Gateway/WiredGatewaySearching.png";
            bodyFrameLayout.AddChidren(picGwImage);
            //正在搜索网关…
            var btnMsg = new NormalViewControl(bodyFrameLayout.Width, false);
            btnMsg.TextID = R.MyInternationalizationString.uGatewaySearching;
            btnMsg.Y = Application.GetRealHeight(1008);
            btnMsg.TextColor = UserCenterColor.Current.TextGrayColor3;
            btnMsg.TextAlignment = TextAlignment.Center;
            bodyFrameLayout.AddChidren(btnMsg);
            //初始化连接的假想动画效果
            this.InitConcetionAnimete(picGwImage, btnMsg);
            //开启网关检测的线程
            this.StartCheckGatewayThread();
        }
        /// <summary>
        /// 初始化失败模式的中部控件
        /// </summary>
        private void InitFailMiddleFrame()
        {
            //清空bodyFrame
            this.ClearBodyFrame();
            //图标
            var picGwImage = new FrameLayout();
            picGwImage.Width = this.GetPictrueRealSize(861);
            picGwImage.Height = this.GetPictrueRealSize(478);
            picGwImage.Y = Application.GetRealWidth(158);
            picGwImage.Gravity = Gravity.CenterHorizontal;
            picGwImage.BackgroundImagePath = "Gateway/WiredGatewaySearching.png";
            bodyFrameLayout.AddChidren(picGwImage);
            var btnFailIcon = new PicViewControl(66, 66);
            btnFailIcon.UnSelectedImagePath = "Item/FailIcon.png";
            btnFailIcon.Gravity = Gravity.CenterHorizontal;
            btnFailIcon.Y = this.GetPictrueRealSize(181);
            picGwImage.AddChidren(btnFailIcon);
            //搜索失败
            var btnFailView = new NormalViewControl(300, 60, true);
            btnFailView.TextAlignment = TextAlignment.Center;
            btnFailView.Y = this.GetPictrueRealSize(305);
            btnFailView.Gravity = Gravity.CenterHorizontal;
            btnFailView.TextColor = UserCenterColor.Current.TextGrayColor3;
            btnFailView.TextID = R.MyInternationalizationString.uSearchFail;
            picGwImage.AddChidren(btnFailView);
            //解决方法,可选择执行以下任意一种方式:
            var btnMsg1 = new NormalViewControl(930, 60, true);
            btnMsg1.X = Application.GetRealWidth(75);
            btnMsg1.Y = picGwImage.Bottom + Application.GetRealHeight(112);
            btnMsg1.TextID = R.MyInternationalizationString.uSearchGatewayFailMsg1;
            bodyFrameLayout.AddChidren(btnMsg1);
            //1.短按HID/WCFG按键,系统指示灯快闪3秒,网关进入换绑模式,强制网关绑定到当前APP
            var btnMsg2 = new NormalViewControl(930, 100, true);
            btnMsg2.X = Application.GetRealWidth(75);
            btnMsg2.Y = btnMsg1.Bottom + Application.GetRealHeight(35);
            btnMsg2.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg2).Replace("{0}", "\r\n");
            btnMsg2.TextSize = 12;
            btnMsg2.TextColor = UserCenterColor.Current.TextGrayColor1;
            btnMsg2.IsMoreLines = true;
            bodyFrameLayout.AddChidren(btnMsg2);
            //2.长按网关ZB/RST按键20秒以上,直到所有指示灯同时灭,即恢复出厂设置并重启
            var btnMsg3 = new NormalViewControl(930, 100, true);
            btnMsg3.X = Application.GetRealWidth(75);
            btnMsg3.Y = btnMsg2.Bottom + Application.GetRealHeight(12);
            btnMsg3.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg3).Replace("{0}", "\r\n");
            btnMsg3.TextSize = 12;
            btnMsg3.TextColor = UserCenterColor.Current.TextGrayColor1;
            btnMsg3.IsMoreLines = true;
            bodyFrameLayout.AddChidren(btnMsg3);
            //3.请重试,重新添加网关。
            var btnMsg4 = new NormalViewControl(930, 50, true);
            btnMsg4.X = Application.GetRealWidth(75);
            btnMsg4.Y = btnMsg3.Bottom + Application.GetRealHeight(12);
            btnMsg4.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg4);
            btnMsg4.TextSize = 12;
            btnMsg4.TextColor = UserCenterColor.Current.TextGrayColor1;
            bodyFrameLayout.AddChidren(btnMsg4);
            //4.返回网关管理。
            var btnMsg5 = new NormalViewControl(930, 50, true);
            btnMsg5.X = Application.GetRealWidth(75);
            btnMsg5.Y = btnMsg4.Bottom + Application.GetRealHeight(12);
            btnMsg5.Text = Language.StringByID(R.MyInternationalizationString.uSearchGatewayFailMsg5);
            btnMsg5.TextSize = 12;
            btnMsg5.TextColor = UserCenterColor.Current.TextGrayColor1;
            bodyFrameLayout.AddChidren(btnMsg5);
            //重试
            var frameback = new FrameLayoutStatuControl();
            frameback.UseClickStatu = false;
            frameback.Y = Application.GetRealHeight(1259);
            frameback.Gravity = Gravity.CenterHorizontal;
            frameback.Width = Application.GetRealWidth(746);
            frameback.Height = Application.GetRealHeight(184);
            frameback.BackgroundImagePath = "Item/BottomButtonGround.png";
            bodyFrameLayout.AddChidren(frameback);
            var btnReDo = new NormalViewControl(300, 65, true);
            btnReDo.IsBold = true;
            btnReDo.TextColor = UserCenterColor.Current.White;
            btnReDo.TextSize = 16;
            btnReDo.Y = Application.GetRealHeight(49);
            btnReDo.Gravity = Gravity.CenterHorizontal;
            btnReDo.TextAlignment = TextAlignment.Center;
            btnReDo.TextID = R.MyInternationalizationString.uReDoAgain;
            frameback.AddChidren(btnReDo, ChidrenBindMode.BindEvent);
            frameback.ButtonClickEvent += (sender, e) =>
            {
                //初始化初始中部控件
                this.InitDefultMiddleFrame();
            };
            //返回网关管理
            var btnGoBack = new BottomClickButton(688);
            btnGoBack.Y = Application.GetRealHeight(1495);
            btnGoBack.TextID = R.MyInternationalizationString.uGobackGatewayManage;
            if (UserCenterResourse.DicActionForm.ContainsKey("GatewayListForm") == false)
            {
                //返回主页
                btnGoBack.TextID = R.MyInternationalizationString.uGobackToHomePage;
            }
            bodyFrameLayout.AddChidren(btnGoBack);
            btnGoBack.ButtonClickEvent += (sender, e) =>
            {
                this.CloseForm();
                //关闭指定界面
                this.CloseFormByFormName("NewGateWayMenuSelectForm");
            };
        }
        #endregion
        #region ■ 假想动画(网关检测)_________________
        /// <summary>
        /// 初始化连接的假想动画效果
        /// </summary>
        private void InitConcetionAnimete(FrameLayout picGwImage, NormalViewControl btnMsg)
        {
            //首格的X轴
            int firstPoint = this.GetPictrueRealSize(288);
            //一格的宽度
            int width = this.GetPictrueRealSize(22);
            //间距大小
            int space = this.GetPictrueRealSize(12);
            //生成格子坐标
            var listPoint = new List<int>();
            for (int i = 0; i < 9; i++)
            {
                listPoint.Add(firstPoint + (width + space) * i);
            }
            //开启连接的假想动画效果线程
            var btnRound = new PicViewControl(width, width, false);
            btnRound.Radius = (uint)width / 2;
            btnRound.BackgroundColor = UserCenterColor.Current.ConcetionRoundColor;
            btnRound.Y = this.GetPictrueRealSize(202);
            btnRound.X = listPoint[0];
            picGwImage.AddChidren(btnRound);
            string strMsg = btnMsg.Text;
            HdlThreadLogic.Current.RunThread(() =>
            {
                int index = 1;
                int maxCount = 120 * 2;
                int timeCount = 120;
                while (picGwImage.Parent != null)
                {
                    System.Threading.Thread.Sleep(500);
                    maxCount--;
                    if (maxCount % 2 == 0)
                    {
                        timeCount--;
                    }
                    if (maxCount <= 0 || this.newGatewayGetting == true)
                    {
                        //获取得到新网关,则中断线程
                        break;
                    }
                    Application.RunOnMainThread(() =>
                    {
                        btnRound.X = listPoint[index];
                        index++;
                        if (index == listPoint.Count)
                        {
                            index = 0;
                        }
                        //正在搜索网关…XXs
                        btnMsg.Text = strMsg + timeCount + "s";
                    });
                }
                //搜索结束
                this.isGatewaySearching = false;
                if (maxCount <= 0)
                {
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        //初始化失败模式的中部控件
                        this.InitFailMiddleFrame();
                    });
                }
                else if (newGatewayGetting == true)
                {
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        if (this.Parent != null)
                        {
                            var form = new GatewayManage.GatewaySearchListForm();
                            this.AddFromAndRemoveNowForm(form, listZbGateway, dicZbGatewayDiv);
                        }
                    });
                }
            });
        }
        #endregion
        #region ■ 网关检测___________________________
        /// <summary>
        /// 开启网关检测的线程
        /// </summary>
        private void StartCheckGatewayThread()
        {
            this.isGatewaySearching = true;
            HdlThreadLogic.Current.RunThread(async () =>
            {
                //清空全部列表
                HdlGatewayLogic.Current.ClearAllRealGateway();
                ZigBee.Common.Application.IsSearchingGateway = true;
                int count = 0;
                while (this.Parent != null && this.isGatewaySearching == true)
                {
                    //每2秒检测搜索到的网关
                    System.Threading.Thread.Sleep(500);
                    count++;
                    if (count < 4)
                    {
                        //主要为了快一点能够中断这个线程
                        continue;
                    }
                    count = 0;
                    await this.CheckZbGatewayAndSetRow();
                    if (this.newGatewayGetting == true)
                    {
                        //获取得到新网关,则中断线程
                        break;
                    }
                }
            });
        }
        /// <summary>
        /// 检测搜索到的网关,然后添加到画面的行里面
        /// </summary>
        private async Task<bool> CheckZbGatewayAndSetRow()
        {
            List<string> listId = new List<string>();
            for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
            {
                if (ZbGateway.GateWayList[i].GwIP == string.Empty)
                {
                    //IP没有的网关,我也不知道它是干嘛的
                    continue;
                }
                string gwId = ZbGateway.GateWayList[i].GwId;
                //重复添加检测
                if (this.dicIdCheckCount.ContainsKey(gwId) == false)
                {
                    //允许五次检测
                    this.dicIdCheckCount[gwId] = 5;
                    listId.Add(gwId);
                }
                else if (this.dicIdCheckCount[gwId] > 0)
                {
                    //如果前一次检测失败了的话,它的次数-1
                    this.dicIdCheckCount[gwId] = this.dicIdCheckCount[gwId] - 1;
                    listId.Add(gwId);
                }
            }
            if (listId.Count == 0)
            {
                //没有新的网关,或者次数已经用完
                return true;
            }
            for (int i = 0; i < listId.Count; i++)
            {
                ZbGateway way = ZbGateway.GateWayList.Find((obj) => obj.GwId == listId[i]);
                if (way == null)
                {
                    continue;
                }
                //网关绑定模式
                GatewayBindMode mode = GatewayBindMode.BindAgain;
                //如果是第一次绑定,或者是以前已经绑定过了的
                if (HdlGatewayLogic.Current.HomeIdIsEmpty(way) == true
                    || way.HomeId == Common.Config.Instance.HomeId)
                {
                    if (way.HomeId != Common.Config.Instance.HomeId)
                    {
                        //第一次绑定,也就是网关住宅ID为空
                        mode = GatewayBindMode.First;
                    }
                    else
                    {
                        //已经绑定过了
                        mode = GatewayBindMode.Binded;
                    }
                    //添加搜索到的网关到缓存(执行网关保存操作)
                    ShowErrorMode showMode = this.dicIdCheckCount[listId[i]] == 0 ? ShowErrorMode.YES : ShowErrorMode.NO;
                    var result = await HdlGatewayLogic.Current.AddNewGateway(way, ShowErrorMode.NO);
                    if (result == false)
                    {
                        continue;
                    }
                }
                //收集网关对象
                this.listZbGateway.Add(way);
                //如果它已经完全成功了的话,则将它的剩余次数置零
                this.dicIdCheckCount[listId[i]] = 0;
                //全部处理OK后,才能设置flage
                if (mode == GatewayBindMode.First)
                {
                    //第一次绑定
                    this.dicZbGatewayDiv[listId[i]] = 0;
                    //获取到了新网关
                    this.newGatewayGetting = true;
                }
                else if (mode == GatewayBindMode.Binded)
                {
                    //已经绑定过
                    this.dicZbGatewayDiv[listId[i]] = 1;
                }
                else
                {
                    //需要重新绑定
                    this.dicZbGatewayDiv[listId[i]] = 2;
                    //获取到了新网关
                    this.newGatewayGetting = true;
                }
                if (mode == GatewayBindMode.First || mode == GatewayBindMode.Binded)
                {
                    //我觉得这里需要获取一下新网关的设备列表
                    Common.LocalDevice.Current.SetDeviceToMemmoryByGateway(way);
                }
            }
            return true;
        }
        #endregion
        #region ■ 界面关闭___________________________
        /// <summary>
        /// 画面关闭
        /// </summary>
        public override void CloseFormBefore()
        {
            ZigBee.Common.Application.IsSearchingGateway = false;
            base.CloseFormBefore();
        }
        #endregion
    }
}