xm
2020-12-10 3aa397ab145382935492b11c1f18c9634e69910b
ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs
old mode 100755 new mode 100644
@@ -1,533 +1,732 @@
using System;
using System.Collections.Generic;
using System.Text;
using Java.Util;
using ZigBee.Device;
namespace Shared.Phone.UserCenter.Device
{
{
  /// <summary>
  /// 设备的功能设置界面
  /// </summary>
  public class DeviceFunctionSettionForm : EditorCommonForm
  {
    #region ■ 变量声明___________________________
    /// <summary>
    /// 设备的功能设置界面
    /// 列表控件
    /// </summary>
    public class DeviceFunctionSettionForm : EditorCommonForm
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 列表控件
        /// </summary>
        private FrameListControl listview = null;
        /// <summary>
        /// 当前选择的设备
        /// </summary>
        private CommonDevice nowSelectDevice = null;
        /// <summary>
        /// 当前选择的回路控件
        /// </summary>
        private NormalViewControl nowSelectControl = null;
        /// <summary>
        /// 设备备注的控件
        /// </summary>
        private FrameCaptionInputControl frameDeviceName = null;
        /// <summary>
        /// 设备的某一回路
        /// </summary>
        private CommonDevice deviceObj = null;
        /// <summary>
        /// 只显示同一种类型的回路
        /// </summary>
        private bool onlyType = false;
        /// <summary>
        /// 设备需要保存的设备名字
        /// </summary>
        private Dictionary<int, string> dicDeviceSaveName = new Dictionary<int, string>();
        /// <summary>
        /// 信息编辑控件
        /// </summary>
        private InformationEditorControl tableContr = null;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 画面显示(底层会固定调用此方法,借以完成画面创建)
        /// </summary>
        /// <param name="i_device">设备的某一回路</param>
        /// <param name="i_onlyType">只显示同一种类型的回路</param>
        public void ShowForm(CommonDevice i_device, bool i_onlyType)
        {
            this.deviceObj = i_device;
            this.onlyType = i_onlyType;
            //设置头部信息
            base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uFunctionSettingUp));
            //初始化中部信息
            this.InitMiddleFrame();
            //初始化右上角菜单
            this.InitTopRightMenu();
        }
        /// <summary>
        /// 初始化中部信息
        /// </summary>
        private void InitMiddleFrame()
        {
            //清空bodyFrame
            this.ClearBodyFrame();
            var listBackControl = new VerticalFrameControl();
            listBackControl.Height = bodyFrameLayout.Height;
            bodyFrameLayout.AddChidren(listBackControl);
            //初始化桌布
            this.tableContr = new InformationEditorControl();
            if (this.deviceObj.Type == DeviceType.FreshAir || this.deviceObj.Type == DeviceType.PMSensor)
            {
                this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uDeviceEditor), 1028);
            }
            else
            {
                this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uDeviceEditor), 1128);
            }
            //初始化设备回路图标
            this.InitDeviceEpointIcon(listBackControl);
            //保存
            var btnFinish = new BottomClickButton();
            btnFinish.TextID = R.MyInternationalizationString.uSave;
            bodyFrameLayout.AddChidren(btnFinish);
            btnFinish.ButtonClickEvent += (sender, e) =>
            {
                //记录起当前正在操作的回路名字
                dicDeviceSaveName[nowSelectDevice.DeviceEpoint] = frameDeviceName.Text.Trim();
                foreach (var epoint in dicDeviceSaveName.Keys)
                {
                    var device = Common.LocalDevice.Current.GetDevice(deviceObj.DeviceAddr, epoint);
                    if (device == null || dicDeviceSaveName[epoint] == string.Empty)
                    {
                        //不能允许空白名字
                        continue;
                    }
                    string newName = dicDeviceSaveName[epoint];
                    string oldName = Common.LocalDevice.Current.GetDeviceEpointName(device);
                    if (oldName != newName)
                    {
                        //设备名称修改
                        var result = Common.LocalDevice.Current.ReName(device, newName);
                        if (result == false)
                        {
                            return;
                        }
                    }
                }
                //关闭自身
                this.CloseForm();
            };
            //如果当前是展示模板,则不能编辑
            if (Common.Config.Instance.Home.IsShowTemplate == true)
            {
                btnFinish.CanClick = false;
            }
        }
        /// <summary>
        /// 初始化菜单行
        /// </summary>
        private void InitMenuRow()
        {
            this.listview.RemoveAll();
            //回路备注
            string caption = Language.StringByID(R.MyInternationalizationString.uDeviceEpointNote);
            string nameValue = Common.LocalDevice.Current.GetDeviceEpointName(nowSelectDevice);
            if (dicDeviceSaveName.ContainsKey(nowSelectDevice.DeviceEpoint) == true)
            {
                nameValue = dicDeviceSaveName[nowSelectDevice.DeviceEpoint];
            }
            this.frameDeviceName = new FrameCaptionInputControl(caption, nameValue, listview.rowSpace / 2);
            this.frameDeviceName.txtInput.MaxByte = 48;//限制只能输入48个字节
            listview.AddChidren(frameDeviceName);
            frameDeviceName.InitControl();
            frameDeviceName.AddBottomLine();
            //如果当前是展示模板,则需要处理
            if (Common.Config.Instance.Home.IsShowTemplate == false)
            {
                frameDeviceName.txtInput.FinishInputEvent += () =>
                {
                    string oldName = Common.LocalDevice.Current.GetDeviceEpointName(nowSelectDevice);
                    if (frameDeviceName.Text.Trim() == string.Empty)
                    {
                        //将名字还原
                        frameDeviceName.Text = oldName;
                    }
                    if (oldName != frameDeviceName.Text.Trim())
                    {
                        //设备名称修改
                        var result = Common.LocalDevice.Current.ReName(nowSelectDevice, frameDeviceName.Text.Trim());
                        if (result == false)
                        {
                            return;
                        }
                        //回路备注修改成功!
                        string msg = Language.StringByID(R.MyInternationalizationString.uDeviceEpointReNoteSuccess);
                        this.ShowMassage(ShowMsgType.Tip, msg);
                    }
                };
            }
            //所属区域
            var rowBeloneArea = new BelongAreaControl(listview.rowSpace / 2);
            listview.AddChidren(rowBeloneArea);
            rowBeloneArea.InitControl(Language.StringByID(R.MyInternationalizationString.uBelongArea), nowSelectDevice);
            //底线
            rowBeloneArea.AddBottomLine();
            rowBeloneArea.SelectRoomEvent += (roomKeys) =>
            {
                //变更房间
                HdlRoomLogic.Current.ChangedRoom(nowSelectDevice, roomKeys);
            };
            //添加功能类型行
            this.AddFunctionTypeRow();
            //初始化桌布完成
            tableContr.FinishInitControl();
        }
        #endregion
        #region ■ 右上角菜单_________________________
        /// <summary>
        /// 初始化右上角菜单
        /// </summary>
        private void InitTopRightMenu()
        {
            //检测此回路是否拥有定位功能
            if (Common.LocalDevice.Current.DeviceIsCanFixedPosition(nowSelectDevice) == false
                || Common.Config.Instance.Home.IsShowTemplate == true)
            {
                return;
            }
            var btnIcon = new MostRightIconControl(69, 69);
            btnIcon.UnSelectedImagePath = "Item/More.png";
            topFrameLayout.AddChidren(btnIcon);
            btnIcon.InitControl();
            btnIcon.ButtonClickEvent += ((sender, e) =>
            {
                //显示右上角菜单界面
                this.ShowTopRightMenu();
            });
        }
        /// <summary>
        /// 显示右上角菜单界面
        /// </summary>
        private void ShowTopRightMenu()
        {
            int menuCount = 1;
            string deviceMenu = string.Empty;
            //检测此回路是否拥有定位功能
            bool canTest = Common.LocalDevice.Current.DeviceIsCanFixedPosition(nowSelectDevice);
            //if (canTest == true)
            //{
            //    menuCount = 2;
            //}
            var frame = new TopRightMenuControl(menuCount, 1);
            if (canTest == true)
            {
                //定位
                deviceMenu = Language.StringByID(R.MyInternationalizationString.uFixedPosition);
                frame.AddRowMenu(deviceMenu, "Item/FixedPosition.png", "Item/FixedPositionSelected.png", () =>
                {
                    //发送定位功能
                    Common.LocalDevice.Current.SetFixedPositionCommand(nowSelectDevice);
                });
            }
            //删除
            //deviceMenu = Language.StringByID(R.MyInternationalizationString.uDelete);
            //frame.AddRowMenu(deviceMenu, "Item/DeleteIcon2.png", "Item/DeleteIcon2Selected.png", () =>
            //{
            //});
        }
        #endregion
        #region ■ 功能类型___________________________
        /// <summary>
        /// 添加功能类型行
        /// </summary>
        private void AddFunctionTypeRow()
        {
            //自定义功能类型控件
            var rowFunction = new DeviceFunctionTypeRowControl(nowSelectDevice, listview.rowSpace / 2);
            if (rowFunction.CanShowRow == false)
            {
                return;
            }
            listview.AddChidren(rowFunction);
            rowFunction.InitControl();
            //底线
            rowFunction.AddBottomLine();
        }
        #endregion
        #region ■ 初始化设备回路图标_________________
        /// <summary>
        /// 初始化设备回路图标
        /// </summary>
        private void InitDeviceEpointIcon(VerticalFrameControl listBackControl)
        {
            //获取按组分配的设备
            var listIcon = this.GetAllDeviceGroup();
            var frameBorder = new FrameLayout();
            frameBorder.Y = Application.GetRealHeight(147);
            frameBorder.Gravity = Gravity.CenterHorizontal;
            frameBorder.Width = this.GetPictrueRealSize(887);
            frameBorder.Height = Application.GetRealHeight(423);
            frameBorder.Radius = (uint)Application.GetRealHeight(6);
            listBackControl.frameTable.AddChidren(frameBorder);
            var frameBack = new FrameLayout();
            frameBack.Height = frameBorder.Height;
            if (listIcon.Count > 2)
            {
                //需要滑动控件
                var listControl = new VerticalScrolViewLayout();
                listControl.Height = frameBorder.Height;
                frameBorder.AddChidren(listControl);
                listControl.AddChidren(frameBack);
            }
            else
            {
                //不需要滑动控件
                frameBorder.AddChidren(frameBack);
            }
            int index = 0;
            for (int i = 0; i < listIcon.Count; i++)
            {
                var frame = new FrameLayout();
                frame.Width = frameBorder.Width;
                frame.Height = this.GetPictrueRealSize(124);
                frameBack.AddChidren(frame);
                //初始化一行设备图标
                this.InitDeviceIconFrame(frame, listIcon[i], ref index);
                if (listIcon.Count == 1)
                {
                    frame.Gravity = Gravity.CenterVertical;
                    //如果是新风
                    if (deviceObj.Type == DeviceType.FreshAir)
                    {
                        frame.RemoveFromParent();
                        frameBorder.Y = Application.GetRealHeight(0);
                        frameBorder.Height = Application.GetRealHeight(709);
                        frameBack.BackgroundImagePath = "FreshAir/FreshAirRealDevicePic.png";
                        frameBack.Width = this.GetPictrueRealSize(878);
                        frameBack.Height = this.GetPictrueRealSize(354);
                        frameBack.Y = Application.GetRealHeight(153);
                        frameBack.Gravity = Gravity.Center;
                    }
                    //如果是PM2.5
                    if (deviceObj.Type == DeviceType.PMSensor)
                    {
                        frame.RemoveFromParent();
                        frameBorder.Y = Application.GetRealHeight(0);
                        frameBorder.Height = Application.GetRealHeight(708);
                        frameBack.BackgroundImagePath = "RealDevice/SensorPMTwoPointFive.png";
                        frameBack.Width = this.GetPictrueRealSize(418);
                        frameBack.Height = this.GetPictrueRealSize(403);
                        frameBack.Y = Application.GetRealHeight(153);
                        frameBack.Gravity = Gravity.Center;
                    }
                }
                else
                {
                    frame.Y = this.GetPictrueRealSize(58) + (frameBack.ChildrenCount - 1) * (frame.Height + this.GetPictrueRealSize(60));
                }
            }
            if (listIcon.Count > 2)
            {
                //计算真实高度
                int realHeight = this.GetPictrueRealSize(58 + 58);//上下间距
                realHeight += frameBack.ChildrenCount * this.GetPictrueRealSize(124);//圆圈高度
                realHeight += (frameBack.ChildrenCount - 1) * this.GetPictrueRealSize(60);//圆圈间距
                if (realHeight > frameBack.Height)
                {
                    //变更高度
                    frameBack.Height = realHeight;
                }
            }
        }
        /// <summary>
        /// 初始化一行设备图标
        /// </summary>
        /// <param name="frame"></param>
        /// <param name="listDevice"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private void InitDeviceIconFrame(FrameLayout frame, List<CommonDevice> listDevice, ref int index)
        {
            NormalViewControl btnTemp = null;
            //间距
            int space = this.GetPictrueRealSize(84);
            int defultXX = (frame.Width - frame.Height * listDevice.Count - (listDevice.Count - 1) * space) / 2;
            for (int i = 0; i < listDevice.Count; i++)
            {
                index++;
                var btnIcon = new NormalViewControl(frame.Height, frame.Height, false);
                btnIcon.Name = "btn" + listDevice[i].DeviceEpoint;
                btnIcon.X = defultXX + i * (frame.Height + space);
                btnIcon.Radius = (uint)frame.Height / 2;
                btnIcon.BorderWidth = 2;
                btnIcon.BorderColor = 0xff979797;
                btnIcon.TextAlignment = TextAlignment.Center;
                btnIcon.TextColor = UserCenterColor.Current.TextGrayColor3;
                btnIcon.TextSize = 13;
                btnIcon.Text = "CH" + index;
                frame.AddChidren(btnIcon);
                //点击事件
                btnIcon.ButtonClickEvent += this.DeviceEpointSelectEvent;
                if (listDevice[i].DeviceEpoint == deviceObj.DeviceEpoint)
                {
                    btnTemp = btnIcon;
                }
            }
            if (btnTemp != null)
            {
                //初始化菜单行
                this.DeviceEpointSelectEvent(btnTemp, null);
            }
        }
        /// <summary>
        /// 获取按组分配的设备
        /// </summary>
        /// <returns></returns>
        private List<List<CommonDevice>> GetAllDeviceGroup()
        {
            bool hadDevice = false;
            var listDevice = Common.LocalDevice.Current.GetDevicesByMac(deviceObj.DeviceAddr);
            var listRelay = new List<CommonDevice>();
            foreach (var device in listDevice)
            {
                if (device.Type == DeviceType.OnOffSwitch)
                {
                    //这个界面不处理干接点
                    continue;
                }
                if (this.onlyType == true && device.Type != deviceObj.Type)
                {
                    //只要同一种类型的
                    continue;
                }
                //获取设备属于【简约多功能面板】
                var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listDevice);
                if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_SimpleMultifunction)
                {
                    if (device.Type == DeviceType.TemperatureSensor && device.DeviceEpoint == 1)
                    {
                        //简约多功能面板第1回路是一个绑定温湿度传感器第类型,不是真的温湿度的传感器,需要屏蔽掉
                        continue;
                    }
                }
                listRelay.Add(device);
                if (device.DeviceEpoint == deviceObj.DeviceEpoint)
                {
                    //能够匹配得到这个回路
                    hadDevice = true;
                }
            }
            //排序
            listRelay.Sort((obj1, obj2) =>
            {
                if (obj1.DeviceEpoint > obj2.DeviceEpoint)
                {
                    return 1;
                }
                return -1;
            });
            if (hadDevice == false)
            {
                //如果匹配不到这个回路,则默认第一个
                this.deviceObj = listRelay[0];
            }
            //从下往上4个为一组
            var listIcon = new List<List<CommonDevice>>();
            var listTemp = new List<CommonDevice>();
            for (int i = listRelay.Count - 1; i >= 0; i--)
            {
                listTemp.Insert(0, listRelay[i]);
                if (listTemp.Count == 4)
                {
                    listIcon.Insert(0, listTemp);
                    listTemp = new List<CommonDevice>();
                }
            }
            if (listTemp.Count > 0)
            {
                listIcon.Insert(0, listTemp);
            }
            return listIcon;
        }
        #endregion
        #region ■ 回路选择___________________________
        /// <summary>
        /// 回路选择事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DeviceEpointSelectEvent(object sender, MouseEventArgs e)
        {
            var nowContr = (NormalViewControl)sender;
            if (nowSelectControl != null)
            {
                //同一个东西,不鸟他
                if (nowSelectControl.Name == nowContr.Name)
                {
                    return;
                }
                //不选择状态
                nowSelectControl.BorderColor = 0xff979797;
                nowSelectControl.TextSize = 13;
                nowSelectControl.TextColor = UserCenterColor.Current.TextGrayColor3;
                //记录它的名字
                dicDeviceSaveName[nowSelectDevice.DeviceEpoint] = frameDeviceName.Text.Trim();
            }
            //选择状态
            nowContr.BorderColor = 0xfffb744a;
            nowContr.TextSize = 14;
            nowContr.TextColor = UserCenterColor.Current.TextColor1;
            nowSelectControl = nowContr;
            nowSelectDevice = Common.LocalDevice.Current.GetDevice(deviceObj.DeviceAddr, Convert.ToInt32(nowContr.Name.Replace("btn", string.Empty)));
            //重新初始化菜单行
            this.InitMenuRow();
        }
        #endregion
    }
    private FrameListControl listview = null;
    /// <summary>
    /// 当前选择的设备
    /// </summary>
    private CommonDevice nowSelectDevice = null;
    /// <summary>
    /// 当前选择的回路控件
    /// </summary>
    private NormalViewControl nowSelectControl = null;
    /// <summary>
    /// 设备备注的控件
    /// </summary>
    private FrameCaptionInputControl frameDeviceName = null;
    /// <summary>
    /// 设备的某一回路
    /// </summary>
    private CommonDevice deviceObj = null;
    /// <summary>
    /// 只显示同一种类型的回路
    /// </summary>
    private bool onlyType = false;
    /// <summary>
    /// 设备需要保存的设备名字
    /// </summary>
    private Dictionary<int, string> dicDeviceSaveName = new Dictionary<int, string>();
    /// <summary>
    /// 信息编辑控件
    /// </summary>
    private InformationEditorControl tableContr = null;
    #endregion
    #region ■ 初始化_____________________________
    /// <summary>
    /// 画面显示(底层会固定调用此方法,借以完成画面创建)
    /// </summary>
    /// <param name="i_device">设备的某一回路</param>
    /// <param name="i_onlyType">只显示同一种类型的回路</param>
    public void ShowForm(CommonDevice i_device, bool i_onlyType)
    {
      this.deviceObj = i_device;
      this.onlyType = i_onlyType;
      //设置头部信息
      base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uFunctionSettingUp));
      //初始化中部信息
      this.InitMiddleFrame();
      //初始化右上角菜单
      this.InitTopRightMenu();
    }
    /// <summary>
    /// 初始化中部信息
    /// </summary>
    private void InitMiddleFrame()
    {
      //清空bodyFrame
      this.ClearBodyFrame();
      var listBackControl = new VerticalFrameControl();
      listBackControl.Height = bodyFrameLayout.Height;
      bodyFrameLayout.AddChidren(listBackControl);
      //初始化桌布
      this.tableContr = new InformationEditorControl();
      if (this.deviceObj.Type == DeviceType.FreshAir || this.deviceObj.Type == DeviceType.PMSensor)
      {
        this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uDeviceEditor), 1028);
      }
      else if (this.deviceObj.Type == DeviceType.Airer)
      {
        //晾衣架设备只存取回路1,如果是晾衣架,默认端点都是1;
        this.deviceObj.DeviceEpoint = 1;
        this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uDeviceEditor), 1342);
      }
      else
      {
        this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uDeviceEditor), 1128);
      }
      //初始化设备回路图标
      this.InitDeviceEpointIcon(listBackControl);
      //保存
      var btnFinish = new BottomClickButton();
      btnFinish.TextID = R.MyInternationalizationString.uSave;
      bodyFrameLayout.AddChidren(btnFinish);
      btnFinish.ButtonClickEvent += (sender, e) =>
      {
        //记录起当前正在操作的回路名字
        dicDeviceSaveName[nowSelectDevice.DeviceEpoint] = frameDeviceName.Text.Trim();
        foreach (var epoint in dicDeviceSaveName.Keys)
        {
          var device = Common.LocalDevice.Current.GetDevice(deviceObj.DeviceAddr, epoint);
          if (device == null || dicDeviceSaveName[epoint] == string.Empty)
          {
            //不能允许空白名字
            continue;
          }
          string newName = dicDeviceSaveName[epoint];
          string oldName = Common.LocalDevice.Current.GetDeviceEpointName(device);
          if (oldName != newName)
          {
            //设备名称修改
            var result = Common.LocalDevice.Current.ReName(device, newName);
            if (result == false)
            {
              return;
            }
          }
        }
        //如果是晾衣架
        if (deviceObj.Type == DeviceType.Airer)
        {
          var airer = deviceObj as Airer;
          SetAirerFunTimeDevice(airer);
        }
        else
        {
          //关闭自身
          this.CloseForm();
        }
      };
      //如果当前是展示模板,则不能编辑
      if (Common.Config.Instance.Home.IsShowTemplate == true)
      {
        btnFinish.CanClick = false;
      }
    }
    /// <summary>
    /// 初始化菜单行
    /// </summary>
    private void InitMenuRow()
    {
      this.listview.RemoveAll();
      //回路备注
      string caption = Language.StringByID(R.MyInternationalizationString.uDeviceEpointNote);
      string nameValue = Common.LocalDevice.Current.GetDeviceEpointName(nowSelectDevice);
      if (this.deviceObj.Type == DeviceType.Airer)
      {
        nameValue = Common.LocalDevice.Current.GetDeviceMacName(nowSelectDevice);
      }
      if (dicDeviceSaveName.ContainsKey(nowSelectDevice.DeviceEpoint) == true)
      {
        nameValue = dicDeviceSaveName[nowSelectDevice.DeviceEpoint];
      }
      this.frameDeviceName = new FrameCaptionInputControl(caption, nameValue, listview.rowSpace / 2);
      this.frameDeviceName.txtInput.MaxByte = 48;//限制只能输入48个字节
      listview.AddChidren(frameDeviceName);
      frameDeviceName.InitControl();
      frameDeviceName.AddBottomLine();
      //如果当前是展示模板,则需要处理
      if (Common.Config.Instance.Home.IsShowTemplate == false)
      {
        frameDeviceName.txtInput.FinishInputEvent += () =>
        {
          string oldName = Common.LocalDevice.Current.GetDeviceEpointName(nowSelectDevice);
          if (frameDeviceName.Text.Trim() == string.Empty)
          {
            //将名字还原
            frameDeviceName.Text = oldName;
          }
          if (oldName != frameDeviceName.Text.Trim())
          {
            //设备名称修改
            var result = Common.LocalDevice.Current.ReName(nowSelectDevice, frameDeviceName.Text.Trim());
            if (result == false)
            {
              return;
            }
            //回路备注修改成功!
            string msg = Language.StringByID(R.MyInternationalizationString.uDeviceEpointReNoteSuccess);
            this.ShowMassage(ShowMsgType.Tip, msg);
          }
        };
      }
      //所属区域
      var rowBeloneArea = new BelongAreaControl(listview.rowSpace / 2);
      listview.AddChidren(rowBeloneArea);
      rowBeloneArea.InitControl(Language.StringByID(R.MyInternationalizationString.uBelongArea), nowSelectDevice);
      //底线
      rowBeloneArea.AddBottomLine();
      rowBeloneArea.SelectRoomEvent += (roomKeys) =>
      {
        //变更房间
        HdlRoomLogic.Current.ChangedRoom(nowSelectDevice, roomKeys);
      };
      //添加功能类型行
      this.AddFunctionTypeRow();
      if (this.deviceObj.Type == DeviceType.Airer)
      {
        var airer = this.deviceObj as Airer;
        //添加烘干时间行
        this.AddAirerDryTimeRow(airer);
        //添加风干时间行
        this.AddAirerWindTimeRow(airer);
        //添加消毒时间行
        this.AddAirerDisinfectTimeRow(airer);
      }
      //初始化桌布完成
      tableContr.FinishInitControl();
    }
    #endregion
    #region ■ 右上角菜单_________________________
    /// <summary>
    /// 初始化右上角菜单
    /// </summary>
    private void InitTopRightMenu()
    {
      //检测此回路是否拥有定位功能
      if (Common.LocalDevice.Current.DeviceIsCanFixedPosition(nowSelectDevice) == false
          || Common.Config.Instance.Home.IsShowTemplate == true)
      {
        return;
      }
      var btnIcon = new MostRightIconControl(69, 69);
      btnIcon.UnSelectedImagePath = "Item/More.png";
      topFrameLayout.AddChidren(btnIcon);
      btnIcon.InitControl();
      btnIcon.ButtonClickEvent += ((sender, e) =>
      {
        //显示右上角菜单界面
        this.ShowTopRightMenu();
      });
    }
    /// <summary>
    /// 显示右上角菜单界面
    /// </summary>
    private void ShowTopRightMenu()
    {
      int menuCount = 1;
      string deviceMenu = string.Empty;
      //检测此回路是否拥有定位功能
      bool canTest = Common.LocalDevice.Current.DeviceIsCanFixedPosition(nowSelectDevice);
      //if (canTest == true)
      //{
      //    menuCount = 2;
      //}
      var frame = new TopRightMenuControl(menuCount, 1);
      if (canTest == true)
      {
        //定位
        deviceMenu = Language.StringByID(R.MyInternationalizationString.uFixedPosition);
        frame.AddRowMenu(deviceMenu, "Item/FixedPosition.png", "Item/FixedPositionSelected.png", () =>
        {
          //发送定位功能
          Common.LocalDevice.Current.SetFixedPositionCommand(nowSelectDevice);
        });
      }
      //删除
      //deviceMenu = Language.StringByID(R.MyInternationalizationString.uDelete);
      //frame.AddRowMenu(deviceMenu, "Item/DeleteIcon2.png", "Item/DeleteIcon2Selected.png", () =>
      //{
      //});
    }
    #endregion
    #region ■ 功能类型___________________________
    /// <summary>
    /// 添加功能类型行
    /// </summary>
    private void AddFunctionTypeRow()
    {
      //自定义功能类型控件
      var rowFunction = new DeviceFunctionTypeRowControl(nowSelectDevice, listview.rowSpace / 2);
      if (rowFunction.CanShowRow == false)
      {
        return;
      }
      listview.AddChidren(rowFunction);
      rowFunction.InitControl();
      //底线
      rowFunction.AddBottomLine();
    }
    #endregion
    #region ■ 晾衣架专用_________________________
    #region ■ 烘干时间_________________________
    /// <summary>
    ///  烘干时间行
    /// </summary>
    private void AddAirerDryTimeRow(Airer airer)
    {
      var rowAirer = new AiererTimeControl(listview.rowSpace / 2);
      listview.AddChidren(rowAirer);
      var text = Language.StringByID(R.MyInternationalizationString.AirerDefault) + 3 + Language.StringByID(R.MyInternationalizationString.AirerHour);
      if (airer.DryTime != 0)
      {
        double result = airer.DryTime / 60.0;
        var hour = Math.Round(result, 2);
        text = hour + Language.StringByID(R.MyInternationalizationString.AirerHour);
      }
      rowAirer.InitControl(airer, bodyFrameLayout, Language.StringByID(R.MyInternationalizationString.AirerDryTime), text, 1);
      //底线
      rowAirer.AddBottomLine();
      rowAirer.SelectTimeEvent += (v1, v2) =>
      {
        //double result = second / 3600.0;
        //var hour = Math.Round(result, 1);
        //text = hour + Language.StringByID(R.MyInternationalizationString.AirerHour);
        //rowAirer.InitControl(airer, bodyFrameLayout, Language.StringByID(R.MyInternationalizationString.AirerDryTime), text, 1);
      };
    }
    #endregion
    #region ■ 风干时间_________________________
    /// <summary>
    ///  风干时间行
    /// </summary>
    private void AddAirerWindTimeRow(Airer airer)
    {
      var rowAirer = new AiererTimeControl(listview.rowSpace / 2);
      listview.AddChidren(rowAirer);
      var text = Language.StringByID(R.MyInternationalizationString.AirerDefault) + 3 + Language.StringByID(R.MyInternationalizationString.AirerHour);
      if (airer.WindTime != 0)
      {
        double result = airer.WindTime / 60.0;
        var hour = Math.Round(result, 1);
        text = hour + Language.StringByID(R.MyInternationalizationString.AirerHour);
      }
      rowAirer.InitControl(airer, bodyFrameLayout, Language.StringByID(R.MyInternationalizationString.AirerWindTime), text, 2);
      //底线
      rowAirer.AddBottomLine();
      rowAirer.SelectTimeEvent += (v1, v2) =>
      {
        //double result = second / 3600.0;
        //var hour = Math.Round(result, 1);
        //text = hour + Language.StringByID(R.MyInternationalizationString.AirerHour);
        //rowAirer.InitControl(airer, bodyFrameLayout, Language.StringByID(R.MyInternationalizationString.AirerDryTime), text, 1);
      };
    }
    #endregion
    #region ■ 消毒时间_________________________
    /// <summary>
    ///  消毒时间行
    /// </summary>
    private void AddAirerDisinfectTimeRow(Airer airer)
    {
      var rowAirer = new AiererTimeControl(listview.rowSpace / 2);
      listview.AddChidren(rowAirer);
      var text = Language.StringByID(R.MyInternationalizationString.AirerDefault) + 30 + Language.StringByID(R.MyInternationalizationString.AirerMin);
      if (airer.DisinfectTime != 0)
      {
        text = airer.DisinfectTime + Language.StringByID(R.MyInternationalizationString.AirerMin);
      }
      rowAirer.InitControl(airer, bodyFrameLayout, Language.StringByID(R.MyInternationalizationString.AirerDisinfectTime), text, 3);
      //底线
      rowAirer.AddBottomLine();
      rowAirer.SelectTimeEvent += (v1, v2) =>
      {
      };
    }
    #endregion
    #region ■  读取时间命令___________________
    /// <summary>
    /// 读取时间命令
    /// </summary>
    public void ReadAirerFunTimeDevice()
    {
    }
    #endregion
    /// <summary>
    /// 设备时间设置
    /// </summary>
    private void SetAirerFunTimeDevice(Airer airer)
    {
      HdlThreadLogic.Current.RunThread(async () =>
      {
        //打开进度条
        this.ShowProgressBar();
        //则要设置对应的功能时间
        List<CommonDevice> listdevice = new List<CommonDevice>();
        for (int i = 3; i < 6; i++)
        {
          int time = 0;
          listdevice.Add(deviceObj);
          switch (i)
          {
            case 3:
              time = airer.WindTime;
              break;
            case 4:
              time = airer.DryTime;
              break;
            case 5:
              time = airer.DisinfectTime;
              break;
          }
          bool result = await Common.LocalDevice.Current.SetAirerTimeDevice(listdevice, airer, time, i);
          if (result == false)
          {
            airer.WindTime = airer.WindRemainTime = 0;
            airer.DryTime = airer.DryRemainTime = 0;
            airer.DisinfectTime = airer.DisinfectTime = 0;
            HdlThreadLogic.Current.RunMainInThread(() =>
            {
              this.InitMiddleFrame();
            });
            //关闭进度条
            this.CloseProgressBar();
            return;
          }
        }
        //关闭进度条
        this.CloseProgressBar();
        //关闭自身
        this.CloseForm();
      });
    }
    #endregion
    #region ■ 初始化设备回路图标_________________
    /// <summary>
    /// 初始化设备回路图标
    /// </summary>
    private void InitDeviceEpointIcon(VerticalFrameControl listBackControl)
    {
      //获取按组分配的设备
      var listIcon = this.GetAllDeviceGroup();
      var frameBorder = new FrameLayout();
      frameBorder.Y = Application.GetRealHeight(147);
      frameBorder.Gravity = Gravity.CenterHorizontal;
      frameBorder.Width = this.GetPictrueRealSize(887);
      frameBorder.Height = Application.GetRealHeight(423);
      frameBorder.Radius = (uint)Application.GetRealHeight(6);
      listBackControl.frameTable.AddChidren(frameBorder);
      var frameBack = new FrameLayout();
      frameBack.Height = frameBorder.Height;
      if (listIcon.Count > 2)
      {
        //需要滑动控件
        var listControl = new VerticalScrolViewLayout();
        listControl.Height = frameBorder.Height;
        frameBorder.AddChidren(listControl);
        listControl.AddChidren(frameBack);
      }
      else
      {
        //不需要滑动控件
        frameBorder.AddChidren(frameBack);
      }
      int index = 0;
      for (int i = 0; i < listIcon.Count; i++)
      {
        var frame = new FrameLayout();
        frame.Width = frameBorder.Width;
        frame.Height = this.GetPictrueRealSize(124);
        frameBack.AddChidren(frame);
        //初始化一行设备图标
        this.InitDeviceIconFrame(frame, listIcon[i], ref index);
        if (listIcon.Count == 1)
        {
          frame.Gravity = Gravity.CenterVertical;
          //如果是新风
          if (deviceObj.Type == DeviceType.FreshAir)
          {
            frame.RemoveFromParent();
            frameBorder.Y = Application.GetRealHeight(0);
            frameBorder.Height = Application.GetRealHeight(709);
            frameBack.BackgroundImagePath = "FreshAir/FreshAirRealDevicePic.png";
            frameBack.Width = this.GetPictrueRealSize(878);
            frameBack.Height = this.GetPictrueRealSize(354);
            frameBack.Y = Application.GetRealHeight(153);
            frameBack.Gravity = Gravity.Center;
          }
          //如果是PM2.5
          if (deviceObj.Type == DeviceType.PMSensor)
          {
            frame.RemoveFromParent();
            frameBorder.Y = Application.GetRealHeight(0);
            frameBorder.Height = Application.GetRealHeight(708);
            frameBack.BackgroundImagePath = "RealDevice/SensorPMTwoPointFive.png";
            frameBack.Width = this.GetPictrueRealSize(418);
            frameBack.Height = this.GetPictrueRealSize(403);
            frameBack.Y = Application.GetRealHeight(153);
            frameBack.Gravity = Gravity.Center;
          }
          //如果是晾衣架
          if (deviceObj.Type == DeviceType.Airer)
          {
            frame.RemoveFromParent();
            frameBorder.Y = Application.GetRealHeight(0);
            frameBorder.Height = Application.GetRealHeight(709);
            frameBack.BackgroundImagePath = "Airer/Airer216.png";
            frameBack.Width = this.GetPictrueRealSize(207);
            frameBack.Height = this.GetPictrueRealSize(207);
            frameBack.Y = Application.GetRealHeight(92);
            frameBack.Gravity = Gravity.CenterHorizontal;
          }
        }
        else
        {
          frame.Y = this.GetPictrueRealSize(58) + (frameBack.ChildrenCount - 1) * (frame.Height + this.GetPictrueRealSize(60));
        }
      }
      //如果是晾衣架,有5个回路,但是5个回路只是代表不同功能使用,不是真实的对应设备,所以默认只显示第一回路
      if (deviceObj.Type != DeviceType.Airer)
      {
        if (listIcon.Count > 2)
        {
          //计算真实高度
          int realHeight = this.GetPictrueRealSize(58 + 58);//上下间距
          realHeight += frameBack.ChildrenCount * this.GetPictrueRealSize(124);//圆圈高度
          realHeight += (frameBack.ChildrenCount - 1) * this.GetPictrueRealSize(60);//圆圈间距
          if (realHeight > frameBack.Height)
          {
            //变更高度
            frameBack.Height = realHeight;
          }
        }
      }
    }
    /// <summary>
    /// 初始化一行设备图标
    /// </summary>
    /// <param name="frame"></param>
    /// <param name="listDevice"></param>
    /// <param name="index"></param>
    /// <returns></returns>
    private void InitDeviceIconFrame(FrameLayout frame, List<CommonDevice> listDevice, ref int index)
    {
      NormalViewControl btnTemp = null;
      //间距
      int space = this.GetPictrueRealSize(84);
      int defultXX = (frame.Width - frame.Height * listDevice.Count - (listDevice.Count - 1) * space) / 2;
      for (int i = 0; i < listDevice.Count; i++)
      {
        index++;
        var btnIcon = new NormalViewControl(frame.Height, frame.Height, false);
        btnIcon.Name = "btn" + listDevice[i].DeviceEpoint;
        btnIcon.X = defultXX + i * (frame.Height + space);
        btnIcon.Radius = (uint)frame.Height / 2;
        btnIcon.BorderWidth = 2;
        btnIcon.BorderColor = 0xff979797;
        btnIcon.TextAlignment = TextAlignment.Center;
        btnIcon.TextColor = UserCenterColor.Current.TextGrayColor3;
        btnIcon.TextSize = 13;
        btnIcon.Text = "CH" + index;
        frame.AddChidren(btnIcon);
        //点击事件
        btnIcon.ButtonClickEvent += this.DeviceEpointSelectEvent;
        if (listDevice[i].DeviceEpoint == deviceObj.DeviceEpoint)
        {
          btnTemp = btnIcon;
        }
      }
      if (btnTemp != null)
      {
        //初始化菜单行
        this.DeviceEpointSelectEvent(btnTemp, null);
      }
    }
    /// <summary>
    /// 获取按组分配的设备
    /// </summary>
    /// <returns></returns>
    private List<List<CommonDevice>> GetAllDeviceGroup()
    {
      bool hadDevice = false;
      var listDevice = Common.LocalDevice.Current.GetDevicesByMac(deviceObj.DeviceAddr);
      var listRelay = new List<CommonDevice>();
      foreach (var device in listDevice)
      {
        if (device.Type == DeviceType.OnOffSwitch)
        {
          //这个界面不处理干接点
          continue;
        }
        if (this.onlyType == true && device.Type != deviceObj.Type)
        {
          //只要同一种类型的
          continue;
        }
        //获取设备属于【简约多功能面板】
        var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(listDevice);
        if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_SimpleMultifunction)
        {
          if (device.Type == DeviceType.TemperatureSensor && device.DeviceEpoint == 1)
          {
            //简约多功能面板第1回路是一个绑定温湿度传感器第类型,不是真的温湿度的传感器,需要屏蔽掉
            continue;
          }
        }
        listRelay.Add(device);
        if (device.DeviceEpoint == deviceObj.DeviceEpoint)
        {
          //能够匹配得到这个回路
          hadDevice = true;
        }
      }
      //排序
      listRelay.Sort((obj1, obj2) =>
      {
        if (obj1.DeviceEpoint > obj2.DeviceEpoint)
        {
          return 1;
        }
        return -1;
      });
      if (hadDevice == false)
      {
        //如果匹配不到这个回路,则默认第一个
        this.deviceObj = listRelay[0];
      }
      //从下往上4个为一组
      var listIcon = new List<List<CommonDevice>>();
      var listTemp = new List<CommonDevice>();
      for (int i = listRelay.Count - 1; i >= 0; i--)
      {
        listTemp.Insert(0, listRelay[i]);
        if (listTemp.Count == 4)
        {
          listIcon.Insert(0, listTemp);
          listTemp = new List<CommonDevice>();
        }
      }
      if (listTemp.Count > 0)
      {
        listIcon.Insert(0, listTemp);
      }
      return listIcon;
    }
    #endregion
    #region ■ 回路选择___________________________
    /// <summary>
    /// 回路选择事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void DeviceEpointSelectEvent(object sender, MouseEventArgs e)
    {
      var nowContr = (NormalViewControl)sender;
      if (nowSelectControl != null)
      {
        //同一个东西,不鸟他
        if (this.deviceObj.Type != DeviceType.Airer)
        {
          if (nowSelectControl.Name == nowContr.Name)
          {
            return;
          }
        }
        //不选择状态
        nowSelectControl.BorderColor = 0xff979797;
        nowSelectControl.TextSize = 13;
        nowSelectControl.TextColor = UserCenterColor.Current.TextGrayColor3;
        //记录它的名字
        dicDeviceSaveName[nowSelectDevice.DeviceEpoint] = frameDeviceName.Text.Trim();
      }
      //选择状态
      nowContr.BorderColor = 0xfffb744a;
      nowContr.TextSize = 14;
      nowContr.TextColor = UserCenterColor.Current.TextColor1;
      nowSelectControl = nowContr;
      nowSelectDevice = Common.LocalDevice.Current.GetDevice(deviceObj.DeviceAddr, Convert.ToInt32(nowContr.Name.Replace("btn", string.Empty)));
      //重新初始化菜单行
      this.InitMenuRow();
    }
    #endregion
  }
}