using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using ZigBee.Device;
namespace Shared.Phone.UserCenter.GatewayAdd
{
///
/// 搜索无线网关的界面
///
public class WirelessGatewaySearchForm : EditorCommonForm
{
#region ■ 变量声明___________________________
///
/// 动画线程
///
private bool animateThread = false;
///
/// 超时时间(500毫秒每单位)
///
private int timeOut = 360;
#endregion
#region ■ 初始化_____________________________
///
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
///
public void ShowForm()
{
//设置标题信息
base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uAddWirelessGateway));
//初始化中部控件
this.InitMiddleFrame();
}
///
/// 初始化中部控件
///
private void InitMiddleFrame()
{
//图标
var btnGwImage = new PicViewControl(248, 230, true);
btnGwImage.X = Application.GetRealWidth(107);
btnGwImage.Y = Application.GetRealHeight(507);
btnGwImage.UnSelectedImagePath = "Gateway/WirelessGatewayImage.png";
bodyFrameLayout.AddChidren(btnGwImage);
//图标
var btnPhoneImage = new PicViewControl(236, 478, true);
btnPhoneImage.X = Application.GetRealWidth(737);
btnPhoneImage.Y = Application.GetRealHeight(438);
btnPhoneImage.UnSelectedImagePath = "Gateway/PhoneImage.png";
bodyFrameLayout.AddChidren(btnPhoneImage);
//智能网关正在配置网络中
var btnMsg1 = new NormalViewControl(bodyFrameLayout.Width, false);
btnMsg1.TextID = R.MyInternationalizationString.uGatewaySearching;
btnMsg1.Y = Application.GetRealHeight(1036);
btnMsg1.TextAlignment = TextAlignment.Center;
bodyFrameLayout.AddChidren(btnMsg1);
//请稍候…
var btnMsg2 = new NormalViewControl(bodyFrameLayout.Width, false);
btnMsg2.TextID = R.MyInternationalizationString.uPleaseWait;
btnMsg2.TextAlignment = TextAlignment.Center;
btnMsg2.Y = btnMsg1.Bottom;
bodyFrameLayout.AddChidren(btnMsg2);
//初始化连接的假想动画效果
this.InitConcetionAnimete();
}
#endregion
#region ■ 假想动画___________________________
///
/// 初始化连接的假想动画效果
///
private void InitConcetionAnimete()
{
var frame = new FrameLayout();
frame.Width = Application.GetRealWidth(294);
frame.Height = Application.GetRealHeight(30);
frame.X = Application.GetRealWidth(403);
frame.Y = Application.GetRealHeight(650 + 30 / 2);
bodyFrameLayout.AddChidren(frame);
//一格的宽度
int width = Application.GetRealWidth(22);
//间距大小
int space = Application.GetRealWidth(9);
//首格只是半格
var btnFirstPoint = new NormalViewControl(width / 2, 3, false);
btnFirstPoint.Gravity = Gravity.CenterVertical;
btnFirstPoint.BackgroundColor = UserCenterColor.Current.ButtomLine;
frame.AddChidren(btnFirstPoint);
NormalViewControl btnTemp = btnFirstPoint;
//生成格子
var listPoint = new List();
for (int i = 0; i < 8; i++)
{
var btnPoint = new NormalViewControl(width, 3, false);
btnPoint.BackgroundColor = UserCenterColor.Current.ButtomLine;
btnPoint.Gravity = Gravity.CenterVertical;
btnPoint.X = btnTemp.Right + space;
frame.AddChidren(btnPoint);
listPoint.Add(btnPoint.X);
btnTemp = btnPoint;
}
//尾格只是半格
var btnLastPoint = new NormalViewControl(width / 2, 3, false);
btnLastPoint.Gravity = Gravity.CenterVertical;
btnLastPoint.X = btnTemp.Right + space;
btnLastPoint.BackgroundColor = UserCenterColor.Current.ButtomLine;
frame.AddChidren(btnLastPoint);
btnTemp = null;
//开启连接的假想动画效果线程
this.StartConcetionAnimeteThread(frame, listPoint, width);
}
///
/// 开启连接的假想动画效果线程
///
///
///
///
private void StartConcetionAnimeteThread(FrameLayout frame, List listPoint, int roundWidth)
{
var btnRound = new PicViewControl(roundWidth, roundWidth, false);
btnRound.Radius = (uint)roundWidth / 2;
btnRound.Gravity = Gravity.CenterVertical;
btnRound.BackgroundColor = UserCenterColor.Current.ConcetionRoundColor;
btnRound.X = listPoint[0];
frame.AddChidren(btnRound);
animateThread = true;
HdlThreadLogic.Current.RunThread(() =>
{
int index = 1;
int timeCount = 0;
while (animateThread == true && this.Parent != null)
{
System.Threading.Thread.Sleep(500);
timeOut--;
if (timeCount == 10)
{
//5秒后清空网关列表
HdlGatewayLogic.Current.ClearAllRealGateway();
ZigBee.Common.Application.IsSearchingGateway = true;
//检测搜索到的网关
this.CheckZbGatewayAndSetRow();
}
timeCount++;
Application.RunOnMainThread(() =>
{
if (btnRound != null)
{
btnRound.X = listPoint[index];
index++;
if (index == listPoint.Count)
{
index = 0;
}
}
});
}
});
}
#endregion
#region ■ 网关检测___________________________
///
/// 检测搜索到的网关
///
private void CheckZbGatewayAndSetRow()
{
HdlThreadLogic.Current.RunThread(async () =>
{
while (animateThread == true && this.Parent != null)
{
await Task.Delay(1000);
if (timeOut < 0)
{
this.animateThread = false;
//先随便乱写点东西好了
string msg = "没有发现网关,建议使用XXX链接方式";
this.ShowMassage(ShowMsgType.Tip, msg);
break;
}
var listCheck = new HashSet();
for (int i = 0; i < ZbGateway.GateWayList.Count; i++)
{
var realWay = ZbGateway.GateWayList[i];
string gwId = HdlGatewayLogic.Current.GetGatewayId(realWay);
if (listCheck.Contains(gwId) == true
|| HdlGatewayLogic.Current.IsGatewayExist(realWay) == true
|| HdlGatewayLogic.Current.GetGatewayBaseInfoAttribute(realWay, "IpAddress").ToString() == string.Empty)
{
//如果处理成功了,则不再处理
//本地如果已经有这个网关了,则不再处理
//IP没有的网关,我也不知道它是干嘛的
continue;
}
//网关绑定模式
var mode = GatewayBindMode.BindAgain;
if (realWay.getGatewayBaseInfo.HomeId == Common.Config.Instance.HomeId)
{
//已经绑定过了
mode = GatewayBindMode.Binded;
}
else if (HdlGatewayLogic.Current.HomeIdIsEmpty(realWay) == true)
{
//第一次绑定,也就是网关住宅ID为空
mode = GatewayBindMode.First;
}
if (mode != GatewayBindMode.Binded)
{
//发现新网关,正在处理中,请稍后
string msg = Language.StringByID(R.MyInternationalizationString.uFindNewGatewayPleaseWaitToBinding);
this.ShowProgressBar(msg);
}
//执行绑定网关操作(无条件直接绑定,哪怕是住宅ID不一样)
var result = await this.DoSaveGateway(realWay, ShowErrorMode.YES, mode);
if (mode != GatewayBindMode.Binded)
{
//关闭进度条
this.CloseProgressBar();
}
//虽然出错了,但是可以无限处理
if (result == -1) { continue; }
//记录处理成功的网关
listCheck.Add(gwId);
//网关绑定在当前账号下的其他住宅里\r\n请解除绑定后再试(IP地址)
if (result == 0) { continue; }
//我觉得这里需要获取一下新网关的设备列表
Common.LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay);
Application.RunOnMainThread(() =>
{
if (this.Parent != null)
{
//搜索得到无线网关
if (mode != GatewayBindMode.Binded)
{
//var form = new GatewayInfoAddForm();
//this.AddFromAndRemoveNowForm(form, realWay);
}
}
});
//搜索得到无线网关,则中断线程
if (mode != GatewayBindMode.Binded)
{
this.animateThread = false;
return;
}
}
}
});
}
#endregion
#region ■ 执行网关保存_______________________
///
/// 执行网关保存(1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面)
///
/// 网关对象
/// 是否显示错误
/// 绑定方式
///
private async Task DoSaveGateway(ZbGateway zbGateway, ShowErrorMode mode, GatewayBindMode bindMode)
{
//添加搜索到的网关到缓存
//1:正常 -1:异常 0:当前的网关绑定在了当前账号下的不同住宅里面
int result = 0;
if (bindMode == GatewayBindMode.BindAgain)
{
result = await HdlGatewayLogic.Current.ReBindNewGateway(zbGateway);
}
else
{
result = await HdlGatewayLogic.Current.AddNewGateway(zbGateway, mode);
}
if (result == -1)
{
return result;
}
//前的网关绑定在了当前账号下的不同住宅里面
if (result == 0)
{
//网关绑定在当前账号下的其他住宅里\r\n请解除绑定后再试(IP地址)
string msg = Language.StringByID(R.MyInternationalizationString.uTheGatewayInOtherResidenceMsg);
if (msg.Contains("{0}") == true)
{
msg = string.Format(msg, "\r\n") + "(" + HdlGatewayLogic.Current.GetGatewayBaseInfoAttribute(zbGateway, "IpAddress").ToString() + ")";
}
this.ShowMassage(ShowMsgType.Tip, msg);
}
return result;
}
#endregion
#region ■ 界面关闭___________________________
///
/// 界面关闭
///
public override void CloseForm()
{
this.animateThread = false;
ZigBee.Common.Application.IsSearchingGateway = false;
//停止Wi-Fi配网
//Com.Mediatek.Elian.ElianNative.StopSmartConnection();
if (UserCenterResourse.listActionFormId.Contains("GatewayManagementForm") == false)
{
//刷新主页
UserView.UserPage.Instance.Fresh();
}
base.CloseForm();
}
#endregion
}
}