xm
2020-04-16 6fa9d69da922c8049f5acfcbb9ce9fd26811024c
ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceListMainForm.cs
@@ -20,7 +20,11 @@
        /// <summary>
        /// 列表控件
        /// </summary>
        private VerticalListControl listView = null;
        private VerticalListRefreshControl listView = null;
        /// <summary>
        /// 前一次显示出左滑菜单的RowLayout
        /// </summary>
        private RowLayoutControl oldShowRightMuneRow = null;
        /// <summary>
        /// 行控件的信息(Keys:Mac地址)
        /// </summary>
@@ -43,6 +47,8 @@
        /// </summary>
        public void ShowForm()
        {
            this.ScrollEnabled = false;
            //设置标题信息
            base.SetTitleText(Language.StringByID(R.MyInternationalizationString.DeviceManagement));
@@ -90,8 +96,6 @@
            this.gatewayViewRow = new MyGatewayControl(GatewayResourse.NowSelectGateway);
            bodyFrameLayout.AddChidren(gatewayViewRow);
            gatewayViewRow.InitControl();
            //设置网关接受在线状态推送
            this.AddGatewayOnlinePush();
            //初始化搜索控件
            this.InitSearchControl();
@@ -128,10 +132,18 @@
            txtSearchControl.BindEvent(this.SetRowDataBySearchKeys);
            //列表控件
            listView = new VerticalListControl(29);
            listView = new VerticalListRefreshControl(29);
            listView.Y = txtSearchControl.Bottom + Application.GetRealHeight(29);
            listView.Height = frame.Height - txtSearchControl.Bottom - Application.GetRealHeight(29);
            frame.AddChidren(listView);
            listView.BeginHeaderRefreshingAction += () =>
            {
                HdlThreadLogic.Current.RunThread(() =>
                {
                    //下拉刷新
                    this.ListViewBeginHeaderRefreshing();
                });
            };
        }
        #endregion
@@ -146,6 +158,8 @@
            //获取设备列表
            string gwID = HdlGatewayLogic.Current.GetGatewayId(GatewayResourse.NowSelectGateway);
            var listDevice = Common.LocalDevice.Current.GetDeviceByGatewayID(gwID);
            var listSpecialOta = Common.LocalDevice.Current.GetSpecialOtaDevice(gwID);
            listDevice.AddRange(listSpecialOta);
            this.dicRowInfo.Clear();
