黄学彪
2019-12-31 737c036a39176fd2085ce82b7c60391da8cb508c
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDevicePanelLogic.cs
@@ -544,6 +544,195 @@
        #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 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>