using System; using System.Collections.Generic; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter.Safety { /// /// 安防管理的主界面★ /// public class SafetyManagementMainForm : UserCenterCommonForm { #region ■ 变量声明___________________________ /// /// 桌布控件,用于存放或者移除功能块控件(Tab控件专用) /// private FrameLayout frameLayoutDraw = null; /// /// Tab的选择。1:安防记录Tab 2:传感器状态Tab /// private int TabSelectIndex = 2; /// /// 在家布防的桌布控件,三个图标(设置了内部防区的) /// private StatuFrameLayout frameTableThreeIcon = null; /// /// 布防的桌布控件,两个图标(没有设置内部防区的) /// private StatuFrameLayout frameTableTwoIcon = null; /// /// 布防的图标(没有设置内部防区显示的图标) /// private IconViewControl btnAtHomeIconTwo = null; /// /// 在家布防的图标(设置了内部防区显示的图标) /// private IconViewControl btnAtHomeIconThree = null; /// /// 离家布防的图标 /// private IconViewControl btnRemoveHomeIcon = null; /// /// 在线状态的锁 /// private object objOnlineLock = new object(); #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// public void ShowForm() { //设置头部信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.SafetyManagement)); //初始化中部信息 this.InitMiddleFrame(); } /// /// 初始化中部信息 /// private void InitMiddleFrame() { //初始化头部的那三个图标 FrameLayout frameLayout = this.InitTopImageControl(); //初始化Tab控件 this.InitTabSwitchControl(frameLayout.Bottom); if (UserCenterResourse.UserInfo.AuthorityNo == 1 || UserCenterResourse.UserInfo.AuthorityNo == 2) { //初始化右上角图标 this.InitTopRightIcon(); } //初始化全部内存信息 this.InitAllMemoryData(); } /// /// 初始化头部的那三个图标 /// private FrameLayout InitTopImageControl() { int height = 400; //三个图标的各自frameLayout的宽度 int width = 320; //最外层 var frameLayout = new FrameLayout(); frameLayout.Height = Application.GetRealHeight(height); bodyFrameLayout.AddChidren(frameLayout); #region ■ 两个图的(很麻烦的东西)_____ //包含两个图的桌布 -> 没有设置内部防区(至于底部) this.frameTableTwoIcon = new StatuFrameLayout(width * 2, height); frameTableTwoIcon.Gravity = Gravity.Center; frameTableTwoIcon.Visible = false; frameLayout.AddChidren(frameTableTwoIcon); //布防的桌布 var frameGarrison = new StatuFrameLayout(width, height); frameTableTwoIcon.AddChidren(frameGarrison); //布防的图标 this.btnAtHomeIconTwo = new IconViewControl(162); btnAtHomeIconTwo.Y = Application.GetRealHeight(90); btnAtHomeIconTwo.UnSelectedImagePath = "Safeguard/ProtectionAtHome.png"; btnAtHomeIconTwo.SelectedImagePath = "Safeguard/ProtectionAtHomeSelected.png"; btnAtHomeIconTwo.Gravity = Gravity.CenterHorizontal; frameGarrison.AddChidren(btnAtHomeIconTwo, ChidrenBindMode.BindEventOnly); //布防的文字 var btnAtHomeViewTwo = new ViewNormalControl(width, true); btnAtHomeViewTwo.Y = btnAtHomeIconTwo.Bottom; btnAtHomeViewTwo.TextID = R.MyInternationalizationString.uAtHomeGarrison; btnAtHomeViewTwo.TextAlignment = TextAlignment.Center; frameGarrison.AddChidren(btnAtHomeViewTwo, ChidrenBindMode.BindEventOnly); //在家布防 frameGarrison.MouseUpEvent = (sender, e) => { if (btnAtHomeIconTwo.IsSelected == false) { this.SetSafetyGarrisonModeInAtHome(); } }; //撤防的桌布 var frameReGarrisonTwo = new StatuFrameLayout(width, height); frameReGarrisonTwo.X = frameGarrison.Right; frameTableTwoIcon.AddChidren(frameReGarrisonTwo); //撤防的图标 var btnReGarrisonIconTwo = new IconViewControl(162); btnReGarrisonIconTwo.Y = btnAtHomeIconTwo.Y; btnReGarrisonIconTwo.UnSelectedImagePath = "Safeguard/WithdrawGarrison.png"; btnReGarrisonIconTwo.SelectedImagePath = "Safeguard/WithdrawGarrisonSelected.png"; btnReGarrisonIconTwo.Gravity = Gravity.CenterHorizontal; frameReGarrisonTwo.AddChidren(btnReGarrisonIconTwo); //撤防的文字 var btnReGarrisonTextTwo = new ViewNormalControl(width, true); btnReGarrisonTextTwo.Y = btnAtHomeViewTwo.Y; btnReGarrisonTextTwo.TextID = R.MyInternationalizationString.uWithdrawGarrison; btnReGarrisonTextTwo.TextAlignment = TextAlignment.Center; frameReGarrisonTwo.AddChidren(btnReGarrisonTextTwo, ChidrenBindMode.BindEventOnly); //撤防 frameReGarrisonTwo.MouseUpEvent = (sender, e) => { this.RemoveSafetyGarrisonMode(); }; #endregion #region ■ 三个图的(很麻烦的东西)_____ //包含三个图的 -> 设置了内部防区(至于上部) this.frameTableThreeIcon = new StatuFrameLayout(width * 3, height); this.frameTableThreeIcon.Visible = false; frameTableThreeIcon.Gravity = Gravity.Center; frameLayout.AddChidren(frameTableThreeIcon); //在家布防的桌布 var frameAtHome = new StatuFrameLayout(width, height); frameTableThreeIcon.AddChidren(frameAtHome); //在家布防的图标 this.btnAtHomeIconThree = new IconViewControl(162); btnAtHomeIconThree.Y = Application.GetRealHeight(90); btnAtHomeIconThree.UnSelectedImagePath = "Safeguard/ProtectionAtHome.png"; btnAtHomeIconThree.SelectedImagePath = "Safeguard/ProtectionAtHomeSelected.png"; btnAtHomeIconThree.Gravity = Gravity.CenterHorizontal; frameAtHome.AddChidren(btnAtHomeIconThree, ChidrenBindMode.BindEventOnly); //在家布防的文字 var btnAtHomeView = new ViewNormalControl(width, true); btnAtHomeView.Y = btnAtHomeIconThree.Bottom; btnAtHomeView.TextID = R.MyInternationalizationString.uAtHomeGarrison; btnAtHomeView.TextAlignment = TextAlignment.Center; frameAtHome.AddChidren(btnAtHomeView, ChidrenBindMode.BindEventOnly); //在家布防 frameAtHome.MouseUpEvent = (sender, e) => { if (btnAtHomeIconThree.IsSelected == false) { this.SetSafetyGarrisonModeInAtHome(); } }; //离家布防的桌布 var frameRemoveHome = new StatuFrameLayout(width, height); frameRemoveHome.X = frameAtHome.Right; frameTableThreeIcon.AddChidren(frameRemoveHome); //离家布防的图标 this.btnRemoveHomeIcon = new IconViewControl(162); btnRemoveHomeIcon.Y = btnAtHomeIconTwo.Y; btnRemoveHomeIcon.UnSelectedImagePath = "Safeguard/ProtectionRemoveHome.png"; btnRemoveHomeIcon.SelectedImagePath = "Safeguard/ProtectionRemoveHomeSelected.png"; btnRemoveHomeIcon.Gravity = Gravity.CenterHorizontal; frameRemoveHome.AddChidren(btnRemoveHomeIcon, ChidrenBindMode.BindEventOnly); //离家布防的文字 var btnRemoveHomeView = new ViewNormalControl(width, true); btnRemoveHomeView.Y = btnAtHomeView.Y; btnRemoveHomeView.TextID = R.MyInternationalizationString.uRemoveHomeGarrison; btnRemoveHomeView.TextAlignment = TextAlignment.Center; frameRemoveHome.AddChidren(btnRemoveHomeView, ChidrenBindMode.BindEventOnly); //离家布防 frameRemoveHome.MouseUpEvent = (sender, e) => { if (btnRemoveHomeIcon.IsSelected == false) { this.SetSafetyGarrisonModeInRemoveHome(); } }; //撤防的桌布 var frameReGarrisonThree = new StatuFrameLayout(width, height); frameReGarrisonThree.X = frameRemoveHome.Right; frameTableThreeIcon.AddChidren(frameReGarrisonThree); //撤防的图标 var btnReGarrisonIconThree = new IconViewControl(162); btnReGarrisonIconThree.Y = btnAtHomeIconTwo.Y; btnReGarrisonIconThree.UnSelectedImagePath = "Safeguard/WithdrawGarrison.png"; btnReGarrisonIconThree.SelectedImagePath = "Safeguard/WithdrawGarrisonSelected.png"; btnReGarrisonIconThree.Gravity = Gravity.CenterHorizontal; frameReGarrisonThree.AddChidren(btnReGarrisonIconThree); //撤防的文字 var btnReGarrisonTextThree = new ViewNormalControl(width, true); btnReGarrisonTextThree.Y = btnAtHomeView.Y; btnReGarrisonTextThree.TextID = R.MyInternationalizationString.uWithdrawGarrison; btnReGarrisonTextThree.TextAlignment = TextAlignment.Center; frameReGarrisonThree.AddChidren(btnReGarrisonTextThree, ChidrenBindMode.BindEventOnly); //撤防 frameReGarrisonThree.MouseUpEvent = (sender, e) => { this.RemoveSafetyGarrisonMode(); }; #endregion return frameLayout; } /// /// 初始化Tab控件 /// /// Yy. private void InitTabSwitchControl(int YY) { //Tab切换控件 var frameSwich = new FrameLayout(); frameSwich.Y = YY; frameSwich.Height = Application.GetRealHeight(150); bodyFrameLayout.AddChidren(frameSwich); //安防记录 var btnLog = new ViewNormalControl(frameSwich.Width / 2, Application.GetRealHeight(100)) { Gravity = Gravity.CenterVertical, TextID = R.MyInternationalizationString.uSecurityLog, TextAlignment = TextAlignment.Center }; frameSwich.AddChidren(btnLog); //传感器状态 var btnSensor = new ViewNormalControl(frameSwich.Width / 2, Application.GetRealHeight(100)) { Gravity = Gravity.CenterVertical, X = frameSwich.Width / 2, TextID = R.MyInternationalizationString.uSensorStatu, TextColor = UserCenterColor.Current.SelectTextColor, TextAlignment = TextAlignment.Center }; frameSwich.AddChidren(btnSensor); //线 var btnLine = new ProgressLine(); btnLine.Gravity = Gravity.BottomLeft; frameSwich.AddChidren(btnLine); btnLine.SetValue(50, false); //桌布控件 frameLayoutDraw = new FrameLayout(); frameLayoutDraw.Y = frameSwich.Bottom; frameLayoutDraw.Height = bodyFrameLayout.Height - frameSwich.Bottom; bodyFrameLayout.AddChidren(frameLayoutDraw); //安防记录Tab btnLog.MouseUpEventHandler += (sender, e) => { btnSensor.TextColor = Common.ZigbeeColor.Current.TextColor; btnLog.TextColor = UserCenterColor.Current.SelectTextColor; btnLine.SetValue(50); this.TabSelectIndex = 1; //显示安防记录 this.SetSafeguardLogToForm(); }; //传感器状态Tab btnSensor.MouseUpEventHandler += (sender, e) => { btnSensor.TextColor = UserCenterColor.Current.SelectTextColor; btnLog.TextColor = Common.ZigbeeColor.Current.TextColor; btnLine.SetValue(50, false); this.TabSelectIndex = 2; //显示传感器列表 this.SetSensorDataToForm(); }; } /// /// 初始化右上角图标 /// private void InitTopRightIcon() { var btnIcon = new TopLayoutMostRightView(); btnIcon.UnSelectedImagePath = "Item/More.png"; btnIcon.SelectedImagePath = "Item/MoreSelected.png"; topFrameLayout.AddChidren(btnIcon); btnIcon.MouseUpEventHandler += (sender, e) => { //菜单控件 var frameMenu = new TopRightMenuControl(this, 2); //防区列表 string menu1 = Language.StringByID(R.MyInternationalizationString.uGarrisonAreaList); frameMenu.AddRowMenu(menu1, (obj) => { var form = new GarrisonAreaListMenuForm(); form.AddForm(form); }); //密码设置 string menu2 = Language.StringByID(R.MyInternationalizationString.uPasswordSettion); frameMenu.AddRowMenu(menu2, (obj) => { var form = new PasswordMainForm(); form.AddForm(form); }); }; } #endregion #region ■ 初始化全部缓存_____________________ /// /// 初始化全部内存信息 /// private async void InitAllMemoryData() { //开启进度条 this.ShowProgressBar(); //正在与网关通讯中,请稍后 this.SetProgressValue(Language.StringByID(R.MyInternationalizationString.uConnectToGatewayPleaseWait)); //检测主网关 var result = await this.CheckMainGateway(); if (result == false) { //关闭进度条 this.CloseProgressBar(ShowReLoadMode.YES); //网关回复超时,请稍后再试 string msg = Language.StringByID(R.MyInternationalizationString.uGatewayResponseTimeOut); this.ShowTip(msg); return; } //安防信息初始化中,请稍后 this.SetProgressValue(Language.StringByID(R.MyInternationalizationString.uGarrisonInfoInittingPleaseWait)); //刷新安防信息 result = await this.RefreshSafeguardInfo(); if (result == false) { //关闭进度条 this.CloseProgressBar(ShowReLoadMode.YES); //网关回复超时,请稍后再试 string msg = Language.StringByID(R.MyInternationalizationString.uGatewayResponseTimeOut); this.ShowTip(msg); return; } //获取当前的安防模式 var data = await Common.LocalSafeguard.Current.GetSafetyMode(); if (data != null) { //根据布防模式,设置图标的选择状态 this.SetIconStatuByGarrisonMode((GarrisonMode)data.ModeId); } //设置按钮可视状态 this.SetButtonVisible(); //设置传感器数据到画面 this.SetSensorDataToForm(); //关闭进度条 this.CloseProgressBar(); } /// /// 检测主网关 /// /// private async Task CheckMainGateway() { int count = 0; //等待主网关 while (ZbGateway.MainGateWay == null) { await Task.Delay(500); count++; if (count == 10) { return false; } } return true; } /// /// 刷新安防信息 /// /// private async Task RefreshSafeguardInfo() { int count = 0; while (true) { //从网关刷新安防信息,直到能够读取为止 var result = await Common.LocalSafeguard.Current.ReFreshByGateway(ShowErrorMode.NO); if (result == true) { break; } count++; if (count == 5) { return false; } await Task.Delay(1000); } return true; } #endregion #region ■ 布防撤防___________________________ /// /// 在家布防 /// private async void SetSafetyGarrisonModeInAtHome() { //打开进度条 this.ShowProgressBar(); //在家布防 GarrisonMode mode = await Common.LocalSafeguard.Current.SetSafetyGarrisonByModel(GarrisonMode.AtHome); //关闭进度条 this.CloseProgressBar(); if (mode == GarrisonMode.None) { return; } //根据布防模式,设置图标的选择状态 this.SetIconStatuByGarrisonMode(mode); if (mode == GarrisonMode.RemoveGarrison) { return; } //如果设置有内部防区 if (Common.LocalSafeguard.Current.IsHadInternalDefenseArea() == true) { //在家布防设置成功 string msg = Language.StringByID(R.MyInternationalizationString.uSetAtHomeGarrisonSuccess); this.ShowNormalMsg(msg); } else { //布防设置成功 string msg = Language.StringByID(R.MyInternationalizationString.uSetGarrisonSuccess); this.ShowNormalMsg(msg); } //添加布防上报的行控件 this.AddSafeguardLogPushRow(null); } /// /// 离家布防 /// private async void SetSafetyGarrisonModeInRemoveHome() { //打开进度条 this.ShowProgressBar(); //离家布防 GarrisonMode mode = await Common.LocalSafeguard.Current.SetSafetyGarrisonByModel(GarrisonMode.RemoveHome); //关闭进度条 this.CloseProgressBar(); if (mode == GarrisonMode.None) { return; } //根据布防模式,设置图标的选择状态 this.SetIconStatuByGarrisonMode(mode); if (mode == GarrisonMode.RemoveGarrison) { return; } //离家布防设置成功 string msg = Language.StringByID(R.MyInternationalizationString.uSetRemoveHomeGarrisonSuccess); this.ShowNormalMsg(msg); //添加布防上报的行控件 this.AddSafeguardLogPushRow(null); } /// /// 撤防 /// private async void RemoveSafetyGarrisonMode() { //打开进度条 this.ShowProgressBar(); //撤防 bool result = await Common.LocalSafeguard.Current.RemoveSafetyGarrison(GarrisonMode.RemoveGarrison, false); //关闭进度条 this.CloseProgressBar(); if (result == false) { return; } //根据布防模式,设置图标的选择状态 this.SetIconStatuByGarrisonMode(GarrisonMode.RemoveGarrison); //撤防成功 string msg = Language.StringByID(R.MyInternationalizationString.uRemoveGarrisonSuccess); this.ShowNormalMsg(msg); //添加布防上报的行控件 this.AddSafeguardLogPushRow(null); } /// /// 根据布防模式,设置图标的选择状态 /// /// private void SetIconStatuByGarrisonMode(GarrisonMode mode) { //在家布防 if (mode == GarrisonMode.AtHome) { Application.RunOnMainThread(() => { this.btnAtHomeIconTwo.IsSelected = true; this.btnAtHomeIconThree.IsSelected = true; this.btnRemoveHomeIcon.IsSelected = false; }); } //离家布防 else if (mode == GarrisonMode.RemoveHome) { Application.RunOnMainThread(() => { this.btnAtHomeIconTwo.IsSelected = false; this.btnAtHomeIconThree.IsSelected = false; this.btnRemoveHomeIcon.IsSelected = true; }); } //撤防 else if (mode == GarrisonMode.RemoveGarrison) { Application.RunOnMainThread(() => { this.btnAtHomeIconTwo.IsSelected = false; this.btnAtHomeIconThree.IsSelected = false; this.btnRemoveHomeIcon.IsSelected = false; }); } } /// /// 检测是否已经配置有用户密码,如果没有配置有密码,则跳转界面,并且返回false /// /// private async Task CheckHadConfigureUserPsw() { if (UserCenterResourse.UserInfo.AuthorityNo == 3) { //成员的时候,不检测这个东西 return true; } var result = await Common.LocalSafeguard.Current.CheckHadConfigureUserPsw(); if (result == -1) { //出现异常 return false; } if (result == 0) { //请先设置用户密码,再执行操作 string msg = Language.StringByID(R.MyInternationalizationString.uPleaseConfigurePswBeforeOperation); this.ShowTip(msg); Application.RunOnMainThread(() => { var form = new PasswordMainForm(); form.AddForm(form); }); return false; } return true; } #endregion #region ■ 界面关闭___________________________ /// /// 画面关闭 /// /// 是否关闭界面,false的时候,只会调用关闭函数里面的附加功能 public override void CloseForm(bool isCloseForm = true) { //移除全部监听事件 this.RemoveAllListenEvent(); base.CloseForm(isCloseForm); } /// /// 移除全部监听事件 /// private void RemoveAllListenEvent() { DeviceAttributeLogic.Current.RemoveEvent("SafetyManagementMainFormOnline"); DeviceAttributeLogic.Current.RemoveEvent("SafetyManagementMainFormAlarm"); DeviceAttributeLogic.Current.RemoveEvent("SafetyManagementMainFormReceivePushOnline"); } #endregion #region ■ 一般方法___________________________ /// /// 设置布防按钮的可视状态 /// public void SetButtonVisible() { //设置有内部防区 if (Common.LocalSafeguard.Current.IsHadInternalDefenseArea() == true) { Application.RunOnMainThread(() => { //在家布防显示 this.frameTableThreeIcon.Visible = true; this.frameTableTwoIcon.Visible = false; }); } else { Application.RunOnMainThread(() => { //在家布防不显示 this.frameTableThreeIcon.Visible = false; this.frameTableTwoIcon.Visible = true; }); } } #endregion #region ■ 传感器相关_________________________ /// /// 传感器的状态控件 /// private Dictionary dicSensorStatuView = new Dictionary(); /// /// 传感器的报警控件 /// private Dictionary dicSensorAlertView = new Dictionary(); #region 添加传感器行_ /// /// 设置传感器数据到画面 /// private void SetSensorDataToForm() { if (this.TabSelectIndex != 2) { return; } //移除全部监听事件 this.RemoveAllListenEvent(); this.dicSensorStatuView.Clear(); this.dicSensorAlertView.Clear(); //添加列表控件 frameLayoutDraw.RemoveAll(); var listView = new VerticalScrolViewLayout(); listView.Height = frameLayoutDraw.Height; frameLayoutDraw.AddChidren(listView); new System.Threading.Thread(() => { //获取安防的全部传感器设备的信息 var dicDevice = Common.LocalSafeguard.Current.GetAllSensorDeviceInfo(); var listDevice = new List(); foreach (var zoneId in dicDevice.Keys) { Application.RunOnMainThread(() => { foreach (var Info in dicDevice[zoneId]) { //添加行 this.AddSensorStatuRow(listView, zoneId, Info); //收集传感器 var tempDevice = Common.LocalDevice.Current.GetDevice(Info.MacAddr, Info.Epoint); if (tempDevice != null) { listDevice.Add(tempDevice); } } //最后一个防区的时候,开启各种监视线程 if (zoneId == dicDevice.Count) { //开启传感器报警监视 this.StartCheckDeviceAlarm(); //开启设备在线监测 this.StartCheckDeviceOnline(listDevice); } }); } }) { IsBackground = true }.Start(); } /// /// 添加传感器状态的行 /// /// /// 防区ID /// 传感器的信息 private void AddSensorStatuRow(VerticalScrolViewLayout listView, int zoneID, Safeguard.ZoneDeviceListData sensorInfo) { CommonDevice device = Common.LocalDevice.Current.GetDevice(sensorInfo.MacAddr, sensorInfo.Epoint); if (device == null) { return; } //设备控件 var rowDevice = new DeviceRoomViewRow(listView, device); rowDevice.ChangedChidrenBindMode(rowDevice.btnIcon, ChidrenBindMode.BindEventOnly); rowDevice.ChangedChidrenBindMode(rowDevice.btnDevie, ChidrenBindMode.BindEventOnly); rowDevice.ChangedChidrenBindMode(rowDevice.btnRoom, ChidrenBindMode.BindEventOnly); string GarrisonText = Common.LocalSafeguard.Current.GetGarrisonText(zoneID); rowDevice.btnDevie.Text = rowDevice.btnDevie.Text + "(" + GarrisonText + ")"; //状态(初始值:离线) var btnStatu = new RowMostRightTextView(); btnStatu.Gravity = Gravity.Frame; btnStatu.Y = rowDevice.btnDevie.Y; if (device.IsOnline == 0) { //离线 btnStatu.TextID = R.MyInternationalizationString.uOffLine; btnStatu.TextColor = UserCenterColor.Current.Gray; } else { //在线 btnStatu.TextID = R.MyInternationalizationString.uOnline; btnStatu.TextColor = UserCenterColor.Current.Green; } rowDevice.AddChidren(btnStatu, ChidrenBindMode.BindEventOnly); //报警信息 var btnAlert = new RowMostRightTextView(); btnAlert.TextColor = UserCenterColor.Current.Red; btnAlert.Gravity = Gravity.Frame; btnAlert.Y = rowDevice.btnRoom.Y; rowDevice.AddChidren(btnAlert); //扩大控件宽度 btnAlert.Width += Application.GetRealWidth(200); btnAlert.X -= Application.GetRealWidth(200); string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device); this.dicSensorStatuView[mainkeys] = btnStatu; this.dicSensorAlertView[mainkeys] = btnAlert; } #endregion #region 传感器报警_ /// /// 开启传感器报警监视 /// private void StartCheckDeviceAlarm() { DeviceAttributeLogic.Current.AddSafetyAlarmEvent("SafetyManagementMainFormAlarm", this.SetAlarmInfoByInterfaceResult); } /// /// 根据接口推送,设置报警信息 /// /// /// 是否是安防设备报警 private void SetAlarmInfoByInterfaceResult(CommonDevice common, bool safetyDevice) { if (safetyDevice == false) { return; } //添加安防设备上报的行控件 this.AddSafeguardLogPushRow(common); string mainkey = Common.LocalDevice.Current.GetDeviceMainKeys(common); if (this.dicSensorAlertView.ContainsKey(mainkey) == false) { return; } var control = this.dicSensorAlertView[mainkey]; //获取传感器报警信息的翻译文本 var msgInfo = Common.LocalSafeguard.Current.GetSensorAlarmInfo(common); if (msgInfo == null) { return; } Application.RunOnMainThread(() => { control.Text = msgInfo.AlarmMsg; }); } #endregion #region 在线状态_ /// /// 开启设备在线监测 /// /// 传感器列表 private void StartCheckDeviceOnline(List listDevice) { if (listDevice.Count == 0) { return; } //添加接受网关自动推送的事件 DeviceAttributeLogic.Current.AddReceiveDeviceOnlinePushEvent("SafetyManagementMainFormReceivePushOnline", this.ReceiveDeviceStatuPush); //从设备列表中获取在线状态 new System.Threading.Thread(async () => { //首先获取这些传感器所在的网关 var listWay = new List(); foreach (var device in listDevice) { ZbGateway realWay = null; //是否存在真实物理网关 if (Common.LocalGateway.Current.GetRealGateway(ref realWay, device.CurrentGateWayId) == false) { continue; } listWay.Add(realWay); } foreach (var zbway in listWay) { if (this.Parent == null) { //界面关闭 return; } await Common.LocalDevice.Current.GetDeviceListFromGateway(zbway, this.ReceiveDeviceStatuPush, ShowErrorMode.NO); } }) { IsBackground = true }.Start(); } /// /// 接受设备在线推送(不要忘记最后它会推送一个Null的东西过来) /// /// private void ReceiveDeviceStatuPush(CommonDevice device) { if (this.Parent == null || device == null) { //界面关闭 return; } lock (objOnlineLock) { string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device); if (this.dicSensorStatuView.ContainsKey(mainkeys) == true) { //因为这是推送过来的,我不保证那一瞬间这个东西会不会被移除 var control = this.dicSensorStatuView[mainkeys]; CommonDevice Loacldevice = Common.LocalDevice.Current.GetDevice(mainkeys); if (Loacldevice != null) { //在线状态一样的话,不需要刷新 if (Loacldevice.IsOnline == device.IsOnline) { return; } //保存状态 Loacldevice.IsOnline = device.IsOnline; Loacldevice.ReSave(); } Application.RunOnMainThread(() => { //设置控件的在线状态文本效果 this.SetControlOnlineStatu(control, device.IsOnline == 1); }); } } } /// /// 设置控件的在线状态文本效果 /// /// /// private void SetControlOnlineStatu(ButtonCommon button, bool IsOnline) { if (IsOnline == true) { //在线 button.TextID = R.MyInternationalizationString.uOnline; button.TextColor = UserCenterColor.Current.Green; } else { //离线 button.TextID = R.MyInternationalizationString.uOffLine; button.TextColor = UserCenterColor.Current.Gray; } } #endregion #endregion #region ■ 安防记录相关_______________________ /// /// 当日的安防记录的FrameLayout /// private SpecialFrameLayout TodaySafeguardFrame = null; /// /// 其他日期的安防记录的FrameLayout /// private SpecialFrameLayout otherDaySafeguardFrame = null; /// /// 当日的安防记录的行 /// private List listNowDayLogRow = new List(); /// /// 设置安防记录到界面 /// private void SetSafeguardLogToForm() { if (this.TabSelectIndex != 1) { return; } //移除全部监听事件 this.RemoveAllListenEvent(); this.dicSensorStatuView.Clear(); this.dicSensorAlertView.Clear(); this.listNowDayLogRow.Clear(); frameLayoutDraw.RemoveAll(); var listView = new VerticalScrolViewLayout(); listView.Height = frameLayoutDraw.Height; frameLayoutDraw.AddChidren(listView); var frame = new SpecialFrameLayout(listView.Height, 0); listView.AddChidren(frame); new System.Threading.Thread(() => { var dicInfo = Common.LocalSafeguard.Current.GetSafeguardAlarmInfo(); Application.RunOnMainThread(() => { //初始化当日的安防记录控件 this.InitTodaySafeguardLogControl(frame, dicInfo); //初始化其他日期的安防记录控件 this.InitOtherDaySafeguardLogControl(frame, dicInfo); //控件内部bug对应 frame.RemoveFromParent(); listView.AddChidren(frame); //开启传感器报警监视 this.StartCheckDeviceAlarm(); }); }) { IsBackground = true }.Start(); } /// /// 初始化当日的安防记录控件 /// /// /// private void InitTodaySafeguardLogControl(SpecialFrameLayout frameLayout, Dictionary> dicInfo) { string nowDayKey = DateTime.Now.ToString("yyyyMMdd"); string month = nowDayKey.Substring(4, 2); string day = nowDayKey.Substring(6, 2); //日期 var btnDayTitle = new ViewNormalControl(800, true); btnDayTitle.TextSize = 18; btnDayTitle.Y = Application.GetRealHeight(30); btnDayTitle.X = ControlCommonResourse.XXLeft; btnDayTitle.Text = month + Language.StringByID(R.MyInternationalizationString.Month) + day + Language.StringByID(R.MyInternationalizationString.Day); frameLayout.AddChidren(btnDayTitle); //记录容器 this.TodaySafeguardFrame = new SpecialFrameLayout(100, 0); this.TodaySafeguardFrame.Y = btnDayTitle.Bottom; frameLayout.AddChidren(this.TodaySafeguardFrame); //没有记录 if (dicInfo.ContainsKey(nowDayKey) == false) { //今日无任何报警记录 var btnView = new ViewNormalControl(800, true); btnView.TextSize = 16; btnView.TextAlignment = TextAlignment.Center; btnView.TextID = R.MyInternationalizationString.uNowDayNotHadAlarmLog; btnView.TextColor = UserCenterColor.Current.TextGrayColor; btnView.Gravity = Gravity.CenterHorizontal; this.TodaySafeguardFrame.AddChidren(btnView, HeightAutoMode.IncreaseOnly); return; } //添加记录行 foreach (var info in dicInfo[nowDayKey]) { var row = new SafeguardLogRowView(this.TodaySafeguardFrame, info); this.listNowDayLogRow.Add(row); } //调整控件高度 this.TodaySafeguardFrame.IncreaseHeightByMode(null); frameLayout.IncreaseHeightByMode(null); //移除当日 dicInfo.Remove(nowDayKey); } /// /// 初始化其他日期的安防记录控件 /// /// /// private void InitOtherDaySafeguardLogControl(SpecialFrameLayout frameLayout, Dictionary> dicInfo) { //记录容器 this.otherDaySafeguardFrame = new SpecialFrameLayout(100, 0); this.otherDaySafeguardFrame.Y = this.TodaySafeguardFrame.Bottom; frameLayout.AddChidren(this.otherDaySafeguardFrame); if (dicInfo.Count == 0) { return; } foreach (string dayText in dicInfo.Keys) { string month = dayText.Substring(4, 2); string day = dayText.Substring(6, 2); //日期 var btnDayTitle = new ViewNormalControl(800, true); btnDayTitle.X = ControlCommonResourse.XXLeft; btnDayTitle.TextSize = 18; btnDayTitle.Text = month + Language.StringByID(R.MyInternationalizationString.Month) + day + Language.StringByID(R.MyInternationalizationString.Day); var view = this.otherDaySafeguardFrame.GetChildren(this.otherDaySafeguardFrame.ChildrenCount - 1); if (view != null) { btnDayTitle.Y = view.Bottom; } this.otherDaySafeguardFrame.AddChidren(btnDayTitle); //添加记录行 foreach (var info in dicInfo[dayText]) { var row = new SafeguardLogRowView(this.otherDaySafeguardFrame, info); } } //调整控件高度 this.otherDaySafeguardFrame.IncreaseHeightByMode(null); frameLayout.IncreaseHeightByMode(null); } /// /// 添加安防设备上报的行控件 /// /// 设备对象,为null时是布防 private void AddSafeguardLogPushRow(CommonDevice device) { if (this.TabSelectIndex != 1 || Common.LocalSafeguard.Current.listAlarmInfo.Count == 0) { return; } var info = Common.LocalSafeguard.Current.listAlarmInfo[0]; if (device != null) { string mainkey1 = Common.LocalDevice.Current.GetDeviceMainKeys(info.DeviceAddr, info.DeviceEpoint); string mainkey2 = Common.LocalDevice.Current.GetDeviceMainKeys(device); if (mainkey1 != mainkey2) { //不是同一个东西 return; } } Application.RunOnMainThread(() => { if (this.listNowDayLogRow.Count == 0) { //清空msg this.TodaySafeguardFrame.RemoveAll(); } //添加行(置顶) var row = new SafeguardLogRowView(null, info); this.TodaySafeguardFrame.AddChidren(row); row.InitControl(); int height = row.Height; //原有控件往下移动 for (int i = 0; i < this.listNowDayLogRow.Count; i++) { this.listNowDayLogRow[i].Y += height; } //变更大小 this.TodaySafeguardFrame.IncreaseHeightByMode(null); //其他日期往下移动 this.otherDaySafeguardFrame.Y = this.TodaySafeguardFrame.Bottom; //变更父容器大小 var fatherFrame = (SpecialFrameLayout)this.otherDaySafeguardFrame.Parent; fatherFrame.IncreaseHeightByMode(null); this.listNowDayLogRow.Add(row); }); } #endregion #region ■ 界面重新激活事件___________________ /// /// 自身的上层界面关闭后,它自身处于最上层时,触发的事件 /// public override void FormActionAgainEvent() { //设置布防按钮的可视状态 this.SetButtonVisible(); if (this.TabSelectIndex == 1) { //设置安防记录到界面 this.SetSafeguardLogToForm(); } else if (this.TabSelectIndex == 2) { //设置传感器数据到画面 this.SetSensorDataToForm(); } } #endregion } }