using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Shared.Common;
using Shared.Phone.Device.Category;
using Shared.Phone.UserCenter.Device;
using ZigBee.Device;
using static ZigBee.Device.Panel;
namespace Shared.Phone.UserCenter.DeviceBind
{
public class BindInfo
{
///
/// 当前按键配置的功能
///
public static int clusterID = 0;
///
/// 记录旧的目标列表
///
public static List oldTargetList = new List();
public static async System.Threading.Tasks.Task RemoveTargets(BindObj.BindListResponseObj bindDevice, Panel currentKey)
{
var delDevice = new BindObj.DelDeviceBindData();
delDevice.DeviceAddr = currentKey.DeviceAddr;
delDevice.Epoint = currentKey.DeviceEpoint;
if (bindDevice.BindType == 0 || bindDevice.BindType == 1)
{
var removeDevice = new BindObj.RemoveBindListObj();
removeDevice.BindCluster = bindDevice.BindCluster;
removeDevice.BindType = 0;
removeDevice.BindMacAddr = bindDevice.BindMacAddr;
removeDevice.BindEpoint = bindDevice.BindEpoint;
delDevice.RemoveBindList.Add(removeDevice);
}
else if (bindDevice.BindType == 2)
{
var removeDevice = new BindObj.RemoveBindListObj();
removeDevice.BindCluster = bindDevice.BindCluster;
removeDevice.BindType = 1;
removeDevice.BindScenesId = bindDevice.BindScenesId;
delDevice.RemoveBindList.Add(removeDevice);
}
var delResult = await currentKey.DelDeviceBindAsync(delDevice);
foreach (var re in delResult.delDeviceBindResponseData.RemoveBindList)
{
switch (re.Result)
{
case 0:
return 0;
break;
case 4:
if (delResult.removeBindResultResponseData != null)
{
if (delResult.removeBindResultResponseData.Result == 0)
{
return 0;
}
}
break;
}
}
return -1;
}
///
/// 检测该设备能否显示
///
///
///
public static bool CheckCanShowDevice(ZigBee.Device.CommonDevice device, string curDeviceBindType = "AddSwitch")
{
if (device == null)
{
return false;
}
//如果是传感器,或者是没有开关簇的话(这里判断的是输入簇)
if ((device.Type == ZigBee.Device.DeviceType.IASZone) || InMatchDevice(device, curDeviceBindType) == false)
{
return false;
}
return true;
}
///
/// 检测该房间能否显示
///
///
///
public static bool CheckCanShowRoom(Common.Room room, string curDeviceBindType = "AddSwitch")
{
if (room.DeviceUIList.Count == 0)
{
return false;
}
if (room.IsLove == true)
{
return false;
}
foreach (var deviceUi in room.DeviceUIList)
{
//检测该设备能否显示
if (CheckCanShowDevice(deviceUi.CommonDevice, curDeviceBindType) == false)
{
continue;
}
//存在设备的话,此房间可以显示
return true;
}
return false;
}
///
/// 检测设备是否拥有开关的功能(输入簇)
///
///
///
public static bool InMatchDevice(CommonDevice device, string curDeviceBindType = "AddSwitch")
{
foreach (var data in device.InClusterList)
{
switch (curDeviceBindType)
{
case "AddSwitch":
//拥有on/off功能的,才支持测试
if (data.InCluster == 6)
{
return true;
}
break;
case "AddDimmer":
if (data.InCluster == 8)
{
return true;
}
break;
case "AddCurtain":
if (data.InCluster == 258)
{
return true;
}
break;
}
}
return false;
}
///
/// 底部完成按钮显示
///
///
public static void FinishDisplay(List roomTempList, Button btnFinish)
{
if (roomTempList.Count == 0)
{
btnFinish.Enable = false;
btnFinish.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMUnSelect;
}
else
{
btnFinish.Enable = true;
btnFinish.BackgroundColor = Shared.Common.ZigbeeColor.Current.XMBlack;
}
}
///
/// 获取当前楼层名称
///
///
public static string GetCurrentKeyAllRoomList()
{
var dicFloor = Common.Room.CurrentRoom.GetFloorSortList();
foreach (var floorId in dicFloor.Keys)
{
//第一个楼层
return dicFloor[floorId];
break;
}
return null;
}
///
/// 获取当前楼层
///
///
public static string GetCurrentSelectFloorId()
{
var dicFloor = Common.Room.CurrentRoom.GetFloorSortList();
foreach (var floorId in dicFloor.Keys)
{
//第一个楼层
return floorId;
break;
}
return null;
}
///
/// 获取当前楼层名称
///
///
public static string GetCurrentSelectFloorIdName()
{
var dicFloor = Common.Room.CurrentRoom.GetFloorSortList();
foreach (var floorId in dicFloor.Keys)
{
//第一个楼层
return dicFloor[floorId];
break;
}
return null;
}
///
/// 检测控制面板(按键类)所拥有的功能,现支持的有以下几种(必定存在键值,出错会返回null)
///
/// The panel key function level2.
/// Key.
public static async System.Threading.Tasks.Task> CheckPanelKeyFunctionLevel3(Panel key)
{
Dictionary dicCheck = new Dictionary();
dicCheck["场景:触发"] = false;
dicCheck["开关:开"] = false;
dicCheck["开关:关"] = false;
dicCheck["开关:切换"] = false;
dicCheck["亮度:按等级调大"] = false;
dicCheck["亮度:按等级调小"] = false;
dicCheck["亮度:按等级切换"] = false;
dicCheck["亮度:打开"] = false;
dicCheck["亮度:关闭"] = false;
dicCheck["亮度:切换"] = false;
dicCheck["窗帘:开"] = false;
dicCheck["窗帘:关"] = false;
dicCheck["窗帘:停"] = false;
dicCheck["窗帘:上升停"] = false;
dicCheck["窗帘:下降停"] = false;
List result = null;
//获取第一级功能
if (key.privateFuncFirstLevelList.Count == 0 || key.privateFuncFirstLevelList.Contains(256) == false)
{
result = await key.GetPanelDeviceFunctionLevel1();
if (result == null)
{
return null;
}
key.privateFuncFirstLevelList = result;
//面板没有按键类
if (result.Contains(256) == false)
{
return dicCheck;
}
}
else
{
result = key.privateFuncFirstLevelList;
}
if (key.privateFuncSecondLevelList.Count == 0 || key.privateFuncSecondLevelList.Contains(1) == false || key.privateFuncSecondLevelList.Contains(100) == false || key.privateFuncSecondLevelList.Contains(200) == false || key.privateFuncSecondLevelList.Contains(300) == false)
{
//获取第二级功能
result = await key.GetPanelDeviceFunctionLevel2(256);
if (result == null)
{
return null;
}
key.privateFuncSecondLevelList = result;
}
else
{
result = key.privateFuncSecondLevelList;
}
//特殊功能
if (result.Contains(1) == true)
{
List result3 = null;
//获取第三级功能
if (key.privateFuncThirdLevelList.Count == 0 || key.privateFuncThirdLevelList.Contains(1) == false)
{
result3 = await key.GetPanelDeviceFunctionLevel3(256, 1);
foreach (var l3 in result3)
{
key.privateFuncThirdLevelList.Add(l3);
}
}
else
{
result3 = key.privateFuncThirdLevelList;
}
if (result3 != null)
{
if (result3.Contains(1) == true)
{
dicCheck["场景:触发"] = true;
}
}
}
//按键开关类
if (result.Contains(100) == true)
{
List result3 = null;
//获取第三级功能
if (key.privateFuncThirdLevelList.Count == 0 || key.privateFuncThirdLevelList.Contains(100) == false || key.privateFuncThirdLevelList.Contains(101) == false || key.privateFuncThirdLevelList.Contains(102) == false)
{
result3 = await key.GetPanelDeviceFunctionLevel3(256, 100);
foreach (var l3 in result3)
{
key.privateFuncThirdLevelList.Add(l3);
}
}
else
{
result3 = key.privateFuncThirdLevelList;
}
if (result3 != null)
{
if (result3.Contains(100) == true)
{
dicCheck["开关:开"] = true;
}
if (result3.Contains(101) == true)
{
dicCheck["开关:关"] = true;
}
if (result3.Contains(102) == true)
{
dicCheck["开关:切换"] = true;
}
}
}
//按键调光类
if (result.Contains(200) == true)
{
List result3 = null;
//获取第三级功能
if (key.privateFuncThirdLevelList.Count == 0 || key.privateFuncThirdLevelList.Contains(200) == false || key.privateFuncThirdLevelList.Contains(201) == false || key.privateFuncThirdLevelList.Contains(202) == false)
{
result3 = await key.GetPanelDeviceFunctionLevel3(256, 200);
foreach (var l3 in result3)
{
key.privateFuncThirdLevelList.Add(l3);
}
}
else
{
result3 = key.privateFuncThirdLevelList;
}
if (result3 != null)
{
if (result3.Contains(200) == true)
{
dicCheck["亮度:按等级调大"] = true;
}
if (result3.Contains(201) == true)
{
dicCheck["亮度:按等级调小"] = true;
}
if (result3.Contains(202) == true)
{
dicCheck["亮度:按等级切换"] = true;
}
if (result3.Contains(203) == true)
{
dicCheck["亮度:打开"] = true;
}
if (result3.Contains(204) == true)
{
dicCheck["亮度:关闭"] = true;
}
if (result3.Contains(205) == true)
{
dicCheck["亮度:切换"] = true;
}
}
}
//窗帘类
if (result.Contains(300) == true)
{
List result3 = null;
//获取第三级功能
if (key.privateFuncThirdLevelList.Count == 0 || (key.privateFuncThirdLevelList.Contains(300) == false && key.privateFuncThirdLevelList.Contains(301) == false && key.privateFuncThirdLevelList.Contains(302) == false && key.privateFuncThirdLevelList.Contains(303) == false && key.privateFuncThirdLevelList.Contains(304) == false))
{
result3 = await key.GetPanelDeviceFunctionLevel3(256, 300);
foreach (var l3 in result3)
{
key.privateFuncThirdLevelList.Add(l3);
}
}
else
{
result3 = key.privateFuncThirdLevelList;
}
if (result3 != null)
{
if (result3.Contains(300) == true)
{
dicCheck["窗帘:开"] = true;
}
if (result3.Contains(301) == true)
{
dicCheck["窗帘:关"] = true;
}
if (result3.Contains(302) == true)
{
dicCheck["窗帘:停"] = true;
}
if (result3.Contains(303) == true)
{
dicCheck["窗帘:上升停"] = true;
}
if (result3.Contains(304) == true)
{
dicCheck["窗帘:下降停"] = true;
}
}
}
return dicCheck;
}
#region 私有数据备份步骤(有用代码,这里先注释掉)
// title.MouseLongEventHandler += async(sender, e) =>
// {
// string fileName = "Panel_";
// fileName += currentKey.FilePath;
// var file = await System.Threading.Tasks.Task.Factory.StartNew(() => Newtonsoft.Json.JsonConvert.SerializeObject(currentKey));
// var data = System.Text.Encoding.UTF8.GetBytes(file);
// //网关中创建存储数据的文件
// var saveFile = await currentKey.Gateway.CreateFileAsync(fileName);
// //上传数据到网关
// var saveData = await currentKey.Gateway.SendFileAsync(data);
// };
// //存储下载的文件数据
// var byteSource = new System.Collections.Generic.List();
// if (byteSource != null)
// {
// //恢复数据对象
// var realDa = Newtonsoft.Json.JsonConvert.DeserializeObject(System.Text.Encoding.UTF8.GetString(byteSource.ToArray()));
//}
////下载恢复私有数据
//title.MouseUpEventHandler +=async(sender, e) =>
// {
// var key11 = currentKey;
//string fileName = "Panel_";
//fileName += currentKey.FilePath;
// //获取当前文件的具体信息
// var getFileSize = await currentKey.Gateway.GetCurrentFileInfoAsync(fileName);
////下载文件
//var saveFileName = await currentKey.Gateway.SetDownloadFileAsync(fileName);
////接收数据
//Action action = (topic, dataContent) =>
//{
// if (topic.Split('/')[0] + "/" + topic.Split('/')[1] + "/" + topic.Split('/')[2] == topic.Split('/')[0] + "/" + "FileTransfer/DownloadFile")
// {
// byte[] fileBytes = dataContent;
// if (fileBytes[5] != 1)
// {
// if (fileBytes.Length == 2056)
// {
// var tempBytes = new byte[2048];
// System.Array.Copy(fileBytes, 8, tempBytes, 0, 2048);
// byteSource.AddRange(tempBytes);
// }
// else
// {
// var tempBytes = new byte[fileBytes.Length - 8];
// System.Array.Copy(fileBytes, 8, tempBytes, 0, tempBytes.Length);
// byteSource.AddRange(tempBytes);
// }
// }
// else
// {
// var tempBytes = new byte[fileBytes.Length - 8];
// System.Array.Copy(fileBytes, 8, tempBytes, 0, tempBytes.Length);
// byteSource.AddRange(tempBytes);
// }
// }
//};
//currentKey.Gateway.FileContentAction += action;
//};
#endregion
/////
///// 列表控件
/////
//private VerticalScrolViewLayout listView = null;
/////
///// 已经存在的绑定设备
/////
//private Dictionary dicEsixtDevice = new Dictionary();
/////
///// 获取设备的唯一主键
/////
/////
/////
//public string GetDeviceMainKeys(CommonDevice device)
//{
// return device.DeviceAddr + device.DeviceEpoint;
//}
/////
///// 显示错误信息窗口
/////
/////
//private void ShowErrorMsg(string msg)
//{
// Application.RunOnMainThread(() =>
// {
// var contr = new Phone.UserCenter.ErrorMsgControl(msg);
// contr.Show();
// });
//}
/////
///// 显示Tip信息窗口
/////
/////
//private void ShowTipMsg(string msg)
//{
// Application.RunOnMainThread(() =>
// {
// var contr = new Phone.UserCenter.TipViewControl(msg);
// contr.ShowView();
// });
//}
/////
///// 显示一个需要确认的信息框
/////
///// 信息
///// 方法名(请确认这是一个共有方法)
///// 回调函数的启动参数
//public void ShowConfirmMsg(string msg, string methodName = null, params object[] obj)
//{
// Application.RunOnMainThread(() =>
// {
// var alert = new ConfirmMsgControl(msg);
// alert.Show();
// if (methodName != null)
// {
// alert.ResultEventHandler += (sender, result) =>
// {
// if (result == true)
// {
// this.LoadFormMethodByName(this, methodName, obj);
// }
// };
// }
// });
//}
/////
///// 执行指定画面的方法
/////
///// 指定画面的英文名
///// 指定要加载的方法名
///// 启动参数
//public object LoadFormMethodByName(BindInfo form, string method, params object[] parameter)
//{
// return form.GetType().InvokeMember(method, System.Reflection.BindingFlags.InvokeMethod, null, form, parameter);
//}
/////
///// 添加画面,启动参数由指定画面的ShowForm函数所指定
/////
///// 对象画面
///// 启动参数:参数由指定画面的ShowForm函数所指定
//public void AddForm(UserCenterCommonForm newform, params object[] parameter)
//{
// //检测能否追加画面(防止画面二重添加),当点击过快时,会有几率二重添加
// if (UserCenterLogic.CheckCanAddForm(newform) == false)
// {
// return;
// }
// newform.FormID = UserCenterLogic.GetFormName(newform);
// UserView.HomePage.Instance.AddChidren(newform);
// UserView.HomePage.Instance.PageIndex += 1;
// //初始化界面框架
// newform.InitForm(parameter);
// //执行ShowForm()方法
// newform.LoadShowFormMethod(parameter);
//}
/////
///// 能绑定到按键的设备
/////
/////
/////
//public bool SupportDevice(CommonDevice device,int currentClusterID)
//{
// foreach (var data in device.InClusterList)
// {
// //拥有on/off功能的,才支持测试
// if (data.InCluster == currentClusterID)
// {
// return true;
// }
// }
// return false;
//}
/////
///// 绑定PIR传感器的目标(返回成功设置的设备,错误时,返回null)
/////
///// 传感器
///// 要绑定的目标设备
/////
//public async Task> BindKeyDeviceTargets(Panel key, List listDevice,int currentClusterID)
//{
// if (listDevice.Count == 0)
// {
// return new List();
// }
// var dicDevice = new Dictionary();
// //组装数据
// var addData = new Panel.AddBindData();
// addData.DeviceAddr = key.DeviceAddr;
// addData.Epoint = key.DeviceEpoint;
// foreach (var device in listDevice)
// {
// var info = new Panel.AddBindListObj();
// info.BindCluster = currentClusterID;
// info.BindMacAddr = device.DeviceAddr;
// info.BindEpoint = device.DeviceEpoint;
// info.BindType = 0;
// addData.BindList.Add(info);
// //返回成功设备的时候使用
// string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
// dicDevice[mainkeys] = device;
// }
// var result = await key.AddDeviceBindAsync(addData);
// if (result.addedDeviceBindResponseData == null)
// {
// //如果网关已经掉线
// bool flage = Common.LocalGateway.Current.CheckGatewayOnLineOnTimeout(key.CurrentGateWayId, result.errorMessageBase);
// if (flage == false)
// {
// return null;
// }
// //绑定目标设置失败
// string msg = Language.StringByID(R.MyInternationalizationString.uSetBindTargetsFail);
// //拼接上【网关回复超时】的Msg
// msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg);
// this.ShowErrorMsg(msg);
// return null;
// }
// var listSuccess = new List();
// foreach (var data in result.addedDeviceBindResponseData.BindList)
// {
// string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(data.BindMacAddr, data.BindEpoint);
// //0:添加成功 3:已经存在,也可以代表成功
// if (data.Result == 0 || data.Result == 3)
// {
// if (dicDevice.ContainsKey(mainkeys) == true)
// {
// listSuccess.Add(dicDevice[mainkeys]);
// }
// }
// //1:失败,节点设备或场景不存在
// else if (data.Result == 1)
// {
// if (dicDevice.ContainsKey(mainkeys) == true)
// {
// //设备名称 绑定失败
// string msg = Shared.Common.LocalDevice .Current.GetDeviceEpointName(dicDevice[mainkeys]) + " ";
// msg += Language.StringByID(R.MyInternationalizationString.BindFailed);
// this.ShowTipMsg(msg);
// }
// }
// //2:未知,由节点设备反馈发送“Bind/BindResult”主题消息确定是否成功
// else if (data.Result == 2)
// {
// if (result.addBindResultResponseData == null)
// {
// //设备名称 绑定失败
// string msg = Shared.Common.LocalDevice.Current.GetDeviceEpointName(dicDevice[mainkeys]) + " ";
// msg += Language.StringByID(R.MyInternationalizationString.BindFailed);
// this.ShowTipMsg(msg);
// }
// else
// {
// //添加成功
// if (result.addBindResultResponseData.Result == 0)
// {
// if (dicDevice.ContainsKey(mainkeys) == true)
// {
// listSuccess.Add(dicDevice[mainkeys]);
// }
// }
// //设备名称 绑定列表已满
// else if (result.addBindResultResponseData.Result == 140)
// {
// string msg = Shared.Common.LocalDevice.Current.GetDeviceEpointName(dicDevice[mainkeys]) + " ";
// msg += Language.StringByID(R.MyInternationalizationString.uBindListIsFull);
// this.ShowTipMsg(msg);
// }
// else
// {
// //设备名称 绑定失败
// string msg = Shared.Common.LocalDevice.Current.GetDeviceEpointName(dicDevice[mainkeys]) + " ";
// msg += Language.StringByID(R.MyInternationalizationString.BindFailed);
// this.ShowTipMsg(msg);
// }
// }
// }
// }
// return listSuccess;
//}
/////
///// 显示设备选择的界面
/////
//public void ShowDeviceSelectForm(Panel key, int currentClusterID)
//{
// var listShowDevice = new List();
// foreach (var device in PanelBindPage.list)
// {
// if (SupportDevice(device, currentClusterID) == false)
// {
// continue;
// }
// string mainKeys = this.GetDeviceMainKeys(device);
// if (this.dicEsixtDevice.ContainsKey(mainKeys) == true)
// {
// //如果已经添加了,则不再显示
// continue;
// }
// listShowDevice.Add(device);
// }
// var listSelect = new List();
// foreach (string mainkeys in this.dicEsixtDevice.Keys)
// {
// listSelect.Add(mainkeys);
// }
// var form = new SelectDeviceForm();
// this.AddForm(form, listShowDevice, listSelect, false);
// //添加绑定目标
// form.SetTitleText(Language.StringByID(R.MyInternationalizationString.AddBindTargets));
// //设备选择确定
// form.ActionSelectDevice += (async (listDevice) =>
// {
// if (listDevice.Count == 0)
// {
// return;
// }
// var listNewDevice = await this.BindKeyDeviceTargets(key, listDevice,currentClusterID);
// if (listNewDevice == null || listNewDevice.Count == 0)
// {
// return;
// }
// foreach (CommonDevice device in listNewDevice)
// {
// string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
// this.dicEsixtDevice[mainKeys] = device;
// Application.RunOnMainThread(() =>
// {
// this.AddRowlayout(device);
// });
// }
// });
//}
/////
///// 添加行
/////
/////
//private void AddRowlayout(CommonDevice device)
//{
// string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
// this.dicEsixtDevice[mainKeys] = device;
// var row = new DeviceRoomViewRow(this.listView, device);
// row.ChangedChidrenBindMode(row.btnIcon, ChidrenBindMode.BindEventOnly);
// row.ChangedChidrenBindMode(row.btnRoom, ChidrenBindMode.BindEventOnly);
// row.ChangedChidrenBindMode(row.btnDevie, ChidrenBindMode.BindEventOnly);
// //删除
// var btnDelete = new RowDeleteButton();
// row.AddRightView(btnDelete);
// btnDelete.MouseUpEventHandler += (sender, e) =>
// {
// //确认要删除吗?
// string msg = Language.StringByID(R.MyInternationalizationString.uShowDoDeleteMsg);
// this . ShowConfirmMsg(msg, "DeleteTargetDevice", device, row);
// };
//}
}
}