@@ -158,6 +172,10 @@
            //根据MAC合并设备列表
            this.MargeAllDeviceByMac(listDevice);
            if (this.Parent == null)
            {
                return;
            }
            HdlThreadLogic.Current.RunMain(() =>
            {
                var listOta = new List<OTADevice>();
@@ -173,13 +191,6 @@
                    this.AddDeviceMenuRow(macAddress);
                }
                //添加底部间隙
                var frameTemp = new FrameLayout();
                frameTemp.Height = Application.GetRealHeight(23);
                listView.AddChidren(frameTemp);
                //开启设备属性变更监听
                this.AddDeviceAttributePush();
                //开启网关在线监测的线程
                this.StartGatewayOnlieCheckThread();
                //检测设备新版本
@@ -207,12 +218,13 @@
            //控件
            var rowMenu = new DeviceObjectControl(deviceMac, listView.rowSpace / 2);
            rowMenu.MainKeys = deviceMac;
            frameTable.AddChidren(rowMenu);
            rowMenu.InitControl();
            rowInfo.MenuRow = rowMenu;
            //向右图标
            var btnRight = rowMenu.frameTable.AddMostRightEmptyIcon(58, 58);
            btnRight.UnSelectedImagePath = "Item/Next.png";
            btnRight.UnSelectedImagePath = "Item/RightNext.png";
            btnRight.SelectedImagePath = "Item/Down.png";
            rowMenu.frameTable.ChangedChidrenBindMode(btnRight, ChidrenBindMode.NotBind);
@@ -224,16 +236,11 @@
            //检测设备是否拥有定位的功能
            var listdevice = Common.LocalDevice.Current.GetDevicesByMac(deviceMac);
            if (Common.LocalDevice.Current.DeviceIsCanFixedPosition(listdevice[0]) == true)
            if (listdevice.Count > 0 && Common.LocalDevice.Current.DeviceIsCanFixedPosition(listdevice[0]) == true)
            {
                //定位
                var btnPosition = new NormalViewControl(Application.GetRealWidth(184), rowMenu.Height, false);
                var btnPosition = rowMenu.AddEditorControl(false);
                btnPosition.TextID = R.MyInternationalizationString.uFixedPosition;
                btnPosition.TextAlignment = TextAlignment.Center;
                btnPosition.TextSize = 12;
                btnPosition.TextColor = UserCenterColor.Current.White;
                btnPosition.BackgroundColor = 0xff4a4a4a;
                rowMenu.AddRightView(btnPosition);
                btnPosition.ButtonClickEvent += (sender, e) =>
                {
                    //定位
@@ -263,11 +270,30 @@
            rowMenu.frameTable.ButtonClickEvent += (sender, e) =>
            {
                //隐藏菜单
                rowMenu.HideMenu();
                //强制跳转真实设备界面
                if (UserCenterResourse.HideOption.GotoRealDeviceForm == 1)
                {
                    var form2 = new DeviceAddSuccessForm();
                    form2.AddForm(deviceMac);
                    return;
                }
                btnNew.Visible = false;
                var form = new DeviceMacInfoEditorForm();
                form.AddForm(deviceMac);
                //界面跳转,记录当前的正在操作的设备的Mac地址
                this.nowActionDeviceMac = deviceMac;
            };
            //左滑菜单事件
            rowMenu.OpenMenuAction += () =>
            {
                if (this.oldShowRightMuneRow != null && this.oldShowRightMuneRow.MainKeys != rowMenu.MainKeys)
                {
                    //左滑菜单只能滑一个
                    this.oldShowRightMuneRow.HideMenu();
                }
                this.oldShowRightMuneRow = rowMenu;
            };
        }
@@ -324,6 +350,7 @@
            //行控件
            var rowDevice = new DeviceRoomControl(device, frame.rowSpace / 2);
            rowDevice.MainKeys = LocalDevice.Current.GetDeviceMainKeys(device);
            frame.AddChidren(rowDevice);
            rowDevice.frameTable.LeftOffset = Application.GetRealWidth(173) - ControlCommonResourse.XXLeft;
            rowDevice.InitControl();
@@ -342,13 +369,8 @@
            if (Common.LocalDevice.Current.DeviceIsCanFixedPosition(device) == true)
            {
                //定位
                var btnPosition = new NormalViewControl(Application.GetRealWidth(184), rowDevice.Height, false);
                var btnPosition = rowDevice.AddEditorControl(false);
                btnPosition.TextID = R.MyInternationalizationString.uFixedPosition;
                btnPosition.TextAlignment = TextAlignment.Center;
                btnPosition.TextSize = 12;
                btnPosition.TextColor = UserCenterColor.Current.White;
                btnPosition.BackgroundColor = 0xff4a4a4a;
                rowDevice.AddRightView(btnPosition);
                btnPosition.ButtonClickEvent += (sender, e) =>
                {
                    //定位
@@ -358,10 +380,22 @@
            rowDevice.frameTable.ButtonClickEvent += (sender, e) =>
            {
                //隐藏菜单
                rowDevice.HideMenu();
                //界面跳转,记录当前的正在操作的设备的Mac地址
                this.nowActionDeviceMac = device.DeviceAddr;
                //显示设备功能配置界面
                this.ShowDeviceFunctionSettionForm(device, deviceEnumInfo);
            };
            //左滑菜单事件
            rowDevice.OpenMenuAction += () =>
            {
                if (this.oldShowRightMuneRow != null && this.oldShowRightMuneRow.MainKeys != rowDevice.MainKeys)
                {
                    //左滑菜单只能滑一个
                    this.oldShowRightMuneRow.HideMenu();
                }
                this.oldShowRightMuneRow = rowDevice;
            };
        }
@@ -386,14 +420,61 @@
            //pir传感器
            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.Sensor_Pir)
            {
                var form = new DevicePirSensor.PirSensorBindTargetSettionForm();
                form.AddForm((IASZone)device);
                if (device is IASZone)
                {
                    var form = new DevicePirSensor.PirSensorBindTargetSettionForm();
                    form.AddForm((IASZone)device);
                }
                else
                {
                    //pir传感器,他们又搞了个继电器在里面
                    var form = new DeviceFunctionSettionForm();
                    form.AddForm(device, true);
                }
            }
            //中央空调
            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.AirConditioner_ZbGateway)
            {
                var form = new DeviceAirConditioner.IndoorUnitSettionForm();
                form.AddForm((AC)device);
            }
            //环境面板
            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueEnvironment)
            {
                var form = new DeviceFunctionSettionForm();
                form.AddForm(device, true);
            }
            //新风面板
            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueFreshAir)
            {
                //方悦新风面板的按键配置
                var form = new DevicePanel.PanelFangyueFreshAirButtonSettionForm();
                form.AddForm(device);
            }
            //方悦面板
            else if (deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueTwo
                || deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueFour
                || deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueEight)
            {
                //干接点
                if (device.Type == DeviceType.OnOffSwitch)
                {
                    //方悦面板的按键配置
                    var form = new DevicePanel.PanelFangyueButtonSettionForm();
                    form.AddForm(device);
                }
                //继电器
                else if (device.Type == DeviceType.OnOffOutput)
                {
                    //方悦面板的功能配置
                    var form = new DevicePanel.PanelFangyueFunctionSettionForm();
                    form.AddForm(device);
                }
                else
                {
                    var form = new DeviceFunctionSettionForm();
                    form.AddForm(device, true);
                }
            }
            //面板设备
            else if (deviceEnumInfo.BeloneType == DeviceBeloneType.A按键面板)
