xm
2020-04-16 6fa9d69da922c8049f5acfcbb9ce9fd26811024c
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePanelLogic.cs
@@ -205,6 +205,87 @@
        #endregion
        #region ■ 接近感应___________________________
        /// <summary>
        /// 获取接近感应配置(ui叫接近感应,使用返回值的panelProximitySensorInfo)
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <returns></returns>
        public async Task<Panel.PanelProximitySensorInfo> GetDeviceProximitySensorsSettion(CommonDevice device)
        {
            //借用它的函数
            var panel = new Panel();
            panel.DeviceAddr = device.DeviceAddr;
            panel.DeviceEpoint = device.DeviceEpoint;
            panel.CurrentGateWayId = device.CurrentGateWayId;
            var result = await panel.GetProximitySensorAsync();
            panel = null;
            //共通错误检测
            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
            if (error != null)
            {
                this.ShowErrorMsg(error);
                return null;
            }
            if (result == null || result.panelProximitySensorInfo == null || string.IsNullOrEmpty(result.errorMessageBase) == false)
            {
                //获取接近感应信息失败
                string msg = Language.StringByID(R.MyInternationalizationString.GetPanelProximityFail);
                this.ShowErrorMsg(msg);
                return null;
            }
            return result.panelProximitySensorInfo;
        }
        /// <summary>
        /// 配置接近传感
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <para>sensorEnable:传感器使能</para>
        /// <returns></returns>
        public async Task<bool> SetProximitySensorStatus(CommonDevice device, bool sensorEnable)
        {
            //借用它的函数
            var panel = new Panel();
            panel.DeviceAddr = device.DeviceAddr;
            panel.DeviceEpoint = device.DeviceEpoint;
            panel.CurrentGateWayId = device.CurrentGateWayId;
            var result = await panel.SetProximitySensor(sensorEnable);
            panel = null;
            //共通错误检测
            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
            if (error != null)
            {
                this.ShowErrorMsg(error);
                return false;
            }
            if (result == null || result.responseData == null)
            {
                //接近传感配置失败
                string msg = Language.StringByID(R.MyInternationalizationString.SetPannelProximityFail);
                //拼接上【网关回复超时】的Msg
                msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
                this.ShowTipMsg(msg);
                return false;
            }
            // 备份设备
            var backData = new Newtonsoft.Json.Linq.JObject
            {
                { "sensorEnable",sensorEnable }
            };
            //备份设备
            await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(device, GatewayBackupEnum.A面板接近感应功能, backData);
            return true;
        }
        #endregion
        #region ■ 节能模式___________________________
        /// <summary>
        /// 获取设备节能模式的配置状态(ui叫节能模式)
