HDL Home App 第二版本 旧平台金堂用 正在使用
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/RowLayoutControls/DeviceFunctionTypeRowControl.cs
@@ -1,380 +1,398 @@
using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 设备功能类型的自定义行控件
    /// </summary>
    public class DeviceFunctionTypeRowControl : FrameCaptionViewControl
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 结束选择的事件 value:索引(从0开始)  文本信息请用Text获取
        /// </summary>
        public Action<int> FinishSelectEvent = null;
        /// <summary>
        /// 判断该控件能否显示
        /// </summary>
        public bool CanShowRow
        {
            get { return this.CheckCanShowRow(); }
        }
        private bool m_SetCanSelect = true;
        /// <summary>
        /// 强制设置能否进行选择(只对继电器和空气开关有效,个别界面需要这种操作)
        /// </summary>
        public bool SetCanSelect
        {
            set
            {
                m_SetCanSelect = value;
            }
        }
        /// <summary>
        /// 设备对象
        /// </summary>
        private CommonDevice device = null;
        /// <summary>
        /// 当前选择的功能类型索引 -1:还没有设置过 0:不指定 1:开关 2:灯光 3:插座
        /// </summary>
        private int nowSelectNo = -1;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 设备功能类型的自定义行控件(选择功能之后,无条件直接变更类型)
        /// </summary>
        /// <param name="i_device">设备的对象</param>
        /// <param name="i_ChidrenYaxis">子控件Y轴偏移量(【列表控件的rowSpace/2】即可,不懂默认为0即可)</param>
        public DeviceFunctionTypeRowControl(CommonDevice i_device, int i_ChidrenYaxis = 0) : base("", "", i_ChidrenYaxis)
        {
            this.device = i_device;
            this.UseClickStatu = false;
        }
        /// <summary>
        /// 初始化
        /// </summary>
        public override void InitControl()
        {
            //初始化初始数据
            this.InitDefultData();
            //初始化底层数据
            base.InitControl();
            //空气开关和继电器可以选择功能类型
            if (this.device.Type == DeviceType.AirSwitch
                || this.device.Type == DeviceType.OnOffOutput)
            {
                //没被强制干涉的话
                if (m_SetCanSelect == true && Common.Config.Instance.Home.IsShowTemplate == false)
                {
                    this.UseClickStatu = true;
                    //右箭头
                    this.AddRightArrow();
                    //读取设备功能类型
                    this.ReadDeviceFunctionType();
                    this.ButtonClickEvent += (sender, e) =>
                    {
                        //显示选择设备功能类型的界面
                        this.ShowSelectDeviceFunctionListForm();
                    };
                }
            }
        }
        #endregion
        #region ■ 显示选择设备功能类型_______________
        /// <summary>
        /// 显示选择设备功能类型的界面
        /// </summary>
        private void ShowSelectDeviceFunctionListForm()
        {
            //显示列表
            var listText = new List<string>();
            listText.Add(Language.StringByID(R.MyInternationalizationString.uSwitch));//开关
            listText.Add(Language.StringByID(R.MyInternationalizationString.uLight));//灯光
            listText.Add(Language.StringByID(R.MyInternationalizationString.uSocket1));//插座
            //标题:选择功能类型
            var title = Language.StringByID(R.MyInternationalizationString.uSelectFunctionType);
            var form = new BottomItemSelectForm();
            form.CancelCallEvent = true;//允许取消
            form.AddForm(title, listText, null, nowSelectNo - 1);
            form.FinishSelectEvent += (selectNo) =>
            {
                if (selectNo == nowSelectNo - 1)
                {
                    //选择的是相同的
                    return;
                }
                //-1:选择取消
                this.Text = selectNo == -1 ? string.Empty : listText[selectNo];
                nowSelectNo = selectNo + 1;
                this.CanClick = false;
                HdlThreadLogic.Current.RunThread(() =>
                {
                    //设置功能类型到网关
                    var result = Common.LocalDevice.Current.SendDeviceFunctionTypeToGateway(this.device, (DeviceFunctionType)nowSelectNo);
using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        if (result == true)
                        {
                            //记录起当前选择的功能类型
                            this.RefreshDfunctionType();
                            //设备改变功能类型的话,主页需要重新刷新
                            UserView.UserPage.Instance.RefreshAllForm = true;
                            //调用回调函数
                            this.FinishSelectEvent?.Invoke(nowSelectNo);
                        }
                        else
                        {
                            //设置设备功能类型失败
                            var alert = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.uSetDeviceFunctionTypeFail));
                            alert.Show();
                        }
                        this.CanClick = true;
                    });
                });
            };
        }
        #endregion
        #region ■ 初始化初始数据_____________________
        /// <summary>
        /// 初始化初始数据
        /// </summary>
        private void InitDefultData()
        {
            //标题:功能类型
            this.btnCaption.Text = Language.StringByID(R.MyInternationalizationString.uFunctionType);
            var myFunType = this.device.DfunctionType;
            //功能类型的翻译名字
            string strType = string.Empty;
            if (this.device.DfunctionType == DeviceFunctionType.A不指定)
            {
                nowSelectNo = 0;
            }
            else if (this.device.DfunctionType == DeviceFunctionType.A开关)
            {
                strType = Language.StringByID(R.MyInternationalizationString.uSwitch);
                nowSelectNo = 1;
            }
            else if (myFunType == DeviceFunctionType.A灯光)
            {
                strType = Language.StringByID(R.MyInternationalizationString.uLight);
                nowSelectNo = 2;
            }
            else if (this.device.DfunctionType == DeviceFunctionType.A插座)
            {
                strType = Language.StringByID(R.MyInternationalizationString.uSocket1);
                nowSelectNo = 3;
            }
            if (this.device.Type == DeviceType.ColorDimmableLight
                || this.device.Type == DeviceType.ColorTemperatureLight
                || this.device.Type == DeviceType.DimmableLight)
            {
                //灯光类固定为 灯光
                var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A418");
                strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
                nowSelectNo = 2;
            }
            else if (this.device.Type == DeviceType.WindowCoveringDevice)
            {
                //窗帘固定为 遮阳
                var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A400");
                strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
                nowSelectNo = -1;
            }
            else if (this.device.Type == DeviceType.Thermostat)
            {
                //空调固定为 空调
                var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A406");
                strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
                nowSelectNo = -1;
            }
            else if (this.device.Type == DeviceType.DoorLock)
            {
                //门锁固定为 门锁
                var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A405");
                strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
                nowSelectNo = -1;
            }
            else if (this.device.Type == DeviceType.FreshAir)
            {
                //新风固定为 新风
                strType = Language.StringByID(R.MyInternationalizationString.FreshAir);
                nowSelectNo = -1;
            }
            else if (this.device.Type == DeviceType.PMSensor)
            {
                //PM2.5传感器固定为 空气质量
                strType = Language.StringByID(R.MyInternationalizationString.AirQuality);
                nowSelectNo = -1;
            }
            else if (this.device.Type == DeviceType.Airer)
            {
                //晾衣架
                strType = Language.StringByID(R.MyInternationalizationString.AirerFun);
                nowSelectNo = -1;
            }
            else if (this.device.Type == DeviceType.PMSensor)
            {
                //空气质量传感器 环境
                strType = Language.StringByID(R.MyInternationalizationString.Envoronment);
                nowSelectNo = -1;
            }
            //显示文本
            this.txtView.Text = strType;
        }
        #endregion
        #region ■ 检测能否显示_______________________
        /// <summary>
        /// 检测能否显示
        /// </summary>
        /// <returns></returns>
        private bool CheckCanShowRow()
        {
            if (this.device == null) { return true; }
            if (this.device.Type == DeviceType.AirSwitch//空气开关
                || this.device.Type == DeviceType.ColorDimmableLight//彩灯
                || this.device.Type == DeviceType.DimmableLight//调光灯
                || this.device.Type == DeviceType.DoorLock//门锁
                || this.device.Type == DeviceType.OnOffOutput//继电器
                || this.device.Type == DeviceType.Thermostat//空调
                || this.device.Type == DeviceType.FreshAir//新风
                || this.device.Type == DeviceType.PMSensor //PM2.5
                || this.device.Type == DeviceType.Airer//晾衣架
                || this.device.Type == DeviceType.ColorTemperatureLight //色温灯
                || this.device.Type == DeviceType.WindowCoveringDevice)//窗帘
            {
                return true;
            }
            return false;
        }
        #endregion
        #region ■ 控件摧毁___________________________
        /// <summary>
        /// 控件摧毁
        /// </summary>
        public override void RemoveFromParent()
        {
            this.FinishSelectEvent = null;
            base.RemoveFromParent();
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 刷新设备功能类型
        /// </summary>
        private void RefreshDfunctionType()
        {
            if (this.nowSelectNo == 1)
            {
                this.device.DfunctionType = DeviceFunctionType.A开关;
                if (this.device.IsCustomizeImage == false)
                {
                    //重新设置图片
                    this.device.IconPath = "Device/Switch.png";
                }
            }
            else if (this.nowSelectNo == 2)
            {
                this.device.DfunctionType = DeviceFunctionType.A灯光;
                if (this.device.IsCustomizeImage == false)
                {
                    //重新设置图片
                    this.device.IconPath = "Device/Light.png";
                }
            }
            else if (this.nowSelectNo == 3)
            {
                this.device.DfunctionType = DeviceFunctionType.A插座;
                if (this.device.IsCustomizeImage == false)
                {
                    //重新设置图片
                    this.device.IconPath = "Device/Socket1.png";
                }
            }
            else
            {
                this.device.DfunctionType = DeviceFunctionType.A不指定;
                if (this.device.IsCustomizeImage == false)
                {
                    //重新设置图片
                    if (this.device.Type == DeviceType.AirSwitch)
                    {
                        //空气开关
                        this.device.IconPath = "Device/Switch.png";
                    }
                    else if (this.device.Type == DeviceType.OnOffOutput)
                    {
                        //继电器
                        this.device.IconPath = "Device/RelayEpoint.png";
                    }
                }
            }
            this.device.ReSave();
        }
        #endregion
        #region ■ 读取设备功能类型___________________
        /// <summary>
        /// 读取设备功能类型
        /// </summary>
        private void ReadDeviceFunctionType()
        {
            HdlThreadLogic.Current.RunThread(() =>
            {
                //读取设备功能类型
                var info = Common.LocalDevice.Current.ReadDeviceEpointDeviceInfo(this.device);
                if (info != null && ((int)this.device.DfunctionType) != info.FunctionType)
                {
                    this.device.DfunctionType = (DeviceFunctionType)info.FunctionType;
                    HdlThreadLogic.Current.RunMain(() =>
                    {
                        //刷新控件
                        this.InitDefultData();
                        //刷新设备功能类型
                        this.RefreshDfunctionType();
                    });
                }
            });
        }
        #endregion
    }
}
namespace Shared.Phone.UserCenter
{
  /// <summary>
  /// 设备功能类型的自定义行控件
  /// </summary>
  public class DeviceFunctionTypeRowControl : FrameCaptionViewControl
  {
    #region ■ 变量声明___________________________
    /// <summary>
    /// 结束选择的事件 value:索引(从0开始)  文本信息请用Text获取
    /// </summary>
    public Action<int> FinishSelectEvent = null;
    /// <summary>
    /// 判断该控件能否显示
    /// </summary>
    public bool CanShowRow
    {
      get { return this.CheckCanShowRow(); }
    }
    private bool m_SetCanSelect = true;
    /// <summary>
    /// 强制设置能否进行选择(只对继电器和空气开关有效,个别界面需要这种操作)
    /// </summary>
    public bool SetCanSelect
    {
      set
      {
        m_SetCanSelect = value;
      }
    }
    /// <summary>
    /// 设备对象
    /// </summary>
    private CommonDevice device = null;
    /// <summary>
    /// 当前选择的功能类型索引 -1:还没有设置过 0:不指定 1:开关 2:灯光 3:插座
    /// </summary>
    private int nowSelectNo = -1;
    #endregion
    #region ■ 初始化_____________________________
    /// <summary>
    /// 设备功能类型的自定义行控件(选择功能之后,无条件直接变更类型)
    /// </summary>
    /// <param name="i_device">设备的对象</param>
    /// <param name="i_ChidrenYaxis">子控件Y轴偏移量(【列表控件的rowSpace/2】即可,不懂默认为0即可)</param>
    public DeviceFunctionTypeRowControl(CommonDevice i_device, int i_ChidrenYaxis = 0) : base("", "", i_ChidrenYaxis)
    {
      this.device = i_device;
      this.UseClickStatu = false;
    }
    /// <summary>
    /// 初始化
    /// </summary>
    public override void InitControl()
    {
      //初始化初始数据
      this.InitDefultData();
      //初始化底层数据
      base.InitControl();
      //空气开关和继电器可以选择功能类型
      if (this.device.Type == DeviceType.AirSwitch
          || this.device.Type == DeviceType.OnOffOutput)
      {
        //没被强制干涉的话
        if (m_SetCanSelect == true && Common.Config.Instance.Home.IsShowTemplate == false)
        {
          this.UseClickStatu = true;
          //右箭头
          this.AddRightArrow();
          //读取设备功能类型
          this.ReadDeviceFunctionType();
          this.ButtonClickEvent += (sender, e) =>
          {
            //显示选择设备功能类型的界面
            this.ShowSelectDeviceFunctionListForm();
          };
        }
      }
    }
    #endregion
    #region ■ 显示选择设备功能类型_______________
    /// <summary>
    /// 显示选择设备功能类型的界面
    /// </summary>
    private void ShowSelectDeviceFunctionListForm()
    {
      //显示列表
      var listText = new List<string>();
      listText.Add(Language.StringByID(R.MyInternationalizationString.uSwitch));//开关
      listText.Add(Language.StringByID(R.MyInternationalizationString.uLight));//灯光
      listText.Add(Language.StringByID(R.MyInternationalizationString.uSocket1));//插座
                                                                                 //标题:选择功能类型
      var title = Language.StringByID(R.MyInternationalizationString.uSelectFunctionType);
      var form = new BottomItemSelectForm();
      form.CancelCallEvent = true;//允许取消
      form.AddForm(title, listText, null, nowSelectNo - 1);
      form.FinishSelectEvent += (selectNo) =>
      {
        if (selectNo == nowSelectNo - 1)
        {
          //选择的是相同的
          return;
        }
        //-1:选择取消
        this.Text = selectNo == -1 ? string.Empty : listText[selectNo];
        nowSelectNo = selectNo + 1;
        this.CanClick = false;
        HdlThreadLogic.Current.RunThread(() =>
              {
                //设置功能类型到网关
                var result = Common.LocalDevice.Current.SendDeviceFunctionTypeToGateway(this.device, (DeviceFunctionType)nowSelectNo);
                HdlThreadLogic.Current.RunMain(() =>
                      {
                        if (result == true)
                        {
                          //记录起当前选择的功能类型
                          this.RefreshDfunctionType();
                          //设备改变功能类型的话,主页需要重新刷新
                          UserView.UserPage.Instance.RefreshAllForm = true;
                          //调用回调函数
                          this.FinishSelectEvent?.Invoke(nowSelectNo);
                        }
                        else
                        {
                          //设置设备功能类型失败
                          var alert = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.uSetDeviceFunctionTypeFail));
                          alert.Show();
                        }
                        this.CanClick = true;
                      });
              });
      };
    }
    #endregion
    #region ■ 初始化初始数据_____________________
    /// <summary>
    /// 初始化初始数据
    /// </summary>
    private void InitDefultData()
    {
      //标题:功能类型
      this.btnCaption.Text = Language.StringByID(R.MyInternationalizationString.uFunctionType);
      var myFunType = this.device.DfunctionType;
      //功能类型的翻译名字
      string strType = string.Empty;
      if (this.device.DfunctionType == DeviceFunctionType.A不指定)
      {
        nowSelectNo = 0;
      }
      else if (this.device.DfunctionType == DeviceFunctionType.A开关)
      {
        strType = Language.StringByID(R.MyInternationalizationString.uSwitch);
        nowSelectNo = 1;
      }
      else if (myFunType == DeviceFunctionType.A灯光)
      {
        strType = Language.StringByID(R.MyInternationalizationString.uLight);
        nowSelectNo = 2;
      }
      else if (this.device.DfunctionType == DeviceFunctionType.A插座)
      {
        strType = Language.StringByID(R.MyInternationalizationString.uSocket1);
        nowSelectNo = 3;
      }
      if (this.device.Type == DeviceType.ColorDimmableLight
          || this.device.Type == DeviceType.ColorTemperatureLight
          || this.device.Type == DeviceType.DimmableLight)
      {
        //灯光类固定为 灯光
        var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A418");
        strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
        nowSelectNo = 2;
      }
      else if (this.device.Type == DeviceType.WindowCoveringDevice)
      {
        //窗帘固定为 遮阳
        var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A400");
        strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
        nowSelectNo = -1;
      }
      else if (this.device.Type == DeviceType.Thermostat)
      {
        //空调固定为 空调
        var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A406");
        strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
        nowSelectNo = -1;
      }
      else if (this.device.Type == DeviceType.DoorLock)
      {
        //门锁固定为 门锁
        var infoContent = Common.LocalDevice.Current.GetDeviceModelIdNameInfo("A405");
        strType = infoContent != null ? infoContent.A官方名字 : string.Empty;
        nowSelectNo = -1;
      }
      else if (this.device.Type == DeviceType.FreshAir)
      {
        //新风固定为 新风
        strType = Language.StringByID(R.MyInternationalizationString.FreshAir);
        nowSelectNo = -1;
      }
      else if (this.device.Type == DeviceType.PMSensor)
      {
        //PM2.5传感器固定为 空气质量
        strType = Language.StringByID(R.MyInternationalizationString.AirQuality);
        nowSelectNo = -1;
      }
      else if (this.device.Type == DeviceType.Airer)
      {
        //晾衣架
        strType = Language.StringByID(R.MyInternationalizationString.AirerFun);
        nowSelectNo = -1;
      }
      else if (device.Type == DeviceType.TemperatureSensor)
      {
        //获取设备类型
        var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { device });
        //空气质量传感器
        if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.AirQualitySensor)
        {
          //空气质量传感器 环境
          strType = Language.StringByID(R.MyInternationalizationString.Envoronment);
          nowSelectNo = -1;
        }
      }
      //显示文本
      this.txtView.Text = strType;
    }
    #endregion
    #region ■ 检测能否显示_______________________
    /// <summary>
    /// 检测能否显示
    /// </summary>
    /// <returns></returns>
    private bool CheckCanShowRow()
    {
      if (this.device == null) { return true; }
      if (this.device.Type == DeviceType.AirSwitch//空气开关
          || this.device.Type == DeviceType.ColorDimmableLight//彩灯
          || this.device.Type == DeviceType.DimmableLight//调光灯
          || this.device.Type == DeviceType.DoorLock//门锁
          || this.device.Type == DeviceType.OnOffOutput//继电器
          || this.device.Type == DeviceType.Thermostat//空调
          || this.device.Type == DeviceType.FreshAir//新风
          || this.device.Type == DeviceType.PMSensor //PM2.5
           || this.device.Type == DeviceType.Airer//晾衣架
          || this.device.Type == DeviceType.ColorTemperatureLight //色温灯
          || this.device.Type == DeviceType.WindowCoveringDevice)//窗帘
      {
        return true;
      }
      //空气质量传感器
      if (this.device.Type == DeviceType.TemperatureSensor)
      {
        //获取设备类型
        var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { device });
        //空气质量传感器
        if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.AirQualitySensor)
        {
          return true;
        }
      }
      return false;
    }
    #endregion
    #region ■ 控件摧毁___________________________
    /// <summary>
    /// 控件摧毁
    /// </summary>
    public override void RemoveFromParent()
    {
      this.FinishSelectEvent = null;
      base.RemoveFromParent();
    }
    #endregion
    #region ■ 一般方法___________________________
    /// <summary>
    /// 刷新设备功能类型
    /// </summary>
    private void RefreshDfunctionType()
    {
      if (this.nowSelectNo == 1)
      {
        this.device.DfunctionType = DeviceFunctionType.A开关;
        if (this.device.IsCustomizeImage == false)
        {
          //重新设置图片
          this.device.IconPath = "Device/Switch.png";
        }
      }
      else if (this.nowSelectNo == 2)
      {
        this.device.DfunctionType = DeviceFunctionType.A灯光;
        if (this.device.IsCustomizeImage == false)
        {
          //重新设置图片
          this.device.IconPath = "Device/Light.png";
        }
      }
      else if (this.nowSelectNo == 3)
      {
        this.device.DfunctionType = DeviceFunctionType.A插座;
        if (this.device.IsCustomizeImage == false)
        {
          //重新设置图片
          this.device.IconPath = "Device/Socket1.png";
        }
      }
      else
      {
        this.device.DfunctionType = DeviceFunctionType.A不指定;
        if (this.device.IsCustomizeImage == false)
        {
          //重新设置图片
          if (this.device.Type == DeviceType.AirSwitch)
          {
            //空气开关
            this.device.IconPath = "Device/Switch.png";
          }
          else if (this.device.Type == DeviceType.OnOffOutput)
          {
            //继电器
            this.device.IconPath = "Device/RelayEpoint.png";
          }
        }
      }
      this.device.ReSave();
    }
    #endregion
    #region ■ 读取设备功能类型___________________
    /// <summary>
    /// 读取设备功能类型
    /// </summary>
    private void ReadDeviceFunctionType()
    {
      HdlThreadLogic.Current.RunThread(() =>
      {
        //读取设备功能类型
        var info = Common.LocalDevice.Current.ReadDeviceEpointDeviceInfo(this.device);
        if (info != null && ((int)this.device.DfunctionType) != info.FunctionType)
        {
          this.device.DfunctionType = (DeviceFunctionType)info.FunctionType;
          HdlThreadLogic.Current.RunMain(() =>
                {
                  //刷新控件
                  this.InitDefultData();
                  //刷新设备功能类型
                  this.RefreshDfunctionType();
                });
        }
      });
    }
    #endregion
  }
}