@@ -427,12 +508,6 @@
                        var form = new DeviceFunctionSettionForm();
                        form.AddForm(device, true);
                    }
                }
                //温湿度
                else if (device.Type == DeviceType.TemperatureSensor)
                {
                    var form = new DeviceFunctionSettionForm();
                    form.AddForm(device, true);
                }
                else
                {
@@ -509,6 +584,60 @@
        #endregion
        #region ■ 下拉刷新___________________________
        /// <summary>
        /// 滑动控件下拉刷新
        /// </summary>
        private async void ListViewBeginHeaderRefreshing()
        {
            //如果是在线的
            if (HdlGatewayLogic.Current.CheckGatewayOnlineByFlag(GatewayResourse.NowSelectGateway) == true)
            {
                //检测广播到的这个网关是否拥有住宅ID
                ZbGateway realWay = null;
                if (HdlGatewayLogic.Current.GetRealGateway(ref realWay, GatewayResourse.NowSelectGateway) == true)
                {
                    //重新设置住宅ID(这个应该是不经过APP,直接把网关恢复了出厂设置)
                    if (HdlGatewayLogic.Current.HomeIdIsEmpty(realWay.getGatewayBaseInfo.HomeId) == true)
                    {
                        //显示进度条
                        ProgressBar.Show();
                        int result2 = await HdlGatewayLogic.Current.ReBindNewGateway(realWay);
                        //关闭进度条
                        ProgressBar.Close();
                        if (result2 == -1)
                        {
                            return;
                        }
                    }
                }
            }
            if (this.Parent == null)
            {
                return;
            }
            //获取全部设备
            int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(GatewayResourse.NowSelectGateway);
            if (this.Parent == null)
            {
                return;
            }
            HdlThreadLogic.Current.RunMain(() =>
            {
                //隐藏下拉刷新特效
                listView.EndHeaderRefreshing();
                if (result != -1)
                {
                    //重新刷新界面
                    this.InitMiddleFrame(false);
                }
            });
        }
        #endregion
        #region ■ 网关在线检测_______________________
        /// <summary>
@@ -567,29 +696,7 @@
        #endregion
        #region ■ 设备属性变更推送___________________
        /// <summary>
        /// 设备属性变更推送
        /// </summary>
        /// <param name="device"></param>
        public override void DeviceAttributePush(CommonDevice device)
        {
            if (dicRowInfo.ContainsKey(device.DeviceAddr) == false)
            {
                return;
            }
            var rowInfo = dicRowInfo[device.DeviceAddr];
            Application.RunOnMainThread(() =>
            {
                //刷新菜单
                rowInfo.MenuRow?.RefreshControlInfo(false);
            });
        }
        #endregion
        #region ■ 开启设备在线线程___________________
        #region ■ 设备在线检测_______________________
        /// <summary>
        /// 开启设备在线线程
@@ -609,10 +716,6 @@
            this.StartCheckDeviceOnline();
        }
        #endregion
        #region ■ 设备在线___________________________
        /// <summary>
        /// 开启设备在线监测
        /// </summary>
