黄学彪
2019-11-07 82a773d1783549caca563831aac8affc059deedf
ZigbeeApp/Shared/Phone/Device/Light/OnOffControl.cs
@@ -1,13 +1,639 @@
using System;
using System.Collections.Generic;
using Shared.Common;
using Shared.Phone.Device.CommonForm;
using Shared.Phone.UserView;
using ZigBee.Device;
namespace Shared.Phone.Device.Light
{
    /// <summary>
    /// 开关
    /// </summary>
    public class OnOffControl
    public class OnOffControl:FrameLayout, ZigBee.Common.IStatus
    {
        #region ◆ 变量__________________________
        /// <summary>
        /// 开关
        /// </summary>
        private Button switchBtn;
        /// <summary>
        /// The action.
        /// </summary>
        public Action action;
        /// <summary>
        /// The light image.
        /// </summary>
        private Button deviceIMG;
        /// <summary>
        /// 收藏按钮
        /// </summary>
        private Button collectionBtn;
        /// <summary>
        /// 传过来的设备
        /// </summary>
        private DeviceUI device;
        /// <summary>
        /// 传过来的房间
        /// </summary>
        private Shared.Common.Room room;
        /// <summary>
        /// 房间
        /// </summary>
        private Button roomBtn;
        /// <summary>
        /// 房间名
        /// </summary>
        private Button roomName;
        /// <summary>
        /// 网关
        /// </summary>
        private ZbGateway zbGateway = null;
        /// <summary>
        /// 是否发送控制命令成功了
        /// </summary>
        private bool sendedControlCommand = false;
        /// <summary>
        /// bodyFrameLayout
        /// </summary>
        private FrameLayout bodyFrameLayout;
        private Button StatuBtn;
        /// <summary>
        /// OnBtn
        /// </summary>
        private Button OnBtn;
        /// <summary>
        /// OffBtn
        /// </summary>
        private Button OffBtn;
        #endregion
        #region ◆ 接口__________________________
        /// <summary>
        /// 处理变化事件 --将弃用 改用DeviceInfoChange()
        /// </summary>
        /// <returns>The changed.</returns>
        /// <param name="common">Common.</param>
        public void Changed(CommonDevice common)
        {
        }
        /// <summary>
        /// Changeds the IL ogic status.
        /// </summary>
        /// <param name="logic">Logic.</param>
        public void ChangedILogicStatus(ZigBee.Device.Logic logic)
        {
            //throw new NotImplementedException();
        }
        /// <summary>
        /// Changeds the IS cene status.
        /// </summary>
        /// <param name="scene">Scene.</param>
        public void ChangedISceneStatus(Scene scene)
        {
            //throw new NotImplementedException();
        }
        /// <summary>
        /// 设备状态更新接口
        /// <para>type:如果为 DeviceInComingRespon:设备新上报</para>
        /// <para>type:如果为 IASInfoReport:RemoveDeviceRespon</para>
        /// <para>type:如果为 DeviceStatusReport:设备上报</para>
        /// <para>type:如果为 IASInfoReport:IAS安防信息上报</para>
        /// <para>type:如果为 OnlineStatusChange: 设备在线状态更新</para>
        /// </summary>
        /// <param name="common">Common.</param>
        /// <param name="typeTag">Type tag.</param>
        public void DeviceInfoChange(CommonDevice common, string typeTag)
        {
            if (typeTag == "DeviceStatusReport")
            {
                Application.RunOnMainThread(() =>
                {
                    try
                    {
                        var deviceUI = device;
                        //设备为空
                        if (deviceUI.CommonDevice == null)
                        {
                            return;
                        }
                        //是否为当前设备
                        if (deviceUI.CommonDevice.DeviceEpoint != common.DeviceEpoint || deviceUI.CommonDevice.DeviceAddr != common.DeviceAddr)
                        {
                            return;
                        }
                        if (deviceUI.CommonDevice.Type == DeviceType.OnOffOutput)
                        {
                            if (common.DeviceStatusReport.CluterID == 6)
                            {
                                var light = deviceUI.CommonDevice as ToggleLight;
                                light.DeviceStatusReport = common.DeviceStatusReport;
                                //记录、更新状态
                                if (light.DeviceStatusReport.AttriBute == null || light.DeviceStatusReport.AttriBute.Count == 0)
                                {
                                    return;
                                }
                                light.OnOffStatus = light.DeviceStatusReport.AttriBute[0].AttriButeData;
                                SetONOFFStatu(light.OnOffStatus == 1);
                                StatuBtn.Text = CommonFormResouce.GetSwitchStatu(light.OnOffStatus == 1);
                                light.LastDateTime = DateTime.Now;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        System.Console.WriteLine($"Error:{ex.Message}");
                    }
                });
            }
            else if (typeTag == "OnlineStatusChange")
            {
                Application.RunOnMainThread(() =>
                {
                    try
                    {
                        var deviceUI = device;
                        //设备为空
                        if (deviceUI.CommonDevice == null)
                        {
                            return;
                        }
                        //是否为当前设备
                        if (deviceUI.CommonDevice.DeviceEpoint != common.DeviceEpoint || deviceUI.CommonDevice.DeviceAddr != common.DeviceAddr)
                        {
                            return;
                        }
                        deviceUI.CommonDevice.IsOnline = common.IsOnline;
                        OnBtn.IsSelected = OffBtn.IsSelected= deviceUI.CommonDevice.IsOnline == 1;
                        deviceUI.CommonDevice.LastDateTime = DateTime.Now;
                    }
                    catch (Exception ex)
                    {
                        System.Console.WriteLine($"Error:{ex.Message}");
                    }
                });
            }
        }
        #endregion
        #region ◆ 初始化_____________________
        /// <summary>
        /// 重写移除方法
        /// </summary>
        public override void RemoveFromParent()
        {
            ZbGateway.StatusList.Remove(this);
            //action();
            //action = null;
            RemoveUpdateControlDeviceStatuAction();
            base.RemoveFromParent();
        }
        /// <summary>
        /// 构造方法
        /// </summary>
        public OnOffControl()
        {
            BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor;
            ZbGateway.StatusList.Add(this);
        }
        /// <summary>
        /// 显示界面
        /// </summary>
        /// <param name="dev">Device.</param>
        /// <param name="room">Room.</param>
        public void Show(DeviceUI dev, Shared.Common.Room room)
        {
            device = dev;
            zbGateway = this.device.CommonDevice.Gateway;
            this.room = room;
            AddTop();
            AddBodyView(device);
            var light = dev.CommonDevice as ToggleLight;
            //补上非远程
            if (light.Gateway == null)
            {
                return;
            }
            if (light.Gateway.IsVirtual)
            {
                UserHomeView.ReadStatus(light, () =>
                {
                    light.ReadOnOffStatus();
                    light.ReadAttri(Cluster_ID.Identify, AttriButeId.Switch);
                });
            }
            else
            {
                //防止短时间内多次读取状态
                if (CommonPage.ReadDeviceStatuSpan < (DateTime.Now - light.LastDateTime).TotalSeconds)
                {
                    light.ReadAttri(Cluster_ID.Identify, AttriButeId.Switch);
                    light.ReadOnOffStatus();
                }
            }
            var de = Shared.Common.Room.LoveRoomDeviceUIFilePathList.Find((obj) => obj == device.FileName);
            if (de == null)
            {
                collectionBtn.IsSelected = false;
            }
            else
            {
                collectionBtn.IsSelected = true;
            }
            BindEvent();
        }
        #endregion
        #region ◆ Add______________________________
        /// <summary>
        /// AddTop
        /// </summary>
        public void AddTop()
        {
            var top = new TopFrameLayout();
            AddChidren(top);
            top.InitTopview();
            top.backButton.MouseUpEventHandler += (sender, e) =>
            {
                RemoveFromParent();
            };
            var sharedBtn = new Button
            {
                X = Application.GetRealWidth(850),
                Width = Application.GetMinReal(69),
                Height = Application.GetMinReal(69),
                Gravity = Gravity.CenterVertical,
                UnSelectedImagePath = "Item/Shared.png"
            };
            top.topView.AddChidren(sharedBtn);
            var moreBtn = new Button
            {
                X = Application.GetRealWidth(953),
                Width = Application.GetMinReal(69),
                Height = Application.GetMinReal(69),
                Gravity = Gravity.CenterVertical,
                UnSelectedImagePath = "Item/More.png"
            };
            top.topView.AddChidren(moreBtn);
            moreBtn.MouseUpEventHandler += More;
        }
        /// <summary>
        /// AddBodyView
        /// </summary>
        public void AddBodyView(DeviceUI device)
        {
            bodyFrameLayout = new FrameLayout()
            {
                Y = Application.GetRealHeight(184),
                Height = Application.GetRealHeight(1737),
                BackgroundColor = ZigbeeColor.Current.GXCGrayBackgroundColor,
            };
            AddChidren(bodyFrameLayout);
            var itemView = new FrameLayout()
            {
                Y = Application.GetRealHeight(115),
                Width = Application.GetRealWidth(965),
                Height = Application.GetRealHeight(1316),
                Radius = (uint)Application.GetRealHeight(CommonFormResouce.BigFormRadius),
                Gravity = Gravity.CenterHorizontal,
                BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor
            };
            bodyFrameLayout.AddChidren(itemView);
            collectionBtn = new Button()
            {
                X = Application.GetRealWidth(850),
                Y = Application.GetRealHeight(46),
                Width = Application.GetMinReal(69),
                Height = Application.GetMinReal(69),
                UnSelectedImagePath = "Item/Collection.png",
                SelectedImagePath = "Item/CollectionSelected.png"
            };
            itemView.AddChidren(collectionBtn);
            var deviceNameBtn = new Button()
            {
                Y = Application.GetRealHeight(46),
                Width = Application.GetRealWidth(500),
                Height = Application.GetRealHeight(60),
                Gravity = Gravity.CenterHorizontal,
                Text = device.CommonDevice.DeviceEpointName,
                TextColor = ZigbeeColor.Current.GXCTextBlackColor,
                TextSize = 15
            };
            itemView.AddChidren(deviceNameBtn);
            StatuBtn = new Button
            {
                Y = Application.GetRealHeight(118),
                Width = Application.GetRealWidth(600),
                Height = Application.GetRealHeight(60),
                Gravity = Gravity.CenterHorizontal,
                TextColor = ZigbeeColor.Current.GXCTextGrayColor,
                Text = CommonFormResouce.GetSwitchStatu(device.CommonDevice.IsOnline == 1)
            };
            itemView.AddChidren(StatuBtn);
            deviceIMG = new Button()
            {
                Y = Application.GetRealHeight(340),
                Width = Application.GetMinRealAverage(579),
                Height = Application.GetMinRealAverage(579),
                Gravity = Gravity.CenterHorizontal,
                UnSelectedImagePath = "Light/OnOff.png",
            };
            itemView.AddChidren(deviceIMG);
            OffBtn = new Button
            {
                X = Application.GetRealWidth(294),
                Y = Application.GetRealHeight(588),
                Width = Application.GetMinRealAverage(81),
                Height = Application.GetMinRealAverage(81),
                UnSelectedImagePath = "Light/OFF.png",
                SelectedImagePath = "Light/OFFSelected.png",
                IsSelected = (device.CommonDevice as ToggleLight).OnOffStatus == 0
            };
            itemView.AddChidren(OffBtn);
            OnBtn = new Button
            {
                X = Application.GetRealWidth(590),
                Y = Application.GetRealHeight(588),
                Width = Application.GetMinRealAverage(81),
                Height = Application.GetMinRealAverage(81),
                UnSelectedImagePath = "Light/ON.png",
                SelectedImagePath = "Light/ONSelected.png",
                IsSelected = (device.CommonDevice as ToggleLight).OnOffStatus == 1
            };
            itemView.AddChidren(OnBtn);
            var roomBG = new Button
            {
                Y = Application.GetRealHeight(1178 - 50),
                Height = Application.GetRealHeight(138 + 50),
                BackgroundColor = ZigbeeColor.Current.GXCBlackBackgroundColor,
                Radius = (uint)Application.GetRealHeight(CommonFormResouce.BigFormRadius)
            };
            itemView.AddChidren(roomBG);
            var roomBG2 = new Button
            {
                Y = Application.GetRealHeight(1178 - 50),
                Height = Application.GetRealHeight(50),
                BackgroundColor = ZigbeeColor.Current.GXCBackgroundColor,
            };
            itemView.AddChidren(roomBG2);
            roomBtn = new Button()
            {
                X = Application.GetRealWidth(CommonFormResouce.X_Left),
                Y = Application.GetRealHeight(1207),
                Width = Application.GetMinReal(80),
                Height = Application.GetMinReal(80),
                UnSelectedImagePath = "Item/Room.png"
            };
            itemView.AddChidren(roomBtn);
            roomName = new Button()
            {
                X = Application.GetRealWidth(150),
                Y = Application.GetRealHeight(1224),
                Width = Application.GetRealWidth(400),
                Height = Application.GetRealHeight(50),
                Text = room.Name,
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = ZigbeeColor.Current.GXCTextWhiteColor
            };
            itemView.AddChidren(roomName);
        }
        #endregion
        #region ◆ 绑定按钮_______________________
        /// <summary>
        /// 绑定按钮的事件
        /// </summary>
        private void BindEvent()
        {
            OnBtn.MouseUpEventHandler += ON;
            OffBtn.MouseUpEventHandler += OFF;
            collectionBtn.MouseUpEventHandler += Collection;
        }
        #endregion
        #region ◆ 开关__________________________
        /// <summary>
        /// 开关设置
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="eventArgs">Event arguments.</param>
        //private void Switch(object sender, MouseEventArgs eventArgs)
        //{
        //    sendedControlCommand = false;
        //    zbGateway.ReportAction += UpdateDeviceControllStatu;
        //    switchBtn.IsSelected = !switchBtn.IsSelected;
        //    deviceIMG.IsSelected = !deviceIMG.IsSelected;
        //    StatuBtn.Text = CommonFormResouce.GetSwitchStatu(deviceIMG.IsSelected);
        //    if (switchBtn.IsSelected == true)
        //    {
        //        (device.CommonDevice as ToggleLight).SwitchControl(1);
        //    }
        //    else
        //    {
        //        (device.CommonDevice as ToggleLight).SwitchControl(0);
        //    }
        //    //控制延时回调
        //    DeviceUI.SendCommandDelayAction(device.CommonDevice, () =>
        //    {
        //        if (Parent == null)
        //        {
        //            return;
        //        }
        //        RemoveUpdateControlDeviceStatuAction();
        //        if (sendedControlCommand == false)
        //        {
        //            DeviceUI.ShowStatuTip(R.MyInternationalizationString.FAIL);
        //        }
        //    });
        //}
        /// <summary>
        /// ON
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void ON(object sender, MouseEventArgs eventArgs)
        {
            SetONOFFStatu(true);
            (device.CommonDevice as ToggleLight).SwitchControl(1);
            //控制延时回调
            zbGateway.ReportAction += UpdateDeviceControllStatu;
            DeviceUI.SendCommandDelayAction(device.CommonDevice, () =>
            {
                if (Parent == null)
                {
                    return;
                }
                RemoveUpdateControlDeviceStatuAction();
                if (sendedControlCommand == false)
                {
                    DeviceUI.ShowStatuTip(R.MyInternationalizationString.FAIL);
                }
            });
        }
        /// <summary>
        /// OFF
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void OFF(object sender, MouseEventArgs eventArgs)
        {
            SetONOFFStatu(false);
            (device.CommonDevice as ToggleLight).SwitchControl(0);
            //控制延时回调
            zbGateway.ReportAction += UpdateDeviceControllStatu;
            DeviceUI.SendCommandDelayAction(device.CommonDevice, () =>
            {
                if (Parent == null)
                {
                    return;
                }
                RemoveUpdateControlDeviceStatuAction();
                if (sendedControlCommand == false)
                {
                    DeviceUI.ShowStatuTip(R.MyInternationalizationString.FAIL);
                }
            });
        }
        /// <summary>
        /// SetONOFFStatu
        /// </summary>
        /// <param name="statu"></param>
        private void SetONOFFStatu(bool statu)
        {
            if (statu)
            {
                OnBtn.IsSelected = true;
                OffBtn.IsSelected = false;
            }
            else
            {
                OnBtn.IsSelected = false;
                OffBtn.IsSelected = true;
            }
        }
        #endregion
        #region ◆ 设置__________________________
        /// <summary>
        /// 更多设置
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="e">E.</param>
        private void More(object sender, MouseEventArgs e)
        {
            var detailInfo = new Device.CommonForm.DeviceDetailInfo { };
            UserView.HomePage.Instance.AddChidren(detailInfo);
            UserView.HomePage.Instance.PageIndex += 1;
            detailInfo.Show(device, room);
            detailInfo.action = () =>
            {
                Show(device, room);
            };
        }
        #endregion
        #region ◆ 收藏__________________________
        /// <summary>
        /// 收藏到主页
        /// </summary>
        /// <param name="sender">Sender.</param>
        /// <param name="e">E.</param>
        private void Collection(object sender, MouseEventArgs e)
        {
            //collection
            if ((sender as Button).IsSelected)
            {
                Shared.Common.Room.CurrentRoom.GetLoveRoom().DeleteDevice(device.FileName);
                (sender as Button).IsSelected = false;
            }
            else
            {
                Shared.Common.Room.CurrentRoom.GetLoveRoom().AddDevice(device.FileName);
                (sender as Button).IsSelected = true;
            }
        }
        #endregion
        #region ◆ 设备控制状态_____________________
        /// <summary>
        /// 显示设备控制状态
        /// </summary>
        /// <param name="command">Command.</param>
        /// <param name="objValue">Object value.</param>
        private void UpdateDeviceControllStatu(string command, object objValue)
        {
            if (Parent == null)
            {
                return;
            }
            if (command != "DeviceDefaultAck" || objValue == null)
            {
                return;
            }
            var tempDevice = (CommonDevice)objValue;
            if (tempDevice.DeviceEpoint != this.device.CommonDevice.DeviceEpoint || tempDevice.DeviceAddr != this.device.CommonDevice.DeviceAddr)
            {
                //不是当前设备的推送,则不处理
                return;
            }
            //标记已经发送控制命令到网关
            sendedControlCommand = true;
            //DeviceUI.ShowStatuTip(R.MyInternationalizationString.Success);
        }
        /// <summary>
        /// 移除更新控制设备的action
        /// </summary>
        private void RemoveUpdateControlDeviceStatuAction()
        {
            //移除action
            if (zbGateway != null)
            {
                zbGateway.ReportAction -= UpdateDeviceControllStatu;
            }
        }
        #endregion
    }
}