using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 窗帘的逻辑 /// public class HdlDeviceCurtainLogic { #region ■ 变量声明___________________________ /// /// 窗帘的逻辑 /// private static HdlDeviceCurtainLogic m_Current = null; /// /// 窗帘的逻辑 /// public static HdlDeviceCurtainLogic Current { get { if (m_Current == null) { m_Current = new HdlDeviceCurtainLogic(); } return m_Current; } } #endregion #region ■ 手拉控制___________________________ /// /// 设置手拉控制状态值 /// /// 窗帘对象 /// 手拉控制状态值 /// public async Task SetHandPullControl(Rollershade rollershade, bool bolStatu) { var result = await rollershade.SetCurtianMaintenanceAsync(bolStatu); //检测网关返回的共通错误状态码 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result); if (error != null) { this.ShowTipMsg(error); return false; } if (result == null || result.setWritableValueResponData == null) { //切换手拉控制失败 string msg = Language.StringByID(R.MyInternationalizationString.uChangeHandPullControlFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); this.ShowTipMsg(msg); return false; } if (result.setWritableValueResponData.Status != 0) { //切换手拉控制失败 string msg = Language.StringByID(R.MyInternationalizationString.uChangeHandPullControlFail); this.ShowTipMsg(msg); return false; } //备份属性 await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(rollershade, GatewayBackupEnum.A窗帘手拉控制, bolStatu); return true; } #endregion #region ■ 窗帘方向配置_______________________ /// /// 配置窗帘的方向 /// /// 窗帘对象 /// false:电机方向正向;true:电机方向反向 /// public async Task SetCurtainDirection(Rollershade rollershade, bool bolStatu) { var result = await rollershade.SetCurtainDirectionAsync(bolStatu); //检测网关返回的共通错误状态码 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result); if (error != null) { this.ShowTipMsg(error); return false; } if (result == null || result.setWritableValueResponData == null) { //窗帘方向设置失败 string msg = Language.StringByID(R.MyInternationalizationString.uSetCurtainDirectionFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); this.ShowTipMsg(msg); return false; } if (result.setWritableValueResponData.Status != 0) { //窗帘方向设置失败 string msg = Language.StringByID(R.MyInternationalizationString.uSetCurtainDirectionFail); this.ShowTipMsg(msg); return false; } //备份设备 await this.BackupCurtainDirection(rollershade, bolStatu); return true; } /// /// 备份窗帘方向 /// /// 窗帘对象 /// false:电机方向正向;true:电机方向反向 /// public async Task BackupCurtainDirection(Rollershade rollershade, bool bolStatu) { //备份设备 return await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(rollershade, GatewayBackupEnum.A窗帘方向, bolStatu); } #endregion #region ■ 窗帘限位配置_______________________ /// /// 执行确认及覆盖窗帘限位点 /// /// 窗帘对象 /// 确认及覆盖上限位还是下限位 /// 上限位的值(长度值,不是百分比) /// 下限位的值(长度值,不是百分比) /// public async Task CommitCurtainLimitPoint(Rollershade rollershade, Rollershade.CurtainPrivateInstalledLimi limiType, int upLimit, int downLimit) { CommonDevice.SetWritableValueResponAllData result = null; if (upLimit == -1 && upLimit == -1) { //这个是卷帘 result = await rollershade.SetCurtainInstalledLimitAsync(limiType); } else { //这个是开合帘 "2,0x00ff,0x00ff"格式 合限位在前,开限位在后 string convertData = "\"2,0x" + Convert.ToString(downLimit, 16).PadLeft(4, '0'); convertData += ",0x" + Convert.ToString(upLimit, 16).PadLeft(4, '0') + "\""; //然后将它们转为ASK码数值,然后再转为16进制 //总计长度为17(这里是16进制) string sendData = "11"; foreach (char c in convertData) { sendData += Convert.ToString((int)c, 16).PadLeft(2, '0'); } result = await HdlDeviceAttributeLogic.Current.WriteDeviceAttribute(rollershade, 258, 24, 65, sendData); } //检测网关返回的共通错误状态码 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result); if (error != null) { this.ShowTipMsg(error); return false; } if (result == null || result.setWritableValueResponData == null) { //设置窗帘限位点失败 string msg = Language.StringByID(R.MyInternationalizationString.uCommitCurtainLimitFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); this.ShowTipMsg(msg); return false; } if (result.setWritableValueResponData.Status != 0) { //设置窗帘限位点失败 string msg = Language.StringByID(R.MyInternationalizationString.uCommitCurtainLimitFail); this.ShowTipMsg(msg); return false; } if (upLimit != -1 && downLimit != -1) { //备份设备 await this.BackupCurtainLimitPoint(rollershade, upLimit, downLimit); } return true; } /// /// 删除限位点 /// /// 窗帘对象 /// 删除上限位还是删除下限位 /// public async Task DeleteCurtainLimitPoint(Rollershade rollershade, Rollershade.LimiType limiType) { var result = await rollershade.DeleteCurtainLimitsAsync(limiType); //检测网关返回的共通错误状态码 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result); if (error != null) { this.ShowTipMsg(error); return false; } if (result == null || result.setWritableValueResponData == null) { //重置窗帘限位点失败 string msg = Language.StringByID(R.MyInternationalizationString.uDeleteCurtainLimitFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); this.ShowTipMsg(msg); return false; } if (result.setWritableValueResponData.Status != 0) { //重置窗帘限位点失败 string msg = Language.StringByID(R.MyInternationalizationString.uDeleteCurtainLimitFail); this.ShowTipMsg(msg); return false; } return true; } /// /// 备份窗帘限位点 /// /// 窗帘对象 /// 上限位的值,百分比(备份用) /// 下限位的值,百分比(备份用) /// public async Task BackupCurtainLimitPoint(Rollershade rollershade, int upLimit, int downLimit) { //备份设备 var backData = new Newtonsoft.Json.Linq.JObject { { "upLimit",upLimit }, { "downLimit", downLimit } }; //备份设备 return await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(rollershade, GatewayBackupEnum.A窗帘上下限位, backData); } #endregion #region ■ 获取窗帘限位配置___________________ /// /// 发送获取窗帘限位配置的命令 /// /// 窗帘对象 public void SetGetCurtainLimitSettionComand(Rollershade rollershade) { var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr",rollershade.DeviceAddr }, { "Epoint", rollershade.DeviceEpoint }, { "Cluster_ID", (int)Cluster_ID.WindowCovering }, { "Command", 108 } }; var attriBute = new Newtonsoft.Json.Linq.JArray { new Newtonsoft.Json.Linq.JObject { //开合帘方向 { "AttriButeId", (int)AttriButeId.WindowCoveringMode} }, new Newtonsoft.Json.Linq.JObject { //开合帘总长 { "AttriButeId", (int)AttriButeId.WindowCoveringLength} }, new Newtonsoft.Json.Linq.JObject { //开限位 { "AttriButeId", (int)AttriButeId.InstalledOpenLimitLift} }, new Newtonsoft.Json.Linq.JObject { //合限位 { "AttriButeId", (int)AttriButeId.InstalledClosedLimitLift} } }; var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } }; jObject.Add("Data", data); rollershade.Gateway?.Send(("GetDeviceStatus"), jObject.ToString()); } #endregion #region ■ 重置窗帘___________________________ /// /// 重置窗帘 /// /// 窗帘对象 /// public async Task RestoreCurtain(Rollershade rollershade) { var result = await rollershade.RestoreCurtainLimitAsync(); //检测网关返回的共通错误状态码 string error = HdlCheckLogic.Current.CheckCommonErrorCode(result); if (error != null) { this.ShowTipMsg(error); return false; } if (result == null || result.setWritableValueResponData == null) { //重置窗帘失败 string msg = Language.StringByID(R.MyInternationalizationString.uRestoreCurtainFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); this.ShowTipMsg(msg); return false; } if (result.setWritableValueResponData.Status != 0) { //重置窗帘失败 string msg = Language.StringByID(R.MyInternationalizationString.uRestoreCurtainFail); this.ShowTipMsg(msg); return false; } return true; } #endregion #region ■ 一般方法___________________________ /// /// 显示错误信息窗口 /// /// private void ShowErrorMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Error, msg); contr.Show(); }); } /// /// 显示Tip信息窗口 /// /// private void ShowTipMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); }); } #endregion } }