@@ -623,66 +726,72 @@
            {
                return;
            }
            //添加接收设备在线上报的监听
            HdlGatewayReceiveLogic.Current.AddAttributeEvent("DeviceListFormReceivePushOnline", ReceiveComandDiv.A设备在线上报, this.ReceiveDeviceStatu);
            string gwId = HdlGatewayLogic.Current.GetGatewayId(GatewayResourse.NowSelectGateway);
            HdlThreadLogic.Current.RunThread(() =>
            {
                //这里主要只是获取在线状态
                var zbway = HdlGatewayLogic.Current.GetLocalGateway(gwId);
                var result = Common.LocalDevice.Current.GetDeviceListFromGateway(zbway, false, this.ReceiveDeviceStatuPush, ShowErrorMode.NO);
                int statu = 0;
                var list = LocalDevice.Current.GetDeviceListFromGateway(zbway, ref statu, false, ShowErrorMode.NO);
                if (statu != -1)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        //设置设备在线状态
                        this.ReceiveDeviceStatu(list[i]);
                    }
                }
            });
        }
        /// <summary>
        /// 接受设备在线推送
        /// 接受设备状态
        /// </summary>
        /// <param name="device"></param>
        private void ReceiveDeviceStatuPush(CommonDevice device)
        private void ReceiveDeviceStatu(CommonDevice device)
        {
            lock (dicRowInfo)
            DeviceObjRowInfo rowInfo = null;
            if (this.dicRowInfo.ContainsKey(device.DeviceAddr) == true)
            {
                if (this.Parent == null)
                rowInfo = this.dicRowInfo[device.DeviceAddr];
            }
            if (rowInfo == null || rowInfo.MenuRow == null)
            {
                return;
            }
            //刷新设备的在线状态
            string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
            var localDevice = Common.LocalDevice.Current.GetDevice(mainkeys);
            if (localDevice != null)
            {
                //在线状态一样的话,不需要刷新
                if (localDevice.IsOnline == device.IsOnline)
                {
                    return;
                }
                DeviceObjRowInfo rowInfo = null;
                if (this.dicRowInfo.ContainsKey(device.DeviceAddr) == true)
                {
                    rowInfo = this.dicRowInfo[device.DeviceAddr];
                }
                if (rowInfo == null || rowInfo.MenuRow == null)
                {
                    return;
                }
                //刷新设备的在线状态
                string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
                var localDevice = Common.LocalDevice.Current.GetDevice(mainkeys);
                if (localDevice != null)
                {
                    //在线状态一样的话,不需要刷新
                    if (localDevice.IsOnline == device.IsOnline)
                    {
                        return;
                    }
                    //保存状态
                    localDevice.IsOnline = device.IsOnline;
                    localDevice.ReSave();
                }
                //保存状态
                localDevice.IsOnline = device.IsOnline;
                localDevice.ReSave();
            }
                HdlThreadLogic.Current.RunMain(() =>
            HdlThreadLogic.Current.RunMain(() =>
            {
                if (rowInfo != null)
                {
                    if (rowInfo != null)
                    rowInfo.MenuRow.isOnline = device.IsOnline == 1;
                    if (rowInfo.dicDetailRow != null)
                    {
                        rowInfo.MenuRow.isOnline = device.IsOnline == 1;
                        if (rowInfo.dicDetailRow != null)
                        foreach (var detailRow in rowInfo.dicDetailRow.Values)
                        {
                            foreach (var detailRow in rowInfo.dicDetailRow.Values)
                            {
                                detailRow.isOnline = rowInfo.MenuRow.isOnline;
                            }
                            detailRow.isOnline = rowInfo.MenuRow.isOnline;
                        }
                    }
                });
            }
                }
            });
        }
        /// <summary>
