using System; using System.Collections.Generic; using System.Linq.Expressions; using Shared.Common; using Shared.Phone.UserCenter.Safety; using ZigBee.Device; using static ZigBee.Device.BindObj; using static ZigBee.Device.Panel; namespace Shared.Phone.UserCenter.DeviceBind { public class PanelSimpleMutilfunctionBindSensorForm : BindCommonLayout { #region 构造函数 /// /// 构造函数 /// /// /// 1:温度传感器;2:湿度传感器 /// 绑定目标 public PanelSimpleMutilfunctionBindSensorForm(CommonDevice device, CommonDevice bindDev, int deviceBindType) { this.curControlDev = device as FreshAir; this.curBindDevice = bindDev; this.curDeviceBindType = deviceBindType; } #endregion #region 变量申明 /// /// 当前新风面板【控制设备】 /// FreshAir curControlDev; /// /// 当前被绑设备 /// CommonDevice curBindDevice; /// /// 显示被绑定设备或场景的view /// VerticalFrameRefreshControl midVerticalScrolViewLayout; /// /// 显示房间的view /// HorizontalScrolViewLayout btnHorizontalScrolViewLayout; /// /// 按键配置的目标列表 /// List targetList = new List(); /// /// 面板中已经存在的目标列表 /// List oldTargetList = new List(); /// /// 当前设备绑定类型 /// 1:新风 /// 2:温度传感器 /// 3:湿度传感器 /// 4:PM2.5传感器 /// int curDeviceBindType = 0; /// /// 本地房间列表 /// List supportRoomList = new List(); /// /// 保存完成按钮 /// Button btnFinifh; /// /// 楼层文本 /// Button btnFloorText; /// /// 楼层列表 /// Dictionary dicFloorList; /// /// 所有房间中支持被绑定的设备列表 /// List currentPanelSupportBindDeviceList = new List(); /// /// 当前房间中支持被绑定的设备列表 /// List currentRoomSupportBindDeviceList = new List(); /// /// 面板中存在的键值 /// List panelBindListKey = null; /// /// 新风绑定目标回调 /// public Action actionFreshAirTarget = null; /// /// 温度绑定目标回调 /// public Action actionTemperatureTarget = null; /// /// 湿度绑定目标回调 /// public Action actionHumidityTarget = null; /// /// PM绑定目标回调 /// public Action actionPMTarget = null; #endregion #region UI设计 /// /// 目标页显示 /// public void Show() { #region 标题栏 string titleText = ""; switch (curDeviceBindType) { case 1: titleText = Language.StringByID(R.MyInternationalizationString.BindFreshAirTarget); break; case 2: titleText = Language.StringByID(R.MyInternationalizationString.TemperatureSource); break; case 3: titleText = Language.StringByID(R.MyInternationalizationString.HumiditySource); break; case 4: titleText = Language.StringByID(R.MyInternationalizationString.PM25Source); break; } this.TopFrameLayout(this, titleText); EventHandler eHandlerBack = (sender, e) => { RemoveFromParent(); }; this.btnTitle.Width = Application.GetRealWidth(1080 - 161 - 300); this.btnBack.MouseUpEventHandler += eHandlerBack; this.btnBackFrameLayout.MouseUpEventHandler += eHandlerBack; this.MidFrameLayout(this); #endregion //添加楼层UI BindDownFrameLayout(); //标题栏下的UI MidFrameLayoutContent(); //初始化设备数据 InitData(); } /// /// 添加楼层UI /// void BindDownFrameLayout() { var btnAddFrameLayout = new FrameLayout { X = Application.GetRealWidth(619), }; this.titleFrameLayout.AddChidren(btnAddFrameLayout); btnFloorText = new Button { Width = Application.GetRealWidth(300 - 69 - 58), Text = Language.StringByID(R.MyInternationalizationString.FirstFloor), TextColor = Shared.Common.ZigbeeColor.Current.XMBlack, TextSize = 14, IsBold = true, TextAlignment = TextAlignment.CenterRight, }; btnAddFrameLayout.AddChidren(btnFloorText); var btnBindDownFrameLayout = new FrameLayout { Width = Application.GetMinReal(69 + 58), X = Application.GetRealWidth(300 - 69 - 58), }; btnAddFrameLayout.AddChidren(btnBindDownFrameLayout); var btnBindDown = new Button { Height = Application.GetMinReal(69), Width = Application.GetMinReal(69), UnSelectedImagePath = "BindPic/BindDown.png", Gravity = Gravity.CenterVertical, }; btnBindDownFrameLayout.AddChidren(btnBindDown); EventHandler eHandlerBindDown = (sender, e) => { SideslipFramelayout(); }; btnBindDown.MouseDownEventHandler += eHandlerBindDown; btnBindDownFrameLayout.MouseDownEventHandler += eHandlerBindDown; if (Common.Config.Instance.Home.FloorDics.Count == 0) { btnAddFrameLayout.Width = 0; } else { btnAddFrameLayout.Width = Application.GetRealWidth(300); } } /// /// 中部UI【标题栏下的UI】 /// async void MidFrameLayoutContent() { var btnMidTopLayout = new FrameLayout { Height = Application.GetRealHeight(389 - 184), }; this.midFrameLayout.AddChidren(btnMidTopLayout); //房间栏 btnHorizontalScrolViewLayout = new HorizontalScrolViewLayout { X = Application.GetRealWidth(58), }; btnMidTopLayout.AddChidren(btnHorizontalScrolViewLayout); //设备栏 midVerticalScrolViewLayout = new VerticalFrameRefreshControl() { Y = btnMidTopLayout.Bottom, Height = Application.GetRealHeight(1145), }; this.midFrameLayout.AddChidren(midVerticalScrolViewLayout); midVerticalScrolViewLayout.BeginHeaderRefreshingAction += () => { midVerticalScrolViewLayout.BeginHeaderRefreshing(); InitData(); }; //底部保存栏 var bottomFrameLayout = new FrameLayout() { Width = LayoutParams.MatchParent, Height = Application.GetRealHeight(127), Y = Application.GetRealHeight(1472), }; this.midFrameLayout.AddChidren(bottomFrameLayout); btnFinifh = new Button() { Width = Application.GetRealWidth(907), Gravity = Gravity.CenterHorizontal, Radius = (uint)Application.GetRealHeight(127) / 2, TextID = R.MyInternationalizationString.Save, BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack, TextColor = Shared.Common.ZigbeeColor.Current.XMWhite, IsBold = true, TextSize = 16, }; bottomFrameLayout.AddChidren(btnFinifh); btnFinifh.MouseUpEventHandler += async (sender, e) => { SaveTarget(); }; } /// /// 面板绑定目标表显示 /// /// Gateway. /// Key. void RefreshRoomList() { Room curRoom = null; if (supportRoomList.Count == 0) { return; } btnHorizontalScrolViewLayout.RemoveAll(); Button curentOldRoom = null; FrameLayout curentOldRoomFrameLayout = null; int index = 0; var roomTempList = GetSupportRoomList(); Room slectedRoom = null; for (int i = 0; i < roomTempList.Count; i++) { var room = roomTempList[i]; bool canSelect = false; if (curControlDev.currentSelectRoomId == room.Id) { slectedRoom = room; canSelect = true; } //房间 var btnRoomFrameLayout = new FrameLayout { Height = Application.GetMinReal(159), Width = Application.GetMinReal(255), Y = Application.GetRealHeight(23), X = Application.GetRealWidth(5), BackgroundImagePath = "Item/RoomIconBackground.png", BorderWidth = 1, }; btnHorizontalScrolViewLayout.AddChidren(btnRoomFrameLayout); var btnRoom = new Button { Height = Application.GetRealHeight(58), Width = Application.GetRealWidth(127), Y = Application.GetRealHeight(58), X = Application.GetRealWidth(14), Text = room.Name, TextSize = 12, TextColor = Shared.Common.ZigbeeColor.Current.XMGray3, Gravity = Gravity.Center, }; btnRoomFrameLayout.AddChidren(btnRoom); btnRoom.IsSelected = false; if (canSelect) { btnRoomFrameLayout.BackgroundImagePath = "Item/RoomIconBackgroundSelected.png"; btnRoom.TextColor = Shared.Common.ZigbeeColor.Current.XMWhite; curentOldRoom = btnRoom; curentOldRoomFrameLayout = btnRoomFrameLayout; } //被绑定的目标还未分配区域,默认是第一个 if (string.IsNullOrEmpty(curControlDev.currentSelectRoomId)) { if (index == 0) { btnRoomFrameLayout.BackgroundImagePath = "Item/RoomIconBackgroundSelected.png"; btnRoom.TextColor = Shared.Common.ZigbeeColor.Current.XMWhite; curentOldRoom = btnRoom; curentOldRoomFrameLayout = btnRoomFrameLayout; } } if (index == roomTempList.Count - 1 && index > 3) { var btnRoomFrameLayoutEmpty = new FrameLayout { Height = Application.GetMinReal(159), Width = Application.GetMinReal(50), Y = Application.GetRealHeight(23), X = Application.GetRealWidth(5), BorderWidth = 1, }; btnHorizontalScrolViewLayout.AddChidren(btnRoomFrameLayoutEmpty); } EventHandler eHandlerRoom = (sender, e) => { if (!btnRoom.IsSelected) { if (curentOldRoom != null) { curentOldRoom.TextColor = Shared.Common.ZigbeeColor.Current.XMGray3; } curentOldRoom = btnRoom; curentOldRoom.TextColor = Shared.Common.ZigbeeColor.Current.XMWhite; } if (btnRoomFrameLayout.BorderWidth == 1) { if (curentOldRoomFrameLayout != null) { curentOldRoomFrameLayout.BorderWidth = 1; curentOldRoomFrameLayout.BorderColor = Shared.Common.ZigbeeColor.Current.XMOrange; curentOldRoomFrameLayout.BackgroundImagePath = "Item/RoomIconBackground.png"; } curentOldRoomFrameLayout = btnRoomFrameLayout; curentOldRoomFrameLayout.BorderWidth = 0; curentOldRoomFrameLayout.BackgroundImagePath = "Item/RoomIconBackgroundSelected.png"; } curRoom = room; //新风面板保存使能 btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; RefreshDeviceList(curRoom); }; btnRoom.MouseUpEventHandler += eHandlerRoom; btnRoomFrameLayout.MouseUpEventHandler += eHandlerRoom; index++; } BindInfo.FinishDisplay(roomTempList, btnFinifh); if (roomTempList.Count == 0) { curRoom = new Shared.Common.Room(); } else { if (slectedRoom == null) { curRoom = roomTempList[0]; } else { curRoom = slectedRoom; } } RefreshDeviceList(curRoom); } /// /// 按键绑目标表显示 /// /// void RefreshDeviceList(Room curRoom) { midVerticalScrolViewLayout.RemoveAll(); Button oldDevice = null; int curIndex = 0; currentRoomSupportBindDeviceList = GetCurRoomSupportDeviceList(curRoom); if (currentRoomSupportBindDeviceList.Count == 0) { btnFinifh.Enable = false; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMUnSelect; return; } foreach (var device in currentRoomSupportBindDeviceList) { #region 绑定表UI显(无数据处理) var rowLayout = new FrameLayout() { Height = Application.GetRealHeight(23 + 127), BackgroundColor = Shared.Common.ZigbeeColor.Current.XMWhite, }; midVerticalScrolViewLayout.AddChidren(rowLayout); var devicePic = new Button() { X = Application.GetMinRealAverage(58), Y = Application.GetMinRealAverage(46), Width = Application.GetMinRealAverage(81), Height = Application.GetMinRealAverage(81), UnSelectedImagePath = device.IconPath, }; rowLayout.AddChidren(devicePic); var btnBindName = new Button() { Width = Application.GetRealWidth(790), X = devicePic.Right + Application.GetRealWidth(20), TextColor = Shared.Common.ZigbeeColor.Current.TextBlack, TextAlignment = TextAlignment.CenterLeft, TextSize = 15, Text = Common.LocalDevice.Current.GetDeviceEpointName(device), }; rowLayout.AddChidren(btnBindName); var btnChoose = new Button() { Width = Application.GetMinReal(60), Height = Application.GetMinReal(60), X = Application.GetRealWidth(861 + 81), Y = Application.GetRealHeight(35), SelectedImagePath = "DoorLock/SelectedIcon.png", Visible = false, }; rowLayout.AddChidren(btnChoose); var line2 = new Button() { Y = rowLayout.Height - 1, X = devicePic.Right + Application.GetRealWidth(20), Width = Application.GetRealWidth(965 - 116), Height = 1, BackgroundColor = Shared.Common.ZigbeeColor.Current.XMRowLine, }; rowLayout.AddChidren(line2); if (curIndex == currentRoomSupportBindDeviceList.Count - 1) { line2.Visible = false; } switch (curDeviceBindType) { case 1: devicePic.UnSelectedImagePath = "Device/FreshAirEpoint.png"; break; case 2: devicePic.UnSelectedImagePath = "Device/SensorTemperature.png"; if (device.Type == DeviceType.PMSensor) { btnBindName.Text = Common.LocalDevice.Current.GetDeviceEpointName(device) + "-" + Language.StringByID(R.MyInternationalizationString.TemperatureSensor); } break; case 3: devicePic.UnSelectedImagePath = "Device/SensorHumidity.png"; if (device.Type == DeviceType.PMSensor) { btnBindName.Text = Common.LocalDevice.Current.GetDeviceEpointName(device) + "-" + Language.StringByID(R.MyInternationalizationString.HumiditySensor); } break; case 4: devicePic.UnSelectedImagePath = "Device/AirQualitySensorEpoint.png"; break; } #endregion string mianKey = device.DeviceAddr + device.DeviceEpoint; if (targetList.Count != 0) { foreach (var bindedDev in targetList) { if (bindedDev.DeviceAddr + bindedDev.DeviceEpoint == mianKey) { btnChoose.IsSelected = true; btnChoose.Visible = true; oldDevice = btnChoose; } } } EventHandler hander = (sender, e) => { btnChoose.IsSelected = !btnChoose.IsSelected; if (!btnChoose.IsSelected) { if (oldDevice != null) { oldDevice.IsSelected = false; oldDevice.Visible = false; } oldDevice = btnChoose; oldDevice.IsSelected = false; oldDevice.Visible = false; targetList.Clear(); } else { if (oldDevice != null) { oldDevice.IsSelected = false; oldDevice.Visible = false; } oldDevice = btnChoose; oldDevice.IsSelected = true; oldDevice.Visible = true; targetList.Clear(); targetList.Add(device); } //新风面板:由于目标没有提供删除接口,所以可以取消选中能保存 btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; }; rowLayout.MouseUpEventHandler += hander; devicePic.MouseUpEventHandler += hander; btnBindName.MouseUpEventHandler += hander; btnChoose.MouseUpEventHandler += hander; curIndex++; } } /// /// 楼层选择的侧边栏 /// void SideslipFramelayout() { var dialog = new Dialog { }; dialog.Show(); var flMain = new FrameLayout { BackgroundColor = 0x00000000 }; dialog.AddChidren(flMain); flMain.MouseUpEventHandler += (sender11, e11) => { dialog.Close(); }; var sidelipFrameLayout = new FrameLayout() { Width = Application.GetMinReal(449), Y = Application.GetRealHeight(161), X = Application.GetRealWidth(596), BackgroundImagePath = "DoorLock/SideslipPic.png", }; flMain.AddChidren(sidelipFrameLayout); var btnSelectFloor = new Button() { Width = Application.GetRealWidth(200), Height = Application.GetRealHeight(58), X = Application.GetRealWidth(81), Y = Application.GetRealHeight(81), TextColor = Shared.Common.ZigbeeColor.Current.XMBlack, TextSize = 14, IsBold = true, TextAlignment = TextAlignment.CenterLeft, TextID = R.MyInternationalizationString.SelectFloor, }; sidelipFrameLayout.AddChidren(btnSelectFloor); var sidelipVerticalScrolViewLayout = new VerticalScrolViewLayout() { Y = btnSelectFloor.Bottom + Application.GetRealHeight(45), Height = Application.GetRealHeight(600), }; sidelipFrameLayout.AddChidren(sidelipVerticalScrolViewLayout); Button oldbutton = null; Button oldbuttonText = null; int count = 0; foreach (var floorId in dicFloorList.Keys) { var rowFrameLayout = new RowLayout() { Height = Application.GetRealHeight(152), LineColor = Shared.Common.ZigbeeColor.Current.XMRowLine, X = Application.GetRealWidth(81), }; sidelipVerticalScrolViewLayout.AddChidren(rowFrameLayout); var btnAllMethod = new Button() { Width = Application.GetMinReal(81), Height = Application.GetMinReal(81), UnSelectedImagePath = "Floor/Floor.png", SelectedImagePath = "Floor/FloorSelected.png", Gravity = Gravity.CenterVertical, }; rowFrameLayout.AddChidren(btnAllMethod); var btnMethodText = new Button() { Width = Application.GetRealWidth(311), Height = Application.GetRealHeight(58), X = Application.GetRealWidth(92), Gravity = Gravity.CenterVertical, TextColor = Shared.Common.ZigbeeColor.Current.XMGray3, TextSize = 14, TextAlignment = TextAlignment.CenterLeft, Text = dicFloorList[floorId], }; rowFrameLayout.AddChidren(btnMethodText); if (curControlDev.currentSelectFloorId == floorId) { btnAllMethod.IsSelected = true; btnAllMethod.IsBold = true; btnMethodText.TextColor = Shared.Common.ZigbeeColor.Current.XMBlack; } string curFloorId = floorId; EventHandler hander = (sender, e) => { if (curControlDev.currentSelectFloorId == curFloorId) { return; } curControlDev.currentSelectFloorId = curFloorId; btnFloorText.Text = dicFloorList[floorId]; //获取楼层中房间列表 supportRoomList = GetFloorRoomList(); if (!btnMethodText.IsSelected) { if (oldbutton != null) { oldbutton.IsSelected = false; } if (oldbuttonText != null) { oldbuttonText.TextColor = Shared.Common.ZigbeeColor.Current.XMGray3; } oldbutton = btnMethodText; oldbuttonText = btnMethodText; btnMethodText.IsSelected = true; oldbuttonText.TextColor = Shared.Common.ZigbeeColor.Current.XMBlack; oldbuttonText.IsBold = true; } int index = 0; RefreshRoomList(); dialog.Close(); }; btnAllMethod.MouseUpEventHandler += hander; rowFrameLayout.MouseUpEventHandler += hander; btnMethodText.MouseUpEventHandler += hander; count++; } if (count == 0) { sidelipFrameLayout.Height = 0; } else if (count <= 4 && count > 0) { sidelipFrameLayout.Height = Application.GetRealHeight(180) + count * Application.GetRealHeight(150); } else { sidelipFrameLayout.Height = Application.GetMinReal(780); } } #endregion #region 数据处理 /// /// 初始化设备数据 /// void InitData() { System.Threading.Tasks.Task.Run(async () => { try { Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); }); //获取被绑目标等信息 BindDevInfo(curBindDevice); //获取楼层 dicFloorList = HdlRoomLogic.Current.GetFloorSortList(); //获取楼层中房间列表 supportRoomList = GetFloorRoomList(); //获取所有房间中匹配的能绑的目标 currentPanelSupportBindDeviceList = GetAllRoomSupportDeviceList(); //获取面板中存在的绑定目标 var panelBindListRes = HdlDeviceBindLogic.Current.GetDeviceBindAsync(curControlDev); if (panelBindListRes != null && panelBindListRes.getAllBindResponseData != null) { curControlDev.bindList.Clear(); foreach (var bDev in panelBindListRes.getAllBindResponseData.BindList) { curControlDev.bindList.Add(bDev); } } else { Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); midVerticalScrolViewLayout.EndHeaderRefreshing(); new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(Common.CommonPage.Instance); }); } targetList.Clear(); //选中目标列表 targetList if (currentPanelSupportBindDeviceList.Count != 0 && curControlDev.bindList.Count != 0) { foreach (var bindDev in curControlDev.bindList) { var mainKey = bindDev.BindMacAddr + bindDev.BindEpoint; var dev = currentPanelSupportBindDeviceList.Find(obj => (obj != null) && (obj.DeviceAddr + obj.DeviceEpoint == mainKey)); if (dev != null) { var device = LocalDevice.Current.GetDevice(dev.DeviceAddr, dev.DeviceEpoint); if (device != null) { switch (curDeviceBindType) { case 1: //获取设备类型的 var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List() { device }); //新风面板的新风设备,则不显示 if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_FangyueFreshAir) { continue; } if (device.Type == DeviceType.FreshAir) { targetList.Add(device); oldTargetList.Add(device); } break; case 2: if (device.Type == DeviceType.TemperatureSensor) { var bDev = device as TemperatureSensor; if (bDev.SensorDiv == 1) { targetList.Add(device); oldTargetList.Add(device); } } if (device.Type == DeviceType.PMSensor) { if (bindDev.BindCluster == 1026) { targetList.Add(device); oldTargetList.Add(device); } } break; case 3: if (device.Type == DeviceType.TemperatureSensor) { var bDev = device as TemperatureSensor; if (bDev.SensorDiv == 2) { targetList.Add(device); oldTargetList.Add(device); } } if (device.Type == DeviceType.FreshAirHumiditySensor) { targetList.Add(device); oldTargetList.Add(device); } if (device.Type == DeviceType.PMSensor) { if (bindDev.BindCluster == 1029) { targetList.Add(device); oldTargetList.Add(device); } } break; case 4: //PM2.5 if (device.Type == DeviceType.PMSensor) { if (bindDev.BindCluster == 1066) { targetList.Add(device); oldTargetList.Add(device); } } break; } } } } } } catch (Exception ex) { var mess = ex.Message; } finally { Application.RunOnMainThread(() => { //首次是否能点击保存 if (targetList.Count == 0) { curControlDev.currentSelectFloorId = BindInfo.GetCurrentSelectFloorId(); curControlDev.currentSelectRoomId = null; if (BindInfo.GetCurrentSelectFloorIdName() != null) { Application.RunOnMainThread(() => { btnFloorText.Text = BindInfo.GetCurrentSelectFloorIdName(); }); } btnFinifh.Enable = false; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMUnSelect; } else { foreach (var dev in targetList) { //获取本地设备列表 var localDeviceList = Shared.Common.LocalDevice.Current.listAllDevice; var tempDev = localDeviceList.Find(obj => obj.DeviceAddr == dev.DeviceAddr && obj.DeviceEpoint == dev.DeviceEpoint); if (tempDev != null) { //获取设备所属房间 var tempDevRoom = HdlRoomLogic.Current.GetRoomByDevice(tempDev); if (tempDevRoom != null) { curControlDev.currentSelectRoomId = tempDevRoom.Id; curControlDev.currentSelectFloorId = tempDevRoom.FloorId; } } } if (!string.IsNullOrEmpty(curControlDev.currentSelectFloorId)) { if (BindInfo.GetBindTargetsFloorIdName(curControlDev.currentSelectFloorId) != null) { btnFloorText.Text = BindInfo.GetBindTargetsFloorIdName(curControlDev.currentSelectFloorId); } } btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; } //获取楼层中房间列表 if (supportRoomList.Count != 0) { RefreshRoomList(); } CommonPage.Loading.Hide(); midVerticalScrolViewLayout.EndHeaderRefreshing(); }); } }); } /// /// 保存目标 /// /// void SaveTarget() { btnFinifh.Enable = false; if (targetList.Count == 0) { //空目标 System.Threading.Tasks.Task.Run(async () => { try { Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); }); if (oldTargetList.Count != 0) { //删除取消的目标 foreach (var bd in oldTargetList) { var delDevice = new DelDeviceBindData(); delDevice.DeviceAddr = curControlDev.DeviceAddr; delDevice.Epoint = curControlDev.DeviceEpoint; var removeDevice = new RemoveBindListObj(); removeDevice.BindType = 0; switch (curDeviceBindType) { case 1: removeDevice.BindCluster = 514; break; case 2: removeDevice.BindCluster = 1026; break; case 3: removeDevice.BindCluster = 1029; break; case 4: //PM2.5 removeDevice.BindCluster = 1066; break; } removeDevice.BindMacAddr = bd.DeviceAddr; removeDevice.BindEpoint = bd.DeviceEpoint; delDevice.RemoveBindList.Add(removeDevice); var delResult = new DelDeviceBindResponseAllData(); delResult = HdlDeviceBindLogic.Current.DelDeviceBindAsync(delDevice); if (delResult == null) { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } else { if (delResult.removeBindResultResponseData == null) { if (delResult.delDeviceBindResponseData != null) { foreach (var d in delResult.delDeviceBindResponseData.RemoveBindList) { if (d.Result == 1) { switch (curDeviceBindType) { case 1: if (actionFreshAirTarget != null) { actionFreshAirTarget(""); } break; case 2: if (actionTemperatureTarget != null) { actionTemperatureTarget(""); } break; case 3: if (actionHumidityTarget != null) { actionHumidityTarget(""); } break; case 4: if (actionPMTarget != null) { actionPMTarget(""); } break; } Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; this.RemoveFromParent(); }); } else { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } } } } else { if (delResult.removeBindResultResponseData.Result == 0) { switch (curDeviceBindType) { case 1: if (actionFreshAirTarget != null) { actionFreshAirTarget(""); } break; case 2: if (actionTemperatureTarget != null) { actionTemperatureTarget(""); } break; case 3: if (actionHumidityTarget != null) { actionHumidityTarget(""); } break; case 4: if (actionPMTarget != null) { actionPMTarget(""); } break; } Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; this.RemoveFromParent(); }); } else { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } } } } } else { //没有目标提示 Application.RunOnMainThread(() => { var myTip = new Tip(); myTip.Direction = AMPopTipDirection.None; myTip.CloseTime = 2; myTip.Text = Language.StringByID(R.MyInternationalizationString.BindDeviceTargetIsEmpty); myTip.Show(Common.CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } } catch (Exception ex) { var mess = ex.Message; Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); }); btnFinifh.Enable = true; } }); } else { //选中目标 //1、已经绑定过的目标 if (checkExistDevice()) { Application.RunOnMainThread(() => { var myTip = new Tip(); myTip.Direction = AMPopTipDirection.None; myTip.CloseTime = 2; myTip.Text = Language.StringByID(R.MyInternationalizationString.BindExist); myTip.Show(Common.CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; }); return; } System.Threading.Tasks.Task.Run(async () => { try { Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); }); //删除已经存在的目标 if (oldTargetList.Count != 0) { foreach (var bd in oldTargetList) { var delDevice = DelBindDevice(bd); var delResult = new DelDeviceBindResponseAllData(); delResult = HdlDeviceBindLogic.Current.DelDeviceBindAsync(delDevice); if (delResult == null) { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } else { if (delResult.removeBindResultResponseData == null) { if (delResult.delDeviceBindResponseData != null) { foreach (var d in delResult.delDeviceBindResponseData.RemoveBindList) { if (d.Result != 1) { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } } } } } if (delResult != null && delResult.removeBindResultResponseData != null) { if (delResult.removeBindResultResponseData.Result != 0) { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } } } } else { //检测已经绑定的目标是否不在本地或者没有分配到任何房间中 //此时需要删除已经被绑定到目标,才能继续绑定新目标 if (curBindDevice != null) { var delDevice = DelBindDevice(curBindDevice); var delResult = new DelDeviceBindResponseAllData(); delResult = HdlDeviceBindLogic.Current.DelDeviceBindAsync(delDevice); if (delResult == null) { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } else { if (delResult.removeBindResultResponseData == null) { if (delResult.delDeviceBindResponseData != null) { foreach (var d in delResult.delDeviceBindResponseData.RemoveBindList) { if (d.Result != 1) { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } } } } } if (delResult != null && delResult.removeBindResultResponseData != null) { if (delResult.removeBindResultResponseData.Result != 0) { Application.RunOnMainThread(() => { new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; CommonPage.Loading.Hide(); }); return; } } } } //2、添加新的目标 string bindName = ""; var addBindeDev = new AddBindData(); addBindeDev.DeviceAddr = curControlDev.DeviceAddr; addBindeDev.Epoint = curControlDev.DeviceEpoint; foreach (var de in targetList) { var addBindInfo = new AddBindListObj(); switch (curDeviceBindType) { case 1: addBindInfo.BindCluster = 514; break; case 2: addBindInfo.BindCluster = 1026; break; case 3: addBindInfo.BindCluster = 1029; break; case 4: //PM2.5 addBindInfo.BindCluster = 1066; break; } addBindInfo.BindType = 0; addBindInfo.BindMacAddr = de.DeviceAddr; addBindInfo.BindEpoint = de.DeviceEpoint; addBindeDev.BindName = Common.LocalDevice.Current.GetDeviceEpointName(de); switch (curDeviceBindType) { case 2: if (de.Type == DeviceType.PMSensor) { addBindeDev.BindName = Common.LocalDevice.Current.GetDeviceEpointName(de) + "-" + Language.StringByID(R.MyInternationalizationString.TemperatureSensor); } break; case 3: if (de.Type == DeviceType.PMSensor) { addBindeDev.BindName = Common.LocalDevice.Current.GetDeviceEpointName(de) + "-" + Language.StringByID(R.MyInternationalizationString.HumiditySensor); } break; } addBindeDev.BindList.Add(addBindInfo); } var dev = new AddedDeviceBindResponseAllData(); dev = HdlDeviceBindLogic.Current.AddDeviceBindAsync(addBindeDev); if (dev == null || dev.addedDeviceBindResponseData == null) { Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; return; }); } else { if (dev.addedDeviceBindResponseData.Result == 0) { targetList.Clear(); switch (curDeviceBindType) { case 1: if (actionFreshAirTarget != null) { actionFreshAirTarget(addBindeDev.BindName); } break; case 2: if (actionTemperatureTarget != null) { actionTemperatureTarget(addBindeDev.BindName); } break; case 3: if (actionHumidityTarget != null) { actionHumidityTarget(addBindeDev.BindName); } break; case 4: if (actionPMTarget != null) { actionPMTarget(addBindeDev.BindName); } break; } Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; this.RemoveFromParent(); }); } else if (dev.addedDeviceBindResponseData.Result == 1) { Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindFailed), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); }); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; return; } else { Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.BindUnknownError), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance); }); btnFinifh.Enable = true; btnFinifh.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack; return; } } } catch (Exception ex) { Application.RunOnMainThread(() => { CommonPage.Loading.Hide(); }); btnFinifh.Enable = true; var mess = ex.Message; } }); } } /// /// 当前被绑定设备所属楼层和房间 /// /// void BindDevInfo(CommonDevice bindDev) { if (bindDev == null) { return; } //获取本地设备列表 var localDeviceList = Shared.Common.LocalDevice.Current.listAllDevice; var tempDev = localDeviceList.Find(obj => obj.DeviceAddr == bindDev.DeviceAddr && obj.DeviceEpoint == bindDev.DeviceEpoint); if (tempDev != null) { //获取设备所属房间 var tempDevRoom = HdlRoomLogic.Current.GetRoomByDevice(tempDev); if (tempDevRoom != null) { curControlDev.currentSelectRoomId = tempDevRoom.Id; curControlDev.currentSelectFloorId = tempDevRoom.FloorId; } } } /// /// 检测目标是否被绑定过 /// /// private bool checkExistDevice() { bool exist = false; foreach (var oldDev in oldTargetList) { var key = oldDev.DeviceAddr + oldDev.DeviceEpoint; var result = targetList.Find(obj => (obj != null) && (obj.DeviceAddr + obj.DeviceEpoint == key)); if (result != null) { exist = true; } else { exist = false; } } return exist; } /// /// 检测已经绑定的目标是否不在本地或者没有分配到任何房间中 /// /// private DelDeviceBindData DelBindDevice(CommonDevice bd) { var delDevice = new DelDeviceBindData(); delDevice.DeviceAddr = curControlDev.DeviceAddr; delDevice.Epoint = curControlDev.DeviceEpoint; var removeDevice = new RemoveBindListObj(); removeDevice.BindType = 0; switch (curDeviceBindType) { case 1: removeDevice.BindCluster = 514; break; case 2: removeDevice.BindCluster = 1026; break; case 3: removeDevice.BindCluster = 1029; break; case 4: //PM2.5 removeDevice.BindCluster = 1066; break; } removeDevice.BindMacAddr = bd.DeviceAddr; removeDevice.BindEpoint = bd.DeviceEpoint; delDevice.RemoveBindList.Add(removeDevice); return delDevice; } /// /// 能显示的房间列表 /// private List GetSupportRoomList() { var roomTempList = new List(); for (int i = 0; i < supportRoomList.Count; i++) { var room = supportRoomList[i]; //如果房间为喜爱[后来改名为常用房间],则不显示 if (room.IsLove == true) { continue; } //如果房间中没有设备,则不显示 if (room.ListDevice.Count == 0) { continue; } else { List roomIncludeMatchDevice = new List(); //房间中没有对应的支持绑定的目标 switch (curDeviceBindType) { case 1: foreach (var de in room.ListDevice) { var device = LocalDevice.Current.GetDevice(de); if (device != null) { //获取设备类型的 var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List() { device }); //新风面板的新风设备,则不显示 if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_FangyueFreshAir) { continue; } if (device.Type == DeviceType.FreshAir) { roomIncludeMatchDevice.Add(device); } } } break; case 2: roomIncludeMatchDevice = GetMatchTemperatureSensorDevice(room); break; case 3: roomIncludeMatchDevice = GetMatchHumiditySensorDevice(room); foreach (var de in room.ListDevice) { var device = LocalDevice.Current.GetDevice(de); if (device != null) { if (device.Type == DeviceType.FreshAirHumiditySensor) { roomIncludeMatchDevice.Add(device); } } } break; case 4: foreach (var de in room.ListDevice) { var device = LocalDevice.Current.GetDevice(de); if (device != null) { if (device.Type == DeviceType.PMSensor) { roomIncludeMatchDevice.Add(device); } } } break; } if (roomIncludeMatchDevice.Count == 0) { continue; } if (!string.IsNullOrEmpty(room.FloorId)) { //有楼层 if (room.FloorId == curControlDev.currentSelectFloorId) { roomTempList.Add(room); } } else { //没有楼层 roomTempList.Add(room); } } } return roomTempList; } /// /// 匹配温度传感器 /// /// List GetMatchTemperatureSensorDevice(Room room) { List roomIncludeMatchTempDevice = new List(); foreach (var de in room.ListDevice) { var device = LocalDevice.Current.GetDevice(de); if (device != null) { //电池设备不支持绑定 if (device.ZigbeeType != 1) { continue; } if (device.Type == DeviceType.TemperatureSensor) { var dev = device as TemperatureSensor; if (dev.SensorDiv == 1) { roomIncludeMatchTempDevice.Add(device); } } else if (device.Type == DeviceType.PMSensor) { var dev = device as PMSensor; foreach (var clu in dev.InClusterList) { if (clu.InCluster == 1026) { roomIncludeMatchTempDevice.Add(device); } } } } } return roomIncludeMatchTempDevice; } /// /// 匹配湿度传感器 /// /// List GetMatchHumiditySensorDevice(Room room) { List roomIncludeMatchHumpDevice = new List(); foreach (var de in room.ListDevice) { var device = LocalDevice.Current.GetDevice(de); if (device != null) { //电池设备不支持绑定 if (device.ZigbeeType != 1) { continue; } if (device.Type == DeviceType.TemperatureSensor) { var dev = device as TemperatureSensor; if (dev.SensorDiv == 2) { roomIncludeMatchHumpDevice.Add(device); } } else if (device.Type == DeviceType.PMSensor) { var dev = device as PMSensor; foreach (var clu in dev.InClusterList) { if (clu.InCluster == 1029) { roomIncludeMatchHumpDevice.Add(device); } } } } } return roomIncludeMatchHumpDevice; } /// /// 获取楼层对应的房间列表 /// /// private List GetFloorRoomList() { supportRoomList.Clear(); var supportRoomListTemp = new List(); var listAllRoom = HdlRoomLogic.Current.GetAllListRooms(); if (Common.Config.Instance.Home.FloorDics.Count == 0) { // 获取没有楼层房间 foreach (var room in listAllRoom) { if (string.IsNullOrEmpty(room.FloorId)) { if (room.IsLove) { continue; } supportRoomListTemp.Add(room); } } } else { // 获取支持的房间 foreach (var room in listAllRoom) { if (room.IsLove) { continue; } supportRoomListTemp.Add(room); } } return supportRoomListTemp; } /// /// 所有房间中匹配的支持绑定的所有目标列表 /// /// List GetAllRoomSupportDeviceList() { currentPanelSupportBindDeviceList.Clear(); List currentPanelBindSupportDeviceListTemp = new List(); switch (curDeviceBindType) { case 1: foreach (var r in supportRoomList) { if (r.ListDevice.Count == 0) { continue; } foreach (var deviceKeys in r.ListDevice) { var device = LocalDevice.Current.GetDevice(deviceKeys); if (device != null) { //获取设备类型的 var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List() { device }); //新风面板的新风设备,则不显示 if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_FangyueFreshAir) { continue; } if (device.Type == DeviceType.FreshAir) { currentPanelBindSupportDeviceListTemp.Add(device); } } } } break; case 2: foreach (var r in supportRoomList) { if (r.ListDevice.Count == 0) { continue; } var deviceListTemp = GetMatchTemperatureSensorDevice(r); foreach (var dev in deviceListTemp) { currentPanelBindSupportDeviceListTemp.Add(dev); } } break; case 3: foreach (var r in supportRoomList) { if (r.ListDevice.Count == 0) { continue; } var deviceListTemp = GetMatchHumiditySensorDevice(r); foreach (var dev in deviceListTemp) { currentPanelBindSupportDeviceListTemp.Add(dev); } foreach (var deviceKeys in r.ListDevice) { var device = LocalDevice.Current.GetDevice(deviceKeys); if (device != null) { if (device.Type == DeviceType.FreshAirHumiditySensor) { currentPanelBindSupportDeviceListTemp.Add(device); } } } } break; case 4: foreach (var r in supportRoomList) { if (r.ListDevice.Count == 0) { continue; } foreach (var deviceKeys in r.ListDevice) { var device = LocalDevice.Current.GetDevice(deviceKeys); if (device != null) { if (device.Type == DeviceType.PMSensor) { currentPanelBindSupportDeviceListTemp.Add(device); } } } } break; } return currentPanelBindSupportDeviceListTemp; } /// /// 获取当前房间中匹配的支持绑定的设备列表 /// /// List GetCurRoomSupportDeviceList(Room curRoom) { currentRoomSupportBindDeviceList.Clear(); List curRoomDeviceListTemp = new List(); switch (curDeviceBindType) { case 1: foreach (var deviceKeys in curRoom.ListDevice) { var device = LocalDevice.Current.GetDevice(deviceKeys); if (device != null) { //获取设备类型的 var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List() { device }); //新风面板的新风设备,则不显示 if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_FangyueFreshAir) { continue; } if (device.Type == DeviceType.FreshAir) { curRoomDeviceListTemp.Add(device); } } } break; case 2: curRoomDeviceListTemp = GetMatchTemperatureSensorDevice(curRoom); break; case 3: curRoomDeviceListTemp = GetMatchHumiditySensorDevice(curRoom); foreach (var deviceKeys in curRoom.ListDevice) { var device = LocalDevice.Current.GetDevice(deviceKeys); if (device != null) { if (device.Type == DeviceType.FreshAirHumiditySensor) { curRoomDeviceListTemp.Add(device); } } } break; case 4: foreach (var deviceKeys in curRoom.ListDevice) { var device = LocalDevice.Current.GetDevice(deviceKeys); if (device != null) { if (device.Type == DeviceType.PMSensor) { curRoomDeviceListTemp.Add(device); } } } break; } return curRoomDeviceListTemp; } #endregion #region 移除方法 /// /// 重写移除方法 /// public override void RemoveFromParent() { actionFreshAirTarget = null; actionTemperatureTarget = null; actionHumidityTarget = null; actionPMTarget = null; base.RemoveFromParent(); } #endregion } }