using System; using System.Collections.Generic; using Shared.Common; using Shared.Phone.UserView; using ZigBee.Device; namespace Shared.Phone.UserCenter.Device { /// /// 卷帘设置反向与限位 /// public class RollerShadeDirectionLimitSettingForm: UserCenterCommonForm,ZigBee.Common.IStatus { #region ◆ 设备接口__________________________ /// /// Changed the specified common. /// /// Common. public void Changed(CommonDevice common) { //throw new NotImplementedException(); } /// /// 设备状态更新接口 /// 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 { var device = listRollershade[0]; //是否为当前设备 if (device.DeviceEpoint != common.DeviceEpoint || device.DeviceAddr != common.DeviceAddr) { return; } if ((common as Rollershade).DeviceStatusReport == null || (common as Rollershade).DeviceStatusReport.CluterID != 258) { return; } var attriButeList = (common as Rollershade).DeviceStatusReport.AttriBute; if(attriButeList==null || attriButeList.Count==0) { return; } switch (attriButeList[0].AttributeId) { case 0: //类型 rollershade.DeviceStatusReport = (common as Rollershade).DeviceStatusReport; rollershade.WcdType = attriButeList[0].AttriButeData; rollershade.LastDateTime = DateTime.Now; break; case 1: //总长 rollershade.DeviceStatusReport = (common as Rollershade).DeviceStatusReport; rollershade.WcdCurrentLength = attriButeList[0].AttriButeData; windowCurrentLength = rollershade.WcdCurrentLength; rollershade.LastDateTime = DateTime.Now; break; case 23: //方向 rollershade.DeviceStatusReport = (common as Rollershade).DeviceStatusReport; if (0 < (attriButeList[0].AttriButeData & 0x01)) { //电机反向 rollershade.WcdCurrentDirection = true; directionBtn.TextID = R.MyInternationalizationString.ReverseDirection; } else { //电机正向 rollershade.WcdCurrentDirection = false; directionBtn.TextID = R.MyInternationalizationString.ForwardDirection; } rollershade.LastDateTime = DateTime.Now; break; case 16: //上限位 rollershade.DeviceStatusReport = (common as Rollershade).DeviceStatusReport; if (windowCurrentLength != 0) { rollershade.WcdCurrentWcdInstalOpenLimit = attriButeList[0].AttriButeData; startSeekBar.Progress = (int)(rollershade.WcdCurrentWcdInstalOpenLimit / (windowCurrentLength * 1.0) * 100); startBtn.Text = $"{Language.StringByID(R.MyInternationalizationString.SetStartLimit)} : {startSeekBar.Progress}%"; rollershade.LastDateTime = DateTime.Now; } break; case 17: //下限位 rollershade.DeviceStatusReport = (common as Rollershade).DeviceStatusReport; if (windowCurrentLength != 0) { rollershade.WcdCurrentInstalCloseLimit = attriButeList[0].AttriButeData; endSeekBar.Progress = (int)(rollershade.WcdCurrentInstalCloseLimit / (windowCurrentLength * 1.0) * 100); endBtn.Text = $"{Language.StringByID(R.MyInternationalizationString.SetEndLimit)} : {endSeekBar.Progress}%"; rollershade.LastDateTime = DateTime.Now; } break; case 8: //窗帘百分比 //发送设置上限位 //发送设置下限位 rollershade.DeviceStatusReport = (common as Rollershade).DeviceStatusReport; rollershade.LastDateTime = DateTime.Now; rollershade.WcdCurrentPositionLiftPercentage= attriButeList[0].AttriButeData; System.Console.WriteLine($"收到了回复:{rollershade.WcdCurrentPositionLiftPercentage} {startSeekBar.Progress} {endSeekBar.Progress}"); if (canSetStartLimit && System.Math.Abs(rollershade.WcdCurrentPositionLiftPercentage - startSeekBar.Progress) < 5) { hadReceivedStartEndLimitCode = true; CommonPage.Loading.Hide(); var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP), Language.StringByID(R.MyInternationalizationString.SettingStartLimit), Language.StringByID(R.MyInternationalizationString.Cancel), Language.StringByID(R.MyInternationalizationString.Confrim)); alert.Show(); alert.ResultEventHandler += async (sender2, e2) => { if (e2) { try { CommonPage.Loading.Start(); var status = await SetLimitAsync(Rollershade.CurtainPrivateInstalledLimi.UpLimit, rollershade); if (status == 0) { System.Console.WriteLine("上行程设置成功"); var tip = new TipViewControl(Language.StringByID(R.MyInternationalizationString.Success)); tip.ShowView(); } else if (status == -1) { CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.ConnectGWFail); } else { CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.FAIL); } } catch (Exception ex) { System.Console.WriteLine($"设置上限位失败{ex.Message}"); } finally { CommonPage.Loading.Hide(); } } }; } if (canSetEndLimit && System.Math.Abs(rollershade.WcdCurrentPositionLiftPercentage - endSeekBar.Progress) < 5) { hadReceivedStartEndLimitCode = true; CommonPage.Loading.Hide(); var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP), Language.StringByID(R.MyInternationalizationString.SettingEndLimit), Language.StringByID(R.MyInternationalizationString.Cancel), Language.StringByID(R.MyInternationalizationString.Confrim)); alert.Show(); alert.ResultEventHandler += async (sender2, e2) => { if (e2) { try { CommonPage.Loading.Start(); var status = await SetLimitAsync(Rollershade.CurtainPrivateInstalledLimi.DownLimit, rollershade); if (status == 0) { System.Console.WriteLine("下行程设置成功"); var tip = new TipViewControl(Language.StringByID(R.MyInternationalizationString.Success)); tip.ShowView(); } else if (status == -1) { CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.ConnectGWFail); } else { CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.FAIL); } } catch (Exception ex) { System.Console.WriteLine($"设置下限位失败{ex.Message}"); } finally { CommonPage.Loading.Hide(); } } }; } break; } } catch (Exception ex) { System.Console.WriteLine($"Error:{ex.Message}"); } }); } } /// /// Changeds the IL ogic status. /// /// Logic. public void ChangedILogicStatus(ZigBee.Device.Logic logic) { //throw new NotImplementedException(); } /// /// Changeds the IS cene status. /// /// Scene. public void ChangedISceneStatus(Scene scene) { //throw new NotImplementedException(); } #endregion #region ◆ 变量_____________________________ /// /// 设置方向与限位的设备--窗帘 /// private List listRollershade = null; /// /// The rollershade. /// private Rollershade rollershade = null; /// /// 起始方向btn /// private RowSecondRightTextView directionBtn = null; /// /// 设置开始的限位的滑条 /// private HorizontalSeekBar startSeekBar = null; /// /// 设置限位的开始百分比按钮 /// private Button startBtn = null; /// /// 设置结束限位的滑条 /// private HorizontalSeekBar endSeekBar = null; /// /// 设置限位的结束百分比按钮 /// private Button endBtn = null; //延时 300毫秒 private readonly double sleepSpan = 0.3; /// /// 是否可以发送设置上限位命令了 /// private bool canSetStartLimit = false; /// /// 接口中是否收到了设置开始\结束限位的导轨移动的百分比 /// private bool hadReceivedStartEndLimitCode = false; /// /// 是否可以发送设置结束限位命令了 /// /// private bool canSetEndLimit = false; /// /// 窗帘总长 /// private int windowCurrentLength = 0; /// /// 设置限位的线程列表 /// static List threads = new List { }; #endregion #region ◆ 构造方法__________________________ /// /// 构造方法 /// public RollerShadeDirectionLimitSettingForm() { UserView.HomePage.Instance.ScrollEnabled = false; ZigBee.Device.ZbGateway.StatusList.Add(this); } #endregion #region ◆ 关闭界面__________________________ /// /// 画面关闭 /// /// 是否关闭界面,false的时候,只会调用关闭函数里面的附加功能 public override void CloseForm(bool isCloseForm = true) { UserView.HomePage.Instance.ScrollEnabled = true; ZigBee.Device.ZbGateway.StatusList.Remove(this); base.CloseForm(isCloseForm); } #endregion #region ◆ 显示界面__________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// /// 设备 public void ShowForm(List i_listdevice) { if(i_listdevice==null || i_listdevice.Count==0) { return; } this.listRollershade = i_listdevice; this.rollershade = listRollershade[0] as Rollershade; //设置标题信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.DirectionLimit)); //初始化中部控件 this.InitMiddleFrame(); } #endregion #region ◆ 初始化中部控件_____________________ /// /// 初始化中部控件 /// private void InitMiddleFrame() { bodyFrameLayout.RemoveAll(); var listview = new VerticalScrolViewLayout(); listview.ScrollEnabled = false; bodyFrameLayout.AddChidren(listview); //读取状态 InitReadStatu(); //起始方向 AddinitialDirectionRow(listview); //限位 AddDirectionLimitRow(listview); //恢复行程设置 AddRestoreTravelSettingsRow(listview); } #endregion #region ◆ 读取状态__________________________ /// /// 读取状态 /// private void InitReadStatu() { //不上非远程 if (rollershade.Gateway == null) { return; } UserHomeView.ReadStatus(rollershade, () => { rollershade.ReadWcdType(); rollershade.ReadWcdLength(); rollershade.ReadCurtainDirectionAndMode(); rollershade.ReadWcdInstalOpenLimit(); rollershade.ReadWcdInstalCloseLimit(); }, 1); } #endregion #region ◆ 添加 【起始方向】行_________________ /// /// 添加 【起始方向】行 /// /// Lisrview. private void AddinitialDirectionRow(VerticalScrolViewLayout listview) { var initialDirectionRow = new StatuRowLayout(listview); var initialDirectionBtn = new RowCenterView(false); initialDirectionBtn.TextID = R.MyInternationalizationString.InitialDirection; initialDirectionRow.AddChidren(initialDirectionBtn); directionBtn = new RowSecondRightTextView(); directionBtn.TextID = rollershade.WcdCurrentDirection == false ? R.MyInternationalizationString.ForwardDirection : R.MyInternationalizationString.ReverseDirection; directionBtn.TextColor = UserCenterColor.Current.TextGrayColor; initialDirectionRow.AddChidren(directionBtn); var directionRightBtn = new RowRightIconView(); initialDirectionRow.AddChidren(directionRightBtn); initialDirectionRow.MouseUpEvent += (sender, e) => { try { CommonPage.Loading.Start(); System.Console.WriteLine("方向"); var list = new List { }; list.Add(Language.StringByID(R.MyInternationalizationString.ForwardDirection)); list.Add(Language.StringByID(R.MyInternationalizationString.ReverseDirection)); PickerView.Show(list, async (obj) => { directionBtn.Text = obj; bool direction = directionBtn.Text.Trim() == Language.StringByID(R.MyInternationalizationString.ReverseDirection); var setWritableValueResponAllData = await rollershade.SetCurtainDirectionAsync(direction); if (setWritableValueResponAllData == null || setWritableValueResponAllData.setWritableValueResponData == null) { CommonPage.Loading.Hide(); Shared.Common.CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.ConnectGWFail); return; } var status = setWritableValueResponAllData.setWritableValueResponData.Status; //以后补充提示 //0:配置成功(若配置成功,下面的AttributeId字段不存在) //34:不支持该属性 //135:无效的属性值 //141:无效的数据类型 if (status == 0) { System.Console.WriteLine("设置方向成功"); rollershade.WcdCurrentDirection = direction; } else { CommonPage.Loading.Hide(); Shared.Common.CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.FAIL); } }, Language.StringByID(R.MyInternationalizationString.Confrim)); } catch(Exception ex) { System.Console.WriteLine($"设置方向行错误:{ex.Message}"); } finally { CommonPage.Loading.Hide(); } }; } #endregion #region ◆ 添加 【限位】行____________________ /// /// 添加 【限位】行 /// /// Lisrview. private void AddDirectionLimitRow(VerticalScrolViewLayout listview) { if(rollershade.WcdType==0) { //AddDirectionLimitRowJL(listview); } else if(rollershade.WcdType==4) { AddDirectionLimitRowKHL(listview); } } /// /// 添加 卷帘【限位】行 /// /// Lisrview. private void AddDirectionLimitRowJL(VerticalScrolViewLayout listview) { var directionLimitRow = new RowLayout(); directionLimitRow.Height = ControlCommonResourse.ListViewRowHeight; directionLimitRow.LineColor = ZigbeeColor.Current.GXCLineColor; listview.AddChidren(directionLimitRow); var directionLimitBtn = new RowCenterView(false); directionLimitBtn.TextID = R.MyInternationalizationString.Limit; directionLimitRow.AddChidren(directionLimitBtn); //方向与限位设置向右的图标 //向右的图标 var btnDirectionRight = new Button() { X = directionLimitRow.Width - Application.GetRealWidth(150), Height = Application.GetMinRealAverage(110), Width = Application.GetMinRealAverage(110), UnSelectedImagePath = "Item/Next.png", SelectedImagePath = "Item/DownSelected.png", Gravity = Gravity.CenterVertical }; //btnDirectionRight.UnSelectedImagePath = "Item/Next.png"; //btnDirectionRight.SelectedImagePath = "Item/Down.png"; directionLimitRow.AddChidren(btnDirectionRight); } /// /// 添加 开合帘【限位】行 /// /// Lisrview. private void AddDirectionLimitRowKHL(VerticalScrolViewLayout listview) { var directionLimitRow = new RowLayout(); directionLimitRow.Height = ControlCommonResourse.ListViewRowHeight; directionLimitRow.LineColor = ZigbeeColor.Current.GXCLineColor; listview.AddChidren(directionLimitRow); var directionLimitBtn = new RowCenterView(false); directionLimitBtn.TextID = R.MyInternationalizationString.Limit; directionLimitRow.AddChidren(directionLimitBtn); //方向与限位设置向右的图标 //向右的图标 var btnDirectionRight = new Button() { X = directionLimitRow.Width - Application.GetRealWidth(150), Height = Application.GetMinRealAverage(110), Width = Application.GetMinRealAverage(110), UnSelectedImagePath = "Item/Next.png", SelectedImagePath = "Item/DownSelected.png", Gravity = Gravity.CenterVertical }; //btnDirectionRight.UnSelectedImagePath = "Item/Next.png"; //btnDirectionRight.SelectedImagePath = "Item/Down.png"; directionLimitRow.AddChidren(btnDirectionRight); var startLimitRowView = new FrameLayout() { Y = ControlCommonResourse.ListViewRowHeight, Height = ControlCommonResourse.ListViewRowHeight * 2, BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor, Tag = "startEndLimitRowView" }; directionLimitRow.AddChidren(startLimitRowView); var startLine = new Button() { Height = 1, BackgroundColor = ZigbeeColor.Current.GXCLineColor }; startLimitRowView.AddChidren(startLine); startSeekBar = new HorizontalSeekBar() { Height = Application.GetRealHeight(80), Width = Application.GetRealWidth(750), Gravity = Gravity.Center, ThumbColor = ZigbeeColor.Current.GXCButtonBlueColor, BackgroundColor = ZigbeeColor.Current.GXCSliderUnSelectedColor, ProgressColor = ZigbeeColor.Current.GXCButtonBlueColor, Max = 100, Progress = 0 }; startLimitRowView.AddChidren(startSeekBar); startBtn = new Button() { Y = Application.GetRealHeight(30), Height = Application.GetRealHeight(80), X = Application.GetRealWidth(CommonPage.XLeft), Width = Application.GetRealWidth(500), TextColor = ZigbeeColor.Current.GXCTextBlackColor, TextAlignment = TextAlignment.CenterLeft, Text = $"{Language.StringByID(R.MyInternationalizationString.SetStartLimit)} : {startSeekBar.Progress}%" }; startLimitRowView.AddChidren(startBtn); var endLimitRowView = new FrameLayout() { Y = startLimitRowView.Bottom, Height = ControlCommonResourse.ListViewRowHeight * 2, BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor, Tag = "startEndLimitRowView" }; directionLimitRow.AddChidren(endLimitRowView); var endLine = new Button() { Height = 1, BackgroundColor = ZigbeeColor.Current.GXCLineColor }; endLimitRowView.AddChidren(endLine); endSeekBar = new HorizontalSeekBar() { Y = endLine.Bottom, Height = Application.GetRealHeight(80), BackgroundColor = ZigbeeColor.Current.GXCSliderUnSelectedColor, Width = Application.GetRealWidth(750), Gravity = Gravity.Center, ThumbColor = ZigbeeColor.Current.GXCButtonBlueColor, ProgressColor = ZigbeeColor.Current.GXCButtonBlueColor, Max = 100, Progress = 100 }; endLimitRowView.AddChidren(endSeekBar); endBtn = new Button() { Y = Application.GetRealHeight(30), Height = Application.GetRealHeight(80), X = Application.GetRealWidth(CommonPage.XLeft), Width = Application.GetRealWidth(500), TextColor = ZigbeeColor.Current.GXCTextBlackColor, TextAlignment = TextAlignment.CenterLeft, Text = $"{Language.StringByID(R.MyInternationalizationString.SetEndLimit)} : {endSeekBar.Progress}%" }; endLimitRowView.AddChidren(endBtn); bool isStartSendDelayFrist = false; bool isEndSendDelayFrist = false; DateTime lastStartSendDelayTime = DateTime.Now; DateTime lastEndSendDelayTime = DateTime.Now; startSeekBar.ProgressChanged += async (sender1, e1) => { canSetStartLimit = false; startBtn.Text = $"{Language.StringByID(R.MyInternationalizationString.SetStartLimit)} : {startSeekBar.Progress}%"; if (isStartSendDelayFrist == false) { isStartSendDelayFrist = true; //先发送删除限位点命令 var t = await DeleteUpLimitAsync(rollershade); endBtn.Text = $"{Language.StringByID(R.MyInternationalizationString.SetEndLimit)} : {endSeekBar.Progress}%"; rollershade.WcdGoToTiltValue(startSeekBar.Progress); lastStartSendDelayTime = DateTime.Now; } else { if ((DateTime.Now - lastStartSendDelayTime).TotalSeconds > sleepSpan) { rollershade.WcdGoToTiltValue(startSeekBar.Progress); lastStartSendDelayTime = DateTime.Now; } } }; startSeekBar.MouseUpEventHandler += (sender1, e1) => { isStartSendDelayFrist = false; canSetStartLimit = true; hadReceivedStartEndLimitCode = false; rollershade.WcdGoToTiltValue(startSeekBar.Progress); lastStartSendDelayTime = DateTime.Now; CommonPage.Loading.Start(Language.StringByID(R.MyInternationalizationString.PleaseWaitWhileTheGuidewayIsMoving)); DeviceDelayAction(rollershade, (hadReceived) => { Application.RunOnMainThread(() => { if (hadReceived == false) { var tip = new TipViewControl(Language.StringByID(R.MyInternationalizationString.FailedPleaseTryAgain)); tip.ShowView(); } else { //var tip = new TipViewControl(Language.StringByID(R.MyInternationalizationString.Success)); //tip.ShowView(); } CommonPage.Loading.Hide(); }); }, 5); }; endSeekBar.ProgressChanged += async (sender1, e1) => { canSetEndLimit = false; endBtn.Text = $"{Language.StringByID(R.MyInternationalizationString.SetEndLimit)} : {endSeekBar.Progress}%"; if (isEndSendDelayFrist == false) { isEndSendDelayFrist = true; //先发送删除限位点命令 await DeleteDownLimintAsync(rollershade); rollershade.WcdGoToTiltValue(endSeekBar.Progress); lastEndSendDelayTime = DateTime.Now; } else { if ((DateTime.Now - lastEndSendDelayTime).TotalSeconds > sleepSpan) { rollershade.WcdGoToTiltValue(endSeekBar.Progress); lastEndSendDelayTime = DateTime.Now; } } }; endSeekBar.MouseUpEventHandler += (sender1, e1) => { isEndSendDelayFrist = false; hadReceivedStartEndLimitCode = false; canSetEndLimit = true; rollershade.WcdGoToTiltValue(endSeekBar.Progress); lastEndSendDelayTime = DateTime.Now; CommonPage.Loading.Start(Language.StringByID(R.MyInternationalizationString.PleaseWaitWhileTheGuidewayIsMoving)); DeviceDelayAction(rollershade, (hadReceived) => { Application.RunOnMainThread(() => { if (hadReceived == false) { var tip = new TipViewControl(Language.StringByID(R.MyInternationalizationString.FailedPleaseTryAgain)); tip.ShowView(); } else { //var tip = new TipViewControl(Language.StringByID(R.MyInternationalizationString.Success)); //tip.ShowView(); } CommonPage.Loading.Hide(); }); }, 5); }; void limit_MouseUpEvnet(object sender, MouseEventArgs mouseEventArgs) { btnDirectionRight.IsSelected = !btnDirectionRight.IsSelected; if (btnDirectionRight.IsSelected) { directionLimitRow.Height = ControlCommonResourse.ListViewRowHeight * 5; } else { directionLimitRow.Height = ControlCommonResourse.ListViewRowHeight; } } btnDirectionRight.MouseUpEventHandler += limit_MouseUpEvnet; directionLimitBtn.MouseUpEventHandler += limit_MouseUpEvnet; directionLimitRow.MouseUpEventHandler += limit_MouseUpEvnet; } #endregion #region ◆ 添加 【恢复行程设置】行______________ /// /// 添加 【恢复行程设置】行 /// /// Lisrview. private void AddRestoreTravelSettingsRow(VerticalScrolViewLayout listview) { var RestoreTravelSettingsRow = new StatuRowLayout(listview); var RestoreTravelSettingsRowBtn = new RowCenterView(false); RestoreTravelSettingsRowBtn.TextID = R.MyInternationalizationString.RestoreTravelSettings; RestoreTravelSettingsRow.AddChidren(RestoreTravelSettingsRowBtn); RestoreTravelSettingsRow.MouseUpEvent += (sender, e) => { try { CommonPage.Loading.Start(); System.Console.WriteLine("恢复限位"); var alert = new Alert(Language.StringByID(R.MyInternationalizationString.TIP), Language.StringByID(R.MyInternationalizationString.IsCancelRestoreTravelSettings), Language.StringByID(R.MyInternationalizationString.Cancel), Language.StringByID(R.MyInternationalizationString.Confrim)); alert.Show(); alert.ResultEventHandler += async (alertSender, alertE) => { if (alertE) { var setWritableValueResponAllData = await rollershade.RestoreCurtainLimitAsync(); if(setWritableValueResponAllData==null || setWritableValueResponAllData.setWritableValueResponData==null) { CommonPage.Loading.Hide(); CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.FAIL); return; } var status = setWritableValueResponAllData.setWritableValueResponData.Status; //以后补充提示 //0:配置成功(若配置成功,下面的AttributeId字段不存在) //34:不支持该属性 //135:无效的属性值 //141:无效的数据类型 if (status == 0) { //恢复行程成功后手动去读取状态 InitReadStatu(); System.Console.WriteLine("恢复行程设置成功"); var tip = new TipViewControl(Language.StringByID(R.MyInternationalizationString.Success)); tip.ShowView(); } else { CommonPage.Loading.Hide(); CommonPage.Instance.ShowErrorInfoAlert(R.MyInternationalizationString.FAIL); } } }; } catch(Exception ex) { System.Console.WriteLine($"恢复行程设置失败{ex.Message}"); } finally { CommonPage.Loading.Hide(); } }; } #endregion #region ◆ 设备延时回调_______________________ /// /// 设备延时回调 /// /// Common device. /// Action. /// 延时执行时间,默认10秒 public void DeviceDelayAction(CommonDevice commonDevice,Action action,int delayTime=10) { var threadName = commonDevice.GetHashCode().ToString(); var tt = threads.Find((obj) => obj.Name == threadName); if (threads.Find((obj) => obj.Name==threadName)==null) { var thread = new System.Threading.Thread(() => { var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalSeconds < delayTime) { System.Threading.Thread.Sleep(100); } lock (threads) { threads.RemoveAll((obj) => obj.Name == threadName); } action?.Invoke(hadReceivedStartEndLimitCode); }) { IsBackground = true, Name = threadName }; lock (threads) { threads.Add(thread); } thread.Start(); } else { System.Console.WriteLine("dddd"); } } #endregion #region ◆ 设置上、下限位______________________ /// /// 设置上、下限位 /// 0 :成功 /// -1 :失败(网关不在线) /// 34:不支持该属性 /// 135:无效的属性值 /// 141:无效的数据类型 /// /// The limit async. /// 上或者下限位 /// 窗帘. private async System.Threading.Tasks.Task SetLimitAsync(Rollershade.CurtainPrivateInstalledLimi upOrDownLimit, Rollershade r) { var setWritableValueResponAllData = await r.SetCurtainInstalledLimitAsync(upOrDownLimit); if (setWritableValueResponAllData == null || setWritableValueResponAllData.setWritableValueResponData == null) { return -1; } return setWritableValueResponAllData.setWritableValueResponData.Status; } #endregion #region ◆ 删除限位点_________________________ /// /// 删除上限位点 /// /// The up limits async. /// The red component. private async System.Threading.Tasks.Task DeleteUpLimitAsync(Rollershade r) { return await r.DeleteCurtainLimitsAsync(Rollershade.LimiType.UpLimit); } /// /// 删除下限位点 /// /// The down limint async. /// The red component. private async System.Threading.Tasks.Task DeleteDownLimintAsync(Rollershade r) { return await r.DeleteCurtainLimitsAsync(Rollershade.LimiType.DownLimit); } #endregion } }