@@ -703,6 +812,29 @@
                    });
                }
            }
        }
        #endregion
        #region ■ 传感器报警_________________________
        /// <summary>
        /// 开启传感器报警监视
        /// </summary>
        private void StartCheckDeviceAlarm()
        {
            HdlGatewayReceiveLogic.Current.AddAttributeEvent("DeviceListFormSensor", ReceiveComandDiv.A传感器上报, (device) =>
             {
                 HdlThreadLogic.Current.RunMain(() =>
                 {
                     if (this.dicRowInfo.ContainsKey(device.DeviceAddr) == false)
                     {
                         return;
                     }
                     //显示传感器上报的特效
                     this.dicRowInfo[device.DeviceAddr].MenuRow?.StartSensorPushAppeal();
                 });
             });
        }
        #endregion
@@ -760,32 +892,6 @@
        #endregion
        #region ■ 传感器报警_________________________
        /// <summary>
        /// 开启传感器报警监视
        /// </summary>
        private void StartCheckDeviceAlarm()
        {
            HdlDeviceAttributeLogic.Current.AddAttributeEvent("DeviceListFormSensor", "IASInfoReport", (device) =>
             {
                 Application.RunOnMainThread(() =>
                 {
                     if (this.dicRowInfo.ContainsKey(device.DeviceAddr) == false)
                     {
                         return;
                     }
                     var row = this.dicRowInfo[device.DeviceAddr].MenuRow;
                     if (row != null)
                     {
                         row.frameTable.StartSelectStatuAppeal(3000);
                     }
                 });
             });
        }
        #endregion
        #region ■ 实现外部调用_______________________
        /// <summary>
@@ -798,6 +904,17 @@
            if (this.dicRowInfo.ContainsKey(deviceAddr) == false)
            {
                var localDevice = Common.LocalDevice.Current.GetDevicesByMac(deviceAddr);
                if (localDevice.Count == 0)
                {
                    //针对单纯只有一个200端点的设备
                    var ota = Common.LocalDevice.Current.GetOTADevice(deviceAddr);
                    if (ota == null)
                    {
                        //入网之后,又把它删了
                        return;
                    }
                    localDevice.Add(ota);
                }
                var rowNewInfo = new DeviceObjRowInfo();
                rowNewInfo.DeviceMac = deviceAddr;
                rowNewInfo.MacName = Common.LocalDevice.Current.GetDeviceMacName(localDevice[0]);
@@ -806,8 +923,6 @@
                //创建新的行
                this.AddDeviceMenuRow(deviceAddr);
                return;
            }
        }
@@ -848,23 +963,6 @@
        #endregion
        #region ■ 关闭界面___________________________
        /// <summary>
        /// 画面关闭
        /// </summary>
        public override void CloseForm()
        {
            HdlDeviceAttributeLogic.Current.RemoveEvent("DeviceListFormSensor");
            HdlDeviceAttributeLogic.Current.RemoveEvent("DeviceListFormReceivePushOnline");
            GatewayResourse.NowSelectGateway = null;
            base.CloseForm();
        }
        #endregion
        #region ■ 界面重新激活事件___________________
        /// <summary>
@@ -875,8 +973,9 @@
            if (this.nowActionDeviceMac != null)
            {
                var rowInfo = this.dicRowInfo[nowActionDeviceMac];
                //检测这个设备是否被删除
                if (Common.LocalDevice.Current.GetDevicesByMac(nowActionDeviceMac).Count == 0)
                //检测这个设备是否被删除 2020.01.13变更:追加Ota设备的判断
                if (Common.LocalDevice.Current.GetDevicesByMac(nowActionDeviceMac).Count == 0
                    && Common.LocalDevice.Current.GetOTADevice(nowActionDeviceMac) == null)
                {
                    //移除控件
                    rowInfo.dicDetailRow = null;
@@ -908,6 +1007,23 @@
        #endregion
        #region ■ 关闭界面___________________________
        /// <summary>
        /// 画面关闭
        /// </summary>
        public override void CloseFormBefore()
        {
            HdlGatewayReceiveLogic.Current.RemoveEvent("DeviceListFormSensor");
            HdlGatewayReceiveLogic.Current.RemoveEvent("DeviceListFormReceivePushOnline");
            GatewayResourse.NowSelectGateway = null;
            base.CloseFormBefore();
        }
        #endregion
        #region ■ 结构体类___________________________
        /// <summary>