using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Shared.Common;
using Shared.Phone.UserView;
using ZigBee.Device;
namespace Shared.Phone.UserCenter.Device
{
///
/// 编辑设备的信息(这里修改的是MAC名,这个画面会更改MAC的物理名字)
///
public class DeviceMacInfoEditorForm : UserCenterCommonForm, ZigBee.Common.IStatus
{
#region ■ 变量声明___________________________
///
/// 画面正常关闭的回调函数
///
public Action ActionFormClose = null;
///
/// 设备对象
///
private List listNewDevice = null;
///
/// 设置窗帘维修模式Btn
///
private SwichControl switchBtn = null;
///
/// 获取得到了镜像信息
///
private bool receiveImageInfo = false;
#endregion
#region ■ 初始化_____________________________
///
/// 构造方法
///
public DeviceMacInfoEditorForm()
{
ZbGateway.StatusList.Add(this);
}
///
/// 画面显示(底层会固定调用此方法,借以完成画面创建)
///
/// 设备列表
public void ShowForm(List listdevices)
{
this.listNewDevice = listdevices;
//设置标题信息
base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uDeviceInfo));
//初始化删除设备的界面(右上)
this.InitDeleteDeviceForm();
new System.Threading.Thread(() =>
{
//重新获取硬件信息
this.RefreshHardFirmwareInfo();
Application.RunOnMainThread(() =>
{
//初始化中部控件
this.InitMiddleFrame();
});
})
{ IsBackground = true }.Start();
}
///
/// 初始化中部控件
///
private void InitMiddleFrame()
{
this.bodyFrameLayout.RemoveAll();
//设备图片
var btnpictrue = new PicViewControl(510, 320);
btnpictrue.Gravity = Gravity.CenterHorizontal;
btnpictrue.Y = Application.GetRealHeight(100);
Common.LocalDevice.Current.SetRealDeviceIconToControl(btnpictrue, listNewDevice);
bodyFrameLayout.AddChidren(btnpictrue);
var listview = new VerticalScrolViewLayout();
listview.Y = btnpictrue.Bottom + Application.GetRealHeight(100);
listview.Height = bodyFrameLayout.Height - btnpictrue.Bottom - Application.GetRealHeight(100);
bodyFrameLayout.AddChidren(listview);
//生产商名称
var row = new RowLayout();
row.Height = ControlCommonResourse.ListViewRowHeight;
listview.AddChidren(row);
var btnManuView = new RowTopGrayView(false);
btnManuView.TextID = R.MyInternationalizationString.uManufacturerName;
row.AddChidren(btnManuView);
var btnManu = new RowBottomBlackView(false);
btnManu.Text = listNewDevice[0].ManufacturerName;
if (string.IsNullOrEmpty(btnManu.Text) == true)
{
if (listNewDevice[0].DriveCode > 0)
{
//虚拟设备固定使用HDL
listNewDevice[0].ManufacturerName = "HDL";
listNewDevice[0].ReSave();
btnManu.Text = "HDL";
}
}
row.AddChidren(btnManu);
//设备型号
row = new RowLayout();
row.Height = ControlCommonResourse.ListViewRowHeight;
listview.AddChidren(row);
var btnModelIdView = new RowTopGrayView(false);
btnModelIdView.TextID = R.MyInternationalizationString.uModelIdentifier;
row.AddChidren(btnModelIdView);
var btnModelId = new RowBottomBlackView(false);
btnModelId.Text = listNewDevice[0].ModelIdentifier;
row.AddChidren(btnModelId);
//序列号
row = new RowLayout();
row.Height = ControlCommonResourse.ListViewRowHeight;
listview.AddChidren(row);
var btnSerialView = new RowTopGrayView(false);
btnSerialView.TextID = R.MyInternationalizationString.uSerialNumber;
row.AddChidren(btnSerialView);
var btnSerial = new RowBottomBlackView(false);
btnSerial.Text = listNewDevice[0].SerialNumber;
if (string.IsNullOrEmpty(btnSerial.Text) == true)
{
btnSerial.Text = listNewDevice[0].DeviceAddr;
}
row.AddChidren(btnSerial);
//产品名称
string caption = Language.StringByID(R.MyInternationalizationString.uProductName);
string nameValue = Common.LocalDevice.Current.GetDeviceMacName(listNewDevice[0]);
var btnDeviceView = new EditorNameValueRow(caption, nameValue);
listview.AddChidren(btnDeviceView);
btnDeviceView.InitControl();
//请输入产品名称
btnDeviceView.SetEmptyNameTip(Language.StringByID(R.MyInternationalizationString.uProductNameMastInput));
//编辑产品名称
btnDeviceView.SetDialogTitle(Language.StringByID(R.MyInternationalizationString.uEditorProductName));
btnDeviceView.ActionNameChangedEvent += (deviceName) =>
{
//设备重命名然后打开新的画面
this.DeviceReName(deviceName);
};
//只有是河东的设备的时候
if (Common.LocalDevice.Current.IsHdlDevice(listNewDevice[0]) == true)
{
//添加【背光设置】行
this.AddBackLightRow(listview);
//添加 【方向与限位】行
this.AddDirectionLimitRow(listview);
//添加 【维护模式】行
this.AddMaintenanceModeRow(listview);
//添加【固件信息】行
this.AddFirmwareVersionRow(listview);
}
}
#endregion
#region ■ 硬件信息___________________________
///
/// 重新获取硬件信息
///
private void RefreshHardFirmwareInfo()
{
//打开进度条
this.ShowProgressBar();
bool isReceive = false;
//重新获取硬件信息
Common.LocalDevice.Current.SetAllHardFirmwareInfoToDevice(listNewDevice[0], true, (device, reportData) =>
{
for (int i = 1; i < listNewDevice.Count; i++)
{
//全部回路的信息都是一致的
DeviceAttributeLogic.Current.SetHardFirmwareInfo(device.DeviceStatusReport, listNewDevice[i]);
listNewDevice[i].ReSave();
}
isReceive = true;
});
int count = 20;
while (isReceive == false && count > 0)
{
//等待设备镜像的反馈
System.Threading.Thread.Sleep(100);
count--;
}
if (count <= 0)
{
//移除获取设备硬件信息的监听线程
Common.LocalDevice.Current.RemoveDeviceHardInfoThread(listNewDevice[0]);
}
//关闭进度条
this.CloseProgressBar();
}
#endregion
#region ■ 背光设置___________________________
///
/// 添加【背光设置】行
///
///
private void AddBackLightRow(VerticalScrolViewLayout listview)
{
bool canAddRow = false;
foreach (var device in listNewDevice)
{
if (device.Type == DeviceType.OnOffSwitch)
{
canAddRow = true;
break;
}
}
if (canAddRow == false)
{
//必须有一路回路是OnOffSwitch才行
return;
}
//获取这一堆设备时属于什么类型的
var myDeviceType = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listNewDevice);
//如果是控制面板
if (myDeviceType.BeloneType == DeviceBeloneType.A按键面板 || myDeviceType.BeloneType == DeviceBeloneType.A调光器)
{
//背光设置
var statuRowLight = new StatuRowLayout(listview);
var btnBackLight = new RowCenterView(false);
btnBackLight.TextID = R.MyInternationalizationString.uBackLightSettion;
statuRowLight.AddChidren(btnBackLight);
//背光设置向右的图标
statuRowLight.AddRightIconControl();
statuRowLight.MouseUpEvent += (sender, e) =>
{
var form = new DevicePanel.PanelBackLightSettionForm();
this.AddForm(form, listNewDevice);
};
}
}
#endregion
#region ■ 固件信息___________________________
///
/// 添加【固件信息】行
///
///
private void AddFirmwareVersionRow(VerticalScrolViewLayout listview)
{
//拥有200端口这个东西的时候,才会显示这一行
var oTADevice = Common.LocalDevice.Current.GetOTADevice(listNewDevice[0].DeviceAddr);
if (oTADevice == null)
{
return;
}
var statuRow = new StatuRowLayout(listview);
//固件信息
var btnUpview = new RowCenterView(false);
btnUpview.TextID = R.MyInternationalizationString.uFirmwareInformation;
statuRow.AddChidren(btnUpview);
//提示有新版本
var btnNewVersion = new RowNewVersionTipView();
btnNewVersion.Visible = false;
statuRow.AddChidren(btnNewVersion);
statuRow.AddRightIconControl();
statuRow.MouseUpEvent += (sender, e) =>
{
btnNewVersion.Visible = false;
var form = new DeviceFirmwareInfoForm();
this.AddForm(form, listNewDevice);
};
//设置设备的版本信息
this.SetDeviceVersionInfo(btnNewVersion, oTADevice);
}
///
/// 设置设备的版本信息
///
/// 有新版本的提示控件
/// ota设备
private void SetDeviceVersionInfo(RowNewVersionTipView btnNewVersion, OTADevice oTADevice)
{
new System.Threading.Thread(async () =>
{
//设置设备全部的镜像信息
Common.LocalDevice.Current.SetAllImageInfoToOtaDevice(oTADevice, this.OtaImageInfoActionBack);
int count = 5;
while (this.receiveImageInfo == false && count > 0)
{
//等待设备镜像的反馈
await Task.Delay(300);
count--;
}
//变量还原
this.receiveImageInfo = false;
oTADevice = Common.LocalDevice.Current.GetOTADevice(listNewDevice[0].DeviceAddr);
//添加升级固件信息(成不成功都无所谓)
var result = await FirmwareUpdateLogic.AddFirmwareVersionInfo(FirmwareLevelType.ZigbeeDevice, oTADevice.HwVersion.ToString(), oTADevice.ImgTypeId.ToString());
//获取设备最新版本
var deviceFirmware = FirmwareUpdateLogic.GetFirmwareMostVersionInfo(FirmwareLevelType.ZigbeeDevice,
oTADevice.HwVersion.ToString(),
oTADevice.ImgTypeId.ToString(),
oTADevice.ImgVersion);
if (deviceFirmware != null)
{
if (deviceFirmware.FirmwareVersion > oTADevice.ImgVersion)
{
Application.RunOnMainThread(() =>
{
btnNewVersion.Visible = true;
});
}
}
})
{ IsBackground = true }.Start();
}
///
/// 获取到了OTA镜像信息回调(100%特定回调)
///
///
///
private void OtaImageInfoActionBack(CommonDevice device, CommonDevice.DeviceStatusReportData reportData)
{
this.receiveImageInfo = true;
}
#endregion
#region ■ 方向限位___________________________
///
///添加 【方向限位】行
///
/// Listview.
private void AddDirectionLimitRow(VerticalScrolViewLayout listview)
{
bool canAddRow = false;
foreach (var device in listNewDevice)
{
if (device.Type == DeviceType.WindowCoveringDevice)
{
canAddRow = true;
break;
}
}
if (canAddRow == false)
{
//必须有一路回路是WindowCoveringDevice才行
return;
}
//获取这一堆设备时属于什么类型的
var myDeviceType = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listNewDevice);
//如果是窗帘
if (myDeviceType.BeloneType == DeviceBeloneType.A窗帘)
{
//方向与限位设置
var directionLimitRow = new StatuRowLayout(listview);
var directionLimitBtn = new RowCenterView(false);
directionLimitBtn.TextID = R.MyInternationalizationString.DirectionLimit;
directionLimitRow.AddChidren(directionLimitBtn);
//方向与限位设置向右的图标
var btnLightRight = new RowRightIconView();
directionLimitRow.AddChidren(btnLightRight);
directionLimitRow.MouseUpEvent += (sender, e) =>
{
var form = new RollerShadeDirectionLimitSettingForm();
this.AddForm(form, listNewDevice);
};
}
}
#endregion
#region ■ 维护模式___________________________
///
/// 添加 【维护模式】行
///
/// Listview.
/// If set to true statu.
private void AddMaintenanceModeRow(VerticalScrolViewLayout listview, bool statu = false)
{
bool canAddRow = false;
foreach (var device in listNewDevice)
{
if (device.Type == DeviceType.WindowCoveringDevice)
{
var rollershade = device as Rollershade;
canAddRow = true;
break;
}
}
if (canAddRow == false)
{
//必须有一路回路是WindowCoveringDevice才行
return;
}
//获取这一堆设备时属于什么类型的
var myDeviceType = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listNewDevice);
//如果是窗帘
if (myDeviceType.BeloneType == DeviceBeloneType.A窗帘)
{
//窗帘取第一回路
var rollerShade = listNewDevice[0] as Rollershade;
//维护模式 设置
var maintenanceModeRow = new RowLayout
{
Height = ControlCommonResourse.ListViewRowHeight
};
listview.AddChidren(maintenanceModeRow);
//不上非远程
if (rollerShade.Gateway == null)
{
return;
}
//if (rollerShade.Gateway.IsVirtual)
//{
UserHomeView.ReadStatus(rollerShade, () =>
{
rollerShade.ReadCurtainDirectionAndMode();
},3);
//}
//else
//{
// //防止短时间内多次读取
// if ((DateTime.Now - rollerShade.LastDateTime).TotalSeconds > CommonPage.ReadDeviceStatuSpan)
// {
// rollerShade.ReadCurtainDirectionAndMode();
// }
//}
var maintenanceModeBtn = new RowTopGrayView(false);
maintenanceModeBtn.TextID = R.MyInternationalizationString.MaintenanceMode;
maintenanceModeRow.AddChidren(maintenanceModeBtn);
var Start_ban_switchBtn = new RowBottomBlackView(false);
Start_ban_switchBtn.TextID = R.MyInternationalizationString.Start_Forbid_Hand_Pull_Switch;
maintenanceModeRow.AddChidren(Start_ban_switchBtn);
switchBtn = new SwichControl();
switchBtn.Tag = rollerShade;
maintenanceModeRow.AddChidren(switchBtn);
switchBtn.IsSelected = rollerShade.WcdCurrentMaintenance;
switchBtn.MouseUpEventHandler += async (sender, e) =>
{
try
{
CommonPage.Loading.Start();
switchBtn.IsSelected = !switchBtn.IsSelected;
var setWritableValueResponAllData = await rollerShade.SetCurtianMaintenanceAsync(switchBtn.IsSelected);
await System.Threading.Tasks.Task.Delay(5000);
if (setWritableValueResponAllData == null || setWritableValueResponAllData.setWritableValueResponData == null)
{
Shared.Common.CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.ConnectGWFail);
switchBtn.IsSelected = false;
return;
}
var status = setWritableValueResponAllData.setWritableValueResponData.Status;
//以后补充提示
//0:配置成功(若配置成功,下面的AttributeId字段不存在)
//34:不支持该属性
//135:无效的属性值
//141:无效的数据类型
if (status == 0)
{
System.Console.WriteLine("切换维护模式成功");
//DeviceUI.ShowStatuTip(R.MyInternationalizationString.Success);
}
else
{
Shared.Common.CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.ChangeMaintenanceMode_Fail);
switchBtn.IsSelected = false;
}
}
catch(Exception ex)
{
System.Console.WriteLine("设置维护模式失败"+ex);
}
finally
{
CommonPage.Loading.Hide();
}
};
}
}
#endregion
#region ■ 修改名字___________________________
///
/// 设备重命名
///
/// deviceName.
private async void DeviceReName(string i_deviceName)
{
//修改MAC名
string deviceName = i_deviceName.Trim();
var result = await Common.LocalDevice.Current.ReMacName(this.listNewDevice, deviceName);
if (result == false)
{
return;
}
Application.RunOnMainThread(() =>
{
if (ActionFormClose != null)
{
this.ActionFormClose(deviceName);
}
});
}
#endregion
#region ■ 删除界面___________________________
///
/// 初始化删除设备的界面
///
private void InitDeleteDeviceForm()
{
var btnIcon = new TopLayoutMostRightView();
btnIcon.UnSelectedImagePath = "Item/More.png";
btnIcon.SelectedImagePath = "Item/MoreSelected.png";
topFrameLayout.AddChidren(btnIcon);
btnIcon.MouseUpEventHandler += ((sender, e) =>
{
//显示删除设备的弹窗界面
this.ShowDeleteDeviceDialogForm();
});
}
///
/// 显示删除设备的弹窗界面
///
private void ShowDeleteDeviceDialogForm()
{
var frame = new TopRightMenuControl(this, 1);
//删除设备
string deviceMenu = Language.StringByID(R.MyInternationalizationString.uDeleteDevice);
frame.AddRowMenu(deviceMenu, (obj) =>
{
//确认要删除该设备?{0}(删除设备后,绑定目标将消失)
string msg = Language.StringByID(R.MyInternationalizationString.uDeleteDeviceMsg);
if (msg.Contains("{0}") == true)
{
msg = string.Format(msg, "\r\n");
}
this.ShowConfirmMsg(msg, "DoDeleteDevice");
});
}
///
/// 删除指定设备
///
public async void DoDeleteDevice()
{
//开启进度条
this.ShowProgressBar();
//删除设备
bool result = await Common.LocalDevice.Current.DeleteDevice(listNewDevice);
this.CloseProgressBar();
if (result == false)
{
return;
}
Application.RunOnMainThread(() =>
{
//关闭界面
this.CloseForm();
//移除设备列表界面指定的设备
this.LoadFormMethodByName("DeviceManagementMainForm", "RemoveDeviceFromMemory", listNewDevice);
});
}
#endregion
#region ■ 关闭界面___________________________
///
/// 画面关闭
///
/// 是否关闭界面,false的时候,只会调用关闭函数里面的附加功能
public override void CloseForm(bool isCloseForm = true)
{
ZbGateway.StatusList.Remove(this);
base.CloseForm(isCloseForm);
}
#endregion
#region ■ 设备接口___________________________
///
/// Changed the specified common.
///
/// Common.
public void Changed(CommonDevice common)
{
}
///
/// 设备状态更新接口
/// type:如果为 DeviceInComingRespon:设备新上报
/// type:如果为 IASInfoReport:RemoveDeviceRespon
/// type:如果为 DeviceStatusReport:设备上报
/// type:如果为 IASInfoReport:IAS安防信息上报
/// type:如果为 OnlineStatusChange: 设备在线状态更新
///
/// Common.
/// Type tag.
public void DeviceInfoChange(CommonDevice common, string typeTag)
{
if (typeTag == "DeviceStatusReport")
{
Application.RunOnMainThread(() =>
{
try
{
if (switchBtn == null)
{
return;
}
var device = switchBtn.Tag as CommonDevice;
//是否为当前设备
if (device.DeviceEpoint != common.DeviceEpoint || device.DeviceAddr != common.DeviceAddr)
{
return;
}
if ((common as Rollershade).DeviceStatusReport.CluterID != 258)
{
return;
}
var rollerShade = device as Rollershade;
rollerShade.DeviceStatusReport = (common as Rollershade).DeviceStatusReport;
var attriButeList = rollerShade.DeviceStatusReport.AttriBute;
if(attriButeList==null)
{
return;
}
foreach (var attriBute in attriButeList)
{
//维护模式
if (attriBute.AttributeId == 23)
{
if (0 < (attriBute.AttriButeData & 0x04))
{
switchBtn.IsSelected = rollerShade.WcdCurrentMaintenance = true;
}
else
{
switchBtn.IsSelected = rollerShade.WcdCurrentMaintenance = false;
}
rollerShade.LastDateTime = DateTime.Now;
}
}
}
catch (Exception ex)
{
System.Console.WriteLine($"Error:{ex.Message}");
}
});
}
}
///
/// Changeds the IL ogic status.
///
/// Logic.
public void ChangedILogicStatus(ZigBee.Device.Logic logic)
{
}
///
/// Changeds the IS cene status.
///
/// Scene.
public void ChangedISceneStatus(Scene scene)
{
}
#endregion
}
}