New file |
| | |
| | | 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
|
| | | }
|
| | | }
|