HDL Home App 第二版本 旧平台金堂用 正在使用
黄学彪
2019-11-04 c7698e163e43cea9e7f8ee45f8e3f91c9265cca4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
using Shared.Common;
using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
 
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 设备属性上报的逻辑类
    /// </summary>
    public class HdlDeviceAttributeLogic : ZigBee.Common.IStatus
    {
        #region ■ 变量声明___________________________
 
        /// <summary>
        /// 属性上报的逻辑
        /// </summary>
        private static HdlDeviceAttributeLogic m_Current = null;
        /// <summary>
        /// 属性上报的逻辑
        /// </summary>
        public static HdlDeviceAttributeLogic Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HdlDeviceAttributeLogic();
                }
                return m_Current;
            }
            set
            {
                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
    }
}