@@ -479,12 +560,12 @@
        #region ■ 修改干接点私有属性_________________
        /// <summary>
        /// 修改干接点私有属性
        /// 修改干接点第三级别的私有属性
        /// </summary>
        /// <param name="panel">干接点对象</param>
        /// <param name="i_value">干接点的第三级别属性的值,具体请参照第三级别属性</param>
        /// <returns></returns>
        public async Task<bool> EditorDryContactFunction(Panel panel, int i_value)
        public async Task<bool> EditorDryContactThirdFunction(Panel panel, int i_value)
        {
            var result = await panel.ConfigureHdlKeyValueAsync((Panel.KeyMode)i_value);
            //共通错误检测
@@ -537,13 +618,208 @@
                return false;
            }
            //备份设备
            await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(panel, GatewayBackupEnum.A干接点私有属性, i_value);
            await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(panel, GatewayBackupEnum.A干接点第三级别私有属性, i_value);
            return true;
        }
        #endregion
        #region ■ 简约面板震动功能___________________
        /// <summary>
        /// 获取简约面板震动功能的信息(null表示出错)
        /// </summary>
        /// <param name="device">某一回路</param>
        /// <returns></returns>
        public VibrationInfo GetPanelVibrationData(CommonDevice device)
        {
            var returnData = new VibrationInfo();
            var gateway = device.Gateway;
            if (gateway == null)
            {
                //错误:网关对象丢失
                this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
                return null;
            }
            string checkTopic = HdlGatewayLogic.Current.GetGatewayId(gateway) + "/" + "ZbDataPassthrough";
            bool canBreak = false;
            Action<string, string> action = (topic, message) =>
            {
                if (topic == checkTopic)
                {
                    try
                    {
                        var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                        string PassData = jobject["Data"]["PassData"].ToString();
                        if (PassData.Length != 18)
                        {
                            return;
                        }
                        string mytopic = PassData[4].ToString() + PassData[5].ToString() + PassData[2].ToString() + PassData[3].ToString();
                        if (mytopic != "0802")
                        {
                            return;
                        }
                        returnData.A震动使能 = PassData.Substring(10, 2) == "01" ? true : false;
                        returnData.A震动强度 = Convert.ToInt32(PassData.Substring(12, 2), 16);
                        returnData.A震动时间 = Convert.ToInt32(PassData.Substring(14, 4), 16);
                        canBreak = true;
                    }
                    catch { }
                }
            };
            gateway.Actions += action;
            try
            {
                var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                var data = new Newtonsoft.Json.Linq.JObject { { "PassData", "050108110101" } };
                jObject.Add("Data", data);
                gateway.Send(("ClientDataPassthrough"), jObject.ToString());
            }
            catch { }
            int TimeOut = 0;
            while (canBreak == false && TimeOut < 60)
            {
                System.Threading.Thread.Sleep(100);
                TimeOut++;
            }
            gateway.Actions -= action;
            if (TimeOut >= 60)
            {
                //获取震动反馈配置信息失败
                string errorMsg = Language.StringByID(R.MyInternationalizationString.uGetVibrationFeedbackSettionFail);
                errorMsg = UserCenterLogic.CombineGatewayTimeOutMsg(errorMsg, null, "回复超时", false);
                this.ShowTipMsg(errorMsg);
                return null;
            }
            return returnData;
        }
        /// <summary>
        /// 设置简约面板震动功能的信息
        /// </summary>
        /// <param name="device">某一回路</param>
        /// <param name="datainfo">设置的信息</param>
        /// <returns></returns>
        public bool SetPanelVibrationData(CommonDevice device, VibrationInfo datainfo)
        {
            var gateway = device.Gateway;
            if (gateway == null)
            {
                //错误:网关对象丢失
                this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
                return false;
            }
            string checkTopic = HdlGatewayLogic.Current.GetGatewayId(gateway) + "/" + "ZbDataPassthrough";
            bool canBreak = false;
            bool success = false;
            Action<string, string> action = (topic, message) =>
            {
                if (topic == checkTopic)
                {
                    try
                    {
                        var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                        if (jobject["DeviceAddr"].ToString() != device.DeviceAddr)
                        {
                            //不是同一个东西
                            return;
                        }
                        string PassData = jobject["Data"]["PassData"].ToString();
                        if (PassData.Length != 16)
                        {
                            return;
                        }
                        string mytopic = PassData[4].ToString() + PassData[5].ToString() + PassData[2].ToString() + PassData[3].ToString();
                        if (mytopic != "0002")
                        {
                            return;
                        }
                        int command = Convert.ToInt32(PassData[10].ToString() + PassData[11].ToString() + PassData[12].ToString() + PassData[13].ToString(), 16);
                        int status = Convert.ToInt32(PassData[14].ToString() + PassData[15].ToString(), 16);
                        if (status == 0)
                        {
                            //成功
                            success = true;
                        }
                        canBreak = true;
                    }
                    catch { }
                }
            };
            gateway.Actions += action;
            try
            {
                string passData = "0800081104";
                passData += datainfo.A震动使能 ? "01" : "00";
                passData += Convert.ToString(datainfo.A震动强度, 16).PadLeft(2, '0');
                string time = Convert.ToString(datainfo.A震动时间, 16).PadLeft(4, '0');
                //低位在前,高位在后
                passData += time.Substring(2, 2);
                passData += time.Substring(0, 2);
                var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                var data = new Newtonsoft.Json.Linq.JObject { { "PassData", passData } };
                jObject.Add("Data", data);
                gateway.Send(("ClientDataPassthrough"), jObject.ToString());
            }
            catch { }
            int TimeOut = 0;
            while (canBreak == false && TimeOut < 60)
            {
                System.Threading.Thread.Sleep(100);
                TimeOut++;
            }
            gateway.Actions -= action;
            if (success == false)
            {
                //设置震动反馈配置信息失败
                string errorMsg = Language.StringByID(R.MyInternationalizationString.uSetVibrationFeedbackSettionFail);
                if (TimeOut >= 60)
                {
                    errorMsg = UserCenterLogic.CombineGatewayTimeOutMsg(errorMsg, null, "回复超时", false);
                }
                this.ShowTipMsg(errorMsg);
                return false;
            }
            //备份设备
            HdlThreadLogic.Current.RunThread(async () =>
            {
                await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(device, GatewayBackupEnum.A简约面板震动功能, datainfo);
            }, ShowErrorMode.NO);
            return success;
        }
        /// <summary>
        /// 简约面板震动功能信息
        /// </summary>
        public class VibrationInfo
        {
            /// <summary>
            /// 震动使能
            /// </summary>
            public bool A震动使能 = false;
            /// <summary>
            /// 震动强度(十进制)
            /// </summary>
            public int A震动强度 = 0;
            /// <summary>
            /// 震动时间(十进制)
            /// </summary>
            public int A震动时间 = 0;
        }
        #endregion
        #region ■ 缓存中的设备私有属性_______________
        /// <summary>