HDL Home App 第二版本 旧平台金堂用 正在使用
ZigbeeApp/Shared/Phone/MainPage/Controls/DeviceCard/Base/DeviceCardCommon.cs
old mode 100755 new mode 100644
@@ -5,498 +5,597 @@
using Shared.Phone.UserCenter;
namespace Shared.Phone.MainPage.Controls
{
{
  /// <summary>
  /// 主页的设备卡片控件底层共通(宽度:458 + 14 * 2 高度:305 + 43)
  /// </summary>
  public class DeviceCardCommon : FrameLayoutStatuControl
  {
    #region ■ 变量声明___________________________
    /// <summary>
    /// 设备对象
    /// </summary>
    public CommonDevice device = null;
    /// <summary>
    /// 卡片需要被移除的事件
    /// </summary>
    public Action CardNeedRemoveEvent = null;
    /// <summary>
    /// 背景图片控件
    /// </summary>
    private PicViewControl btnBackGroud = null;
    /// <summary>
    /// 设备名称控件
    /// </summary>
    private NormalViewControl btnDeviceName = null;
    /// <summary>
    /// 设备的背景圆圈图控件
    /// </summary>
    private FrameLayout fraDeviceRound = null;
    /// <summary>
    /// 设备图标控件
    /// </summary>
    private IconViewControl btnDeviceIcon = null;
    /// <summary>
    /// 状态文本控件
    /// </summary>
    private NormalViewControl btnStatu = null;
    /// <summary>
    /// 开关控件
    /// </summary>
    private PicViewControl btnSwitch = null;
    /// <summary>
    /// 收集控件
    /// </summary>
    private IconViewControl btnCollect = null;
    /// <summary>
    /// 电池控件
    /// </summary>
    private IconViewControl btnBattery = null;
    /// <summary>
    /// 是否获取网关反馈的结果  0:没有获取得到  1:已经获取得到
    /// </summary>
    private int ResponeResult = 0;
    /// <summary>
    /// 判断是否有开关功能
    /// </summary>
    private bool isHadOpenSwitch = true;
    /// <summary>
    /// 当前选择的房间
    /// </summary>
    public Common.Room nowSelectRoom = null;
    #endregion
    #region ■ 初始化_____________________________
    /// <summary>
    /// 主页的设备卡片控件底层共通(宽度:458 + 14 * 2 高度:305 + 43)
    /// </summary>
    public class DeviceCardCommon : FrameLayoutStatuControl
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 设备对象
        /// </summary>
        public CommonDevice device = null;
        /// <summary>
        /// 卡片需要被移除的事件
        /// </summary>
        public Action CardNeedRemoveEvent = null;
        /// <summary>
        /// 背景图片控件
        /// </summary>
        private PicViewControl btnBackGroud = null;
        /// <summary>
        /// 设备名称控件
        /// </summary>
        private NormalViewControl btnDeviceName = null;
        /// <summary>
        /// 设备的背景圆圈图控件
        /// </summary>
        private FrameLayout fraDeviceRound = null;
        /// <summary>
        /// 设备图标控件
        /// </summary>
        private IconViewControl btnDeviceIcon = null;
        /// <summary>
        /// 状态文本控件
        /// </summary>
        private NormalViewControl btnStatu = null;
        /// <summary>
        /// 开关控件
        /// </summary>
        private PicViewControl btnSwitch = null;
        /// <summary>
        /// 收集控件
        /// </summary>
        private IconViewControl btnCollect = null;
        /// <summary>
        /// 是否获取网关反馈的结果  0:没有获取得到  1:已经获取得到
        /// </summary>
        private int ResponeResult = 0;
        /// <summary>
        /// 判断是否有开关功能
        /// </summary>
        private bool isHadOpenSwitch = true;
        /// <summary>
        /// 当前选择的房间
        /// </summary>
        public Common.Room nowSelectRoom = null;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 主页的设备卡片控件底层共通(宽度:458 + 14 * 2 高度:305 + 43)
        /// </summary>
        public DeviceCardCommon()
        {
            //图片真实宽度+图片自身左右空白
            this.Width = HdlControlLogic.Current.GetPictrueRealSize(458 + 14 * 2);
            //图片高度+阴影
            this.Height = HdlControlLogic.Current.GetPictrueRealSize(305 + 43);
            //取消点击特效
            this.UseClickStatu = false;
        }
        /// <summary>
        /// 初始化控件
        /// </summary>
        /// <param name="i_device">指定设备</param>
        /// <param name="i_nowSelectRoom">当前选择的房间(有点用处)</param>
        public virtual void InitControl(CommonDevice i_device, Common.Room i_nowSelectRoom)
        {
            this.device = i_device;
            this.nowSelectRoom = i_nowSelectRoom;
            //背景图片
            this.btnBackGroud = new PicViewControl(this.Width, this.Height, false);
            btnBackGroud.UnSelectedImagePath = "Item/FunctionCardView.png";
            btnBackGroud.SelectedImagePath = "Item/FunctionCardViewSelected.png";
            btnBackGroud.Gravity = Gravity.CenterHorizontal;
            this.AddChidren(btnBackGroud, ChidrenBindMode.BindEvent);
            //设备名称控件
            this.btnDeviceName = new NormalViewControl(320, 63, true);
            btnDeviceName.X = HdlControlLogic.Current.GetPictrueRealSize(40);
            btnDeviceName.Y = HdlControlLogic.Current.GetPictrueRealSize(17);
            btnDeviceName.TextSize = 16;
            btnDeviceName.TextColor = UserCenterColor.Current.TextGrayColor1;
            btnDeviceName.SelectedTextColor = UserCenterColor.Current.White;
            btnDeviceName.Text = Common.LocalDevice.Current.GetDeviceEpointName(i_device);
            this.AddChidren(btnDeviceName, ChidrenBindMode.BindEvent);
            //收集控件
            this.btnCollect = new IconViewControl(107);
            btnCollect.X = HdlControlLogic.Current.GetPictrueRealSize(350);
            btnCollect.Y = HdlControlLogic.Current.GetPictrueRealSize(12);
            btnCollect.UnSelectedImagePath = "Item/Collection1.png";
            btnCollect.SelectedImagePath = "Item/CollectionSelected1.png";
            this.AddChidren(btnCollect, ChidrenBindMode.NotBind);
            btnCollect.IsSelected = HdlRoomLogic.Current.IsCollectInRoom(i_device);
            btnCollect.ButtonClickEvent += (sender, e) =>
            {
                //状态取反
                btnCollect.IsSelected = !btnCollect.IsSelected;
                if (btnCollect.IsSelected == false)
                {
                    //取消收藏
                    HdlRoomLogic.Current.DeleteLoveDevice(i_device);
                    if (this.nowSelectRoom.IsLove == true)
                    {
                        //如果当前房间是我的喜爱的话,回调卡片被删除的事件
                        this.CardNeedRemoveEvent?.Invoke();
                    }
                }
                else
                {
                    //添加收藏
                    HdlRoomLogic.Current.AddLoveDevice(i_device);
                }
            };
            //设备的背景圆圈图
            this.fraDeviceRound = new FrameLayout();
            fraDeviceRound.Width = HdlControlLogic.Current.GetPictrueRealSize(124);
            fraDeviceRound.Height = HdlControlLogic.Current.GetPictrueRealSize(124);
            fraDeviceRound.Radius = (uint)HdlControlLogic.Current.GetPictrueRealSize(124) / 2;
            fraDeviceRound.X = HdlControlLogic.Current.GetPictrueRealSize(44);
            fraDeviceRound.Y = HdlControlLogic.Current.GetPictrueRealSize(101);
            fraDeviceRound.BackgroundColor = Common.ZigbeeColor.Current.GXCForFunctionUnSelectedBackgroundColor;
            this.AddChidren(fraDeviceRound, ChidrenBindMode.BindEvent);
            //设备图标控件
            this.btnDeviceIcon = new IconViewControl(86);
            btnDeviceIcon.Gravity = Gravity.Center;
            fraDeviceRound.AddChidren(btnDeviceIcon);
            this.ChangedChidrenBindMode(fraDeviceRound, ChidrenBindMode.BindEvent);
            //状态文本控件
            this.btnStatu = new NormalViewControl(HdlControlLogic.Current.GetPictrueRealSize(300), HdlControlLogic.Current.GetPictrueRealSize(63), false);
            btnStatu.X = HdlControlLogic.Current.GetPictrueRealSize(46);
            btnStatu.Y = HdlControlLogic.Current.GetPictrueRealSize(236);
            btnStatu.TextColor = UserCenterColor.Current.TextColor1;
            btnStatu.SelectedTextColor = Common.ZigbeeColor.Current.GXCTextSelectedColor;
            btnStatu.IsBold = true;
            this.AddChidren(btnStatu, ChidrenBindMode.BindEvent);
            //开关控件(不加入父控件中)
            this.btnSwitch = new PicViewControl(109, 104);
            btnSwitch.X = HdlControlLogic.Current.GetPictrueRealSize(325);
            btnSwitch.Y = HdlControlLogic.Current.GetPictrueRealSize(202);
            btnSwitch.UnSelectedImagePath = "Item/Switch1.png";
            btnSwitch.SelectedImagePath = "Item/SwitchSelected1.png";
            //刷新信息
            this.RefreshControlInfo(i_device);
        }
        #endregion
        #region ■ 添加开关控件_______________________
        /// <summary>
        /// 添加开关控件
        /// </summary>
        /// <returns></returns>
        public PicViewControl AddSwitchControl()
        {
            this.AddChidren(this.btnSwitch, ChidrenBindMode.NotBind);
            return btnSwitch;
        }
        #endregion
        #region ■ 刷新控件状态_______________________
        /// <summary>
        /// 刷新控件状态
        /// </summary>
        /// <param name="i_device">设备对象,不是推送的那个</param>
        public void RefreshControlInfo(CommonDevice i_device)
        {
            bool collect = HdlRoomLogic.Current.IsCollectInRoom(i_device);
            if (btnCollect.IsSelected != collect)
            {
                btnCollect.IsSelected = collect;
            }
            //设备图标也刷新
            Common.LocalDevice.Current.SetDeviceIconToControl2(btnDeviceIcon, i_device);
            //名字刷新
            this.btnDeviceName.Text = Common.LocalDevice.Current.GetDeviceEpointName(i_device);
            //检测设备是否是打开状态
            bool isOpen = this.CheckIsOpenStatu(i_device);
            if (this.isHadOpenSwitch == true && i_device.HadReadDeviceStatu == false)
            {
                //如果这个卡片有开关功能,并且网关还没有回复之前,默认是关闭状态
                //等待网关回复后会重新刷新,不然一直是关闭状态
                isOpen = false;
            }
            this.SetCardOpenStatu(isOpen);
        }
        /// <summary>
        /// 设置卡片状态
        /// </summary>
        /// <param name="isOpen"></param>
        public void SetCardOpenStatu(bool isOpen)
        {
            //设备状态必须刷新
            this.btnStatu.Text = HdlDeviceOtherLogic.Current.GetDeviceStatu(this.device);
            //开关控件
            if (btnSwitch != null && this.btnSwitch.IsSelected != isOpen)
            {
                this.btnSwitch.IsSelected = isOpen;
            }
            //切换卡片状态特效
            this.SwitchCardStatuAppeal(isOpen);
        }
        /// <summary>
        /// 设置卡片的在线状态
        /// </summary>
        /// <param name="isOnline">在线</param>
        public void SetCardOnlineStatu(bool isOnline)
        {
            if (this.isHadOpenSwitch == true)
            {
                //如果这个设备有开关功能,则在线状态不会改变状态
                return;
            }
            this.SetCardOpenStatu(isOnline);
        }
        /// <summary>
        /// 设置设备的状态文本
        /// </summary>
        /// <param name="i_Text">状态文本</param>
        public void SetDeviceStatuText(string i_Text)
        {
            this.btnStatu.Text = i_Text;
        }
        #endregion
        #region ■ 发送获取状态命令___________________
        /// <summary>
        /// 发送获取状态命令
        /// </summary>
        public virtual void SendStatuComand()
        {
            return;
        }
        #endregion
        #region ■ 检测设备打开状态___________________
        /// <summary>
        /// 检测设备是否是打开状态
        /// </summary>
        /// <param name="i_device"></param>
        /// <returns></returns>
        public virtual bool CheckIsOpenStatu(CommonDevice i_device)
        {
            //如果这个函数被重写的话,则代表这个设备有开关功能
            this.isHadOpenSwitch = false;
            //默认用在线状态来判断
            return Common.LocalDevice.Current.CheckDeviceIsOnline(i_device);
        }
        #endregion
        #region ■ 深度卡片信息的返回事件_____________
        /// <summary>
        /// 深度卡片信息的返回事件(底层专用)
        /// </summary>
        /// <param name="device">设备</param>
        public void CardDetailInfoBackEvent(CommonDevice device)
        {
            if (this.nowSelectRoom.IsLove == true)
            {
                //如果是主页取消搜藏的话,回调卡片被删除的函数
                if (HdlRoomLogic.Current.IsCollectInRoom(device) == false)
                {
                    this.CardNeedRemoveEvent?.Invoke();
                    return;
                }
            }
            else
            {
                //如果这个设备改变了房间的话,回调卡片被删除的函数
                var nowRoom = HdlRoomLogic.Current.GetRoomByDevice(device);
                if (nowRoom == null || nowRoom.Id != this.nowSelectRoom.Id)
                {
                    this.CardNeedRemoveEvent?.Invoke();
                    return;
                }
            }
            //如果它还在这个房间的话,刷新卡片信息
            this.RefreshControlInfo(device);
        }
        #endregion
        #region ■ 是否获取网关反馈的结果_____________
        /// <summary>
        /// <para>检测是否获取网关反馈的结果,如果网关没有回复,则会弹出消息</para>
        /// <para>获取到回复结果之后,记得调用SetHadGetResponeResultStatu()函数设置状态</para>
        /// </summary>
        /// <param name="oldOpenStatu">设备目前的开关状态</param>
        public void StartCheckResponeResult(bool oldOpenStatu)
        {
            if (Common.Config.Instance.Home.IsVirtually == true)
            {
                //如果住宅为虚拟住宅,则此功能无效
                return;
            }
            this.ResponeResult = 0;
            //开关按钮不能再点击
            if (btnSwitch != null) { this.btnSwitch.CanClick = false; }
            HdlThreadLogic.Current.RunThread(() =>
            {
                int waitime = 40;
                while (waitime > 0)
                {
                    System.Threading.Thread.Sleep(100);
                    if (this.ResponeResult == 1)
                    {
                        //已经获取得到数据
                        break;
                    }
                    waitime--;
                    //2秒的时候,还是接受不到的话,强制再次刷新设备状态
                    if (waitime == 20)
                    {
                        //从新发送获取设备的状态(强制)
                        this.device.HadReadDeviceStatu = false;
                        this.SendStatuComand();
                    }
                }
                if (waitime <= 0 && this.Parent != null)
                {
                    //没有获取得到结果
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        var msgContr = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.FAIL));
                        msgContr.Show();
                        //变更回原来的状态
                        this.SetCardOpenStatu(oldOpenStatu);
                    });
                }
                //开关按钮不能再点击
                if (btnSwitch != null) { this.btnSwitch.CanClick = true; }
            });
        }
        /// <summary>
        /// 设置已经获取到网关的反馈结果
        /// </summary>
        public void SetHadGetResponeResultStatu()
        {
            this.ResponeResult = 1;
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 检测能否发送获取状态命令
        /// </summary>
        /// <returns></returns>
        public bool CheckCanSendStatuComand()
        {
            if (this.device.HadReadDeviceStatu == false)
            {
                //还没有读取过数据
                return true;
            }
            if ((DateTime.Now - this.device.LastDateTime).TotalMinutes >= 10)
            {
                //10分钟后可以再次获取
                return true;
            }
            return false;
        }
        #endregion
        #region ■ 卡片闪烁特效_______________________
        /// <summary>
        /// 是否处于特效中
        /// </summary>
        private bool isAppeal = false;
        /// <summary>
        /// 开启卡片闪烁特效
        /// </summary>
        public void StartCardLightAppeal()
        {
            //设备状态必须刷新
            this.btnStatu.Text = HdlDeviceOtherLogic.Current.GetDeviceStatu(this.device);
            if (this.isAppeal == true) { return; }
            this.isAppeal = true;
            HdlThreadLogic.Current.RunThread(() =>
            {
                //闪烁5秒,间隔400毫秒
                int count = 5000 / 400;
                bool isOpen = false;
                while (this.Parent != null && count >= 0)
                {
                    //闪烁特效
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        isOpen = !isOpen;
                        this.SwitchCardStatuAppeal(isOpen);
                    });
                    System.Threading.Thread.Sleep(400);
                    count--;
                }
                if (this.Parent != null && isOpen == false)
                {
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        //结束时,默认为打开特效
                        this.SwitchCardStatuAppeal(true);
                    }, ShowErrorMode.NO);
                }
                this.isAppeal = false;
            }, ShowErrorMode.NO);
        }
        /// <summary>
        /// 切换卡片状态特效
        /// </summary>
        private void SwitchCardStatuAppeal(bool isOpen)
        {
            if (this.btnBackGroud.IsSelected == isOpen)
            {
                //状态一样,则不需要处理
                return;
            }
            //背景图片
            this.btnBackGroud.IsSelected = isOpen;
            //设备名称控件
            this.btnDeviceName.IsSelected = isOpen;
            this.btnDeviceName.IsBold = isOpen;
            //设备的背景圆圈图
            if (isOpen == true)
            {
                fraDeviceRound.BackgroundColor = Common.ZigbeeColor.Current.GXCForFunctionBackgroundColor;
            }
            else
            {
                fraDeviceRound.BackgroundColor = Common.ZigbeeColor.Current.GXCForFunctionUnSelectedBackgroundColor;
            }
            //设备图标控件
            this.btnDeviceIcon.IsSelected = isOpen;
            //状态文本控件
            this.btnStatu.IsSelected = isOpen;
        }
        #endregion
        #region ■ 控件摧毁___________________________
        /// <summary>
        /// 控件摧毁
        /// </summary>
        public override void RemoveFromParent()
        {
            this.CardNeedRemoveEvent = null;
            base.RemoveFromParent();
        }
        #endregion
    }
    public DeviceCardCommon()
    {
      //图片真实宽度+图片自身左右空白
      this.Width = HdlControlLogic.Current.GetPictrueRealSize(458 + 14 * 2);
      //图片高度+阴影
      this.Height = HdlControlLogic.Current.GetPictrueRealSize(305 + 43);
      //取消点击特效
      this.UseClickStatu = false;
    }
    /// <summary>
    /// 初始化控件
    /// </summary>
    /// <param name="i_device">指定设备</param>
    /// <param name="i_nowSelectRoom">当前选择的房间(有点用处)</param>
    public virtual void InitControl(CommonDevice i_device, Common.Room i_nowSelectRoom)
    {
      this.device = i_device;
      this.nowSelectRoom = i_nowSelectRoom;
      //背景图片
      this.btnBackGroud = new PicViewControl(this.Width, this.Height, false);
      btnBackGroud.UnSelectedImagePath = "Item/FunctionCardView.png";
      btnBackGroud.SelectedImagePath = "Item/FunctionCardViewSelected.png";
      btnBackGroud.Gravity = Gravity.CenterHorizontal;
      this.AddChidren(btnBackGroud, ChidrenBindMode.BindEvent);
      //设备名称控件
      this.btnDeviceName = new NormalViewControl(360, 63, true);
      btnDeviceName.X = HdlControlLogic.Current.GetPictrueRealSize(40);
      btnDeviceName.Y = HdlControlLogic.Current.GetPictrueRealSize(17);
      btnDeviceName.TextSize = 16;
      btnDeviceName.TextColor = UserCenterColor.Current.TextGrayColor1;
      btnDeviceName.SelectedTextColor = UserCenterColor.Current.White;
      btnDeviceName.Text = Common.LocalDevice.Current.GetDeviceEpointName(i_device);
      this.AddChidren(btnDeviceName, ChidrenBindMode.BindEvent);
      //收集控件
      this.btnCollect = new IconViewControl(107);
      btnCollect.X = HdlControlLogic.Current.GetPictrueRealSize(350);
      btnCollect.Y = HdlControlLogic.Current.GetPictrueRealSize(12);
      btnCollect.UnSelectedImagePath = "Item/Collection1.png";
      btnCollect.SelectedImagePath = "Item/CollectionSelected1.png";
      this.AddChidren(btnCollect, ChidrenBindMode.NotBind);
      btnCollect.IsSelected = HdlRoomLogic.Current.IsCollectInRoom(i_device);
      btnCollect.ButtonClickEvent += (sender, e) =>
      {
        //状态取反
        btnCollect.IsSelected = !btnCollect.IsSelected;
        if (btnCollect.IsSelected == false)
        {
          //取消收藏
          HdlRoomLogic.Current.DeleteLoveDevice(i_device);
          if (this.nowSelectRoom.IsLove == true)
          {
            //如果当前房间是我的喜爱的话,回调卡片被删除的事件
            this.CardNeedRemoveEvent?.Invoke();
          }
        }
        else
        {
          //添加收藏
          HdlRoomLogic.Current.AddLoveDevice(i_device);
        }
      };
      //设备的背景圆圈图
      this.fraDeviceRound = new FrameLayout();
      fraDeviceRound.Width = HdlControlLogic.Current.GetPictrueRealSize(124);
      fraDeviceRound.Height = HdlControlLogic.Current.GetPictrueRealSize(124);
      fraDeviceRound.Radius = (uint)HdlControlLogic.Current.GetPictrueRealSize(124) / 2;
      fraDeviceRound.X = HdlControlLogic.Current.GetPictrueRealSize(44);
      fraDeviceRound.Y = HdlControlLogic.Current.GetPictrueRealSize(101);
      fraDeviceRound.BackgroundColor = Common.ZigbeeColor.Current.GXCForFunctionUnSelectedBackgroundColor;
      this.AddChidren(fraDeviceRound, ChidrenBindMode.BindEvent);
      //设备图标控件
      this.btnDeviceIcon = new IconViewControl(86);
      btnDeviceIcon.Gravity = Gravity.Center;
      fraDeviceRound.AddChidren(btnDeviceIcon);
      this.ChangedChidrenBindMode(fraDeviceRound, ChidrenBindMode.BindEvent);
      //状态文本控件
      this.btnStatu = new NormalViewControl(HdlControlLogic.Current.GetPictrueRealSize(400), HdlControlLogic.Current.GetPictrueRealSize(63), false);
      btnStatu.X = HdlControlLogic.Current.GetPictrueRealSize(46);
      btnStatu.Y = HdlControlLogic.Current.GetPictrueRealSize(236);
      btnStatu.TextColor = UserCenterColor.Current.TextColor1;
      btnStatu.SelectedTextColor = Common.ZigbeeColor.Current.GXCTextSelectedColor;
      btnStatu.IsBold = true;
      this.AddChidren(btnStatu, ChidrenBindMode.BindEvent);
      //开关控件(不加入父控件中)
      this.btnSwitch = new PicViewControl(109, 104);
      btnSwitch.X = HdlControlLogic.Current.GetPictrueRealSize(325);
      btnSwitch.Y = HdlControlLogic.Current.GetPictrueRealSize(202);
      btnSwitch.UnSelectedImagePath = "Item/Switch1.png";
      btnSwitch.SelectedImagePath = "Item/SwitchSelected1.png";
      //电池控件
      if (this.device.Type == DeviceType.IASZone)
      {
        this.btnBattery = new IconViewControl(69);
        btnBattery.X = HdlControlLogic.Current.GetPictrueRealSize(348);
        btnBattery.Y = HdlControlLogic.Current.GetPictrueRealSize(236);
        btnBattery.UnSelectedImagePath = "Item/Battery.png";
        btnBattery.SelectedImagePath = "Item/BatterySelected.png";
        this.AddChidren(btnBattery, ChidrenBindMode.BindEvent);
        if (this.device.IsBatteryDown == false)
        {
          btnBattery.Visible = false;
        }
      }
      //刷新信息
      this.RefreshControlInfo(i_device);
    }
    #endregion
    #region ■ 添加开关控件_______________________
    /// <summary>
    /// 添加开关控件
    /// </summary>
    /// <returns></returns>
    public PicViewControl AddSwitchControl()
    {
      this.AddChidren(this.btnSwitch, ChidrenBindMode.NotBind);
      return btnSwitch;
    }
    #endregion
    #region ■ 刷新控件状态_______________________
    /// <summary>
    /// 刷新控件状态
    /// </summary>
    /// <param name="i_device">设备对象,不是推送的那个</param>
    public void RefreshControlInfo(CommonDevice i_device)
    {
      bool collect = HdlRoomLogic.Current.IsCollectInRoom(i_device);
      if (btnCollect.IsSelected != collect)
      {
        btnCollect.IsSelected = collect;
      }
      //设备图标也刷新
      Common.LocalDevice.Current.SetDeviceIconToControl2(btnDeviceIcon, i_device);
      //名字刷新
      this.btnDeviceName.Text = Common.LocalDevice.Current.GetDeviceEpointName(i_device);
      //检测设备是否是打开状态
      bool isOpen = this.CheckIsOpenStatu(i_device);
      if (this.isHadOpenSwitch == true && i_device.HadReadDeviceStatu == false)
      {
        //如果这个卡片有开关功能,并且网关还没有回复之前,默认是关闭状态
        //等待网关回复后会重新刷新,不然一直是关闭状态
        isOpen = false;
      }
      //如果是传感器类,则默认是关的效果
      if (this.device.Type == DeviceType.PMSensor || this.device.Type == DeviceType.IASZone
          || this.device.Type == DeviceType.TemperatureSensor)
      {
        isOpen = false;
      }
      this.SetCardOpenStatu(isOpen);
    }
    /// <summary>
    /// 设置卡片状态
    /// </summary>
    /// <param name="isOpen"></param>
    public void SetCardOpenStatu(bool isOpen)
    {
      //获取设备类型
      var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { device });
      if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.AirQualitySensor)
      {
        var aqSensor = (TemperatureSensor)this.device;
        //空气质量传感器
        var tempAirQuality = aqSensor.AirQuality(aqSensor);
        string curQuality = string.Empty;
        if (tempAirQuality == 1)
        {
          curQuality = Language.StringByID(R.MyInternationalizationString.ExcellentAirQuality);
        }
        else if (tempAirQuality == 2)
        {
          curQuality = Language.StringByID(R.MyInternationalizationString.GoodAirQuality);
        }
        else if (tempAirQuality == 3)
        {
          curQuality = Language.StringByID(R.MyInternationalizationString.Pollution);
        }
        else
        {
          curQuality = "";
        }
        this.btnStatu.Text = curQuality;
      }
      else
      {
        //设备状态必须刷新
        this.btnStatu.Text = HdlDeviceOtherLogic.Current.GetDeviceStatu(this.device);
      }
      //开关控件
      if (btnSwitch != null && this.btnSwitch.IsSelected != isOpen)
      {
        this.btnSwitch.IsSelected = isOpen;
      }
      //切换卡片状态特效
      this.SwitchCardStatuAppeal(isOpen);
    }
    /// <summary>
    /// 设置卡片的在线状态
    /// </summary>
    /// <param name="isOnline">在线</param>
    public void SetCardOnlineStatu(bool isOnline)
    {
      if (this.isHadOpenSwitch == true)
      {
        //如果这个设备有开关功能,则在线状态不会改变状态
        return;
      }
      this.SetCardOpenStatu(isOnline);
    }
    /// <summary>
    /// 设置设备的状态文本
    /// </summary>
    /// <param name="i_Text">状态文本</param>
    public void SetDeviceStatuText(string i_Text)
    {
      this.btnStatu.Text = i_Text;
    }
    #endregion
    #region ■ 发送获取状态命令___________________
    /// <summary>
    /// 发送获取状态命令
    /// </summary>
    public virtual void SendStatuComand()
    {
      return;
    }
    #endregion
    #region ■ 检测设备打开状态___________________
    /// <summary>
    /// 检测设备是否是打开状态
    /// </summary>
    /// <param name="i_device"></param>
    /// <returns></returns>
    public virtual bool CheckIsOpenStatu(CommonDevice i_device)
    {
      //如果这个函数被重写的话,则代表这个设备有开关功能
      this.isHadOpenSwitch = false;
      //默认用在线状态来判断
      return Common.LocalDevice.Current.CheckDeviceIsOnline(i_device);
    }
    #endregion
    #region ■ 深度卡片信息的返回事件_____________
    /// <summary>
    /// 深度卡片信息的返回事件(底层专用)
    /// </summary>
    /// <param name="device">设备</param>
    public void CardDetailInfoBackEvent(CommonDevice device)
    {
      if (this.nowSelectRoom.IsLove == true)
      {
        //如果是主页取消搜藏的话,回调卡片被删除的函数
        if (HdlRoomLogic.Current.IsCollectInRoom(device) == false)
        {
          this.CardNeedRemoveEvent?.Invoke();
          return;
        }
      }
      else
      {
        //如果这个设备改变了房间的话,回调卡片被删除的函数
        var nowRoom = HdlRoomLogic.Current.GetRoomByDevice(device);
        if (nowRoom == null || nowRoom.Id != this.nowSelectRoom.Id)
        {
          this.CardNeedRemoveEvent?.Invoke();
          return;
        }
      }
      //如果它还在这个房间的话,刷新卡片信息
      this.RefreshControlInfo(device);
    }
    #endregion
    #region ■ 是否获取网关反馈的结果_____________
    /// <summary>
    /// <para>检测是否获取网关反馈的结果,如果网关没有回复,则会弹出消息</para>
    /// <para>获取到回复结果之后,记得调用SetHadGetResponeResultStatu()函数设置状态</para>
    /// </summary>
    /// <param name="oldOpenStatu">设备目前的开关状态</param>
    public void StartCheckResponeResult(bool oldOpenStatu)
    {
      if (Common.Config.Instance.Home.IsVirtually == true)
      {
        //如果住宅为虚拟住宅,则此功能无效
        return;
      }
      this.ResponeResult = 0;
      //开关按钮不能再点击
      if (btnSwitch != null) { this.btnSwitch.CanClick = false; }
      HdlThreadLogic.Current.RunThread(() =>
      {
        int waitime = 40;
        while (waitime > 0)
        {
          System.Threading.Thread.Sleep(100);
          if (this.ResponeResult == 1)
          {
            //已经获取得到数据
            break;
          }
          waitime--;
          //2秒的时候,还是接受不到的话,强制再次刷新设备状态
          if (waitime == 20)
          {
            //从新发送获取设备的状态(强制)
            this.device.HadReadDeviceStatu = false;
            this.SendStatuComand();
          }
        }
        if (waitime <= 0 && this.Parent != null)
        {
          //没有获取得到结果
          HdlThreadLogic.Current.RunMain(() =>
          {
            var msgContr = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.FAIL));
            msgContr.Show();
                  //变更回原来的状态
                  this.SetCardOpenStatu(oldOpenStatu);
          });
        }
        //开关按钮不能再点击
        if (btnSwitch != null) { this.btnSwitch.CanClick = true; }
      });
    }
    /// <summary>
    /// 设置已经获取到网关的反馈结果
    /// </summary>
    public void SetHadGetResponeResultStatu()
    {
      this.ResponeResult = 1;
    }
    /// <summary>
    /// 接收网关回复的状态(true:已经接收到网关的回复 false:还没有接收到网关回复)
    /// </summary>
    /// <returns></returns>
    public bool ReceiveResponeResultStatu()
    {
      return this.ResponeResult == 1;
    }
    #endregion
    #region ■ 显示低电量_________________________
    /// <summary>
    /// 刷新电池电量状态
    /// </summary>
    public void RefreshBatteryStatu()
    {
      if (this.btnBattery == null) { return; }
      if (this.device.IsBatteryDown == true)
      {
        //电量低,显示图标
        if (this.btnBattery.Visible == false)
        {
          this.btnBattery.Visible = true;
        }
      }
      else
      {
        //电量足够,隐藏图标
        if (this.btnBattery.Visible == true)
        {
          this.btnBattery.Visible = false;
        }
      }
    }
    #endregion
    #region ■ 一般方法___________________________
    /// <summary>
    /// 检测能否发送获取状态命令
    /// </summary>
    /// <returns></returns>
    public bool CheckCanSendStatuComand()
    {
      if (this.device.HadReadDeviceStatu == false)
      {
        //还没有读取过数据
        return true;
      }
      if ((DateTime.Now - this.device.LastDateTime).TotalMinutes >= 10)
      {
        //10分钟后可以再次获取
        return true;
      }
      return false;
    }
    #endregion
    #region ■ 卡片闪烁特效_______________________
    /// <summary>
    /// 是否处于特效中
    /// </summary>
    private bool isAppeal = false;
    /// <summary>
    /// 开启卡片闪烁特效
    /// </summary>
    public void StartCardLightAppeal()
    {
      //设备状态必须刷新
      this.btnStatu.Text = HdlDeviceOtherLogic.Current.GetDeviceStatu(this.device);
      if (this.isAppeal == true) { return; }
      this.isAppeal = true;
      HdlThreadLogic.Current.RunThread(() =>
      {
        //闪烁5秒,间隔400毫秒
        int count = 5000 / 400;
        bool isOpen = false;
        while (this.Parent != null && count >= 0)
        {
          //闪烁特效
          HdlThreadLogic.Current.RunMain(() =>
          {
            isOpen = !isOpen;
            this.SwitchCardStatuAppeal(isOpen);
          });
          System.Threading.Thread.Sleep(400);
          count--;
        }
        if (this.Parent != null && isOpen == false)
        {
          HdlThreadLogic.Current.RunMain(() =>
                {
                  //结束时,默认为打开特效
                  this.SwitchCardStatuAppeal(true);
                }, ShowErrorMode.NO);
        }
        this.isAppeal = false;
      }, ShowErrorMode.NO);
    }
    /// <summary>
    /// 切换卡片状态特效
    /// </summary>
    public void SwitchCardStatuAppeal(bool isOpen)
    {
      if (this.btnBackGroud.IsSelected == isOpen)
      {
        //状态一样,则不需要处理
        return;
      }
      //背景图片
      this.btnBackGroud.IsSelected = isOpen;
      //设备名称控件
      this.btnDeviceName.IsSelected = isOpen;
      this.btnDeviceName.IsBold = isOpen;
      //设备的背景圆圈图
      if (isOpen == true)
      {
        fraDeviceRound.BackgroundColor = Common.ZigbeeColor.Current.GXCForFunctionBackgroundColor;
      }
      else
      {
        fraDeviceRound.BackgroundColor = Common.ZigbeeColor.Current.GXCForFunctionUnSelectedBackgroundColor;
      }
      //设备图标控件
      this.btnDeviceIcon.IsSelected = isOpen;
      //状态文本控件
      this.btnStatu.IsSelected = isOpen;
      //电池控件
      if (this.btnBattery != null && this.btnBattery.Visible == true)
      {
        this.btnBattery.IsSelected = isOpen;
      }
    }
    #endregion
    #region ■ 控件摧毁___________________________
    /// <summary>
    /// 控件摧毁
    /// </summary>
    public override void RemoveFromParent()
    {
      this.CardNeedRemoveEvent = null;
      base.RemoveFromParent();
    }
    #endregion
  }
}