黄学彪
2019-11-25 160785587667cc0d927f85e44c139ec9dde13a9e
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs
@@ -7,18 +7,18 @@
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 设备属性上报的逻辑类
    /// 设备属性的逻辑类
    /// </summary>
    public class HdlDeviceAttributeLogic : ZigBee.Common.IStatus
    public class HdlDeviceAttributeLogic
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 属性上报的逻辑
        /// 属性的逻辑
        /// </summary>
        private static HdlDeviceAttributeLogic m_Current = null;
        /// <summary>
        /// 属性上报的逻辑
        /// 属性的逻辑
        /// </summary>
        public static HdlDeviceAttributeLogic Current
        {
@@ -34,172 +34,6 @@
            {
                m_Current = value;
            }
        }
        /// <summary>
        /// 事件集合
        /// </summary>
        private Dictionary<string, Action<CommonDevice>> dicEvent = new Dictionary<string, Action<CommonDevice>>();
        /// <summary>
        /// 命令区分
        /// </summary>
        private Dictionary<string, string> dicCommandDiv = new Dictionary<string, string>();
        #endregion
        #region ■ 添加事件___________________________
        /// <summary>
        /// 添加获取设备属性的事件(推送已经强制指定运行于主线程,属性上报的对象:device.DeviceStatusReport)
        /// </summary>
        /// <param name="mainKeys">标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况)</param>
        /// <param name="comand">命令区分,比如:DeviceStatusReport,IASInfoReport等等</param>
        /// <param name="action">当接收到网关回复之后的回调函数,属性上报的对象:device.DeviceStatusReport</param>
        public void AddAttributeEvent(string mainKeys, string comand, Action<CommonDevice> action)
        {
            lock (this.dicEvent)
            {
                if (this.dicEvent.Count == 0)
                {
                    ZbGateway.StatusList.Add(this);
                }
                this.dicEvent[mainKeys] = action;
                this.dicCommandDiv[mainKeys] = comand;
            }
        }
        #endregion
        #region ■ 移除监听___________________________
        /// <summary>
        /// 移除事件
        /// </summary>
        /// <param name="mainKeys">标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况)</param>
        public void RemoveEvent(string mainKeys)
        {
            lock (this.dicEvent)
            {
                if (this.dicEvent.ContainsKey(mainKeys) == true)
                {
                    var action = this.dicEvent[mainKeys];
                    this.dicEvent.Remove(mainKeys);
                    this.dicCommandDiv.Remove(mainKeys);
                    action = null;
                }
                if (this.dicEvent.Count == 0)
                {
                    ZbGateway.StatusList.Remove(this);
                }
            }
        }
        /// <summary>
        /// 移除全部的事件
        /// </summary>
        public void RemoveAllEvent()
        {
            lock (this.dicEvent)
            {
                var list = new HashSet<string>();
                foreach (var keys in this.dicEvent.Keys)
                {
                    list.Add(keys);
                }
                foreach (var keys in list)
                {
                    //需要慢慢一个一个的释放Action,听说
                    this.RemoveEvent(keys);
                }
            }
        }
        #endregion
        #region ■ 实现接口___________________________
        /// <summary>
        /// 设备状态通知
        /// </summary>
        /// <param name="common"></param>
        /// <param name="typeTag"></param>
        public void DeviceInfoChange(CommonDevice common, string typeTag)
        {
            if (common == null || string.IsNullOrEmpty(common.DeviceAddr) == true)
            {
                //我也不知道这有没有可能
                return;
            }
            lock (this.dicEvent)
            {
                var list = new List<Action<CommonDevice>>();
                foreach (string keys in this.dicEvent.Keys)
                {
                    if (this.dicCommandDiv[keys] != typeTag)
                    {
                        //命令区分不一致,则不调用回调函数
                        continue;
                    }
                    //命令区分一致时,则调用回调函数
                    list.Add(this.dicEvent[keys]);
                }
                //有可能在回调函数中移除了事件,导致报错,所以先收集,再调用
                Application.RunOnMainThread(() =>
                {
                    foreach (var action in list)
                    {
                        try
                        {
                            action?.Invoke(common);
                        }
                        catch (Exception ex)
                        {
                            //Log出力
                            string msg = "当前激活的界面[" + UserCenterResourse.NowActionFormID + "]";
                            HdlLogLogic.Current.WriteLog(-1, msg);
                            HdlLogLogic.Current.WriteLog(ex);
                        }
                    }
                });
            }
        }
        /// <summary>
        /// 不使用
        /// </summary>
        /// <param name="common"></param>
        public void Changed(CommonDevice common)
        {
        }
        /// <summary>
        /// 不使用
        /// </summary>
        public void ChangedILogicStatus(ZigBee.Device.Logic logic)
        {
        }
        /// <summary>
        /// 不使用
        /// </summary>
        public void ChangedISceneStatus(Scene scene)
        {
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 是否存在指定的事件
        /// </summary>
        /// <param name="mainkeys"></param>
        /// <returns></returns>
        public bool IsEsixt(string mainkeys)
        {
            return this.dicCommandDiv.ContainsKey(mainkeys);
        }
        #endregion