xm
2020-12-14 d6fb0646531172f23648441c224cdcccd721b894
ZigbeeApp/Shared/Phone/MainPage/ControlForm/Base/DeviceDetailCardCommonForm.cs
New file
@@ -0,0 +1,437 @@
using Shared.Phone.UserCenter;
using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
namespace Shared.Phone.MainPage.ControlForm
{
  /// <summary>
  /// 主页深度卡片的底层共通
  /// </summary>
  public class DeviceDetailCardCommonForm : EditorCommonForm
  {
    #region ■ 变量声明___________________________
    /// <summary>
    /// 界面关闭事件
    /// </summary>
    public Action<CommonDevice> FormCloseEvent = null;
    /// <summary>
    /// 设备对象
    /// </summary>
    public CommonDevice device = null;
    /// <summary>
    /// 当前选择的房间对象(再次刷新界面时,这个东西有可能是null)
    /// </summary>
    public Common.Room nowSelectRoom = null;
    /// <summary>
    /// 标记它是由哪个控件调起的
    /// </summary>
    public ViewGroup RowOrCardControl = null;
    /// <summary>
    /// 状态控件
    /// </summary>
    private NormalViewControl btnStatu = null;
    /// <summary>
    /// 设备名称控件
    /// </summary>
    private NormalViewControl btnDeviceName = null;
    /// <summary>
    /// 房间名称
    /// </summary>
    private NormalViewControl btnRoomName = null;
    /// <summary>
    /// 是否获取网关反馈的结果  0:没有获取得到  1:已经获取得到
    /// </summary>
    public int ResponeResult = 0;
    /// <summary>
    /// 当前端点的功能类型
    /// </summary>
    private DeviceFunctionType nowDeviceFuncType = DeviceFunctionType.A未定义;
    /// <summary>
    /// 白色背景的宽度
    /// </summary>
    private int backFrameWidth = 0;
    /// <summary>
    /// 白色背景的高度
    /// </summary>
    private int backFrameHeight = 0;
    /// <summary>
    /// 当前的文本
    /// </summary>
    private string CurrentText = string.Empty;
    #endregion
    #region ■ 初始化_____________________________
    /// <summary>
    /// 画面显示(底层会固定调用此方法,借以完成画面创建)
    /// </summary>
    /// <param name="i_device">设备对象</param>
    /// <param name="i_nowSelectRoom">房间</param>
    /// <param name="i_backWidth">白色背景的宽度(非真实值)</param>
    /// <param name="i_backHeight">白色背景的高度(非真实值)</param>
    public void ShowForm(CommonDevice i_device, Common.Room i_nowSelectRoom, int i_backWidth, int i_backHeight)
    {
      this.CurrentText = Language.StringByID(R.MyInternationalizationString.Current) + "  ";
      this.nowSelectRoom = i_nowSelectRoom;
      this.backFrameWidth = i_backWidth;
      this.backFrameHeight = i_backHeight;
      //更多
      var btnMore = new MostRightIconControl(69, 69);
      btnMore.UnSelectedImagePath = "Item/More.png";
      topFrameLayout.AddChidren(btnMore);
      btnMore.InitControl();
      btnMore.ButtonClickEvent += (sender, e) =>
      {
        //获取设备属于【晾衣架】
        var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice> { device });
        if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.Airer)
        {
          var form = new Shared.Phone.UserCenter.Device.DeviceFunctionSettionForm();
          form.AddForm(device, true);
        }
        else
        {
          var detailInfo = new DeviceDetailInfoForm();
          detailInfo.AddForm(device, nowSelectRoom);
        }
      };
      //初始化中部信息
      this.InitMiddleFrame(i_device);
      //添加设备上报事件
      this.AddDeviceReportEvent();
    }
    /// <summary>
    /// 初始化中部信息
    /// </summary>
    /// <param name="i_device">设备对象</param>
    /// <param name="backWidth">白色背景的宽度(非真实值)</param>
    /// <param name="backHeight">白色背景的高度(非真实值)</param>
    private void InitMiddleFrame(CommonDevice i_device)
    {
      this.device = i_device;
      this.nowDeviceFuncType = device.DfunctionType;
      //清空bodyFrame
      this.ClearBodyFrame();
      //白色背景控件
      var frameWhiteBack = new FrameLayout();
      frameWhiteBack.Y = Application.GetRealHeight(115);
      frameWhiteBack.Width = Application.GetRealWidth(this.backFrameWidth);
      frameWhiteBack.Height = Application.GetRealHeight(this.backFrameHeight);
      frameWhiteBack.BackgroundColor = UserCenterColor.Current.White;
      frameWhiteBack.Radius = (uint)Application.GetRealHeight(17);
      frameWhiteBack.Gravity = Gravity.CenterHorizontal;
      bodyFrameLayout.AddChidren(frameWhiteBack);
      //设备名称
      this.btnDeviceName = new NormalViewControl(100, 60, true);
      btnDeviceName.Y = Application.GetRealHeight(46);
      btnDeviceName.TextSize = 15;
      btnDeviceName.IsBold = true;
      btnDeviceName.Text = Common.LocalDevice.Current.GetDeviceEpointName(i_device);
      btnDeviceName.Width = btnDeviceName.GetRealWidthByText();
      btnDeviceName.TextAlignment = TextAlignment.Center;
      btnDeviceName.Gravity = Gravity.CenterHorizontal;
      frameWhiteBack.AddChidren(btnDeviceName);
      //状态
      this.btnStatu = new NormalViewControl(700, 42, true);
      btnStatu.Y = btnDeviceName.Bottom + Application.GetRealHeight(12);
      btnStatu.TextSize = 10;
      btnStatu.TextColor = UserCenterColor.Current.TextGrayColor1;
      btnStatu.TextAlignment = TextAlignment.Center;
      btnStatu.Gravity = Gravity.CenterHorizontal;
      frameWhiteBack.AddChidren(btnStatu);
      //房间的黑色背景
      var frameRoomBlack = new FrameLayout();
      frameRoomBlack.Height = Application.GetRealHeight(138);
      frameRoomBlack.Width = frameWhiteBack.Width;
      frameRoomBlack.BackgroundColor = 0xff232323;
      frameRoomBlack.Radius = (uint)Application.GetRealHeight(17);
      frameRoomBlack.Gravity = Gravity.BottomCenter;
      frameWhiteBack.AddChidren(frameRoomBlack);
      //让上部变直角(因为安卓这里,单独指定左下和右下角圆角的话,圆不了)
      var frameTemp = new FrameLayout();
      frameTemp.Height = Application.GetRealHeight(30);
      frameTemp.Width = frameWhiteBack.Width;
      frameTemp.BackgroundColor = frameRoomBlack.BackgroundColor;
      frameRoomBlack.AddChidren(frameTemp);
      //房间图标
      var btnRoomIcon = new IconViewControl(81);
      btnRoomIcon.X = ControlCommonResourse.XXLeft;
      btnRoomIcon.UnSelectedImagePath = "Item/Room.png";
      btnRoomIcon.Gravity = Gravity.CenterVertical;
      frameRoomBlack.AddChidren(btnRoomIcon);
      //房间名称
      this.btnRoomName = new NormalViewControl(600, 52, true);
      btnRoomName.X = btnRoomIcon.Right + Application.GetRealWidth(12);
      btnRoomName.TextSize = 12;
      btnRoomName.TextColor = UserCenterColor.Current.White;
      btnRoomName.Gravity = Gravity.CenterVertical;
      if (this.nowSelectRoom != null)
      {
        btnRoomName.Text = this.nowSelectRoom.Name;
      }
      else
      {
        //未分配
        btnRoomName.TextID = R.MyInternationalizationString.uDeviceNotAssignedRoom;
      }
      frameRoomBlack.AddChidren(btnRoomName);
      //收藏
      var btnCollect = new IconBigViewControl(69, 69);
      btnCollect.UnSelectedImagePath = "Item/Collection.png";
      btnCollect.SelectedImagePath = "Item/CollectionSelected.png";
      btnCollect.IsSelected = HdlRoomLogic.Current.IsCollectInRoom(i_device);
      frameWhiteBack.AddChidren(btnCollect);
      btnCollect.InitControl();
      btnCollect.X = Application.GetRealWidth(850) - btnCollect.XOffset;
      btnCollect.Y = Application.GetRealHeight(35) - btnCollect.YOffset;
      btnCollect.ButtonClickEvent += (sender, e) =>
      {
        //状态取反
        btnCollect.IsSelected = !btnCollect.IsSelected;
        if (btnCollect.IsSelected == false)
        {
          //取消收藏
          HdlRoomLogic.Current.DeleteLoveDevice(i_device);
        }
        else
        {
          //添加收藏
          HdlRoomLogic.Current.AddLoveDevice(i_device);
        }
      };
      //底层初始化中部控件完成之后,调用各自界面的初始化函数
      this.InitMiddleFrameAfter(frameWhiteBack);
    }
    /// <summary>
    /// 底层初始化中部控件完成之后
    /// </summary>
    /// <param name="frameWhiteBack">白色背景控件</param>
    public virtual void InitMiddleFrameAfter(FrameLayout frameWhiteBack)
    {
    }
    #endregion
    #region ■ 是否获取网关反馈的结果_____________
    /// <summary>
    /// 检测是否获取网关反馈的结果,如果网关没有回复,则会弹出消息
    /// </summary>
    /// <param name="listControl">需要限制不能点击的控件(超时时,它会还原Select状态)</param>
    /// <param name="lastAction">函数运行完成后的回调函数。参数false:没有等到网关回复 true:接收到了网关回复</param>
    public void StartCheckResponeResult(List<ButtonBase> listControl, Action<bool> lastAction = null)
    {
      this.ResponeResult = 0;
      //先让指定控件不能点击
      foreach (var myContr in listControl)
      {
        myContr.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;
            if (this.RowOrCardControl != null)
            {
              this.RowOrCardControl.GetType().InvokeMember("SendStatuComand", System.Reflection.BindingFlags.InvokeMethod, null, this.RowOrCardControl, null);
            }
          }
        }
        if (waitime <= 0 && this.Parent != null)
        {
          //没有获取得到结果
          HdlThreadLogic.Current.RunMain(() =>
          {
            var msgContr = new ShowMsgControl(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.FAIL));
            msgContr.Show();
          });
        }
        //开关按钮可以再点击
        foreach (var myContr in listControl)
        {
          myContr.CanClick = true;
        }
        //函数运行完成的回调函数
        lastAction?.Invoke(this.ResponeResult == 1);
        lastAction = null;
      });
    }
    /// <summary>
    /// 检测网关的反馈结果(属性上报的对象:device.DeviceStatusReport)
    /// </summary>
    /// <param name="comandDiv">命令区分</param>
    /// <param name="report">上报数据</param>
    public virtual bool CheckResponeResultStatu(ReceiveComandDiv comandDiv, CommonDevice report)
    {
      return false;
    }
    /// <summary>
    /// 添加设备上报事件
    /// </summary>
    private void AddDeviceReportEvent()
    {
      string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(this.device);
      //属性上报
      HdlGatewayReceiveLogic.Current.AddAttributeEvent("DeviceDetailCardAttribute" + mainKeys, ReceiveComandDiv.A设备属性上报, (report) =>
      {
        string mainKey2 = Common.LocalDevice.Current.GetDeviceMainKeys(report);
        if (this.device.Type == DeviceType.Airer && this.device.DeviceAddr == report.DeviceAddr)
        {
          //晾衣架特殊:5个回路代表不同的功能,但是默认本地只显示了第一个回路
          //所以条件特殊判断
          //检测结果
          if (this.CheckResponeResultStatu(ReceiveComandDiv.A设备属性上报, report) == true)
          {
            //结果已经接收到
            this.ResponeResult = 1;
          }
        }
        else
        {
          if (mainKeys != mainKey2)
          {
            //不是同一个东西
            return;
          }
          //检测结果
          if (this.CheckResponeResultStatu(ReceiveComandDiv.A设备属性上报, report) == true)
          {
            //结果已经接收到
            this.ResponeResult = 1;
          }
        }
      });
    }
    #endregion
    #region ■ 界面重新激活事件___________________
    /// <summary>
    /// 自身的上层界面关闭后,它自身处于最上层时,触发的事件
    /// </summary>
    public override int FormActionAgainEvent()
    {
      //如果不是喜爱房间的话,它的房间有可能被切换了
      if (this.nowSelectRoom == null || this.nowSelectRoom.IsLove == false)
      {
        this.nowSelectRoom = HdlRoomLogic.Current.GetRoomByDevice(this.device);
      }
      //如果功能类型变更了
      if (this.nowDeviceFuncType != this.device.DfunctionType)
      {
        //重新刷新界面,初始化中部信息
        this.InitMiddleFrame(this.device);
      }
      else
      {
        //刷新名字
        this.btnDeviceName.Text = Common.LocalDevice.Current.GetDeviceEpointName(this.device);
        btnDeviceName.Width = btnDeviceName.GetRealWidthByText();
        btnDeviceName.Gravity = Gravity.CenterHorizontal;
        if (this.nowSelectRoom == null)
        {
          //未分配
          this.btnRoomName.TextID = R.MyInternationalizationString.uDeviceNotAssignedRoom;
        }
        else
        {
          this.btnRoomName.Text = this.nowSelectRoom.Name;
        }
      }
      return 1;
    }
    #endregion
    #region ■ 界面关闭___________________________
    /// <summary>
    /// 界面关闭
    /// </summary>
    public override void CloseFormBefore()
    {
      string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(this.device);
      HdlGatewayReceiveLogic.Current.RemoveEvent("DeviceDetailCardAttribute" + mainKeys);
      //回调函数
      this.FormCloseEvent?.Invoke(this.device);
      this.FormCloseEvent = null;
      base.CloseFormBefore();
    }
    #endregion
    #region ■ 一般方法___________________________
    /// <summary>
    /// 设置状态文本(不需要指定【当前两个字】)
    /// </summary>
    /// <param name="text"></param>
    public void SetStatuText(string text)
    {
      this.btnStatu.Text = this.CurrentText + text;
    }
    /// <summary>
    /// 设置PM2.5传感器状态文本(不需要指定【当前两个字】)
    /// </summary>
    /// <param name="text"></param>
    public void SetPmTwoPointFiveStatuText(string text)
    {
      this.btnStatu.Text = text;
    }
    /// <summary>
    /// 重新设置设备名字控件和状态控件的Y轴
    /// </summary>
    /// <param name="i_NameY">设备名字控件的Y轴(真实值)</param>
    /// <param name="i_StatuY">状态控件的Y轴(真实值)</param>
    public void ResetDeviceNameAndStatuPoint(int i_NameY, int i_StatuY)
    {
      btnDeviceName.Y = i_NameY;
      btnStatu.Y = i_StatuY;
    }
    #endregion
  }
}