using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using ZigBee.Device;
namespace Shared.Phone.UserCenter.Safety
{
///
/// 安防管理的主界面★
///
public class SafetyManagementMainForm : EditorCommonForm
{
#region ■ 变量声明___________________________
///
/// 桌布控件,用于存放或者移除功能块控件(Tab控件专用)
///
private NormalFrameLayout frameLayoutDraw = null;
///
/// 安防控件
///
private SafetyMasterControl garrisonControl = null;
///
/// Tab的选择。1:安防记录Tab 2:传感器状态Tab
///
private int TabSelectIndex = 2;
///
/// 在线状态的锁
///
private object objOnlineLock = new object();
#endregion
#region ■ 初始化_____________________________
///
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
///
public void ShowForm()
{
//设置头部信息
base.SetTitleText(Language.StringByID(R.MyInternationalizationString.SafetyManagement));
//初始化中部信息
this.InitMiddleFrame();
}
///
/// 初始化中部信息
///
private void InitMiddleFrame()
{
//清空bodyFrame
this.ClearBodyFrame();
//初始化右上角图标
this.InitTopRightIcon();
//初始化全部内存信息
this.InitAllMemoryData();
}
///
/// 初始化Tab控件
///
private void InitTabSwitchControl()
{
var frameBack = new FrameLayout();
frameBack.Height = Application.GetRealHeight(1300);
frameBack.Y = Application.GetRealHeight(444);
frameBack.BackgroundColor = 0xa1ffffff;
frameBack.SetCornerWithSameRadius(Application.GetRealHeight(58), HDLUtils.RectCornerTopLeft | HDLUtils.RectCornerTopRight);
bodyFrameLayout.AddChidren(frameBack);
//桌布控件
frameLayoutDraw = new NormalFrameLayout();
frameLayoutDraw.Y = Application.GetRealHeight(181);
frameLayoutDraw.Height = frameBack.Height - Application.GetRealHeight(181);
frameBack.AddChidren(frameLayoutDraw);
//计算宽度使用
var btnTemp = new ButtonBase();
btnTemp.TextSize = 16;
btnTemp.IsBold = true;
btnTemp.TextID = R.MyInternationalizationString.uSecurityLog;
int frameLogWidth = btnTemp.GetRealWidthByText() + Application.GetRealWidth(30);
btnTemp.TextID = R.MyInternationalizationString.uSensorStatu;
int frameSensorWidth = btnTemp.GetRealWidthByText() + Application.GetRealWidth(30);
//安防记录(点击范围有点小,需要扩大它的点击范围)
var frameLog = new FrameLayoutStatuControl();
frameLog.UseClickStatu = false;
frameLog.Height = Application.GetRealHeight(123);
frameLog.Width = frameLogWidth;
frameLog.X = (frameBack.Width - frameLogWidth - frameSensorWidth) / 2;
frameLog.Y = Application.GetRealHeight(58);
frameBack.AddChidren(frameLog);
//标题
var btnLog = new NormalViewControl(100, 63, true);
btnLog.Width = frameLog.Width;
btnLog.TextAlignment = TextAlignment.Center;
btnLog.TextID = R.MyInternationalizationString.uSecurityLog;
btnLog.TextColor = UserCenterColor.Current.TextGrayColor3;
frameLog.AddChidren(btnLog, ChidrenBindMode.BindEvent);
//底线
var btnLogLine = new NormalViewControl(40, 10, true);
btnLogLine.Y = Application.GetRealHeight(86);
//btnLogLine.X = btnLog.X + btnLog.Width / 2 - Application.GetRealWidth(40) / 2;
btnLogLine.Gravity = Gravity.CenterHorizontal;
btnLogLine.Radius = (uint)Application.GetRealHeight(10) / 2;
btnLogLine.BackgroundColor = UserCenterColor.Current.TextOrangeColor;
frameLog.AddChidren(btnLogLine, ChidrenBindMode.BindEvent);
btnLogLine.Visible = false;
//传感器状态(点击范围有点小,需要扩大它的点击范围)
var frameSensor = new FrameLayoutStatuControl();
frameSensor.UseClickStatu = false;
frameSensor.Height = frameLog.Height;
frameSensor.Width = frameSensorWidth;
frameSensor.X = frameLog.Right;
frameSensor.Y = frameLog.Y;
frameBack.AddChidren(frameSensor);
//标题
var btnSensor = new NormalViewControl(100, 63, true);
btnSensor.Width = frameSensor.Width;
btnSensor.TextID = R.MyInternationalizationString.uSensorStatu;
btnSensor.TextSize = 16;
btnSensor.TextAlignment = TextAlignment.Center;
btnSensor.TextColor = UserCenterColor.Current.TextColor2;
btnSensor.IsBold = true;
frameSensor.AddChidren(btnSensor, ChidrenBindMode.BindEvent);
//底线
var btnSensorLine = new NormalViewControl(40, 10, true);
btnSensorLine.BackgroundColor = UserCenterColor.Current.TextOrangeColor;
btnSensorLine.Y = btnLogLine.Y;
//btnSensorLine.X = btnSensor.X + btnSensor.Width / 2 - Application.GetRealWidth(40) / 2;
btnSensorLine.Gravity = Gravity.CenterHorizontal;
btnSensorLine.Radius = (uint)Application.GetRealHeight(10) / 2;
frameSensor.AddChidren(btnSensorLine, ChidrenBindMode.BindEvent);
//安防记录Tab
frameLog.ButtonClickEvent += (sender, e) =>
{
//字体大小和颜色变更
btnSensor.TextColor = UserCenterColor.Current.TextGrayColor3;
btnSensor.TextSize = 14;
btnSensor.IsBold = false;
btnLog.TextColor = UserCenterColor.Current.TextColor2;
btnLog.TextSize = 16;
btnLog.IsBold = true;
btnLogLine.Visible = true;
btnSensorLine.Visible = false;
this.TabSelectIndex = 1;
//显示安防记录
this.SetSafeguardLogToForm();
};
//传感器状态Tab
frameSensor.ButtonClickEvent += (sender, e) =>
{
//字体大小和颜色变更
btnSensor.TextColor = UserCenterColor.Current.TextColor2;
btnSensor.TextSize = 16;
btnSensor.IsBold = true;
btnLog.TextColor = UserCenterColor.Current.TextGrayColor3;
btnLog.TextSize = 14;
btnLog.IsBold = false;
btnLogLine.Visible = false;
btnSensorLine.Visible = true;
this.TabSelectIndex = 2;
//显示传感器列表
this.SetSensorDataToForm();
};
}
///
/// 初始化右上角图标
///
private void InitTopRightIcon()
{
//快捷方式
var btnShortCut = new MostRightIconControl(69, 69);
btnShortCut.UnSelectedImagePath = "Safeguard/SafetyShortcut.png";
btnShortCut.SelectedImagePath = "Safeguard/SafetyShortcutSelected.png";
if (HdlUserCenterResourse.ResidenceOption.AuthorityNo == 1 || HdlUserCenterResourse.ResidenceOption.AuthorityNo == 2)
{
//快捷方式向左移动
btnShortCut.X = Application.GetRealWidth(855);
var btnIcon = new MostRightIconControl(69, 69);
btnIcon.UnSelectedImagePath = "Item/More.png";
topFrameLayout.AddChidren(btnIcon);
btnIcon.InitControl();
btnIcon.ButtonClickEvent += (sender, e) =>
{
//菜单控件
var frameMenu = new TopRightMenuControl(2, 2);
//防区列表
string menu1 = Language.StringByID(R.MyInternationalizationString.uGarrisonAreaList);
frameMenu.AddRowMenu(menu1, "Item/GarrisonList.png", "Item/GarrisonListSelected.png", () =>
{
HdlCheckLogic.Current.CheckSecondarySecurity(() =>
{
//验证成功
var form = new GarrisonAreaListMenuForm();
form.AddForm();
},
() =>
{
//请前往个人中心{0}设置二次安全验证方式
string msg = Language.StringByID(R.MyInternationalizationString.uGotoCenterAndSetSecondAuthentication).Replace("{0}", "\r\n");
this.ShowMassage(ShowMsgType.Confirm, msg, () =>
{
var form = new UserMain.SecondAuthenticationForm();
form.AddForm();
});
});
});
//密码设置
string menu2 = Language.StringByID(R.MyInternationalizationString.uPasswordSettion);
frameMenu.AddRowMenu(menu2, "Item/PswSettion.png", "Item/PswSettionSelected.png", () =>
{
HdlCheckLogic.Current.CheckSecondarySecurity(() =>
{
//验证成功
var form = new PasswordMenuForm();
form.AddForm();
},
() =>
{
//请前往个人中心{0}设置二次安全验证方式
string msg = Language.StringByID(R.MyInternationalizationString.uGotoCenterAndSetSecondAuthentication).Replace("{0}", "\r\n");
this.ShowMassage(ShowMsgType.Confirm, msg, () =>
{
var form = new UserMain.SecondAuthenticationForm();
form.AddForm();
});
});
});
};
}
topFrameLayout.AddChidren(btnShortCut);
btnShortCut.InitControl();
if (HdlUserCenterResourse.ResidenceOption.SafetyShortcut == true)
{
//使用快捷方式
btnShortCut.IsSelected = true;
}
btnShortCut.ButtonClickEvent += (sender, e) =>
{
if (btnShortCut.IsSelected == true)
{
//确定取消主页的「安防」捷径?
this.ShowMassage(ShowMsgType.Confirm, Language.StringByID(R.MyInternationalizationString.uCancelSafetyShortcutMsg), () =>
{
HdlUserCenterResourse.ResidenceOption.SafetyShortcut = false;
HdlUserCenterResourse.ResidenceOption.Save();
btnShortCut.IsSelected = false;
//取消主页的「安防」捷径的话,主页需要重新刷新
UserView.UserPage.Instance.RefreshAllForm = true;
});
}
else
{
//确定创建「安防」捷径到主页?
this.ShowMassage(ShowMsgType.Confirm, Language.StringByID(R.MyInternationalizationString.uCreatSafetyShortcutMsg), () =>
{
HdlUserCenterResourse.ResidenceOption.SafetyShortcut = true;
HdlUserCenterResourse.ResidenceOption.Save();
btnShortCut.IsSelected = true;
//创建主页的「安防」捷径的话,主页需要重新刷新
UserView.UserPage.Instance.RefreshAllForm = true;
});
}
};
}
#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.ShowMassage(ShowMsgType.Tip, msg);
return;
}
//安防信息初始化中,请稍后
this.SetProgressValue(Language.StringByID(R.MyInternationalizationString.uGarrisonInfoInittingPleaseWait));
//刷新安防信息
result = await HdlSafeguardLogic.Current.ReFreshByGateway();
if (result == false)
{
//关闭进度条
this.CloseProgressBar(ShowReLoadMode.YES);
return;
}
//关闭进度条
this.CloseProgressBar();
//数据初始化完成后
HdlThreadLogic.Current.RunMain(() =>
{
//初始化头部的那三个图标
garrisonControl = new SafetyMasterControl();
garrisonControl.Y = Application.GetRealHeight(46);
bodyFrameLayout.AddChidren(garrisonControl);
garrisonControl.InitControl();
//初始化Tab控件
this.InitTabSwitchControl();
//设置传感器数据到画面
this.SetSensorDataToForm();
});
}
///
/// 检测主网关
///
///
private async Task CheckMainGateway()
{
int count = 0;
//等待主网关
while (ZbGateway.MainGateWay == null)
{
await Task.Delay(500);
count++;
if (count == 10)
{
return false;
}
}
return true;
}
#endregion
#region ■ 界面关闭___________________________
///
/// 画面关闭
///
public override void CloseFormBefore()
{
//移除全部监听事件
this.RemoveAllListenEvent();
base.CloseFormBefore();
}
///
/// 移除全部监听事件
///
private void RemoveAllListenEvent()
{
HdlGatewayReceiveLogic.Current.RemoveEvent("SafetyManagementMainFormAlarm");
HdlGatewayReceiveLogic.Current.RemoveEvent("SafetyManagementMainFormReceivePushOnline");
}
#endregion
#region ■ 传感器相关_________________________
///
/// 传感器的状态控件
///
private Dictionary dicSensorStatuView = new Dictionary();
#region 添加传感器行_
///
/// 设置传感器数据到画面
///
private void SetSensorDataToForm()
{
if (this.TabSelectIndex != 2)
{
return;
}
//移除全部监听事件
this.RemoveAllListenEvent();
this.dicSensorStatuView.Clear();
//添加列表控件
frameLayoutDraw.RemoveAll();
var listView = new VerticalFrameControl(35);
listView.Height = frameLayoutDraw.Height;
frameLayoutDraw.AddChidren(listView);
HdlThreadLogic.Current.RunThread(() =>
{
//获取安防的全部传感器设备的信息
var dicDevice = HdlSafeguardLogic.Current.GetAllSensorDeviceInfo();
var listDevice = new List();
HdlThreadLogic.Current.RunMain(() =>
{
foreach (var zoneId in dicDevice.Keys)
{
foreach (var Info in dicDevice[zoneId])
{
if (this.Parent == null)
{
return;
}
//添加行
this.AddSensorStatuRow(listView, zoneId, Info);
//收集传感器
var tempDevice = HdlDeviceCommonLogic.Current.GetDevice(Info.MacAddr, Info.Epoint);
if (tempDevice != null)
{
listDevice.Add(tempDevice);
}
}
}
//调整列表控件高度
listView.AdjustChidrenFrameHeight(listView.frameTable, Application.GetRealHeight(46));
//开启传感器报警监视
this.StartCheckDeviceAlarm();
//开启设备在线监测
this.StartCheckDeviceOnline(listDevice);
});
});
}
///
/// 添加传感器状态的行
///
///
/// 防区ID
/// 传感器的信息
private void AddSensorStatuRow(VerticalFrameControl listView, int zoneID, Safeguard.ZoneDeviceListData sensorInfo)
{
CommonDevice device = HdlDeviceCommonLogic.Current.GetDevice(sensorInfo.MacAddr, sensorInfo.Epoint);
if (device == null)
{
return;
}
//自定义传感器状态控件
var frameDevice = new SafetySensorStatuControl();
listView.AddChidren(frameDevice);
frameDevice.InitControl(device);
//添加阴影特效
frameDevice.SetViewShadow(true);
string mainkeys = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device);
this.dicSensorStatuView[mainkeys] = frameDevice;
}
#endregion
#region 传感器报警_
///
/// 开启传感器报警监视
///
private void StartCheckDeviceAlarm()
{
//根据接口推送,设置报警信息
HdlGatewayReceiveLogic.Current.AddAttributeEvent("SafetyManagementMainFormAlarm", ReceiveComandDiv.A传感器上报, (device) =>
{
if (HdlSafeguardLogic.Current.IsSensorDeviceExist(device) == false)
{
//如果这个设备不存在于安防,则不处理
return;
}
//传感器状态
string mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device);
if (this.dicSensorStatuView.ContainsKey(mainkey) == false)
{
return;
}
var control = this.dicSensorStatuView[mainkey];
//获取传感器报警信息的翻译文本
var msgInfo = HdlAlarmsLogic.Current.GetSensorAlarmInfo(device);
HdlThreadLogic.Current.RunMain(() =>
{
control?.SetSensoReportInfo(msgInfo);
});
});
}
#endregion
#region 在线状态_
///
/// 上一次获取设备在线的时间(不能让它每点一次都去获取设备状态)
///
private DateTime oldGetOnlineTime = new DateTime(1900, 1, 1);
///
/// 开启设备在线监测
///
/// 传感器列表
private void StartCheckDeviceOnline(List listDevice)
{
if (listDevice.Count == 0)
{
return;
}
if (oldGetOnlineTime.Year != 1900)
{
var timeValue = (DateTime.Now - oldGetOnlineTime).TotalSeconds;
if (timeValue < 10)
{
//最少要间隔十秒,才去重新获取
return;
}
}
oldGetOnlineTime = DateTime.Now;
//从设备列表中获取在线状态
HdlThreadLogic.Current.RunThread(() =>
{
foreach (var device in listDevice)
{
if (this.Parent == null)
{
//界面关闭
return;
}
var deviceInfo = HdlDeviceCommonLogic.Current.ReadDeviceEpointDeviceInfo(device);
if (deviceInfo != null)
{
//设置设备在线状态
this.ReceiveDeviceStatuPush(device, deviceInfo);
}
System.Threading.Thread.Sleep(50);
}
}, ShowErrorMode.NO);
}
///
/// 接受设备在线推送
///
///
private void ReceiveDeviceStatuPush(CommonDevice device, CommonDevice.DeviceInfoData deviceInfo)
{
if (this.Parent == null)
{
//界面关闭
return;
}
string mainkeys = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device);
if (this.dicSensorStatuView.ContainsKey(mainkeys) == true)
{
CommonDevice Loacldevice = HdlDeviceCommonLogic.Current.GetDevice(mainkeys);
if (Loacldevice == null)
{
return;
}
//在线状态一样的话,不需要刷新
if (Loacldevice.IsOnline == deviceInfo.IsOnline)
{
return;
}
//保存状态
Loacldevice.IsOnline = deviceInfo.IsOnline;
//因为这是推送过来的,我不保证那一瞬间这个东西会不会被移除
var control = this.dicSensorStatuView[mainkeys];
HdlThreadLogic.Current.RunMain(() =>
{
//设置控件的在线状态文本效果
bool bolOnline = HdlDeviceCommonLogic.Current.CheckDeviceIsOnline(device);
control?.SetOnlineStatu(bolOnline);
});
}
}
#endregion
#endregion
#region ■ 安防记录相关_______________________
///
/// 当日的安防记录的FrameLayout
///
private SafeguardLogControl TodaySafeguardFrame = null;
///
/// 其他日期的安防记录的FrameLayout
///
private FrameLayout otherDaySafeguardFrame = null;
///
/// 设置安防记录到界面
///
private void SetSafeguardLogToForm()
{
if (this.TabSelectIndex != 1)
{
return;
}
//移除全部监听事件
this.RemoveAllListenEvent();
this.dicSensorStatuView.Clear();
frameLayoutDraw.RemoveAll();
var listView = new VerticalFrameControl(0);
listView.Height = frameLayoutDraw.Height;
frameLayoutDraw.AddChidren(listView);
HdlThreadLogic.Current.RunThread(() =>
{
var dicAlarm = HdlAlarmsLogic.Current.GetSafeguardAlarmInfo();
var dicInfo = new Dictionary>>();
//这里不显示布防和撤防的信息
foreach (var day in dicAlarm.Keys)
{
var listInfo = new Dictionary>();
foreach (var info in dicAlarm[day])
{
if (info.AlarmType == SafeguardAlarmType.Sensor)
{
//只要传感器的
if (listInfo.ContainsKey(info.ZoneId) == false)
{
listInfo[info.ZoneId] = new List();
}
listInfo[info.ZoneId].Add(info);
}
}
//如果没有传感器的报警信息,则当不存在处理
if (listInfo.Count > 0)
{
dicInfo[day] = listInfo;
}
}
dicAlarm = null;
HdlThreadLogic.Current.RunMain(() =>
{
if (this.Parent == null)
{
return;
}
//初始化当日的安防记录控件
string nowDayKey = DateTime.Now.ToString("yyyyMMdd");
Dictionary> nowDayData = null;
if (dicInfo.ContainsKey(nowDayKey) == true)
{
nowDayData = dicInfo[nowDayKey];
//移除掉当日记录
dicInfo.Remove(nowDayKey);
}
//执行初始化
TodaySafeguardFrame = new SafeguardLogControl();
TodaySafeguardFrame.Y = Application.GetRealHeight(10);
listView.AddChidren(TodaySafeguardFrame);
TodaySafeguardFrame.InitControl(nowDayKey, nowDayData);
//初始化其他日期的安防记录控件
if (dicInfo.Count > 0)
{
otherDaySafeguardFrame = new FrameLayout();
otherDaySafeguardFrame.Height = Application.GetRealHeight(10);
listView.AddChidren(otherDaySafeguardFrame);
foreach (var dayText in dicInfo.Keys)
{
//执行初始化
var contr = new SafeguardLogControl();
if (otherDaySafeguardFrame.ChildrenCount > 0)
{
contr.Y = otherDaySafeguardFrame.GetChildren(otherDaySafeguardFrame.ChildrenCount - 1).Bottom + Application.GetRealHeight(35);
}
otherDaySafeguardFrame.AddChidren(contr);
contr.InitControl(dayText, dicInfo[dayText]);
}
//调整高度
otherDaySafeguardFrame.Height = otherDaySafeguardFrame.GetChildren(otherDaySafeguardFrame.ChildrenCount - 1).Bottom;
}
//调整桌布高度
listView.AdjustTableHeight();
//开启传感器报警监视
this.StartCheckDeviceAlarm();
});
});
}
///
/// 添加安防设备上报的行控件(安防推送会调用这个东西)
///
/// 设备对象
public void AddSafeguardLogPushRow(CommonDevice device)
{
if (this.TabSelectIndex != 1 || HdlAlarmsLogic.Current.listSafetyAlarmInfo.Count == 0)
{
return;
}
var info = HdlAlarmsLogic.Current.listSafetyAlarmInfo[0];
if (device != null)
{
string mainkey1 = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(info.DeviceAddr, info.DeviceEpoint);
string mainkey2 = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(device);
if (mainkey1 != mainkey2)
{
//不是同一个东西
return;
}
}
HdlThreadLogic.Current.RunMain(() =>
{
if (this.TodaySafeguardFrame != null)
{
//添加报警信息
var value = this.TodaySafeguardFrame.AddSafeguardAlarmInfo(info);
if (value > 0)
{
//其他日期的FrameLayout往下移动
if (this.otherDaySafeguardFrame != null)
{
this.otherDaySafeguardFrame.Y += value;
}
//桌布控件
var contrTable = (FrameLayout)this.TodaySafeguardFrame.Parent;
//列表控件
var listview = (VerticalFrameControl)contrTable.Parent;
//调整桌布高度
listview?.AdjustTableHeight();
}
}
});
}
///
/// 防区推送
///
///
public void GarrisonModePush(GarrisonMode garrison)
{
HdlThreadLogic.Current.RunMain(() =>
{
garrisonControl?.SetIconStatuByGarrisonMode(garrison);
});
}
#endregion
#region ■ 界面重新激活事件___________________
///
/// 自身的上层界面关闭后,它自身处于最上层时,触发的事件
///
public override int FormActionAgainEvent()
{
//设置布防按钮的可视状态
garrisonControl?.SetButtonVisible();
if (this.TabSelectIndex == 1)
{
//设置安防记录到界面
this.SetSafeguardLogToForm();
}
else if (this.TabSelectIndex == 2)
{
//设置传感器数据到画面
this.SetSensorDataToForm();
}
return 1;
}
#endregion
}
}