wxr
2021-11-30 358044c907e0e492b26377b21ca5091d19b503c8
合并wjc
2个文件已删除
8个文件已修改
5212 ■■■■ 已修改文件
HDL-ON_Android/Application.cs 716 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/HDL-ON_Android.csproj 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/MainPage.cs 825 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation 2.zip 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation.zip 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/AddInputType.cs 605 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs 1838 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/Send.cs 759 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Automation/WeatherCondition.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/FuntionControlView/ArmCenter/AddOutputPage.cs 463 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Application.cs
@@ -18,392 +18,400 @@
namespace HDL_ON_Android
{
    /// <summary>
    /// 设定为默认启动的Application
    /// </summary>
    [Android.App.Application]
    public class Application : Android.App.Application, Android.App.Application.IActivityLifecycleCallbacks
  /// <summary>
  /// 设定为默认启动的Application
  /// </summary>
  [Android.App.Application]
  public class Application : Android.App.Application, Android.App.Application.IActivityLifecycleCallbacks
  {
    static void reStartApp(Android.App.Application application)
    {
        static void reStartApp(Android.App.Application application)
        {
            var intent = new Intent(application, typeof(BaseActivity));
            intent.AddFlags(ActivityFlags.NewTask);
            application.StartActivity(intent);
            Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
        }
      var intent = new Intent(application, typeof(BaseActivity));
      intent.AddFlags(ActivityFlags.NewTask);
      application.StartActivity(intent);
      Android.OS.Process.KillProcess(Android.OS.Process.MyPid());
    }
        public Application(IntPtr handle, Android.Runtime.JniHandleOwnership ownerShip) : base(handle, ownerShip) { }
        public override void OnCreate()
        {
            //注册未处理异常事件
            AppCenter.Start("64ac5859-2cd7-4ef8-a5da-5455e29679ec", typeof(Analytics), typeof(Crashes));
            if (Shared.Application.Activity != null)
            {
                reStartApp(this);
                return;
            }
    public Application(IntPtr handle, Android.Runtime.JniHandleOwnership ownerShip) : base(handle, ownerShip) { }
    public override void OnCreate()
    {
      //注册未处理异常事件
      AppCenter.Start("64ac5859-2cd7-4ef8-a5da-5455e29679ec", typeof(Analytics), typeof(Crashes));
      if (Shared.Application.Activity != null)
      {
        reStartApp(this);
        return;
      }
            base.OnCreate();
            RegisterActivityLifecycleCallbacks(this);
      base.OnCreate();
      RegisterActivityLifecycleCallbacks(this);
            initAll();
      initAll();
        }
    }
        /// <summary>
        /// 所有初始化全部在这个方法实现
        /// </summary>
        void initAll()
        {
    /// <summary>
    /// 所有初始化全部在这个方法实现
    /// </summary>
    void initAll()
    {
            string[] permissions = new string[] { Manifest.Permission.WriteExternalStorage, Manifest.Permission.RecordAudio,
      string[] permissions = new string[] { Manifest.Permission.WriteExternalStorage, Manifest.Permission.RecordAudio,
            Manifest.Permission.Camera, Manifest.Permission.ProcessOutgoingCalls, Manifest.Permission.GetAccounts};
            //禁止屏幕长亮
            BaseActivity.KeepScreenON = false;
            //隐藏虚拟按键
            BaseActivity.IsHideVirualButtons = true;
            //实现安卓返回按键
            BaseActivity.BackKeyAction = () =>
            {
                try
                {
                    var result = MainPage.LoadEvent_BackAction();
                    switch (result)
                    {
                        case 0:
                            break;
                        case 1:
                        case 2:
                            BaseActivity.VerifyDateTime = DateTime.MaxValue;
                            break;
                        default:
                            BaseActivity.VerifyDateTime = DateTime.MaxValue;
                            break;
                    }
                }
                catch (Exception ex)
                {
                    MainPage.Log(ex.Message);
                    BaseActivity.VerifyDateTime = DateTime.MaxValue;
                }
            };
            init();
            BaseActivity.OnCreateActoin += (activity, application) =>
            {
                Language.CurrentLanguage = "Chinese";
                Locale locale1 = Locale.Default;
                var localeList = Resources.Configuration.Locale;
                if (localeList.Language == "zh")
                {
                    Language.CurrentLanguage = "Chinese";
                }
                else
                {
                    Language.CurrentLanguage = "English";
                }
                //获取极光推送ID
                GetJPushRegistrationID(activity);
                BaseActivity.NetworkStateChanged += (int internetStatus) =>
                {
                    //if (!IsEnterBackground)
                    //{
                    //    ////BusSocket.Stop();
                    //    //new System.Threading.Thread(() =>
                    //    //{
                    //    //    System.Threading.Thread.Sleep(1000);
                    //    //    //BusSocket.Start();
                    //    //})
                    //    //{ IsBackground = true }.Start();
                    //}
                    //else
                    //{
                    //    Console.WriteLine("HHH 网络变化但处于后台");
                    //}
                    //网络变化处理
                    HDLCommon.Current.UpdateInternetStatus((int)internetStatus, MainPage.IsEnterBackground);
                };
            };
            BaseActivity.RefreshUIAction += (activity) =>
            {
                MainPage.Show();
                checkSomeInfo();
            };
            BaseActivity.OnResumeAction += (activity) =>
            {
                checkSomeInfo();
            };
            BaseActivity.OnDestroyAction += (activity) =>
            {
                Console.WriteLine("OnDestroyAction");
                //BusSocket.Stop();
                //UserInfo.Current.unlockTime = DateTime.Now;
            };
            HDLUtils.SetAuthoritiesName("com.hdl.onpro.fileProvider");
            //Shared.Application.IsGpsEnable = true;
            //获取经纬度
            Shared.Application.LocationAction = (lon, lat) =>
            {
                try
                {
                    Shared.Application.LocationAction = null;
                    new HDL_ON.DAL.Server.HttpServerRequest().GetCityWeatherInfo(lon.ToString(), lat.ToString());
                    //关闭定位服务
                    Shared.Application.StopGPSLocationService();
                }
                catch (Exception ex)
                {
                    Utlis.WriteLine("GetCityInfo catch" + ex.Message);
                }
                MainPage.Log($"经纬度:::{lon}:{lat}");
            };
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="activity"></param>
        void GetJPushRegistrationID(BaseActivity activity)
      //禁止屏幕长亮
      BaseActivity.KeepScreenON = false;
      //隐藏虚拟按键
      BaseActivity.IsHideVirualButtons = true;
      //实现安卓返回按键
      BaseActivity.BackKeyAction = () =>
      {
        try
        {
            try
            {
                //保存获取的极光服务器上的注册ID到本地文件
                var tokenID = JPushInterface.GetRegistrationID(activity);
                Console.WriteLine("RegistrationID:  " + tokenID);
                if (!string.IsNullOrEmpty(tokenID) && OnAppConfig.Instance.PushDeviceToken != tokenID)
                {
                    OnAppConfig.Instance.PushDeviceToken = tokenID;
                    OnAppConfig.Instance.PhoneName = Android.OS.Build.Manufacturer;
                    OnAppConfig.Instance.SaveConfig();
                }
                int loadTokenCount = 0;
                System.Threading.Tasks.Task.Run(() =>
                {
                    while (string.IsNullOrEmpty(tokenID))
                    {
                        System.Threading.Thread.Sleep(1000);
                        tokenID = JPushInterface.GetRegistrationID(activity);
                        Console.WriteLine("Sleep.tokenID + " + JPushInterface.GetRegistrationID(activity));
                        loadTokenCount++;
                        if (loadTokenCount > 30)
                        {
                            break;
                        }
                    }
                    Console.WriteLine("RegistrationID:  " + tokenID);
                    if (!string.IsNullOrEmpty(tokenID) && OnAppConfig.Instance.PushDeviceToken != tokenID)
                    {
                        OnAppConfig.Instance.PushDeviceToken = tokenID;
                        OnAppConfig.Instance.PhoneName = Android.OS.Build.Manufacturer;
                        OnAppConfig.Instance.SaveConfig();
                    }
                });
          var result = MainPage.LoadEvent_BackAction();
          switch (result)
          {
            case 0:
              break;
            case 1:
            case 2:
              BaseActivity.VerifyDateTime = DateTime.MaxValue;
              break;
            default:
              BaseActivity.VerifyDateTime = DateTime.MaxValue;
              break;
          }
        }
        catch (Exception ex)
        {
          MainPage.Log(ex.Message);
          BaseActivity.VerifyDateTime = DateTime.MaxValue;
        }
      };
      init();
      BaseActivity.OnCreateActoin += (activity, application) =>
      {
        Language.CurrentLanguage = "Chinese";
        Locale locale1 = Locale.Default;
        var localeList = Resources.Configuration.Locale;
        if (localeList.Language == "zh")
        {
          Language.CurrentLanguage = "Chinese";
        }
        else
        {
          Language.CurrentLanguage = "English";
        }
        //获取极光推送ID
        GetJPushRegistrationID(activity);
        BaseActivity.NetworkStateChanged += (int internetStatus) =>
              {
                //if (!IsEnterBackground)
                //{
                //    ////BusSocket.Stop();
                //    //new System.Threading.Thread(() =>
                //    //{
                //    //    System.Threading.Thread.Sleep(1000);
                //    //    //BusSocket.Start();
                //    //})
                //    //{ IsBackground = true }.Start();
                //}
                //else
                //{
                //    Console.WriteLine("HHH 网络变化但处于后台");
                //}
                //网络变化处理
                HDLCommon.Current.UpdateInternetStatus((int)internetStatus, MainPage.IsEnterBackground);
              };
      };
      BaseActivity.RefreshUIAction += (activity) =>
      {
        MainPage.Show();
        checkSomeInfo();
      };
      BaseActivity.OnResumeAction += (activity) =>
      {
        checkSomeInfo();
      };
      BaseActivity.OnDestroyAction += (activity) =>
      {
        Console.WriteLine("OnDestroyAction");
        //BusSocket.Stop();
        //UserInfo.Current.unlockTime = DateTime.Now;
      };
      HDLUtils.SetAuthoritiesName("com.hdl.onpro.fileProvider");
      //Shared.Application.IsGpsEnable = true;
      bool isfirst = true;
      //获取经纬度
      Shared.Application.LocationAction = (lon, lat) =>
      {
        try
        {
          if (isfirst)
          {
            //只触发一次
            //Shared.Application.LocationAction = null;
            new HDL_ON.DAL.Server.HttpServerRequest().GetCityWeatherInfo(lon.ToString(), lat.ToString());
          }
          isfirst = false;
          ///监听经纬度
          HDL_ON.UI.UI2.Intelligence.Automation.LogicMethod.CurrLogicMethod.AppLatAndLonEvent(lon, lat);
          //关闭定位服务
          //Shared.Application.StopGPSLocationService();
        }
        catch (Exception ex)
        {
          Utlis.WriteLine("GetCityInfo catch" + ex.Message);
        }
        MainPage.Log($"经纬度:::{lon}:{lat}");
      };
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="activity"></param>
    void GetJPushRegistrationID(BaseActivity activity)
    {
      try
      {
        //保存获取的极光服务器上的注册ID到本地文件
        var tokenID = JPushInterface.GetRegistrationID(activity);
        Console.WriteLine("RegistrationID:  " + tokenID);
        if (!string.IsNullOrEmpty(tokenID) && OnAppConfig.Instance.PushDeviceToken != tokenID)
        {
          OnAppConfig.Instance.PushDeviceToken = tokenID;
          OnAppConfig.Instance.PhoneName = Android.OS.Build.Manufacturer;
          OnAppConfig.Instance.SaveConfig();
        }
        int loadTokenCount = 0;
        System.Threading.Tasks.Task.Run(() =>
        {
          while (string.IsNullOrEmpty(tokenID))
          {
            System.Threading.Thread.Sleep(1000);
            tokenID = JPushInterface.GetRegistrationID(activity);
            Console.WriteLine("Sleep.tokenID + " + JPushInterface.GetRegistrationID(activity));
            loadTokenCount++;
            if (loadTokenCount > 30)
            {
              break;
            }
            catch
            {
          }
          Console.WriteLine("RegistrationID:  " + tokenID);
          if (!string.IsNullOrEmpty(tokenID) && OnAppConfig.Instance.PushDeviceToken != tokenID)
          {
            OnAppConfig.Instance.PushDeviceToken = tokenID;
            OnAppConfig.Instance.PhoneName = Android.OS.Build.Manufacturer;
            OnAppConfig.Instance.SaveConfig();
          }
        });
            }
        }
      }
      catch
      {
        public static bool IsShowTip = true;
        void init()
      }
    }
    public static bool IsShowTip = true;
    void init()
    {
      //手机名称 Android.OS.Build.Manufacturer;
      //OnAppConfig.Instance.PhoneName = Android.OS.Build.Manufacturer;
      //#if DEBUG
      //CN.Jpush.Android.Api.JPushInterface.SetDebugMode(true);
      //#endif
      CN.Jpush.Android.Api.JPushInterface.Init(this);
    }
    void checkSomeInfo()
    {
      try
      {
        IsShowTip = true;
        var status = isNetworkAvailable(this);
        int internetStatus = 0;
        if (!status)
        {
            //手机名称 Android.OS.Build.Manufacturer;
            //OnAppConfig.Instance.PhoneName = Android.OS.Build.Manufacturer;
            //#if DEBUG
            //CN.Jpush.Android.Api.JPushInterface.SetDebugMode(true);
            //#endif
            CN.Jpush.Android.Api.JPushInterface.Init(this);
          internetStatus = 0;
        }
        void checkSomeInfo()
        var isWifi = isWifiConnected(this);
        if (isWifi)
        {
            try
            {
                IsShowTip = true;
                var status = isNetworkAvailable(this);
                int internetStatus = 0;
                if (!status)
                {
                    internetStatus = 0;
                }
                var isWifi = isWifiConnected(this);
                if (isWifi)
                {
                    internetStatus = 2;
                }
                else
                {
                    internetStatus = 1;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"android check some info erorr : {ex.Message}");
            }
          internetStatus = 2;
        }
        bool isNetworkAvailable(Context context)
        else
        {
            var cm = (ConnectivityManager)context.GetSystemService(ConnectivityService);
            if (cm == null || cm.ActiveNetworkInfo == null)
            {
                return false;
            }
            else
            {
                return cm.ActiveNetworkInfo.IsAvailable;
            }
          internetStatus = 1;
        }
      }
      catch (Exception ex)
      {
        Console.WriteLine($"android check some info erorr : {ex.Message}");
      }
    }
        bool isWifiConnected(Context context)
    bool isNetworkAvailable(Context context)
    {
      var cm = (ConnectivityManager)context.GetSystemService(ConnectivityService);
      if (cm == null || cm.ActiveNetworkInfo == null)
      {
        return false;
      }
      else
      {
        return cm.ActiveNetworkInfo.IsAvailable;
      }
    }
    bool isWifiConnected(Context context)
    {
      if (context != null)
      {
        var mConnectivityManager = (ConnectivityManager)context.GetSystemService
        (ConnectivityService);
        var mWiFiNetworkInfo = mConnectivityManager.GetNetworkInfo(ConnectivityType.Wifi);
        if (mWiFiNetworkInfo != null)
        {
            if (context != null)
            {
                var mConnectivityManager = (ConnectivityManager)context.GetSystemService
                (ConnectivityService);
                var mWiFiNetworkInfo = mConnectivityManager.GetNetworkInfo(ConnectivityType.Wifi);
                if (mWiFiNetworkInfo != null)
                {
                    return mWiFiNetworkInfo.IsAvailable;
                }
            }
            return false;
          return mWiFiNetworkInfo.IsAvailable;
        }
      }
      return false;
    }
        public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
    public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
    {
    }
    public void OnActivityDestroyed(Activity activity)
    {
      //throw new NotImplementedException ();
    }
    public void OnActivityPaused(Activity activity)
    {
      //throw new NotImplementedException ();
    }
    public void OnActivityResumed(Activity activity)
    {
      //throw new NotImplementedException ();
    }
    public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
    {
      //throw new NotImplementedException ();
    }
    public void OnActivityStarted(Activity activity)
    {
      //throw new NotImplementedException ();
      mCount++;
      if (mCount == 1)
      {
        Console.WriteLine("HHH OnActivityStarted:foreground");
        BusSocketStart();
        //后台回到前台
        new HDL_ON.UI.AppUnlockPage().LoadPage();
      }
    }
    public void OnActivityStopped(Activity activity)
    {
      mCount--;
      if (mCount == 0)
      {
        Console.WriteLine("HHH OnActivityStopped: background");
        BusSocketStop();
        //进入后台
        UserInfo.Current.unlockTime = DateTime.Now;
      }
    }
    public override void OnTerminate()
    {
      base.OnTerminate();
      UnregisterActivityLifecycleCallbacks(this);
    }
    int mCount;
    ///// <summary>
    ///// 是否进入后台
    ///// </summary>
    //public bool IsEnterBackground = false;
    /// <summary>
    /// 进入后台的时间
    /// </summary>
    DateTime CloseTime = DateTime.Now;
    /// <summary>
    /// BusSocketStop
    /// </summary>
    void BusSocketStop()
    {
      //IsEnterBackground = true;
      CloseTime = DateTime.Now;
      MainPage.IsEnterBackground = true;
      //进入后台mqtt正在连接重置状态
      HDL_ON.DAL.Mqtt.MqttClient.RemoteMqttIsConnecting = false;
      HDL_ON.DriverLayer.UdpSocket._BusSocket.Stop();
    }
    /// <summary>
    /// BusSocketStart
    /// </summary>
    void BusSocketStart()
    {
      //IsEnterBackground = false;
      if (CloseTime.AddSeconds(10) < DateTime.Now)
      {
        //后台超过10s就断开MQTT重连
        //if (HDL_ON.DriverLayer.Control.Ins.IsRemote)
        {
          HDL_ON.DAL.Mqtt.MqttClient.DisConnectRemote("closeTime", false);
        }
      }
        public void OnActivityDestroyed(Activity activity)
        {
            //throw new NotImplementedException ();
        }
      MainPage.IsEnterBackground = false;
      HDL_ON.DriverLayer.UdpSocket._BusSocket.Start();
      HDL_ON.DriverLayer.Control.Ins.SearchLoaclGateway();
    }
        public void OnActivityPaused(Activity activity)
        {
            //throw new NotImplementedException ();
        }
    protected override void Dispose(bool disposing)
    {
      base.Dispose(disposing);
    }
        public void OnActivityResumed(Activity activity)
        {
            //throw new NotImplementedException ();
        }
        public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
        {
            //throw new NotImplementedException ();
        }
        public void OnActivityStarted(Activity activity)
        {
            //throw new NotImplementedException ();
            mCount++;
            if (mCount == 1)
            {
                Console.WriteLine("HHH OnActivityStarted:foreground");
                BusSocketStart();
                //后台回到前台
                new HDL_ON.UI.AppUnlockPage().LoadPage();
            }
        }
        public void OnActivityStopped(Activity activity)
        {
            mCount--;
            if (mCount == 0)
            {
                Console.WriteLine("HHH OnActivityStopped: background");
                BusSocketStop();
                //进入后台
                UserInfo.Current.unlockTime = DateTime.Now;
            }
        }
        public override void OnTerminate()
        {
            base.OnTerminate();
            UnregisterActivityLifecycleCallbacks(this);
        }
        int mCount;
        ///// <summary>
        ///// 是否进入后台
        ///// </summary>
        //public bool IsEnterBackground = false;
        /// <summary>
        /// 进入后台的时间
        /// </summary>
        DateTime CloseTime = DateTime.Now;
        /// <summary>
        /// BusSocketStop
        /// </summary>
        void BusSocketStop()
        {
            //IsEnterBackground = true;
            CloseTime = DateTime.Now;
            MainPage.IsEnterBackground = true;
            //进入后台mqtt正在连接重置状态
            HDL_ON.DAL.Mqtt.MqttClient.RemoteMqttIsConnecting = false;
            HDL_ON.DriverLayer.UdpSocket._BusSocket.Stop();
        }
        /// <summary>
        /// BusSocketStart
        /// </summary>
        void BusSocketStart()
        {
            //IsEnterBackground = false;
            if (CloseTime.AddSeconds(10) < DateTime.Now)
            {
                //后台超过10s就断开MQTT重连
                //if (HDL_ON.DriverLayer.Control.Ins.IsRemote)
                {
                    HDL_ON.DAL.Mqtt.MqttClient.DisConnectRemote("closeTime", false);
                }
            }
            MainPage.IsEnterBackground = false;
            HDL_ON.DriverLayer.UdpSocket._BusSocket.Start();
            HDL_ON.DriverLayer.Control.Ins.SearchLoaclGateway();
        }
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }
        /// <summary>
        /// 查询通知权限,并提示
        /// </summary>
        public  void QueryNotificationPermission()
        {
        }
    /// <summary>
    /// 查询通知权限,并提示
    /// </summary>
    public void QueryNotificationPermission()
    {
    }
  }
}
HDL-ON_Android/HDL-ON_Android.csproj
@@ -33,7 +33,6 @@
    <DefineConstants>DEBUG;TRACE;__Android__</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
    <MandroidI18n>cjk</MandroidI18n>
    <AndroidDexTool>d8</AndroidDexTool>
    <AndroidEnableSGenConcurrent>false</AndroidEnableSGenConcurrent>
@@ -62,7 +61,7 @@
    <AndroidEnableSGenConcurrent>false</AndroidEnableSGenConcurrent>
    <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
    <AndroidKeyStore>True</AndroidKeyStore>
    <AndroidSigningKeyStore>/Users/kaede/Desktop/HDL_APP_Project/on_plus.keystore</AndroidSigningKeyStore>
    <AndroidSigningKeyStore>/Users/hdl/Desktop/on_plus/on_plus.keystore</AndroidSigningKeyStore>
    <AndroidSigningStorePass>85521566</AndroidSigningStorePass>
    <AndroidSigningKeyPass>85521566</AndroidSigningKeyPass>
    <AndroidSigningKeyAlias>on_plus</AndroidSigningKeyAlias>
HDL_ON/UI/MainPage.cs
@@ -8,86 +8,86 @@
namespace HDL_ON
{
    public static class MainPage
  public static class MainPage
  {
    /// <summary>
    /// BaseView
    /// </summary>
    public static FrameLayout BaseView { get; internal set; }
    /// <summary>
    /// BasePageView
    /// </summary>
    public static PageLayout BasePageView { get; set; }
    /// <summary>
    /// 用户控制父容器
    /// </summary>
    public static UserPage UserBasePage;
    /// <summary>
    /// 版本号
    /// </summary>
    public static string VersionString = "1.3.1123";
    ///// <summary>
    ///// 客户端类型
    ///// </summary>
    //public static string ClientType = APIClientType.HDL_ON_PRO.ToString();
    /// <summary>
    ///
    /// </summary>
    public static Entity.CityInfo cityInfo = new Entity.CityInfo();
    /// <summary>
    /// 天气刷新action
    /// </summary>
    public static Action RefreshAir;
    /// <summary>
    /// 回退页面action 没有需要可以不用
    /// </summary>
    public static Action ReturnRefreshAction;
    /// <summary>
    /// 无登录模式
    /// </summary>
    public static bool NoLoginMode = false;
    /// <summary>
    /// 网络连接状态
    /// 0:无网络
    /// </summary>
    public static int InternetStatus = 2;
    /// <summary>
    /// 是否进入后台
    /// </summary>
    public static bool IsEnterBackground = false;
    /// <summary>
    /// 当前分页索引
    /// 0:收藏
    /// 1:分类
    /// 2:智能
    /// 3:个人
    /// </summary>
    public static int CurPageIndex = 9999;
    ///// <summary>
    ///// 公司代码
    ///// 预留第三方定制标记
    ///// 0:HDL
    ///// </summary>
    //public static int Company = 0;
    /// <summary>
    /// 右滑后退提示按钮
    /// </summary>
    public static Button BtnBackIcon;
    /// <summary>
    /// 后退右滑了多少距离,超过一定距离才触发后退事件
    /// </summary>
    public static int StartX = 0;
    /// <summary>
    /// 是否全面屏手机
    /// </summary>
    public static bool Increase
    {
        /// <summary>
        /// BaseView
        /// </summary>
        public static FrameLayout BaseView { get; internal set; }
        /// <summary>
        /// BasePageView
        /// </summary>
        public static PageLayout BasePageView { get; set; }
        /// <summary>
        /// 用户控制父容器
        /// </summary>
        public static UserPage UserBasePage;
        /// <summary>
        /// 版本号
        /// </summary>
        public static string VersionString = "1.3.1123";
        ///// <summary>
        ///// 客户端类型
        ///// </summary>
        //public static string ClientType = APIClientType.HDL_ON_PRO.ToString();
        /// <summary>
        ///
        /// </summary>
        public static Entity.CityInfo cityInfo = new Entity.CityInfo();
        /// <summary>
        /// 天气刷新action
        /// </summary>
        public static Action RefreshAir;
        /// <summary>
        /// 回退页面action 没有需要可以不用
        /// </summary>
        public static Action ReturnRefreshAction;
        /// <summary>
        /// 无登录模式
        /// </summary>
        public static bool NoLoginMode = false;
        /// <summary>
        /// 网络连接状态
        /// 0:无网络
        /// </summary>
        public static int InternetStatus = 2;
        /// <summary>
        /// 是否进入后台
        /// </summary>
        public static bool IsEnterBackground = false;
        /// <summary>
        /// 当前分页索引
        /// 0:收藏
        /// 1:分类
        /// 2:智能
        /// 3:个人
        /// </summary>
        public static int CurPageIndex = 9999;
        ///// <summary>
        ///// 公司代码
        ///// 预留第三方定制标记
        ///// 0:HDL
        ///// </summary>
        //public static int Company = 0;
        /// <summary>
        /// 右滑后退提示按钮
        /// </summary>
        public static Button BtnBackIcon;
        /// <summary>
        /// 后退右滑了多少距离,超过一定距离才触发后退事件
        /// </summary>
        public static int StartX = 0;
        /// <summary>
        /// 是否全面屏手机
        /// </summary>
        public static bool Increase
        {
            get
            {
      get
      {
#if __IOS__
                if (Application.PhoneType>10)
                {
@@ -95,15 +95,15 @@
                }
                return false;
#else
                return false;
        return false;
#endif
            }
        }
      }
    }
        /// <summary>
        /// 场景支持的功能列表
        /// </summary>
        public static List<string> SceneSupportFunctionList = new List<string> {
    /// <summary>
    /// 场景支持的功能列表
    /// </summary>
    public static List<string> SceneSupportFunctionList = new List<string> {
            SPK.LightCCT,SPK.LightDimming,SPK.LightSwitch,SPK.LightRGB,
            SPK.CurtainRoller,SPK.CurtainSwitch,SPK.CurtainTrietex,
            SPK.AcIr,SPK.AcStandard,SPK.HvacAC,
@@ -114,350 +114,353 @@
        };
        static List<string> _RoomNotSupportFunctionList = null;
        /// <summary>
        /// 房间功能列表不加载的功能列表
        /// </summary>
        public static List<string> RoomNotSupportFunctionList
    static List<string> _RoomNotSupportFunctionList = null;
    /// <summary>
    /// 房间功能列表不加载的功能列表
    /// </summary>
    public static List<string> RoomNotSupportFunctionList
    {
      get
      {
        if (_RoomNotSupportFunctionList == null)
        {
            get {
                if(_RoomNotSupportFunctionList == null)
                {
                    _RoomNotSupportFunctionList = new List<string>();
                    _RoomNotSupportFunctionList.Add(SPK.EnergyStandard);
                    _RoomNotSupportFunctionList.Add(SPK.MusicStandard);
                    _RoomNotSupportFunctionList.Add(SPK.AvMusic);
                    _RoomNotSupportFunctionList.Add(SPK.AirSwitch);
                    _RoomNotSupportFunctionList.Add(SPK.ElectricEnergy);
                    _RoomNotSupportFunctionList.AddRange(SPK.EnvironDeviceSpkList());
                    _RoomNotSupportFunctionList.AddRange(SPK.ArmSensorSpkList());
                }
                return _RoomNotSupportFunctionList;
            }
          _RoomNotSupportFunctionList = new List<string>();
          _RoomNotSupportFunctionList.Add(SPK.EnergyStandard);
          _RoomNotSupportFunctionList.Add(SPK.MusicStandard);
          _RoomNotSupportFunctionList.Add(SPK.AvMusic);
          _RoomNotSupportFunctionList.Add(SPK.AirSwitch);
          _RoomNotSupportFunctionList.Add(SPK.ElectricEnergy);
          _RoomNotSupportFunctionList.AddRange(SPK.EnvironDeviceSpkList());
          _RoomNotSupportFunctionList.AddRange(SPK.ArmSensorSpkList());
        }
        return _RoomNotSupportFunctionList;
      }
    }
        public static void Show()
    public static void Show()
    {
      try
      {
        Application.DesignWidth = 375;
        Application.DesignHeight = 667;
        BaseView = Application.MainPage;
        Application.MainPage.BackgroundColor = CSS_Color.MainBackgroundColor;
        //#region 测试
        //var ddd = new UI.test.TestDialog();
        //ddd.InitView();
        //return;
        //#endregion
        if (string.IsNullOrEmpty(OnAppConfig.Instance.LastLoginUserId))
        {
            try
            {
                Application.DesignWidth = 375;
                Application.DesignHeight = 667;
                BaseView = Application.MainPage;
                Application.MainPage.BackgroundColor = CSS_Color.MainBackgroundColor;
                ///监听经纬度
                HDL_ON.UI.UI2.Intelligence.Automation.LogicMethod.CurrLogicMethod.AppLatAndLonEvent();
                //#region 测试
                //var ddd = new UI.test.TestDialog();
                //ddd.InitView();
                //return;
                //#endregion
                if (string.IsNullOrEmpty(OnAppConfig.Instance.LastLoginUserId))
                {
                    GoLoginPage();
                }
                else
                {
                    //判断需不需要登录,有没有登录,或者登录是否过期,
                    if (UserInfo.Current == null || !UserInfo.Current.IsLogin)
                    {
                        GoLoginPage(UserInfo.Current);
                    }
                    else
                    {
                        //new System.Threading.Thread(() =>
                        //{
                        //    var pm = new DAL.Server.HttpServerRequest();
                        //    pm.RefreshToken();//刷新Token
                        //    pm.GetHomePager();//刷新住宅信息
                        //    pm.GetUserInfo();//刷新个人信息
                        //})
                        //{ IsBackground = true }.Start();
                        Common.ApiUtlis.Ins.DownloadData();
                        GoUserPage(false,true);
                    }
                }
            }
            catch (Exception ex)
            {
                Log("root erorr : " + ex.Message);
            }
            finally
            {
                //Application.RunOnMainThread(() => {
                //    Application.HideSoftInput();
                //});
            }
          GoLoginPage();
        }
        /// <summary>
        /// 进入登录界面
        /// </summary>
        public static void GoLoginPage(UserInfo userInfo = null)
        else
        {
            BaseView.RemoveAll();
            BaseView.BackgroundColor = CSS_Color.BackgroundColor;
            var fisrtView = new UI.UI1Login.LoginPage();
            fisrtView.BackgroundColor = CSS_Color.MainBackgroundColor;
            BaseView.AddChidren(fisrtView);
            fisrtView.LoadView(userInfo);
          //判断需不需要登录,有没有登录,或者登录是否过期,
          if (UserInfo.Current == null || !UserInfo.Current.IsLogin)
          {
            GoLoginPage(UserInfo.Current);
          }
          else
          {
            //new System.Threading.Thread(() =>
            //{
            //    var pm = new DAL.Server.HttpServerRequest();
            //    pm.RefreshToken();//刷新Token
            //    pm.GetHomePager();//刷新住宅信息
            //    pm.GetUserInfo();//刷新个人信息
            //})
            //{ IsBackground = true }.Start();
            Common.ApiUtlis.Ins.DownloadData();
            GoUserPage(false, true);
          }
        }
      }
      catch (Exception ex)
      {
        Log("root erorr : " + ex.Message);
      }
      finally
      {
        //Application.RunOnMainThread(() => {
        //    Application.HideSoftInput();
        //});
      }
    }
        /// <summary>
        /// 进入主页
        /// </summary>
        /// <param name="isFirstOpen">如果是第一次启动 检测校验密码</param>
        /// <param name="pageShowEvent">主页显示之后触发的事件(没有住宅的话,则不会触发)</param>
        public static void GoUserPage(bool downloadData , bool isFirstOpen = false, Action pageShowEvent = null)
        {
            BaseView.RemoveAll();
            #region 后退事件
            BasePageView = new PageLayout();
            BasePageView.ScrollEnabled = false;
            BasePageView.IsShowPoint = false;
            BasePageView.PageChange = (sender, e) =>
    /// <summary>
    /// 进入登录界面
    /// </summary>
    public static void GoLoginPage(UserInfo userInfo = null)
    {
      BaseView.RemoveAll();
      BaseView.BackgroundColor = CSS_Color.BackgroundColor;
      var fisrtView = new UI.UI1Login.LoginPage();
      fisrtView.BackgroundColor = CSS_Color.MainBackgroundColor;
      BaseView.AddChidren(fisrtView);
      fisrtView.LoadView(userInfo);
    }
    /// <summary>
    /// 进入主页
    /// </summary>
    /// <param name="isFirstOpen">如果是第一次启动 检测校验密码</param>
    /// <param name="pageShowEvent">主页显示之后触发的事件(没有住宅的话,则不会触发)</param>
    public static void GoUserPage(bool downloadData, bool isFirstOpen = false, Action pageShowEvent = null)
    {
      BaseView.RemoveAll();
      #region 后退事件
      BasePageView = new PageLayout();
      BasePageView.ScrollEnabled = false;
      BasePageView.IsShowPoint = false;
      BasePageView.PageChange = (sender, e) =>
      {
        if (e < BasePageView.ChildrenCount - 1)
        {
          BasePageView.GetChildren(BasePageView.ChildrenCount - 1).RemoveFromParent();
        }
        try
        {
          ReturnRefreshAction?.Invoke();
          ReturnRefreshAction = null;
        }
        catch (Exception ex)
        {
          Log($"后退事件异常:{ex.Message}");
        }
      };
      BaseView.AddChidren(BasePageView);
      var backView = new FrameLayout()
      {
        Y = Application.GetRealHeight(100),
        Width = Application.GetRealWidth(10),
        Height = Application.GetRealHeight(440),
      };
      BaseView.AddChidren(backView);
      BtnBackIcon = new Button()
      {
        X = -Application.GetRealWidth(100),
        Gravity = Gravity.CenterVertical,
        Width = Application.GetRealWidth(88 / 2),
        Height = Application.GetRealHeight(56 / 2),
        UnSelectedImagePath = "Public/RightSlideBackIcon.png"
      };
      BaseView.AddChidren(BtnBackIcon);
      backView.MouseMoveEventHandler = (sender, e) =>
      {
        if (BasePageView.ChildrenCount <= 1)
        {
          return;
        }
        MainPage.Log($"move:{e.X}");
        if (StartX == 0 && e.X < 30)
        {
          StartX = (int)e.X;
        }
        if (StartX < 30)
        {
          if (e.X < Application.GetRealWidth(100))
          {
            BtnBackIcon.X = (int)e.X - Application.GetRealWidth(100);
          }
        }
      };
      backView.MouseDownEventHandler = (sender, e) =>
      {
        if (BasePageView.ChildrenCount <= 1)
        {
          return;
        }
        MainPage.Log($"down:{e.X}");
        StartX = (int)e.X;
        BtnBackIcon.Y = (int)e.Y + Application.GetRealHeight(50);
      };
      backView.MouseUpEventHandler = (sender, e) =>
      {
        MainPage.Log($"up{e.X}");
        StartX = 0;
        BtnBackIcon.X = -Application.GetRealWidth(100);
        if (e.X > 70)
        {
          if (BasePageView.ChildrenCount > 1)
          {
            BasePageView.PageIndex = BasePageView.ChildrenCount - 2;
          }
        }
      };
      backView.MouseUpOutsideEventHandler = (sender, e) =>
      {
        MainPage.Log($"up{e.X}");
        StartX = 0;
        BtnBackIcon.X = -Application.GetRealWidth(100);
        if (e.X > 70)
        {
          if (BasePageView.ChildrenCount > 1)
          {
            BasePageView.PageIndex = BasePageView.ChildrenCount - 2;
          }
        }
      };
      #endregion
      //体验模式
      if (NoLoginMode)
      {
        //跳转页面----
        UserBasePage = new UserPage();
        BasePageView.AddChidren(UserBasePage);
        UserBasePage.LoadPage();
        BasePageView.PageIndex = 0;
        return;
      }
      //加载Loading效果
      var waitPage = new Loading();
      BaseView.AddChidren(waitPage);
      waitPage.Start(Language.StringByID(StringId.PleaseWait));
      //当没有住宅时,不能让它往下走
      if (UserInfo.Current.regionList.Count == 0)
      {
        waitPage.Hide();
        var addResidencePage = new BindingResidencePage();
        BaseView.AddChidren(addResidencePage);
        addResidencePage.LoadView();
        return;
      }
      new System.Threading.Thread(async () =>
      {
        try
        {
          Entity.FunctionList.List.Clear();
          Entity.SpatialInfo.CurrentSpatial.Clear();
          ///等待获取住宅信息
          Application.RunOnMainThread(() =>
          {
            if (waitPage != null)
            {
                if (e < BasePageView.ChildrenCount - 1)
                {
                    BasePageView.GetChildren(BasePageView.ChildrenCount - 1).RemoveFromParent();
                }
                try
                {
                    ReturnRefreshAction?.Invoke();
                    ReturnRefreshAction = null;
                }
                catch (Exception ex)
                {
                    Log($"后退事件异常:{ex.Message}");
                }
            };
            BaseView.AddChidren(BasePageView);
            var backView = new FrameLayout()
            {
                Y = Application.GetRealHeight(100),
                Width = Application.GetRealWidth(10),
                Height = Application.GetRealHeight(440),
            };
            BaseView.AddChidren(backView);
            BtnBackIcon = new Button()
            {
                X = -Application.GetRealWidth(100),
                Gravity = Gravity.CenterVertical,
                Width = Application.GetRealWidth(88 / 2),
                Height = Application.GetRealHeight(56 / 2),
                UnSelectedImagePath = "Public/RightSlideBackIcon.png"
            };
            BaseView.AddChidren(BtnBackIcon);
            backView.MouseMoveEventHandler = (sender, e) =>
            {
                if (BasePageView.ChildrenCount <= 1)
                {
                    return;
                }
                MainPage.Log($"move:{e.X}");
                if (StartX == 0 && e.X < 30)
                {
                    StartX = (int)e.X;
                }
                if (StartX < 30)
                {
                    if (e.X < Application.GetRealWidth(100))
                    {
                        BtnBackIcon.X = (int)e.X - Application.GetRealWidth(100);
                    }
                }
            };
            backView.MouseDownEventHandler = (sender, e) =>
            {
                if (BasePageView.ChildrenCount <= 1)
                {
                    return;
                }
                MainPage.Log($"down:{e.X}");
                StartX = (int)e.X;
                BtnBackIcon.Y = (int)e.Y + Application.GetRealHeight(50);
            };
            backView.MouseUpEventHandler = (sender, e) => {
                MainPage.Log($"up{e.X}");
                StartX = 0;
                BtnBackIcon.X = -Application.GetRealWidth(100);
                if (e.X > 70)
                {
                    if (BasePageView.ChildrenCount > 1)
                    {
                        BasePageView.PageIndex = BasePageView.ChildrenCount - 2;
                    }
                }
            };
            backView.MouseUpOutsideEventHandler = (sender, e) => {
                MainPage.Log($"up{e.X}");
                StartX = 0;
                BtnBackIcon.X = -Application.GetRealWidth(100);
                if (e.X > 70)
                {
                    if (BasePageView.ChildrenCount > 1)
                    {
                        BasePageView.PageIndex = BasePageView.ChildrenCount - 2;
                    }
                }
            };
            #endregion
            //体验模式
            if (NoLoginMode)
            {
                //跳转页面----
                UserBasePage = new UserPage();
                BasePageView.AddChidren(UserBasePage);
                UserBasePage.LoadPage();
                BasePageView.PageIndex = 0;
                return;
              waitPage.RemoveFromParent();
              waitPage = null;
            }
            //加载Loading效果
            var waitPage = new Loading();
            BaseView.AddChidren(waitPage);
            waitPage.Start(Language.StringByID(StringId.PleaseWait));
            //跳转页面----
            UserBasePage = new UserPage();
            BasePageView.AddChidren(UserBasePage);
            UserBasePage.LoadPage();
            BasePageView.PageIndex = 0;
            //当没有住宅时,不能让它往下走
            if (UserInfo.Current.regionList.Count == 0)
            if (isFirstOpen)
            {
                waitPage.Hide();
                var addResidencePage = new BindingResidencePage();
                BaseView.AddChidren(addResidencePage);
                addResidencePage.LoadView();
                return;
              //启动密码验证
              new AppUnlockPage().LoadPage(isFirstOpen);
            }
            new System.Threading.Thread(async () =>
            {
                try
                {
                    Entity.FunctionList.List.Clear();
                    Entity.SpatialInfo.CurrentSpatial.Clear();
                    ///等待获取住宅信息
                    Application.RunOnMainThread( () =>
                    {
                        if (waitPage != null)
                        {
                            waitPage.RemoveFromParent();
                            waitPage = null;
                        }
                        //跳转页面----
                        UserBasePage = new UserPage();
                        BasePageView.AddChidren(UserBasePage);
                        UserBasePage.LoadPage();
                        BasePageView.PageIndex = 0;
                        if (isFirstOpen)
                        {
                            //启动密码验证
                            new AppUnlockPage().LoadPage(isFirstOpen);
                        }
                        //主页加载完成,回调事件
                        pageShowEvent?.Invoke();
                        pageShowEvent = null;
                    });
                }
                catch (Exception ex)
                {
                    MainPage.Log($"GoUserPage : {ex.Message}");
                }finally
                {
                    Application.RunOnMainThread(() =>
                    {
                        if (downloadData)
                        {
                            DB_ResidenceData.Instance.EixtAccount();
                            ///初始化app数据
                            Common.ApiUtlis.Ins.DownloadData();
                        };
                    });
                }
            }).Start();
            //主页加载完成,回调事件
            pageShowEvent?.Invoke();
            pageShowEvent = null;
          });
        }
        /// <summary>
        /// 后退事件
        /// 0:后退
        /// 1:有等待界面
        /// 2:无法再后退,可以执行退到桌面
        /// </summary>
        public static int LoadEvent_BackAction()
        catch (Exception ex)
        {
            int result = 0;
            Application.RunOnMainThread(() =>
            {
                if (BasePageView == null || BasePageView.ChildrenCount<=1 )
                {
                    result = 2;//无法再后退,可以执行退到桌面
                }
                if (BasePageView.ChildrenCount > 1)
                {
                    int index = BasePageView.ChildrenCount - 1;
                    var view = BasePageView.GetChildren(index);
                    if (view.GetType() == typeof(Loading))
                    {
                        var loading = view as Loading;
                        if (loading.CurStatus == false)//有一些等待界面隐藏了,但是没有移除到,需要先移除
                        {
                            loading.RemoveFromParent();
                            result = LoadEvent_BackAction();
                        }
                        else
                        {
                            result = 1;//正在等待某些操作
                        }
                    }
                    else
                    {
                        if (view != null)
                        {
                            if(view.Tag!=null )
                            {
                                if (view.Tag.ToString() != "unlockpage")
                                {
                                    view.RemoveFromParent();
                                }else
                                {
                                    result = 2;
                                }
                            }else
                            {
                                view.RemoveFromParent();
                            }
                        }
                    }
                }
                else
                {
                    result = 2;//无法再后退,可以执行退到桌面
                }
            });
            return result;
          MainPage.Log($"GoUserPage : {ex.Message}");
        }
        /// <summary>
        /// 自定义日志输出
        /// </summary>
        public static void Log(string msg)
        finally
        {
#if DEBUG
            Console.WriteLine(msg);
#endif
          Application.RunOnMainThread(() =>
          {
            if (downloadData)
            {
              DB_ResidenceData.Instance.EixtAccount();
              ///初始化app数据
              Common.ApiUtlis.Ins.DownloadData();
            };
          });
        }
      }).Start();
    }
}
    /// <summary>
    /// 后退事件
    /// 0:后退
    /// 1:有等待界面
    /// 2:无法再后退,可以执行退到桌面
    /// </summary>
    public static int LoadEvent_BackAction()
    {
      int result = 0;
      Application.RunOnMainThread(() =>
      {
        if (BasePageView == null || BasePageView.ChildrenCount <= 1)
        {
          result = 2;//无法再后退,可以执行退到桌面
        }
        if (BasePageView.ChildrenCount > 1)
        {
          int index = BasePageView.ChildrenCount - 1;
          var view = BasePageView.GetChildren(index);
          if (view.GetType() == typeof(Loading))
          {
            var loading = view as Loading;
            if (loading.CurStatus == false)//有一些等待界面隐藏了,但是没有移除到,需要先移除
            {
              loading.RemoveFromParent();
              result = LoadEvent_BackAction();
            }
            else
            {
              result = 1;//正在等待某些操作
            }
          }
          else
          {
            if (view != null)
            {
              if (view.Tag != null)
              {
                if (view.Tag.ToString() != "unlockpage")
                {
                  view.RemoveFromParent();
                }
                else
                {
                  result = 2;
                }
              }
              else
              {
                view.RemoveFromParent();
              }
            }
          }
        }
        else
        {
          result = 2;//无法再后退,可以执行退到桌面
        }
      });
      return result;
    }
    /// <summary>
    /// 自定义日志输出
    /// </summary>
    public static void Log(string msg)
    {
#if DEBUG
            Console.WriteLine(msg);
#endif
    }
  }
}
HDL_ON/UI/UI2/3-Intelligence/Automation 2.zip
Binary files differ
HDL_ON/UI/UI2/3-Intelligence/Automation.zip
Binary files differ
HDL_ON/UI/UI2/3-Intelligence/Automation/AddInputType.cs
@@ -3,337 +3,328 @@
using Shared;
namespace HDL_ON.UI.UI2.Intelligence.Automation
{
    public class AddInputType : FrameLayout
  public class AddInputType : FrameLayout
  {
    public AddInputType()
    {
        public AddInputType()
      Tag = "Logic";
    }
    public void Show()
    {
      LogicView.TopView topView = new LogicView.TopView();
      this.AddChidren(topView.FLayoutView());
      topView.clickBackBtn.MouseUpEventHandler += (e, sen) =>
      {
        RemoveFromParent();
      };
      topView.topNameBtn.TextID = StringId.selectionCondition;
      FrameLayout viewLayout = new FrameLayout
      {
        Y = Application.GetRealHeight(64),
        Width = Application.GetRealWidth(LogicView.TextSize.view375),
        Height = Application.GetRealHeight(LogicView.TextSize.view667 - 64),
        BackgroundColor = CSS.CSS_Color.viewMiddle,
      };
      this.AddChidren(viewLayout);
      #region 时间  功能 室外变化
      //时间
      LogicView.SelectTypeView timeView = new LogicView.SelectTypeView();
      timeView.btnText.TextID = StringId.time;
      timeView.btnIcon.UnSelectedImagePath = "LogicIcon/time.png";
      if (MainView.IsGatewayType)
      {
        viewLayout.AddChidren(timeView.FLayoutView());
      }
      //功能
      LogicView.SelectTypeView functionView = new LogicView.SelectTypeView();
      functionView.frameLayout.Y = timeView.frameLayout.Bottom;
      functionView.btnText.TextID = StringId.funLogic;
      functionView.btnIcon.UnSelectedImagePath = "LogicIcon/functionicon.png";
      viewLayout.AddChidren(functionView.FLayoutView());
      if (!MainView.IsGatewayType)
      {
        functionView.frameLayout.Y = Application.GetRealHeight(0);
      }
      //场景
      LogicView.SelectTypeView sceneView = new LogicView.SelectTypeView();
      sceneView.frameLayout.Y = functionView.frameLayout.Bottom;
      sceneView.btnText.TextID = StringId.Scenes;
      sceneView.btnIcon.UnSelectedImagePath = "LogicIcon/scene.png";
      viewLayout.AddChidren(sceneView.FLayoutView());
      //室外变化
      LogicView.SelectTypeView shiwaiView = new LogicView.SelectTypeView();
      shiwaiView.frameLayout.Y = sceneView.frameLayout.Bottom;
      shiwaiView.btnText.TextID = StringId.shiwaibainhua;
      shiwaiView.btnIcon.UnSelectedImagePath = "LogicIcon/changesinoutdoor.png";
      if (MainView.IsGatewayType)
      {
        viewLayout.AddChidren(shiwaiView.FLayoutView());
      }
      //地理围栏
      LogicView.SelectTypeView likiadaodaView = new LogicView.SelectTypeView();
      likiadaodaView.frameLayout.Y = shiwaiView.frameLayout.Bottom;
      likiadaodaView.btnText.TextID = StringId.likiadaoda;
      likiadaodaView.btnIcon.UnSelectedImagePath = "LogicIcon/location.png";
      if (MainView.IsGatewayType)
      {
        viewLayout.AddChidren(likiadaodaView.FLayoutView());
      }
      #endregion
      #region  所有点击事件
      //时间
      timeView.btnClick.MouseUpEventHandler += (sen, e) =>
      {
        TimeTpye timeTpye = new TimeTpye();
        MainPage.BasePageView.AddChidren(timeTpye);
        timeTpye.Show();
        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
      };
      //功能
      functionView.btnClick.MouseUpEventHandler += (sen, e) =>
      {
        FunTpye funTpye = new FunTpye();
        MainPage.BasePageView.AddChidren(funTpye);
        funTpye.Show(LogicMethod.condition_if);
        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
      };
      //场景点击事件
      sceneView.btnClick.MouseUpEventHandler += (sen, e) =>
      {
        SceneMethod();
      };
      //室外变化
      shiwaiView.btnClick.MouseUpEventHandler += (sen, e) =>
      {
        //if (string.IsNullOrEmpty(Entity.DB_ResidenceData.Instance.CurrentRegion.homeAddress))//.longitude == 0 && Entity.DB_ResidenceData.Instance.CurrentRegion.latitude == 0)
        //{
        //    new PublicAssmebly().TipMsg(StringId.tip, StringId.GatewayLocationInformationIsNotConfigured);
        //    return;
        //}
        Weather weather = new Weather();
        MainPage.BasePageView.AddChidren(weather);
        weather.Show();
        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
      };
      //地理围栏
      likiadaodaView.btnClick.MouseUpEventHandler += (sen, e) =>
      {
        LocationView(this, false);
      };
      #endregion
    }
    /// <summary>
    /// 添加场景
    /// </summary>
    public void SceneMethod()
    {
      var sceneList = LogicMethod.CurrLogicMethod.GetSceneList();
      List<string> nameList = new List<string>();
      for (int i = 0; i < sceneList.Count; i++)
      {
        var scene = sceneList[i];
        nameList.Add(scene.name);
      }
      PublicInterface publicInterface = new PublicInterface();
      publicInterface.FrameOrVv(this, nameList, new List<string> { }, StringId.addSceneLogic, (index) =>
      {
        var sceneSelecetd = sceneList[index];
        Input input = new Input();
        input.sid = sceneSelecetd.sid;
        input.condition_type = "10";
        Dictionary<string, string> dic = new Dictionary<string, string>();
        LogicMethod.CurrLogicMethod.dictionary(dic, "key", "scene");
        LogicMethod.CurrLogicMethod.dictionary(dic, "comparator", "=");
        LogicMethod.CurrLogicMethod.dictionary(dic, "data_type", "string");
        LogicMethod.CurrLogicMethod.dictionary(dic, "value", "on");
        input.condition.Add(dic);
        AddCondition(input);
        LogicMethod.CurrLogicMethod.RemoveAllView();
        AddLogic addLogic = new AddLogic();
        MainPage.BasePageView.AddChidren(addLogic);
        addLogic.Show();
        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
      });
    }
    /// <summary>
    /// 添加地理围栏
    /// </summary>
    /// <param name="flMain">Fl main.</param>
    /// <param name="edit">If set to <c>true</c> edit.</param>
    public void LocationView(FrameLayout flMain, bool edit)
    {
      string strname = "";
      ///通过调试宝给的经纬度<标准GPS>
      double latitude = Entity.DB_ResidenceData.Instance.CurrentRegion.latitude;//纬度
      double longitude = Entity.DB_ResidenceData.Instance.CurrentRegion.longitude;//经度
      LogicMethod.CurrLogicMethod.WGS84_to_GCJ02(Entity.DB_ResidenceData.Instance.CurrentRegion.longitude, Entity.DB_ResidenceData.Instance.CurrentRegion.latitude, out longitude, out latitude);
      int r = 500;//默认半径
      if (edit)
      {
        for (var i = 0; i < Logic.currlogic.input.Count; i++)
        {
            Tag = "Logic";
        }
        public void Show()
        {
            LogicView.TopView topView = new LogicView.TopView();
            this.AddChidren(topView.FLayoutView());
            topView.clickBackBtn.MouseUpEventHandler += (e, sen) =>
            {
                RemoveFromParent();
            };
            topView.topNameBtn.TextID = StringId.selectionCondition;
            FrameLayout viewLayout = new FrameLayout
            {
                Y = Application.GetRealHeight(64),
                Width = Application.GetRealWidth(LogicView.TextSize.view375),
                Height = Application.GetRealHeight(LogicView.TextSize.view667 - 64),
                BackgroundColor = CSS.CSS_Color.viewMiddle,
            };
            this.AddChidren(viewLayout);
            #region 时间  功能 室外变化
            //时间
            LogicView.SelectTypeView timeView = new LogicView.SelectTypeView();
            timeView.btnText.TextID = StringId.time;
            timeView.btnIcon.UnSelectedImagePath = "LogicIcon/time.png";
            if (MainView.IsGatewayType)
            {
                viewLayout.AddChidren(timeView.FLayoutView());
            }
            //功能
            LogicView.SelectTypeView functionView = new LogicView.SelectTypeView();
            functionView.frameLayout.Y = timeView.frameLayout.Bottom;
            functionView.btnText.TextID = StringId.funLogic;
            functionView.btnIcon.UnSelectedImagePath = "LogicIcon/functionicon.png";
            viewLayout.AddChidren(functionView.FLayoutView());
            if (!MainView.IsGatewayType)
            {
                functionView.frameLayout.Y = Application.GetRealHeight(0);
            }
            //场景
            LogicView.SelectTypeView sceneView = new LogicView.SelectTypeView();
            sceneView.frameLayout.Y = functionView.frameLayout.Bottom;
            sceneView.btnText.TextID = StringId.Scenes;
            sceneView.btnIcon.UnSelectedImagePath = "LogicIcon/scene.png";
            viewLayout.AddChidren(sceneView.FLayoutView());
            //室外变化
            LogicView.SelectTypeView shiwaiView = new LogicView.SelectTypeView();
            shiwaiView.frameLayout.Y = sceneView.frameLayout.Bottom;
            shiwaiView.btnText.TextID = StringId.shiwaibainhua;
            shiwaiView.btnIcon.UnSelectedImagePath = "LogicIcon/changesinoutdoor.png";
            if (MainView.IsGatewayType)
            {
                viewLayout.AddChidren(shiwaiView.FLayoutView());
            }
            //地理围栏
            LogicView.SelectTypeView likiadaodaView = new LogicView.SelectTypeView();
            likiadaodaView.frameLayout.Y = shiwaiView.frameLayout.Bottom;
            likiadaodaView.btnText.TextID = StringId.likiadaoda;
            likiadaodaView.btnIcon.UnSelectedImagePath = "LogicIcon/location.png";
            if (MainView.IsGatewayType)
            {
                viewLayout.AddChidren(likiadaodaView.FLayoutView());
            }
            #endregion
            #region  所有点击事件
            //时间
            timeView.btnClick.MouseUpEventHandler += (sen, e) =>
            {
                TimeTpye timeTpye = new TimeTpye();
                MainPage.BasePageView.AddChidren(timeTpye);
                timeTpye.Show();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            //功能
            functionView.btnClick.MouseUpEventHandler += (sen, e) =>
            {
                FunTpye funTpye = new FunTpye();
                MainPage.BasePageView.AddChidren(funTpye);
                funTpye.Show(LogicMethod.condition_if);
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            //场景点击事件
            sceneView.btnClick.MouseUpEventHandler += (sen, e) =>
            {
                SceneMethod();
            };
            //室外变化
            shiwaiView.btnClick.MouseUpEventHandler += (sen, e) =>
            {
                //if (string.IsNullOrEmpty(Entity.DB_ResidenceData.Instance.CurrentRegion.homeAddress))//.longitude == 0 && Entity.DB_ResidenceData.Instance.CurrentRegion.latitude == 0)
                //{
                //    new PublicAssmebly().TipMsg(StringId.tip, StringId.GatewayLocationInformationIsNotConfigured);
                //    return;
                //}
                Weather weather = new Weather();
                MainPage.BasePageView.AddChidren(weather);
                weather.Show();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            //地理围栏
            likiadaodaView.btnClick.MouseUpEventHandler += (sen, e) =>
            {
                LocationView(this, false);
            };
            #endregion
        }
        /// <summary>
        /// 添加场景
        /// </summary>
        public void SceneMethod()
        {
            var sceneList = LogicMethod.CurrLogicMethod.GetSceneList();
            List<string> nameList = new List<string>();
            for (int i = 0; i < sceneList.Count; i++)
            {
                var scene = sceneList[i];
                nameList.Add(scene.name);
            }
            PublicInterface publicInterface = new PublicInterface();
            publicInterface.FrameOrVv(this, nameList, new List<string> { }, StringId.addSceneLogic, (index) =>
            {
                var sceneSelecetd = sceneList[index];
                Input input = new Input();
                input.sid = sceneSelecetd.sid;
                input.condition_type = "10";
                Dictionary<string, string> dic = new Dictionary<string, string>();
                LogicMethod.CurrLogicMethod.dictionary(dic, "key", "scene");
                LogicMethod.CurrLogicMethod.dictionary(dic, "comparator", "=");
                LogicMethod.CurrLogicMethod.dictionary(dic, "data_type", "string");
                LogicMethod.CurrLogicMethod.dictionary(dic, "value", "on");
                input.condition.Add(dic);
                AddCondition(input);
                LogicMethod.CurrLogicMethod.RemoveAllView();
                AddLogic addLogic = new AddLogic();
                MainPage.BasePageView.AddChidren(addLogic);
                addLogic.Show();
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            });
        }
        /// <summary>
        /// 地理围栏View
        /// </summary>
        /// <param name="flMain">Fl main.</param>
        /// <param name="edit">If set to <c>true</c> edit.</param>
        public void LocationView(FrameLayout flMain, bool edit)
        {
            string strname = "";
            ///通过调试宝给的经纬度<标准GPS>
            double latitude = Entity.DB_ResidenceData.Instance.CurrentRegion.latitude;//纬度
            double longitude = Entity.DB_ResidenceData.Instance.CurrentRegion.longitude;//经度
          var input = Logic.currlogic.input[i];
          if (input.condition_type != "8")
          {
            continue;
          }
          if (input.condition[0]["value"] == "arrive")
          {
            //到达某地
            strname = Language.StringByID(StringId.daoda);
          }
          else
          {
            //离开地点
            strname = Language.StringByID(StringId.likai);
          }
          //再一次编辑地理围栏 <控件暂时不支持显示记录上一次的状态>
          if (!string.IsNullOrEmpty(input.geo_fence.latitude) && !string.IsNullOrEmpty(input.geo_fence.longitude))
          {
            ////纬度
            //var latitude1 = Convert.ToDouble(input.geo_fence.latitude);
            ////经度
            //var longitude1 = Convert.ToDouble(input.geo_fence.longitude);
            //半径
            r = int.Parse(input.geo_fence.radius);
            //WGS84坐标转高德坐标
            LogicMethod.CurrLogicMethod.WGS84_to_GCJ02(Entity.DB_ResidenceData.Instance.CurrentRegion.longitude, Entity.DB_ResidenceData.Instance.CurrentRegion.latitude, out longitude, out latitude);
            int r = 500;//半径
            if (edit)
            {
                for (var i = 0; i < Logic.currlogic.input.Count; i++)
                {
                    var input = Logic.currlogic.input[i];
                    if (input.condition_type != "8")
                    {
                        continue;
                    }
                    if (input.condition[0]["value"] == "arrive")
                    {
                        //到达某地
                        strname = Language.StringByID(StringId.daoda);
                    }
                    else
                    {
                        //离开地点
                        strname = Language.StringByID(StringId.likai);
                    }
                    //纬度
                    latitude = Convert.ToDouble(input.geo_fence.latitude);
                    //经度
                    longitude = Convert.ToDouble(input.geo_fence.longitude);
                    //半径
                    r = int.Parse(input.geo_fence.radius);
                }
            }
            PublicInterface publicInterface = new PublicInterface();
            var list = publicInterface.GetViewList("地理围栏");
            publicInterface.SingleSelectionShow(flMain, list, Language.StringByID(StringId.likiadaoda), strname, (str) =>
             {
            //LogicMethod.CurrLogicMethod.WGS84_to_GCJ02(longitude1, latitude1, out longitude, out latitude);
          }
        }
      }
      PublicInterface publicInterface = new PublicInterface();
      var list = publicInterface.GetViewList("地理围栏");
      publicInterface.SingleSelectionShow(flMain, list, Language.StringByID(StringId.likiadaoda), strname, (str) =>
       {
                 string valueStr = "arrive";
                 if (str == Language.StringByID(StringId.daoda))
                 {
                     //到达某地
                     valueStr = "arrive";
                 }
                 else
                 {
                     //离开
                     valueStr = "leave";
                 }
         string valueStr = "arrive";
         if (str == Language.StringByID(StringId.daoda))
         {
           //到达某地
           valueStr = "arrive";
         }
         else
         {
           //离开
           valueStr = "leave";
         }
#if __Android__
                 //申请定位权限
                 ((BaseActivity)Application.Activity).SetGPSLocationPermission((result1) =>
                  {
                      if (result1 == false) { return; }
                    if (result1 == false) { return; }
                  //申请允许程序写入外部存储,如SD卡上写文件
                  ((BaseActivity)Application.Activity).SetPermission((result2) =>
                  {
                      if (result2 == false) { return; }
                    if (result2 == false) { return; }
                       //读取电话状态权限
                       ((BaseActivity)Application.Activity).SetPermission((result3) =>
                       {
                           if (result3 == false) { return; }
                           //调用方法,跳转页面
                           GDMapKit.Show((mLatitude, mLongitude, mRadius, name) =>
                            {
                               //高德坐标转WGS84坐标(高德地图设置GPS)
                               double out_lng, out_lat;
                                LogicMethod.CurrLogicMethod.GCJ02_to_WGS84(mLongitude, mLatitude, out out_lng, out out_lat);
                                Input input = new Input();
                                input.sid = LogicMethod.CurrLogicMethod.NewSid();
                                input.condition_type = "8";
                                Dictionary<string, string> dic = new Dictionary<string, string>();
                                LogicMethod.CurrLogicMethod.dictionary(dic, "key", "direction");
                                LogicMethod.CurrLogicMethod.dictionary(dic, "comparator", "=");
                                LogicMethod.CurrLogicMethod.dictionary(dic, "data_type", "string");
                                LogicMethod.CurrLogicMethod.dictionary(dic, "value", valueStr);
                                input.condition.Add(dic);
                               //纬度
                               input.geo_fence.latitude = out_lat.ToString();
                               //经度
                               input.geo_fence.longitude = out_lng.ToString();
                               //半径<单位米>
                               input.geo_fence.radius = mRadius.ToString();
                                AddCondition(input);
                                LogicMethod.CurrLogicMethod.RemoveAllView();
                                AddLogic addLogic = new AddLogic();
                                MainPage.BasePageView.AddChidren(addLogic);
                                addLogic.Show();
                                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                            }, strname, Language.StringByID(StringId.save), true, latitude, longitude, r);
                         if (result3 == false) { return; }
                         //调用方法,跳转页面
                         Location(valueStr, strname, latitude, longitude, r);
                       }, "android.permission.READ_PHONE_STATE");
                  }, "android.permission.WRITE_EXTERNAL_STORAGE");
                  });
#endif
#if __IOS__
                //调用方法,跳转页面
                GDMapKit.Show((mLatitude, mLongitude, mRadius, name) =>
                {
                   //高德坐标转WGS84坐标(高德地图设置GPS)
                             double out_lng, out_lat;
                             LogicMethod.CurrLogicMethod.GCJ02_to_WGS84(mLongitude, mLatitude, out out_lng, out out_lat);
                              Input input = new Input();
                              input.sid = LogicMethod.CurrLogicMethod.NewSid();
                              input.condition_type = "8";
                              Dictionary<string, string> dic = new Dictionary<string, string>();
                              LogicMethod.CurrLogicMethod.dictionary(dic, "key", "direction");
                              LogicMethod.CurrLogicMethod.dictionary(dic, "comparator", "=");
                              LogicMethod.CurrLogicMethod.dictionary(dic, "data_type", "string");
                              LogicMethod.CurrLogicMethod.dictionary(dic, "value", "arrive");
                              input.condition.Add(dic);
                              //纬度
                              input.geo_fence.latitude = out_lat.ToString();
                              //经度
                              input.geo_fence.longitude = out_lng.ToString();
                              //半径<单位米>
                              input.geo_fence.radius = mRadius.ToString();
                              AddCondition(input);
                              LogicMethod.CurrLogicMethod.RemoveAllView();
                              AddLogic addLogic = new AddLogic();
                              MainPage.BasePageView.AddChidren(addLogic);
                              addLogic.Show();
                              MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                }, strname, Language.StringByID(StringId.save), true, latitude, longitude, r);
               //调用方法,跳转页面
                  Location(valueStr, strname, latitude, longitude, r);
#endif
             });
       });
        }
        /// <summary>
        /// 添加条件
        /// </summary>
        /// <param name="input"></param>
        private void AddCondition(Input input)
        {
            ///记录索引值
            int index = -1;
            for (var i = 0; i < Logic.currlogic.input.Count; i++)
            {
                var condition_type = Logic.currlogic.input[i].condition_type;
                if (condition_type == "10" || condition_type == "8")
                {
                    //支持场景=10,地理围栏=8
                    ///找到标记索引,退出循环体
                    index = i;
                    break;
                }
            }
            if (index != -1)
            {
                //移除旧数据
                Logic.currlogic.input.RemoveAt(index);
                //新数据插入旧数据的位置
                Logic.currlogic.input.Insert(index, input);
            }
            else
            {
                Logic.currlogic.input.Add(input);
            }
        }
    }
    /// <summary>
    /// 地理围栏View
    /// </summary>
    /// <param name="valueStr">进入(arrive)或者离开(leave)</param>
    /// <param name="strname"></param>
    /// <param name="latitude">纬度</param>
    /// <param name="longitude">经度</param>
    /// <param name="r">半径(默认500米)</param>
    private void Location(string valueStr, string strname, double latitude, double longitude, int r)
    {
      if (r == 0)
      {
        //按道理说不会出现
        r = 500;
      }
      //调用方法,跳转页面
      GDMapKit.Show((mLatitude, mLongitude, mRadius, name) =>
      {
        //高德坐标转WGS84坐标(高德地图设置GPS)
        double out_lng, out_lat;
        LogicMethod.CurrLogicMethod.GCJ02_to_WGS84(mLongitude, mLatitude, out out_lng, out out_lat);
        Input input = new Input();
        input.sid = LogicMethod.CurrLogicMethod.NewSid();
        input.condition_type = "8";
        Dictionary<string, string> dic = new Dictionary<string, string>();
        LogicMethod.CurrLogicMethod.dictionary(dic, "key", "direction");
        LogicMethod.CurrLogicMethod.dictionary(dic, "comparator", "=");
        LogicMethod.CurrLogicMethod.dictionary(dic, "data_type", "string");
        LogicMethod.CurrLogicMethod.dictionary(dic, "value", valueStr);
        input.condition.Add(dic);
        //纬度
        input.geo_fence.latitude = out_lat.ToString();
        //经度
        input.geo_fence.longitude = out_lng.ToString();
        //半径<单位米>
        input.geo_fence.radius = mRadius.ToString();
        AddCondition(input);
        LogicMethod.CurrLogicMethod.RemoveAllView();
        AddLogic addLogic = new AddLogic();
        MainPage.BasePageView.AddChidren(addLogic);
        addLogic.Show();
        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
      }, strname, Language.StringByID(StringId.save), true, latitude, longitude, r);
    }
    /// <summary>
    /// 添加条件
    /// </summary>
    /// <param name="input"></param>
    private void AddCondition(Input input)
    {
      ///记录索引值
      int index = -1;
      for (var i = 0; i < Logic.currlogic.input.Count; i++)
      {
        var condition_type = Logic.currlogic.input[i].condition_type;
        if (condition_type == "10" || condition_type == "8")
        {
          //支持场景=10,地理围栏=8
          ///找到标记索引,退出循环体
          index = i;
          break;
        }
      }
      if (index != -1)
      {
        //移除旧数据
        Logic.currlogic.input.RemoveAt(index);
        //新数据插入旧数据的位置
        Logic.currlogic.input.Insert(index, input);
      }
      else
      {
        Logic.currlogic.input.Add(input);
      }
    }
  }
}
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs
@@ -6,893 +6,963 @@
namespace HDL_ON.UI.UI2.Intelligence.Automation
{
    public class LogicMethod
  public class LogicMethod
  {
    /// <summary>
    /// 定义一个静态对象
    /// </summary>
    private static LogicMethod logicMethod = null;
    /// <summary>
    /// 获取静态对象
    /// </summary>
    public static LogicMethod CurrLogicMethod
    {
        /// <summary>
        /// 定义一个静态对象
        /// </summary>
        private static LogicMethod logicMethod = null;
        /// <summary>
        /// 获取静态对象
        /// </summary>
        public static LogicMethod CurrLogicMethod
      get
      {
        if (logicMethod == null)
        {
            get
            {
                if (logicMethod == null)
                {
                    return new LogicMethod();
                }
                return logicMethod;
            }
          return new LogicMethod();
        }
        /// <summary>
        /// 表示是条件
        /// </summary>
        public const string condition_if = "条件";
        /// <summary>
        /// 表示是目标
        /// </summary>
        public const string target_if = "目标";
        /// <summary>
        /// 移除所有"Logic"界面
        /// </summary>
        public void RemoveAllView()
        {
            MainPage.BasePageView.RemoveViewByTag("Logic");
        }
        /// <summary> Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2)</summary>
        /// <param name="data"> The array of bytes to be translated into a string of hex digits. </param>
        /// <returns> Returns a well formatted string of hex digits with spacing. </returns>
        public string byteArrayToHexString(byte[] data)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (byte b in data)
            {
                sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
            }
            return sb.ToString().ToUpper();
        }
        /**
  * int转byte[]
  * 该方法将一个int类型的数据转换为byte[]形式,因为int为32bit,而byte为8bit所以在进行类型转换时,知会获取低8位,
  * 丢弃高24位。通过位移的方式,将32bit的数据转换成4个8bit的数据。注意 &0xff,在这当中,&0xff简单理解为一把剪刀,
  * 将想要获取的8位数据截取出来。
  * @param i 一个int数字
  * @return byte[]
  */
        public byte[] int2ByteArray(int i)
        {
            byte[] result = new byte[4];
            result[0] = (byte)((i >> 24) & 0xFF);
            result[1] = (byte)((i >> 16) & 0xFF);
            result[2] = (byte)((i >> 8) & 0xFF);
            result[3] = (byte)(i & 0xFF);
            return result;
        }
        /// <summary>
        /// 获取时间戳
        /// </summary>
        /// <returns></returns>
        public int getTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return (int)ts.TotalSeconds;
        }
        /// <summary>
        /// 生成逻辑sid方法
        /// </summary>
        public string NewSid()
        {
            string logicId = "";
            try
            {
                string sOidBeginsWith = "000101";//厂商 + 通讯方式
                DateTime dt = DateTime.Now;
                DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2020, 1, 1));
                long m = (long)((dt - startTime).TotalMilliseconds / 10);
                string sTimeSpan = byteArrayToHexString(int2ByteArray(getTimeStamp()));
                logicId = sOidBeginsWith + sTimeSpan;
                logicId += "15";
                logicId += "1501";
                //1501 物模型为逻辑, 0001 表示 1 号逻辑功能
                int maxId = 1;
                for (int i = 0; i < Logic.LogicList.Count; i++)
                {
                    string s = Logic.LogicList[i].sid.Substring(20, 4);
                    int iThisSceneId = Convert.ToInt16(s, 16);
                    if (iThisSceneId > maxId)
                        maxId = iThisSceneId;
                }
                logicId += (maxId + 1).ToString("X4");//逻辑号 两个byte
                logicId += "0000";
            }
            catch
            {
                return logicId;
            }
            return logicId;
        }
        /// <summary>
        /// 封装Dictionary对象
        /// </summary>
        /// <param name="dic">Dictionary类</param>
        /// <param name="key">健</param>
        /// <param name="value">值</param>
        public void dictionary(Dictionary<string, string> dic, string key, string value)
        {
            if (dic.ContainsKey(key)) //判断是否存在键值
            {
                //键存在移除
                dic.Remove(key);
            }
            //添加键值
            dic.Add(key, value);
        }
        /// <summary>
        /// 获取网关房间列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Room> GetGatewayRoomList()
        {
            return HDL_ON.Entity.SpatialInfo.CurrentSpatial.RoomList;
        }
        /// <summary>
        /// 获取网关房间列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Room> GetGatewayRoomList(string name)
        {
            List<Entity.Room> roomList = new List<Entity.Room>();
            Entity.Room room1 = new Entity.Room();
            room1.roomName = name;//自定义默认一个房间名为:6688
            room1.roomId = "6688";//自定义默认id用识别该房间
            roomList.Add(room1);//默认添加到房间列表里
            var roomLists = GetGatewayRoomList();
            for (int i = 0; i < roomLists.Count; i++)
            {
                var room = roomLists[i];
                var devlist = GetRoomDevice(room);
                if (devlist.Count == 0)
                {
                    //过滤掉没有设备的房间;
                    continue;
                }
                roomList.Add(room);
            }
            return roomList;
        }
        /// <summary>
        /// 获取网关设备列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Function> GetGatewayDeviceList()
        {
            return Entity.FunctionList.List.GetDeviceFunctionList();
        }
        /// <summary>
        /// 获取场景列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.Scene> GetSceneList()
        {
            return HDL_ON.Entity.FunctionList.List.scenes;
        }
        /// <summary>
        /// 获取安防列表
        /// </summary>
        /// <returns></returns>
        public List<HDL_ON.Entity.SecurityAlarm> GetSecurityList()
        {
            return FunctionList.List.securities;
        }
        /// <summary>
        /// 获取房间的设备列表
        /// </summary>
        /// <param name="room">当前房间</param>
        /// <returns></returns>
        public List<HDL_ON.Entity.Function> GetRoomDevice(HDL_ON.Entity.Room room)
        {
            List<HDL_ON.Entity.Function> deviceLists = new List<Entity.Function>();
            List<HDL_ON.Entity.Function> lists = GetGatewayDeviceList();
            if (room.roomId == "6688")
            {
                //默认一个房间名:6688
                //显示网关全部设备
                deviceLists = lists;
            }
            else
            {
                for (int i = 0; i < lists.Count; i++)
                {
                    var dev = lists[i];
                    if (dev.roomIds.Find((id) => id == room.roomId) != null)
                    {
                        //添加属于这个房间的设备;
                        deviceLists.Add(dev);
                    }
                }
            }
            return deviceLists;
        }
        /// <summary>
        /// 获取设备(功能)对象
        /// </summary>
        /// <param name="sid">设备唯一标识</param>
        /// <returns></returns>
        public HDL_ON.Entity.Function GetDevice(string sid)
        {
            HDL_ON.Entity.Function device = new Entity.Function() { name = "Unknown" };
            List<HDL_ON.Entity.Function> deviceLists = GetGatewayDeviceList();
            for (int i = 0; i < deviceLists.Count; i++)
            {
                var dev = deviceLists[i];
                if (dev.sid == sid)
                {
                    device = dev;
                    break;
                }
            }
            return device;
        }
        /// <summary>
        /// 获取场景对象
        /// </summary>
        /// <param name="sid">场景唯一标识</param>
        /// <returns></returns>
        public HDL_ON.Entity.Scene GetSecne(string sid)
        {
            HDL_ON.Entity.Scene scene = new Entity.Scene() { name = "Unknown" };
            List<HDL_ON.Entity.Scene> sceneLists = GetSceneList();
            for (int i = 0; i < sceneLists.Count; i++)
            {
                var sce = sceneLists[i];
                if (sce.sid == sid)
                {
                    scene = sce;
                    break;
                }
            }
            return scene;
        }
        /// <summary>
        /// 获取安防对象
        /// </summary>
        /// <param name="sid">安防唯一标识</param>
        /// <returns></returns>
        public HDL_ON.Entity.SecurityAlarm GetSecurity(string sid)
        {
            HDL_ON.Entity.SecurityAlarm security = new Entity.SecurityAlarm() { name = "Unknown" };
            List<HDL_ON.Entity.SecurityAlarm> SecurityLists = GetSecurityList();
            for (int i = 0; i < SecurityLists.Count; i++)
            {
                var sce = SecurityLists[i];
                if (sce.sid == sid)
                {
                    security = sce;
                    break;
                }
            }
            return security;
        }
        /// <summary>
        /// 获取房间名(即是=区域名称)
        /// </summary>
        /// <param name="device">设备</param>
        /// <returns></returns>
        public string GetGetRoomName(HDL_ON.Entity.Function device)
        {
            string roomName = "";
            List<HDL_ON.Entity.Room> roomLists = GetGatewayRoomList();
            for (int i = 0; i < device.roomIds.Count; i++)
            {
                var dev = device.roomIds[i];
                var room = roomLists.Find((c) => c.roomId == dev);
                if (room != null)
                {
                    roomName += room.floorName + "." + room.roomName + ",";
                }
            }
            return roomName.TrimEnd(',');
        }
        #region   动一改四
        /// <summary>
        /// 获取设备类型图标
        /// </summary>
        /// <param name="functionType">设备类型</param>
        /// <returns></returns>
        public string GetIconPath(string functionType)
        {
            string strPath = "";
            switch (functionType)
            {
                case SPK.AirSwitch:
                    {
                        strPath = "FunctionIcon/Icon/electricalbreaker.png";
                    }
                    break;
                case SPK.PanelSocket:
                case SPK.ElectricSocket:
                    {
                        strPath = "FunctionIcon/Icon/electricalsocket.png";
                    }
                    break;
                case SPK.LightSwitch:
                case SPK.LightRGB:
                case SPK.LightRGBW:
                case SPK.LightCCT:
                case SPK.LightDimming:
                    {
                        strPath = "LogicIcon/lightloguc.png";
                    }
                    break;
                case SPK.CurtainSwitch:
                case SPK.CurtainRoller:
                case SPK.CurtainTrietex:
                    {
                        strPath = "LogicIcon/curtainlogic.png";
                    }
                    break;
                case SPK.AcStandard:
                case SPK.HvacAC:
                    {
                        strPath = "LogicIcon/airconditionerlogic.png";
                    }
                    break;
                case SPK.FloorHeatStandard:
                case SPK.HvacFloorHeat:
                    {
                        strPath = "LogicIcon/heatlogic.png";
                    }
                    break;
                case SPK.AirFreshStandard:
                case SPK.HvacAirFresh:
                    {
                        strPath = "LogicIcon/heatlogic.png";
                    }
                    break;
                case SPK.SensorSmoke:
                case SPK.SensorWater:
                case SPK.SensorGas:
                case SPK.SensorDryContact:
                case SPK.SensorDryContact2:
                case SPK.SensorShanLan:
                case SPK.SensorDuiShe:
                case SPK.SensorPir:
                case SPK.SensorDoorWindow:
                case SPK.SensorUtrasonic:
                case SPK.SenesorMegahealth:
                case SPK.SenesorMegahealth2:
                case SPK.SensorEnvironment:
                case SPK.SensorEnvironment2:
                case SPK.SensorEnvironment3:
                case SPK.SensorTemperature:
                case SPK.SensorHumidity:
                case SPK.SensorCO2:
                case SPK.SensorPm25:
                case SPK.SensorTVOC:
                case SPK.SensorHcho:
                    {
                        strPath = "LogicIcon/sensor.png";
                    }
                    break;
            }
            return strPath;
        }
        /// <summary>
        /// 设备类型的列表(灯光类,窗帘类。。。)
        /// </summary>
        /// <param name="deviceList">设备列表</param>
        /// <returns></returns>
        public List<string> GetDeviceTypeList(List<HDL_ON.Entity.Function> deviceList)
        {
            List<string> deviceStrTypeList = new List<string>();
            deviceStrTypeList.Clear();
            ///灯光类
            var lightjosn = deviceList.Find((device) =>
            device.spk == SPK.LightSwitch
            || device.spk == SPK.LightDimming
            || device.spk == SPK.LightCCT
            || device.spk == SPK.LightRGB
            || device.spk == SPK.LightRGBW
            );
            if (lightjosn != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Lights));
            }
            ///窗帘类
            var curtainjosn = deviceList.Find((device) =>
            device.spk == SPK.CurtainSwitch
            || device.spk == SPK.CurtainTrietex
            || device.spk == SPK.CurtainRoller);
            if (curtainjosn != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Curtain));
            }
            ///空调类
            var ac = deviceList.Find((device) => device.spk == SPK.AcStandard || device.spk == SPK.HvacAC);
            if (ac != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.AC));
            }
            ///地暖类
            var floorHeating = deviceList.Find((device) => device.spk == SPK.FloorHeatStandard || device.spk == SPK.HvacFloorHeat);
            if (floorHeating != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.FloorHeating));
            }
            ///新风类
            var airFresh = deviceList.Find((device) => device.spk == SPK.AirFreshStandard || device.spk == SPK.HvacAirFresh);
            if (airFresh != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.AirFresh));
            }
            ///传感器类
            var sensor = deviceList.Find((device) =>
            device.spk == SPK.SensorWater
            || device.spk == SPK.SensorGas
            || device.spk == SPK.SensorSmoke
            || device.spk == SPK.SensorDryContact || device.spk == SPK.SensorDryContact2
            || device.spk == SPK.SensorShanLan
            || device.spk == SPK.SensorDuiShe
            || device.spk == SPK.SensorPir
            || device.spk == SPK.SensorDoorWindow
            || device.spk == SPK.SensorUtrasonic
            || device.spk == SPK.SenesorMegahealth
            || device.spk == SPK.SenesorMegahealth2
            || device.spk == SPK.SensorEnvironment
             || device.spk == SPK.SensorEnvironment2
              || device.spk == SPK.SensorEnvironment3
                || device.spk == SPK.SensorTemperature
                  || device.spk == SPK.SensorHumidity
                    || device.spk == SPK.SensorCO2
                      || device.spk == SPK.SensorPm25
                        || device.spk == SPK.SensorTVOC
                          || device.spk == SPK.SensorHcho
            );
            if (sensor != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Sensor));
            }
            ///家电类
            var electric = deviceList.Find((device) =>
            device.spk == SPK.AirSwitch
            || device.spk == SPK.PanelSocket
            || device.spk == SPK.ElectricSocket
            );
            if (electric != null)
            {
                deviceStrTypeList.Add(Language.StringByID(StringId.Electric));
            }
            return deviceStrTypeList;
        }
        /// <summary>
        /// 设备类型FunctionType列表
        /// </summary>
        /// <param name="deviceType">设备类型(灯光类,窗帘类。)</param>
        /// <returns></returns>
        public List<string> GetDeviceTypeFunctionList(string deviceType)
        {
            List<string> functionTypeList = new List<string>();
            ///灯光类
            if (deviceType == Language.StringByID(StringId.Lights))
            {
                functionTypeList.Add(SPK.LightSwitch);
                functionTypeList.Add(SPK.LightDimming);
                functionTypeList.Add(SPK.LightRGB);
                functionTypeList.Add(SPK.LightRGBW);
                functionTypeList.Add(SPK.LightCCT);
                functionTypeList.Add(SPK.AirSwitch);
                functionTypeList.Add(SPK.PanelSocket);
                functionTypeList.Add(SPK.ElectricSocket);
            }
            ///窗帘类
            else if (deviceType == Language.StringByID(StringId.Curtain))
            {
                functionTypeList.Add(SPK.CurtainSwitch);
                functionTypeList.Add(SPK.CurtainRoller);
                functionTypeList.Add(SPK.CurtainTrietex);
            }
            ///空调类
            else if (deviceType == Language.StringByID(StringId.AC))
            {
                functionTypeList.Add(SPK.AcStandard);
                functionTypeList.Add(SPK.HvacAC);
            }
            ///地暖类
            else if (deviceType == Language.StringByID(StringId.FloorHeating))
            {
                functionTypeList.Add(SPK.FloorHeatStandard); functionTypeList.Add(SPK.HvacFloorHeat);
            }
            ///新风类
            else if (deviceType == Language.StringByID(StringId.AirFresh))
            {
                functionTypeList.Add(SPK.AirFreshStandard); functionTypeList.Add(SPK.HvacAirFresh);
            }
            ///传感器类
            else if (deviceType == Language.StringByID(StringId.Sensor))
            {
                functionTypeList.Add(SPK.SensorSmoke);
                functionTypeList.Add(SPK.SensorWater);
                functionTypeList.Add(SPK.SensorGas);
                functionTypeList.Add(SPK.SensorDryContact); functionTypeList.Add(SPK.SensorDryContact2);
                functionTypeList.Add(SPK.SensorShanLan);
                functionTypeList.Add(SPK.SensorDuiShe);
                functionTypeList.Add(SPK.SensorPir);
                functionTypeList.Add(SPK.SensorDoorWindow);
                functionTypeList.Add(SPK.SensorUtrasonic);
                functionTypeList.Add(SPK.SenesorMegahealth);
                functionTypeList.Add(SPK.SenesorMegahealth2);
                functionTypeList.Add(SPK.SensorEnvironment);
                functionTypeList.Add(SPK.SensorEnvironment2);
                functionTypeList.Add(SPK.SensorEnvironment3);
                functionTypeList.Add(SPK.SensorTemperature);
                functionTypeList.Add(SPK.SensorHumidity);
                functionTypeList.Add(SPK.SensorCO2);
                functionTypeList.Add(SPK.SensorPm25);
                functionTypeList.Add(SPK.SensorTVOC);
                functionTypeList.Add(SPK.SensorHcho);
            }
            ///家电类
            else if (deviceType == Language.StringByID(StringId.Electric))
            {
                functionTypeList.Add(SPK.AirSwitch);
                functionTypeList.Add(SPK.PanelSocket);
                functionTypeList.Add(SPK.ElectricSocket);
            }
            return functionTypeList;
        }
        /// <summary>
        /// 条件/目标支持设备
        /// </summary>
        /// <returns></returns>
        public List<string> GetSupportEquipment(string if_type)
        {
            List<string> deviceTypeList = new List<string>();
            switch (if_type)
            {
                case condition_if:
                    {
                        deviceTypeList.Add(SPK.LightSwitch);
                        deviceTypeList.Add(SPK.LightRGB);
                        deviceTypeList.Add(SPK.LightRGBW);
                        deviceTypeList.Add(SPK.LightDimming);
                        deviceTypeList.Add(SPK.LightCCT);
                        deviceTypeList.Add(SPK.CurtainSwitch);
                        deviceTypeList.Add(SPK.CurtainRoller);
                        deviceTypeList.Add(SPK.CurtainTrietex);
                        deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
                        deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
                        deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
                        deviceTypeList.Add(SPK.SensorSmoke);
                        deviceTypeList.Add(SPK.SensorWater);
                        deviceTypeList.Add(SPK.SensorGas);
                        deviceTypeList.Add(SPK.SensorDryContact); deviceTypeList.Add(SPK.SensorDryContact2);
                        deviceTypeList.Add(SPK.SensorShanLan);
                        deviceTypeList.Add(SPK.SensorDuiShe);
                        deviceTypeList.Add(SPK.SensorPir);
                        deviceTypeList.Add(SPK.SensorDoorWindow);
                        deviceTypeList.Add(SPK.SensorUtrasonic);
                        deviceTypeList.Add(SPK.SenesorMegahealth);
                        deviceTypeList.Add(SPK.SenesorMegahealth2);
                        deviceTypeList.Add(SPK.SensorEnvironment);
                        deviceTypeList.Add(SPK.SensorEnvironment2);
                        deviceTypeList.Add(SPK.SensorEnvironment3);
                        deviceTypeList.Add(SPK.SensorTemperature);
                        deviceTypeList.Add(SPK.SensorHumidity);
                        deviceTypeList.Add(SPK.SensorCO2);
                        deviceTypeList.Add(SPK.SensorPm25);
                        deviceTypeList.Add(SPK.SensorTVOC);
                        deviceTypeList.Add(SPK.SensorHcho);
                        deviceTypeList.Add(SPK.AirSwitch);
                        deviceTypeList.Add(SPK.PanelSocket);
                        deviceTypeList.Add(SPK.ElectricSocket);
                    }
                    break;
                case target_if:
                    {
                        deviceTypeList.Add(SPK.LightSwitch);
                        deviceTypeList.Add(SPK.LightRGB);
                        deviceTypeList.Add(SPK.LightRGBW);
                        deviceTypeList.Add(SPK.LightDimming);
                        deviceTypeList.Add(SPK.LightCCT);
                        deviceTypeList.Add(SPK.CurtainSwitch);
                        deviceTypeList.Add(SPK.CurtainRoller);
                        deviceTypeList.Add(SPK.CurtainTrietex);
                        deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
                        deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
                        deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
                        deviceTypeList.Add(SPK.AirSwitch);
                        deviceTypeList.Add(SPK.PanelSocket);
                        deviceTypeList.Add(SPK.ElectricSocket);
                    }
                    break;
            }
            return deviceTypeList;
        }
        #endregion
        /// <summary>
        /// 显示的设备列表
        /// </summary>
        /// <param name="functionType">源数据列表1</param>
        /// <param name="deviceList">源数据列表2</param>
        /// <returns></returns>
        public List<Entity.Function> GetShowDeviceList(List<string> functionType, List<HDL_ON.Entity.Function> deviceList)
        {
            List<HDL_ON.Entity.Function> devList = new List<Entity.Function>();
            for (int i = 0; i < deviceList.Count; i++)
            {
                var dev = deviceList[i];
                //过滤掉不需要显示的设备
                if (functionType.Contains(dev.spk))
                {
                    devList.Add(dev);
                }
            }
            return devList;
        }
        /// <summary>
        /// 返回最终支持显示出来的设备列表
        /// </summary>
        /// <param name="room">当前房间</param>
        /// <param name="str">判断符(表示=输入设备和输出设备)</param>
        /// <returns></returns>
        public List<Entity.Function> GetFunctionDeviceList(Entity.Room room, string str)
        {
            List<string> functionTypeList = GetSupportEquipment(str);
            //返回房间设备列表
            var roomDeviceList = GetRoomDevice(room);
            //返回最终支持显示出来的设备列表
            var list = GetShowDeviceList(functionTypeList, roomDeviceList);
            return list;
        }
        /// <summary>
        /// 网关ID(获取嘉乐网关ID)
        /// </summary>
        public string GatewayId
        {
            get
            {
                if (Entity.DB_ResidenceData.Instance.HomeGateway == null)
                {
                    return DriverLayer.Control.Ins.GatewayId;
                }
                return Entity.DB_ResidenceData.Instance.HomeGateway.gatewayId;
            }
        }
        /// <summary>
        /// 住宅ID
        /// </summary>
        public string HomeId
        {
            get
            {
                return Entity.DB_ResidenceData.Instance.CurrentRegion.id;
            }
        }
        /// <summary>
        /// 是否为其他主用户分享过来的住宅
        /// </summary>
        public bool IsOthreShare
        {
            get
            {
                return Entity.DB_ResidenceData.Instance.CurrentRegion.isOtherShare;
            }
        }
        #region 高德坐标转WGS84坐标
        /// <summary>
        /// 高德坐标转WGS84坐标
        /// </summary>
        /// <param name="in_lng"></param>
        /// <param name="in_lat"></param>
        /// <param name="out_lng"></param>
        /// <param name="out_lat"></param>
        public void GCJ02_to_WGS84(double in_lng, double in_lat, out double out_lng, out double out_lat)
        {
            if (OutOfChina(in_lat, in_lng))
            {
                out_lng = in_lng;
                out_lat = in_lat;
                return;
            }
            CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
            out_lng = in_lng - out_lng;
            out_lat = in_lat - out_lat;
        }
        #endregion
        #region WGS84坐标转高德坐标
        /// <summary>
        /// WGS84坐标转高德坐标
        /// </summary>
        /// <param name="in_lng">经度</param>
        /// <param name="in_lat">纬度</param>
        /// <param name="out_lng"></param>
        /// <param name="out_lat"></param>
        public void WGS84_to_GCJ02(double in_lng, double in_lat, out double out_lng, out double out_lat)
        {
            if (OutOfChina(in_lat, in_lng))
            {
                out_lng = in_lng;
                out_lat = in_lat;
                return;
            }
            CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
            out_lng = in_lng + out_lng;
            out_lat = in_lat + out_lat;
        }
        #endregion
        /// <summary>
        /// 坐标是否在中国境内
        /// </summary>
        /// <param name="lat"></param>
        /// <param name="lng"></param>
        /// <returns></returns>
        public bool OutOfChina(double lat, double lng)
        {
            if (lng < 72.004 || lng > 137.8347)
                return true;
            if (lat < 0.8293 || lat > 55.8271)
                return true;
            return false;
        }
        /// <summary>
        /// 计算偏差
        /// </summary>
        /// <param name="in_lng"></param>
        /// <param name="in_lat"></param>
        /// <param name="dLng"></param>
        /// <param name="dLat"></param>
        private void CalculateDev(double in_lng, double in_lat, out double dLng, out double dLat)
        {
            dLat = TransformLat(in_lng - 105.0, in_lat - 35.0);
            dLng = TransformLng(in_lng - 105.0, in_lat - 35.0);
            double radLat = in_lat / 180.0 * pi;
            double magic = Math.Sin(radLat);
            magic = 1 - ee * magic * magic;
            double sqrtMagic = Math.Sqrt(magic);
            dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
            dLng = (dLng * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
        }
        private double TransformLat(double x, double y)
        {
            double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
            ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
            return ret;
        }
        private double TransformLng(double x, double y)
        {
            double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
            ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
            ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
            ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
            return ret;
        }
        // 椭球参数-圆周率
        private const double pi = 3.14159265358979324;
        // (北京54)椭球长半轴,卫星椭球坐标投影到平面地图坐标系的投影因子
        private const double a = 6378245.0;
        /*
            * Krasovsky 1940 (北京54)椭球长半轴第一偏心率平方
            * 计算方式:
            * 长半轴:
            * a = 6378245.0
            * 扁率:
            * 1/f = 298.3(变量相关计算为:(a-b)/a)
            * 短半轴:
            * b = 6356863.0188 (变量相关计算方法为:b = a * (1 - f))
            * 第一偏心率平方:
            * e2 = (a^2 - b^2) / a^2;
        */
        private const double ee = 0.00669342162296594323;
        /// <summary>
        /// APP上报GPS经纬度
        /// </summary>
        public void AppLatAndLonEvent()
        {
            Application.LocationAction += (lon, lat) =>
            {
                ////GPS坐标转成高德坐标
                //double out_lng, out_lat;
                //this.WGS84_to_GCJ02(lon, lat, out out_lng, out out_lat);
                //上报经纬度
                this.AutomatedGeofenceStatusReporting(lon, lat);
            };
        }
        /// <summary>
        /// 自动化地理围栏状态上报云端
        /// </summary>
        /// <param name="out_lng">APP GPS经度</param>
        /// <param name="out_lat">APP GPS纬度</param>
        private void AutomatedGeofenceStatusReporting(double out_lng, double out_lat)
        {
            List<LogicData> logicDataList = new List<LogicData>();
            logicDataList.Clear();
            //获取逻辑ID列表
            var idStr = Send.GetLogicIdList();
            if (idStr.Code == "0" && idStr.Data != null && idStr.Data.ToString() != "")
            {
                var date = Newtonsoft.Json.JsonConvert.SerializeObject(idStr.Data);
                logicDataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<LogicData>>(date);
            }
            ///有自动列表才处理
            if (logicDataList.Count>0) {
                ///遍历所有列表
                for (int i = 0; i < logicDataList.Count; i++)
                {
                    var logicDate = logicDataList[i];
                    ///自动化没有配置地理围栏不处理
                    if (string.IsNullOrEmpty(logicDate.geo_fence.latitude) || string.IsNullOrEmpty(logicDate.geo_fence.longitude))
                    {
                        //经纬度为空,认为自动化没有配置地理围栏,不处理;
                        continue;
                    }
                    //自动化纬度
                    double lat = Convert.ToDouble(logicDate.geo_fence.latitude);
                    //自动化经度
                    double lon = Convert.ToDouble(logicDate.geo_fence.longitude);
                    //自动化配置输入条件<地理围栏半径><单位,公里、千米.米>
                    int radius = int.Parse(logicDate.geo_fence.radius);
                    //计算2个经纬度之间的距离
                    int r =Infrastructure.Service.Helper.CalculatedDistance.Distance(out_lat, out_lng, lat, lon);
                    //定义一个局部变量
                    string direction = string.Empty;
                    //两点距离小于配置距离<既自动化配置输入条件地理围栏半径>,说明进入区域
                    if (r<radius) {
                        //到达某地
                        direction = "arrive";
                    } else {
                        //离开
                        direction = "leave";
                    }
                     bool f= Send.GeoFenceStateReport(logicDate.userLogicId,logicDate.sid, direction);
                    //if () { }
                    //Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd);
                }
            }
        }
        return logicMethod;
      }
    }
    /// <summary>
    /// 表示是条件
    /// </summary>
    public const string condition_if = "条件";
    /// <summary>
    /// 表示是目标
    /// </summary>
    public const string target_if = "目标";
    /// <summary>
    /// 移除所有"Logic"界面
    /// </summary>
    public void RemoveAllView()
    {
      MainPage.BasePageView.RemoveViewByTag("Logic");
    }
    /// <summary> Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2)</summary>
    /// <param name="data"> The array of bytes to be translated into a string of hex digits. </param>
    /// <returns> Returns a well formatted string of hex digits with spacing. </returns>
    public string byteArrayToHexString(byte[] data)
    {
      System.Text.StringBuilder sb = new System.Text.StringBuilder();
      foreach (byte b in data)
      {
        sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
      }
      return sb.ToString().ToUpper();
    }
    /**
* int转byte[]
* 该方法将一个int类型的数据转换为byte[]形式,因为int为32bit,而byte为8bit所以在进行类型转换时,知会获取低8位,
* 丢弃高24位。通过位移的方式,将32bit的数据转换成4个8bit的数据。注意 &0xff,在这当中,&0xff简单理解为一把剪刀,
* 将想要获取的8位数据截取出来。
* @param i 一个int数字
* @return byte[]
*/
    public byte[] int2ByteArray(int i)
    {
      byte[] result = new byte[4];
      result[0] = (byte)((i >> 24) & 0xFF);
      result[1] = (byte)((i >> 16) & 0xFF);
      result[2] = (byte)((i >> 8) & 0xFF);
      result[3] = (byte)(i & 0xFF);
      return result;
    }
    /// <summary>
    /// 获取时间戳
    /// </summary>
    /// <returns></returns>
    public int getTimeStamp()
    {
      TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
      return (int)ts.TotalSeconds;
    }
    /// <summary>
    /// 生成逻辑sid方法
    /// </summary>
    public string NewSid()
    {
      string logicId = "";
      try
      {
        string sOidBeginsWith = "000101";//厂商 + 通讯方式
        DateTime dt = DateTime.Now;
        DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2020, 1, 1));
        long m = (long)((dt - startTime).TotalMilliseconds / 10);
        string sTimeSpan = byteArrayToHexString(int2ByteArray(getTimeStamp()));
        logicId = sOidBeginsWith + sTimeSpan;
        logicId += "15";
        logicId += "1501";
        //1501 物模型为逻辑, 0001 表示 1 号逻辑功能
        int maxId = 1;
        for (int i = 0; i < Logic.LogicList.Count; i++)
        {
          string s = Logic.LogicList[i].sid.Substring(20, 4);
          int iThisSceneId = Convert.ToInt16(s, 16);
          if (iThisSceneId > maxId)
            maxId = iThisSceneId;
        }
        logicId += (maxId + 1).ToString("X4");//逻辑号 两个byte
        logicId += "0000";
      }
      catch
      {
        return logicId;
      }
      return logicId;
    }
    /// <summary>
    /// 封装Dictionary对象
    /// </summary>
    /// <param name="dic">Dictionary类</param>
    /// <param name="key">健</param>
    /// <param name="value">值</param>
    public void dictionary(Dictionary<string, string> dic, string key, string value)
    {
      if (dic.ContainsKey(key)) //判断是否存在键值
      {
        //键存在移除
        dic.Remove(key);
      }
      //添加键值
      dic.Add(key, value);
    }
    /// <summary>
    /// 获取网关房间列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Room> GetGatewayRoomList()
    {
      return HDL_ON.Entity.SpatialInfo.CurrentSpatial.RoomList;
    }
    /// <summary>
    /// 获取网关房间列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Room> GetGatewayRoomList(string name)
    {
      List<Entity.Room> roomList = new List<Entity.Room>();
      Entity.Room room1 = new Entity.Room();
      room1.roomName = name;//自定义默认一个房间名为:6688
      room1.roomId = "6688";//自定义默认id用识别该房间
      roomList.Add(room1);//默认添加到房间列表里
      var roomLists = GetGatewayRoomList();
      for (int i = 0; i < roomLists.Count; i++)
      {
        var room = roomLists[i];
        var devlist = GetRoomDevice(room);
        if (devlist.Count == 0)
        {
          //过滤掉没有设备的房间;
          continue;
        }
        roomList.Add(room);
      }
      return roomList;
    }
    /// <summary>
    /// 获取网关设备列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Function> GetGatewayDeviceList()
    {
      return Entity.FunctionList.List.GetDeviceFunctionList();
    }
    /// <summary>
    /// 获取场景列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.Scene> GetSceneList()
    {
      return HDL_ON.Entity.FunctionList.List.scenes;
    }
    /// <summary>
    /// 获取安防列表
    /// </summary>
    /// <returns></returns>
    public List<HDL_ON.Entity.SecurityAlarm> GetSecurityList()
    {
      return FunctionList.List.securities;
    }
    /// <summary>
    /// 获取房间的设备列表
    /// </summary>
    /// <param name="room">当前房间</param>
    /// <returns></returns>
    public List<HDL_ON.Entity.Function> GetRoomDevice(HDL_ON.Entity.Room room)
    {
      List<HDL_ON.Entity.Function> deviceLists = new List<Entity.Function>();
      List<HDL_ON.Entity.Function> lists = GetGatewayDeviceList();
      if (room.roomId == "6688")
      {
        //默认一个房间名:6688
        //显示网关全部设备
        deviceLists = lists;
      }
      else
      {
        for (int i = 0; i < lists.Count; i++)
        {
          var dev = lists[i];
          if (dev.roomIds.Find((id) => id == room.roomId) != null)
          {
            //添加属于这个房间的设备;
            deviceLists.Add(dev);
          }
        }
      }
      return deviceLists;
    }
    /// <summary>
    /// 获取设备(功能)对象
    /// </summary>
    /// <param name="sid">设备唯一标识</param>
    /// <returns></returns>
    public HDL_ON.Entity.Function GetDevice(string sid)
    {
      HDL_ON.Entity.Function device = new Entity.Function() { name = "Unknown" };
      List<HDL_ON.Entity.Function> deviceLists = GetGatewayDeviceList();
      for (int i = 0; i < deviceLists.Count; i++)
      {
        var dev = deviceLists[i];
        if (dev.sid == sid)
        {
          device = dev;
          break;
        }
      }
      return device;
    }
    /// <summary>
    /// 获取场景对象
    /// </summary>
    /// <param name="sid">场景唯一标识</param>
    /// <returns></returns>
    public HDL_ON.Entity.Scene GetSecne(string sid)
    {
      HDL_ON.Entity.Scene scene = new Entity.Scene() { name = "Unknown" };
      List<HDL_ON.Entity.Scene> sceneLists = GetSceneList();
      for (int i = 0; i < sceneLists.Count; i++)
      {
        var sce = sceneLists[i];
        if (sce.sid == sid)
        {
          scene = sce;
          break;
        }
      }
      return scene;
    }
    /// <summary>
    /// 获取安防对象
    /// </summary>
    /// <param name="sid">安防唯一标识</param>
    /// <returns></returns>
    public HDL_ON.Entity.SecurityAlarm GetSecurity(string sid)
    {
      HDL_ON.Entity.SecurityAlarm security = new Entity.SecurityAlarm() { name = "Unknown" };
      List<HDL_ON.Entity.SecurityAlarm> SecurityLists = GetSecurityList();
      for (int i = 0; i < SecurityLists.Count; i++)
      {
        var sce = SecurityLists[i];
        if (sce.sid == sid)
        {
          security = sce;
          break;
        }
      }
      return security;
    }
    /// <summary>
    /// 获取房间名(即是=区域名称)
    /// </summary>
    /// <param name="device">设备</param>
    /// <returns></returns>
    public string GetGetRoomName(HDL_ON.Entity.Function device)
    {
      string roomName = "";
      List<HDL_ON.Entity.Room> roomLists = GetGatewayRoomList();
      for (int i = 0; i < device.roomIds.Count; i++)
      {
        var dev = device.roomIds[i];
        var room = roomLists.Find((c) => c.roomId == dev);
        if (room != null)
        {
          roomName += room.floorName + "." + room.roomName + ",";
        }
      }
      return roomName.TrimEnd(',');
    }
    #region   动一改四
    /// <summary>
    /// 获取设备类型图标
    /// </summary>
    /// <param name="functionType">设备类型</param>
    /// <returns></returns>
    public string GetIconPath(string functionType)
    {
      string strPath = "";
      switch (functionType)
      {
        case SPK.AirSwitch:
          {
            strPath = "FunctionIcon/Icon/electricalbreaker.png";
          }
          break;
        case SPK.PanelSocket:
        case SPK.ElectricSocket:
          {
            strPath = "FunctionIcon/Icon/electricalsocket.png";
          }
          break;
        case SPK.LightSwitch:
        case SPK.LightRGB:
        case SPK.LightRGBW:
        case SPK.LightCCT:
        case SPK.LightDimming:
          {
            strPath = "LogicIcon/lightloguc.png";
          }
          break;
        case SPK.CurtainSwitch:
        case SPK.CurtainRoller:
        case SPK.CurtainTrietex:
          {
            strPath = "LogicIcon/curtainlogic.png";
          }
          break;
        case SPK.AcStandard:
        case SPK.HvacAC:
          {
            strPath = "LogicIcon/airconditionerlogic.png";
          }
          break;
        case SPK.FloorHeatStandard:
        case SPK.HvacFloorHeat:
          {
            strPath = "LogicIcon/heatlogic.png";
          }
          break;
        case SPK.AirFreshStandard:
        case SPK.HvacAirFresh:
          {
            strPath = "LogicIcon/heatlogic.png";
          }
          break;
        case SPK.SensorSmoke:
        case SPK.SensorWater:
        case SPK.SensorGas:
        case SPK.SensorDryContact:
        case SPK.SensorDryContact2:
        case SPK.SensorShanLan:
        case SPK.SensorDuiShe:
        case SPK.SensorPir:
        case SPK.SensorDoorWindow:
        case SPK.SensorUtrasonic:
        case SPK.SenesorMegahealth:
        case SPK.SenesorMegahealth2:
        case SPK.SensorEnvironment:
        case SPK.SensorEnvironment2:
        case SPK.SensorEnvironment3:
        case SPK.SensorTemperature:
        case SPK.SensorHumidity:
        case SPK.SensorCO2:
        case SPK.SensorPm25:
        case SPK.SensorTVOC:
        case SPK.SensorHcho:
          {
            strPath = "LogicIcon/sensor.png";
          }
          break;
      }
      return strPath;
    }
    /// <summary>
    /// 设备类型的列表(灯光类,窗帘类。。。)
    /// </summary>
    /// <param name="deviceList">设备列表</param>
    /// <returns></returns>
    public List<string> GetDeviceTypeList(List<HDL_ON.Entity.Function> deviceList)
    {
      List<string> deviceStrTypeList = new List<string>();
      deviceStrTypeList.Clear();
      ///灯光类
      var lightjosn = deviceList.Find((device) =>
      device.spk == SPK.LightSwitch
      || device.spk == SPK.LightDimming
      || device.spk == SPK.LightCCT
      || device.spk == SPK.LightRGB
      || device.spk == SPK.LightRGBW
      );
      if (lightjosn != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Lights));
      }
      ///窗帘类
      var curtainjosn = deviceList.Find((device) =>
      device.spk == SPK.CurtainSwitch
      || device.spk == SPK.CurtainTrietex
      || device.spk == SPK.CurtainRoller);
      if (curtainjosn != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Curtain));
      }
      ///空调类
      var ac = deviceList.Find((device) => device.spk == SPK.AcStandard || device.spk == SPK.HvacAC);
      if (ac != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.AC));
      }
      ///地暖类
      var floorHeating = deviceList.Find((device) => device.spk == SPK.FloorHeatStandard || device.spk == SPK.HvacFloorHeat);
      if (floorHeating != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.FloorHeating));
      }
      ///新风类
      var airFresh = deviceList.Find((device) => device.spk == SPK.AirFreshStandard || device.spk == SPK.HvacAirFresh);
      if (airFresh != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.AirFresh));
      }
      ///传感器类
      var sensor = deviceList.Find((device) =>
      device.spk == SPK.SensorWater
      || device.spk == SPK.SensorGas
      || device.spk == SPK.SensorSmoke
      || device.spk == SPK.SensorDryContact || device.spk == SPK.SensorDryContact2
      || device.spk == SPK.SensorShanLan
      || device.spk == SPK.SensorDuiShe
      || device.spk == SPK.SensorPir
      || device.spk == SPK.SensorDoorWindow
      || device.spk == SPK.SensorUtrasonic
      || device.spk == SPK.SenesorMegahealth
      || device.spk == SPK.SenesorMegahealth2
      || device.spk == SPK.SensorEnvironment
       || device.spk == SPK.SensorEnvironment2
        || device.spk == SPK.SensorEnvironment3
          || device.spk == SPK.SensorTemperature
            || device.spk == SPK.SensorHumidity
              || device.spk == SPK.SensorCO2
                || device.spk == SPK.SensorPm25
                  || device.spk == SPK.SensorTVOC
                    || device.spk == SPK.SensorHcho
      );
      if (sensor != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Sensor));
      }
      ///家电类
      var electric = deviceList.Find((device) =>
      device.spk == SPK.AirSwitch
      || device.spk == SPK.PanelSocket
      || device.spk == SPK.ElectricSocket
      );
      if (electric != null)
      {
        deviceStrTypeList.Add(Language.StringByID(StringId.Electric));
      }
      return deviceStrTypeList;
    }
    /// <summary>
    /// 设备类型FunctionType列表
    /// </summary>
    /// <param name="deviceType">设备类型(灯光类,窗帘类。)</param>
    /// <returns></returns>
    public List<string> GetDeviceTypeFunctionList(string deviceType)
    {
      List<string> functionTypeList = new List<string>();
      ///灯光类
      if (deviceType == Language.StringByID(StringId.Lights))
      {
        functionTypeList.Add(SPK.LightSwitch);
        functionTypeList.Add(SPK.LightDimming);
        functionTypeList.Add(SPK.LightRGB);
        functionTypeList.Add(SPK.LightRGBW);
        functionTypeList.Add(SPK.LightCCT);
        functionTypeList.Add(SPK.AirSwitch);
        functionTypeList.Add(SPK.PanelSocket);
        functionTypeList.Add(SPK.ElectricSocket);
      }
      ///窗帘类
      else if (deviceType == Language.StringByID(StringId.Curtain))
      {
        functionTypeList.Add(SPK.CurtainSwitch);
        functionTypeList.Add(SPK.CurtainRoller);
        functionTypeList.Add(SPK.CurtainTrietex);
      }
      ///空调类
      else if (deviceType == Language.StringByID(StringId.AC))
      {
        functionTypeList.Add(SPK.AcStandard);
        functionTypeList.Add(SPK.HvacAC);
      }
      ///地暖类
      else if (deviceType == Language.StringByID(StringId.FloorHeating))
      {
        functionTypeList.Add(SPK.FloorHeatStandard); functionTypeList.Add(SPK.HvacFloorHeat);
      }
      ///新风类
      else if (deviceType == Language.StringByID(StringId.AirFresh))
      {
        functionTypeList.Add(SPK.AirFreshStandard); functionTypeList.Add(SPK.HvacAirFresh);
      }
      ///传感器类
      else if (deviceType == Language.StringByID(StringId.Sensor))
      {
        functionTypeList.Add(SPK.SensorSmoke);
        functionTypeList.Add(SPK.SensorWater);
        functionTypeList.Add(SPK.SensorGas);
        functionTypeList.Add(SPK.SensorDryContact); functionTypeList.Add(SPK.SensorDryContact2);
        functionTypeList.Add(SPK.SensorShanLan);
        functionTypeList.Add(SPK.SensorDuiShe);
        functionTypeList.Add(SPK.SensorPir);
        functionTypeList.Add(SPK.SensorDoorWindow);
        functionTypeList.Add(SPK.SensorUtrasonic);
        functionTypeList.Add(SPK.SenesorMegahealth);
        functionTypeList.Add(SPK.SenesorMegahealth2);
        functionTypeList.Add(SPK.SensorEnvironment);
        functionTypeList.Add(SPK.SensorEnvironment2);
        functionTypeList.Add(SPK.SensorEnvironment3);
        functionTypeList.Add(SPK.SensorTemperature);
        functionTypeList.Add(SPK.SensorHumidity);
        functionTypeList.Add(SPK.SensorCO2);
        functionTypeList.Add(SPK.SensorPm25);
        functionTypeList.Add(SPK.SensorTVOC);
        functionTypeList.Add(SPK.SensorHcho);
      }
      ///家电类
      else if (deviceType == Language.StringByID(StringId.Electric))
      {
        functionTypeList.Add(SPK.AirSwitch);
        functionTypeList.Add(SPK.PanelSocket);
        functionTypeList.Add(SPK.ElectricSocket);
      }
      return functionTypeList;
    }
    /// <summary>
    /// 条件/目标支持设备
    /// </summary>
    /// <returns></returns>
    public List<string> GetSupportEquipment(string if_type)
    {
      List<string> deviceTypeList = new List<string>();
      switch (if_type)
      {
        case condition_if:
          {
            deviceTypeList.Add(SPK.LightSwitch);
            deviceTypeList.Add(SPK.LightRGB);
            deviceTypeList.Add(SPK.LightRGBW);
            deviceTypeList.Add(SPK.LightDimming);
            deviceTypeList.Add(SPK.LightCCT);
            deviceTypeList.Add(SPK.CurtainSwitch);
            deviceTypeList.Add(SPK.CurtainRoller);
            deviceTypeList.Add(SPK.CurtainTrietex);
            deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
            deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
            deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
            deviceTypeList.Add(SPK.SensorSmoke);
            deviceTypeList.Add(SPK.SensorWater);
            deviceTypeList.Add(SPK.SensorGas);
            deviceTypeList.Add(SPK.SensorDryContact); deviceTypeList.Add(SPK.SensorDryContact2);
            deviceTypeList.Add(SPK.SensorShanLan);
            deviceTypeList.Add(SPK.SensorDuiShe);
            deviceTypeList.Add(SPK.SensorPir);
            deviceTypeList.Add(SPK.SensorDoorWindow);
            deviceTypeList.Add(SPK.SensorUtrasonic);
            deviceTypeList.Add(SPK.SenesorMegahealth);
            deviceTypeList.Add(SPK.SenesorMegahealth2);
            deviceTypeList.Add(SPK.SensorEnvironment);
            deviceTypeList.Add(SPK.SensorEnvironment2);
            deviceTypeList.Add(SPK.SensorEnvironment3);
            deviceTypeList.Add(SPK.SensorTemperature);
            deviceTypeList.Add(SPK.SensorHumidity);
            deviceTypeList.Add(SPK.SensorCO2);
            deviceTypeList.Add(SPK.SensorPm25);
            deviceTypeList.Add(SPK.SensorTVOC);
            deviceTypeList.Add(SPK.SensorHcho);
            deviceTypeList.Add(SPK.AirSwitch);
            deviceTypeList.Add(SPK.PanelSocket);
            deviceTypeList.Add(SPK.ElectricSocket);
          }
          break;
        case target_if:
          {
            deviceTypeList.Add(SPK.LightSwitch);
            deviceTypeList.Add(SPK.LightRGB);
            deviceTypeList.Add(SPK.LightRGBW);
            deviceTypeList.Add(SPK.LightDimming);
            deviceTypeList.Add(SPK.LightCCT);
            deviceTypeList.Add(SPK.CurtainSwitch);
            deviceTypeList.Add(SPK.CurtainRoller);
            deviceTypeList.Add(SPK.CurtainTrietex);
            deviceTypeList.Add(SPK.AcStandard); deviceTypeList.Add(SPK.HvacAC);
            deviceTypeList.Add(SPK.FloorHeatStandard); deviceTypeList.Add(SPK.HvacFloorHeat);
            deviceTypeList.Add(SPK.AirFreshStandard); deviceTypeList.Add(SPK.HvacAirFresh);
            deviceTypeList.Add(SPK.AirSwitch);
            deviceTypeList.Add(SPK.PanelSocket);
            deviceTypeList.Add(SPK.ElectricSocket);
          }
          break;
      }
      return deviceTypeList;
    }
    #endregion
    /// <summary>
    /// 显示的设备列表
    /// </summary>
    /// <param name="functionType">源数据列表1</param>
    /// <param name="deviceList">源数据列表2</param>
    /// <returns></returns>
    public List<Entity.Function> GetShowDeviceList(List<string> functionType, List<HDL_ON.Entity.Function> deviceList)
    {
      List<HDL_ON.Entity.Function> devList = new List<Entity.Function>();
      for (int i = 0; i < deviceList.Count; i++)
      {
        var dev = deviceList[i];
        //过滤掉不需要显示的设备
        if (functionType.Contains(dev.spk))
        {
          devList.Add(dev);
        }
      }
      return devList;
    }
    /// <summary>
    /// 返回最终支持显示出来的设备列表
    /// </summary>
    /// <param name="room">当前房间</param>
    /// <param name="str">判断符(表示=输入设备和输出设备)</param>
    /// <returns></returns>
    public List<Entity.Function> GetFunctionDeviceList(Entity.Room room, string str)
    {
      List<string> functionTypeList = GetSupportEquipment(str);
      //返回房间设备列表
      var roomDeviceList = GetRoomDevice(room);
      //返回最终支持显示出来的设备列表
      var list = GetShowDeviceList(functionTypeList, roomDeviceList);
      return list;
    }
    /// <summary>
    /// 网关ID(获取嘉乐网关ID)
    /// </summary>
    public string GatewayId
    {
      get
      {
        if (Entity.DB_ResidenceData.Instance.HomeGateway == null)
        {
          return DriverLayer.Control.Ins.GatewayId;
        }
        return Entity.DB_ResidenceData.Instance.HomeGateway.gatewayId;
      }
    }
    /// <summary>
    /// 住宅ID
    /// </summary>
    public string HomeId
    {
      get
      {
        return Entity.DB_ResidenceData.Instance.CurrentRegion.id;
      }
    }
    /// <summary>
    /// 是否为其他主用户分享过来的住宅
    /// </summary>
    public bool IsOthreShare
    {
      get
      {
        return Entity.DB_ResidenceData.Instance.CurrentRegion.isOtherShare;
      }
    }
    #region 高德坐标转WGS84坐标
    /// <summary>
    /// 高德坐标转WGS84坐标
    /// </summary>
    /// <param name="in_lng"></param>
    /// <param name="in_lat"></param>
    /// <param name="out_lng"></param>
    /// <param name="out_lat"></param>
    public void GCJ02_to_WGS84(double in_lng, double in_lat, out double out_lng, out double out_lat)
    {
      if (OutOfChina(in_lat, in_lng))
      {
        out_lng = in_lng;
        out_lat = in_lat;
        return;
      }
      CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
      out_lng = in_lng - out_lng;
      out_lat = in_lat - out_lat;
    }
    #endregion
    #region WGS84坐标转高德坐标
    /// <summary>
    /// WGS84坐标转高德坐标
    /// </summary>
    /// <param name="in_lng">经度</param>
    /// <param name="in_lat">纬度</param>
    /// <param name="out_lng"></param>
    /// <param name="out_lat"></param>
    public void WGS84_to_GCJ02(double in_lng, double in_lat, out double out_lng, out double out_lat)
    {
      if (OutOfChina(in_lat, in_lng))
      {
        out_lng = in_lng;
        out_lat = in_lat;
        return;
      }
      CalculateDev(in_lng, in_lat, out out_lng, out out_lat);
      out_lng = in_lng + out_lng;
      out_lat = in_lat + out_lat;
    }
    #endregion
    /// <summary>
    /// 坐标是否在中国境内
    /// </summary>
    /// <param name="lat"></param>
    /// <param name="lng"></param>
    /// <returns></returns>
    public bool OutOfChina(double lat, double lng)
    {
      if (lng < 72.004 || lng > 137.8347)
        return true;
      if (lat < 0.8293 || lat > 55.8271)
        return true;
      return false;
    }
    /// <summary>
    /// 计算偏差
    /// </summary>
    /// <param name="in_lng"></param>
    /// <param name="in_lat"></param>
    /// <param name="dLng"></param>
    /// <param name="dLat"></param>
    private void CalculateDev(double in_lng, double in_lat, out double dLng, out double dLat)
    {
      dLat = TransformLat(in_lng - 105.0, in_lat - 35.0);
      dLng = TransformLng(in_lng - 105.0, in_lat - 35.0);
      double radLat = in_lat / 180.0 * pi;
      double magic = Math.Sin(radLat);
      magic = 1 - ee * magic * magic;
      double sqrtMagic = Math.Sqrt(magic);
      dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
      dLng = (dLng * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
    }
    private double TransformLat(double x, double y)
    {
      double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.Sqrt(Math.Abs(x));
      ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
      ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
      ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
      return ret;
    }
    private double TransformLng(double x, double y)
    {
      double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.Sqrt(Math.Abs(x));
      ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
      ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
      ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0 * pi)) * 2.0 / 3.0;
      return ret;
    }
    // 椭球参数-圆周率
    private const double pi = 3.14159265358979324;
    // (北京54)椭球长半轴,卫星椭球坐标投影到平面地图坐标系的投影因子
    private const double a = 6378245.0;
    /*
        * Krasovsky 1940 (北京54)椭球长半轴第一偏心率平方
        * 计算方式:
        * 长半轴:
        * a = 6378245.0
        * 扁率:
        * 1/f = 298.3(变量相关计算为:(a-b)/a)
        * 短半轴:
        * b = 6356863.0188 (变量相关计算方法为:b = a * (1 - f))
        * 第一偏心率平方:
        * e2 = (a^2 - b^2) / a^2;
    */
    private const double ee = 0.00669342162296594323;
    /// <summary>
    /// APP上报GPS经纬度
    /// </summary>
    /// <param name="lon">APP GPS经度</param>
    /// <param name="lat">APP GPS纬度</param>
    public void AppLatAndLonEvent(double lon, double lat)
    {
      Console.WriteLine($"GPS经度===={lon}  \nGPS纬度===={lat}");
      //Application.LocationAction += (lon, lat) =>
      //{
      //  Console.WriteLine($"GPS经度===={lon}");
      //  Console.WriteLine($"GPS纬度===={lat}");
      //  ////GPS坐标转成高德坐标
      //  //double out_lng, out_lat;
      //  //this.WGS84_to_GCJ02(lon, lat, out out_lng, out out_lat);
      //  //上报经纬度
      //  this.AutomatedGeofenceStatusReporting(lon, lat);
      //};
      //上报经纬度<gps 上报条件大于30秒且移动距离大于100米,上报经纬度>
      this.AutomatedGeofenceStatusReporting(lon, lat);
    }
    /// <summary>
    /// 自动化地理围栏状态上报云端
    /// </summary>
    /// <param name="out_lng">APP GPS经度</param>
    /// <param name="out_lat">APP GPS纬度</param>
    private void AutomatedGeofenceStatusReporting(double out_lng, double out_lat)
    {
      if (IsOthreShare)
      {
        //不是主账号直接返回
        return;
      }
      List<LogicData> logicDataList = new List<LogicData>();
      logicDataList.Clear();
      System.Threading.Tasks.Task.Run(() =>
      {
        try
        {
          //获取逻辑ID列表,目前针对所有<备注:如果只针对当前手机的话,可以直接拿缓存数据自动化列表遍历>
          var idStr = Send.GetLogicIdList();
          if (idStr.Code == "0" && idStr.Data != null && idStr.Data.ToString() != "")
          {
            var date = Newtonsoft.Json.JsonConvert.SerializeObject(idStr.Data);
            logicDataList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<LogicData>>(date);
          }
          ///有自动列表才处理
          if (logicDataList.Count > 0)
          {
            ///遍历所有列表
            for (int i = 0; i < logicDataList.Count; i++)
            {
              var logicDate = logicDataList[i];
              ///自动化没有配置地理围栏不处理
              if (string.IsNullOrEmpty(logicDate.geo_fence.latitude) || string.IsNullOrEmpty(logicDate.geo_fence.longitude))
              {
                //经纬度为空,认为自动化没有配置地理围栏,不处理;
                continue;
              }
              //自动化配置输入条件纬度
              double lat = Convert.ToDouble(logicDate.geo_fence.latitude);
              //自动化配置输入条件经度
              double lon = Convert.ToDouble(logicDate.geo_fence.longitude);
              //自动化配置输入条件<地理围栏半径><单位,公里、千米.米>
              int radius = int.Parse(logicDate.geo_fence.radius);
              //计算2个经纬度之间的距离
              int r = Infrastructure.Service.Helper.CalculatedDistance.Distance(out_lat, out_lng, lat, lon);
              //定义一个局部变量
              string direction = string.Empty;
              //两点距离小于配置距离<既自动化配置输入条件地理围栏半径>,说明进入区域
              if (r < radius)
              {
                //到达某地
                direction = "arrive";
              }
              else
              {
                //离开
                direction = "leave";
              }
              ///遍历缓存列表<不为空说明数据已经推送过,不再推送>
              var isPush = pushList.Find((o) => o.homeId == HomeId && o.userId == UserInfo.Current.ID && o.userLogicId == logicDate.userLogicId && o.arriveOnLeave == direction);
              if (isPush == null)
              {
                //推送给云端是否成功
                bool push = Send.GeoFenceStateReport(logicDate.userLogicId, logicDate.sid, direction);
                if (push)
                {
                  ///添加到推送列表
                  pushList.Add(new Push
                  {
                    homeId = HomeId,
                    userId = UserInfo.Current.ID,
                    userLogicId = logicDate.userLogicId,
                    sid = logicDate.sid,
                    arriveOnLeave = direction,
                  });
                }
              }
            }
          }
        }
        catch { }
      });
    }
    /// <summary>
    /// 推送列表<这里数据已经推送过>
    /// </summary>
    private static List<Push> pushList = new List<Push>();
  }
  public class Push
  {
    /// <summary>
    /// 云端唯一id
    /// </summary>
    public string userLogicId = "";
    /// <summary>
    /// 网关id
    /// </summary>
    public string gatewayId = "";
    /// <summary>
    /// 逻辑唯一标识
    /// </summary>
    public string sid = "";
    /// <summary>
    /// 住宅id
    /// </summary>
    public string homeId = "";
    /// <summary>
    /// 到达某地 离开
    /// </summary>
    public string arriveOnLeave = "";
    /// <summary>
    ///  用户id
    /// </summary>
    public string userId = "";
  }
}
HDL_ON/UI/UI2/3-Intelligence/Automation/Send.cs
@@ -8,407 +8,406 @@
namespace HDL_ON.UI.UI2.Intelligence.Automation
{
    public  class Send
  public class Send
  {
    /// <summary>
    /// 调用获取住宅子账号列表
    /// </summary>
    public static List<ResidenceMemberInfo> GetResidenceMemberAccount()
    {
        /// <summary>
        /// 调用获取住宅子账号列表
        /// </summary>
        public static List<ResidenceMemberInfo> GetResidenceMemberAccount()
      var responePack = new HttpServerRequest().GetResidenceMemberAccount();
      if (responePack.Code == StateCode.SUCCESS)
      {
        return Newtonsoft.Json.JsonConvert.DeserializeObject<List<ResidenceMemberInfo>>(responePack.Data.ToString());
      }
      //失败
      else
      {
        //提示
        IMessageCommon.Current.ShowErrorInfoAlter(responePack.Code);
      }
      return new List<ResidenceMemberInfo>();
    }
    /// <summary>
    /// 获取逻辑ID列表
    /// </summary>
    /// <returns></returns>
    public static ResponsePackNew GetLogicIdList()
    {
      var jObject = new JObject { { "homeId", LogicMethod.CurrLogicMethod.HomeId } };
      var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_List);
      //如果是token过期则刷新token
      if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
      {
        RefreshToken();
        GetLogicIdList();
      }
      return responsePackNew;
    }
    /// <summary>
    /// 获取逻辑
    /// </summary>
    /// <param name="listIdList">逻辑ID列表</param>
    /// <returns></returns>
    public static ResponsePackNew GetLogic(List<string> listIdList)
    {
      var jArray = new JArray { };
      for (int i = 0; i < listIdList.Count; i++)
      {
        jArray.Add(listIdList[i]);
      }
      var jObject = new JObject { { "userLogicIds", jArray } };
      var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Info);
      //如果是token过期则刷新token
      if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
      {
        RefreshToken();
        GetLogic(listIdList);
      }
      return responsePackNew;
    }
    /// <summary>
    /// 添加自动化命令
    /// </summary>
    /// <param name="logic"></param>
    /// <returns></returns>
    public static ResponsePackNew AddLogic(Logic logic)
    {
      ResponsePackNew responsePackNew = null;
      try
      {
        var cycleJObject = new JObject { };
        var cyclevaluejArray = new JArray { };
        cycleJObject.Add("type", logic.cycle.type);
        foreach (var dictionary in logic.cycle.value)
        {
          cyclevaluejArray.Add(dictionary);
        }
        cycleJObject.Add("value", cyclevaluejArray);
            var responePack = new HttpServerRequest().GetResidenceMemberAccount();
            if (responePack.Code == StateCode.SUCCESS)
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<List<ResidenceMemberInfo>>(responePack.Data.ToString());
            }
            //失败
            else
            {
                //提示
                IMessageCommon.Current.ShowErrorInfoAlter(responePack.Code);
            }
            return new List<ResidenceMemberInfo>();
        var inputArray = new JArray { };
        foreach (var dictionary in logic.input)
        {
          var inputTypeJOb = new JObject { };
          inputTypeJOb.Add("sid", dictionary.sid);
          inputTypeJOb.Add("condition_type", dictionary.condition_type);
          var conditionArray = new JArray { };
          foreach (var dic in dictionary.condition)
          {
            var conditionJOb = new JObject { };
            conditionJOb.Add("key", dic["key"]);
            conditionJOb.Add("comparator", dic["comparator"]);
            conditionJOb.Add("data_type", dic["data_type"]);
            conditionJOb.Add("value", dic["value"]);
            conditionArray.Add(conditionJOb);
          }
          inputTypeJOb.Add("condition", conditionArray);
          if (dictionary.condition_type == "8")
          {
            ///地理围栏
            var geo_fencejob = new JObject();
            geo_fencejob.Add("longitude", dictionary.geo_fence.longitude);
            geo_fencejob.Add("latitude", dictionary.geo_fence.latitude);
            geo_fencejob.Add("radius", dictionary.geo_fence.radius);
            inputTypeJOb.Add("geo_fence", geo_fencejob);
          }
          inputArray.Add(inputTypeJOb);
        }
        /// <summary>
        /// 获取逻辑ID列表
        /// </summary>
        /// <returns></returns>
        public static ResponsePackNew GetLogicIdList()
        var outputArray = new JArray { };
        foreach (var dictionary in logic.output)
        {
            var jObject = new JObject { { "homeId", LogicMethod.CurrLogicMethod.HomeId } };
            var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_List);
            //如果是token过期则刷新token
            if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
            {
                RefreshToken();
                GetLogicIdList();
            }
            return responsePackNew;
        }
        /// <summary>
        /// 获取逻辑
        /// </summary>
        /// <param name="listIdList">逻辑ID列表</param>
        /// <returns></returns>
        public static ResponsePackNew GetLogic(List<string> listIdList)
        {
            var jArray = new JArray { };
            for (int i = 0; i < listIdList.Count; i++)
            {
                jArray.Add(listIdList[i]);
            }
            var jObject = new JObject { { "userLogicIds", jArray } };
            var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Info);
            //如果是token过期则刷新token
            if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
            {
                RefreshToken();
                GetLogic(listIdList);
            }
            return responsePackNew;
        }
        /// <summary>
        /// 添加自动化命令
        /// </summary>
        /// <param name="logic"></param>
        /// <returns></returns>
        public static ResponsePackNew AddLogic(Logic logic)
        {
            ResponsePackNew responsePackNew = null;
            try
            {
                var cycleJObject = new JObject { };
                var cyclevaluejArray = new JArray { };
                cycleJObject.Add("type", logic.cycle.type);
                foreach (var dictionary in logic.cycle.value)
                {
                    cyclevaluejArray.Add(dictionary);
                }
                cycleJObject.Add("value", cyclevaluejArray);
                var inputArray = new JArray { };
                foreach (var dictionary in logic.input)
                {
                    var inputTypeJOb = new JObject { };
                    inputTypeJOb.Add("sid", dictionary.sid);
                    inputTypeJOb.Add("condition_type", dictionary.condition_type);
                    var conditionArray = new JArray { };
                    foreach (var dic in dictionary.condition)
                    {
                        var conditionJOb = new JObject { };
                        conditionJOb.Add("key", dic["key"]);
                        conditionJOb.Add("comparator", dic["comparator"]);
                        conditionJOb.Add("data_type", dic["data_type"]);
                        conditionJOb.Add("value", dic["value"]);
                        conditionArray.Add(conditionJOb);
                    }
                    inputTypeJOb.Add("condition",conditionArray);
                    if (dictionary.condition_type=="8") {
                        ///地理围栏
                        var geo_fencejob = new JObject();
                        geo_fencejob.Add("longitude", dictionary.geo_fence.longitude);
                        geo_fencejob.Add("latitude", dictionary.geo_fence.latitude);
                        geo_fencejob.Add("radius", dictionary.geo_fence.radius);
                        inputTypeJOb.Add("geo_fence", geo_fencejob);
                    }
                    inputArray.Add(inputTypeJOb);
                }
                var outputArray = new JArray { };
                foreach (var dictionary in logic.output)
                {
                    var outputTypeJOb = new JObject { };
                    outputTypeJOb.Add("sid", dictionary.sid);
                    outputTypeJOb.Add("delay", dictionary.delay);
                    outputTypeJOb.Add("target_type", dictionary.target_type);
                    var statusArray = new JArray { };
                    foreach (var dic in dictionary.status)
                    {
                        var statusJOb = new JObject { };
                        statusJOb.Add("key", dic["key"]);
                        statusJOb.Add("value", dic["value"]);
                        statusArray.Add(statusJOb);
                    }
                    outputTypeJOb.Add("status", statusArray);
                    outputArray.Add(outputTypeJOb);
                }
                var noticeConfigJObject = new JObject();
                noticeConfigJObject.Add("enable", logic.noticeConfig.enable);
                noticeConfigJObject.Add("noticeContent", logic.noticeConfig.noticeContent);
                var pushConfigsArray = new JArray { };
                if (logic.pushConfigs.Count > 0)
                {   // 推送文本
                    foreach (var pushConfig in logic.pushConfigs)
                    {
                        var pushConfigJob = new JObject { };
                        pushConfigJob.Add("pushMethod", pushConfig.pushMethod);
                        var accountArray = new JArray { };
                        foreach (var account in pushConfig.pushTarget)
                        {
                            accountArray.Add(account);
                        }
                        pushConfigJob.Add("pushTarget", accountArray);
                        pushConfigsArray.Add(pushConfigJob);
                    }
                }
                var logicjArray = new JArray { };
                var logicIfon = new JObject { };
                logicIfon.Add("sid", logic.sid);
                logicIfon.Add("gatewayId", LogicMethod.CurrLogicMethod.GatewayId);
                logicIfon.Add("name", logic.name);
                logicIfon.Add("relation", logic.relation);
                logicIfon.Add("enable", logic.enable);
                logicIfon.Add("cycle", cycleJObject);
                logicIfon.Add("input", inputArray);
                logicIfon.Add("output", outputArray);
                logicIfon.Add("noticeConfig", noticeConfigJObject);
                logicIfon.Add("pushConfigs", pushConfigsArray);
                logicjArray.Add(logicIfon);
                var jObject = new JObject { { "homeId", LogicMethod.CurrLogicMethod.HomeId }, { "logics", logicjArray } };
                responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Add,5);
                //如果是token过期则刷新token
                if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
                {
                    RefreshToken();
                    AddLogic(logic);
                }
            }
            catch (Exception e)
            {
                var dd = e.Message;
            }
            return responsePackNew;
        }
        /// <summary>
        /// 编辑更新逻辑
        /// </summary>
        /// <param name="logic"></param>
        /// <returns></returns>
        public static ResponsePackNew UpdateLogic(Logic logic)
        {
            ResponsePackNew responsePackNew = null;
            try
            {
                var cycleJObject = new JObject { };
                var cyclevaluejArray = new JArray { };
                cycleJObject.Add("type", logic.cycle.type);
                foreach (var dictionary in logic.cycle.value)
                {
                    cyclevaluejArray.Add(dictionary);
                }
                cycleJObject.Add("value", cyclevaluejArray);
                var inputArray = new JArray { };
                foreach (var dictionary in logic.input)
                {
                    var inputTypeJOb = new JObject { };
                    inputTypeJOb.Add("sid", dictionary.sid);
                    inputTypeJOb.Add("condition_type", dictionary.condition_type);
                    var conditionArray = new JArray { };
                    foreach (var dic in dictionary.condition)
                    {
                        var conditionJOb = new JObject { };
                        conditionJOb.Add("key", dic["key"]);
                        var c1 = "";
                        dic.TryGetValue("comparator", out c1);
                        c1 = string.IsNullOrEmpty(c1) ? "" : c1;
                        conditionJOb.TryAdd("comparator", c1);
                        conditionJOb.Add("data_type", dic["data_type"]);
                        conditionJOb.Add("value", dic["value"]);
                        conditionArray.Add(conditionJOb);
                        if (dictionary.condition_type == "8")
                        {
                            ///地理围栏
                            var geo_fencejob = new JObject();
                            geo_fencejob.Add("longitude", dictionary.geo_fence.longitude);
                            geo_fencejob.Add("latitude", dictionary.geo_fence.latitude);
                            geo_fencejob.Add("radius", dictionary.geo_fence.radius);
                            inputTypeJOb.Add("geo_fence", geo_fencejob);
                        }
                    }
                    inputTypeJOb.Add("condition", conditionArray);
                    inputArray.Add(inputTypeJOb);
                }
                var outputArray = new JArray { };
                foreach (var dictionary in logic.output)
                {
                    var outputTypeJOb = new JObject { };
                    outputTypeJOb.Add("sid", dictionary.sid);
                    outputTypeJOb.Add("delay", dictionary.delay);
                    outputTypeJOb.Add("target_type", dictionary.target_type);
                    var statusArray = new JArray { };
                    foreach (var dic in dictionary.status)
                    {
                        var statusJOb = new JObject { };
                        statusJOb.Add("key", dic["key"]);
                        statusJOb.Add("value", dic["value"]);
                        statusArray.Add(statusJOb);
                    }
                    outputTypeJOb.Add("status", statusArray);
                    outputArray.Add(outputTypeJOb);
                }
                var noticeConfigJObject = new JObject();
                noticeConfigJObject.Add("enable", logic.noticeConfig.enable);
                noticeConfigJObject.Add("noticeContent", logic.noticeConfig.noticeContent);
                var pushConfigsArray = new JArray { };
                if (logic.pushConfigs.Count > 0)
                {
                    // 推送文本
                    foreach (var pushConfig in logic.pushConfigs)
                    {
                        var pushConfigJob = new JObject { };
                        pushConfigJob.Add("pushMethod", pushConfig.pushMethod);
                        var accountArray = new JArray { };
                        foreach (var account in pushConfig.pushTarget)
                        {
                            accountArray.Add(account);
                        }
                        pushConfigJob.Add("pushTarget", accountArray);
                        pushConfigsArray.Add(pushConfigJob);
                    }
                }
                var logicjArray = new JArray { };
                var logicIfon = new JObject { };
                logicIfon.Add("userLogicId", logic.userLogicId);
                logicIfon.Add("sid", logic.sid);
                logicIfon.Add("gatewayId", LogicMethod.CurrLogicMethod.GatewayId);
                logicIfon.Add("name", logic.name);
                logicIfon.Add("relation", logic.relation);
                logicIfon.Add("enable", logic.enable);
                logicIfon.Add("cycle", cycleJObject);
                logicIfon.Add("input", inputArray);
                logicIfon.Add("output", outputArray);
                logicIfon.Add("noticeConfig", noticeConfigJObject);
                logicIfon.Add("pushConfigs", pushConfigsArray);
                logicjArray.Add(logicIfon);
                var jObject = new JObject { { "homeId", LogicMethod.CurrLogicMethod.HomeId }, { "logics", logicjArray } };
                string str = jObject.ToString();
                responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Update,5);
                //如果是token过期则刷新token
                if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
                {
                    RefreshToken();
                    UpdateLogic(logic);
                }
            }
            catch (Exception e)
            {
                var dd = e.Message;
            }
            return responsePackNew;
        }
        /// <summary>
        /// 删除逻辑
        /// </summary>
        /// <returns></returns>
        public static ResponsePackNew DelLogic(Logic logic)
        {
            var jArray = new JArray { };
            jArray.Add(logic.userLogicId);
            var jObject = new JObject { { "userLogicIds", jArray } };
            var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Delete);
            //如果是token过期则刷新token
            if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
            {
                RefreshToken();
                DelLogic(logic);
            }
            return responsePackNew;
        }
        /// <summary>
        /// 逻辑开关
        /// </summary>
        /// <returns></returns>
        public static ResponsePackNew SwitchLogic(Logic logic)
        {
            var jArray = new JArray { };
            var job = new JObject { { "userLogicId", logic.userLogicId } , { "enable", logic.enable } };
            jArray.Add(job);
            var jObject = new JObject { { "logics", jArray } };
            var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Enable);
            //如果是token过期则刷新token
            if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
            {
                RefreshToken();
                SwitchLogic(logic);
            }
            return responsePackNew;
          var outputTypeJOb = new JObject { };
          outputTypeJOb.Add("sid", dictionary.sid);
          outputTypeJOb.Add("delay", dictionary.delay);
          outputTypeJOb.Add("target_type", dictionary.target_type);
          var statusArray = new JArray { };
          foreach (var dic in dictionary.status)
          {
            var statusJOb = new JObject { };
            statusJOb.Add("key", dic["key"]);
            statusJOb.Add("value", dic["value"]);
            statusArray.Add(statusJOb);
          }
          outputTypeJOb.Add("status", statusArray);
          outputArray.Add(outputTypeJOb);
        }
        /// <summary>
        /// 自动化地理围栏状态上报
        /// </summary>
        /// <param name="userLogicId">自动化云端id<备注:logicSid与userLogicId 不能同时为空></param>
        /// <param name="logicSid">自动化sid<备注:logicSid与userLogicId 不能同时为空></param>
        /// <param name="direction">arrive:到达(进入) leave:离开</param>
        /// <returns></returns>
        public static bool GeoFenceStateReport(string userLogicId, string logicSid, string direction)
        {
            var jObject = new JObject();
            jObject.Add("homeId", LogicMethod.CurrLogicMethod.HomeId);
            jObject.Add("userLogicId", userLogicId);
            jObject.Add("sid", logicSid);
            jObject.Add("direction", direction);
            var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_GeoFenceStateReport);
            //如果是token过期则刷新token
            if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
        var noticeConfigJObject = new JObject();
        noticeConfigJObject.Add("enable", logic.noticeConfig.enable);
        noticeConfigJObject.Add("noticeContent", logic.noticeConfig.noticeContent);
        var pushConfigsArray = new JArray { };
        if (logic.pushConfigs.Count > 0)
        {   // 推送文本
          foreach (var pushConfig in logic.pushConfigs)
          {
            var pushConfigJob = new JObject { };
            pushConfigJob.Add("pushMethod", pushConfig.pushMethod);
            var accountArray = new JArray { };
            foreach (var account in pushConfig.pushTarget)
            {
                RefreshToken();
                GeoFenceStateReport(userLogicId, logicSid, direction);
              accountArray.Add(account);
            }
            if (responsePackNew.Code == "0")
            pushConfigJob.Add("pushTarget", accountArray);
            pushConfigsArray.Add(pushConfigJob);
          }
        }
        var logicjArray = new JArray { };
        var logicIfon = new JObject { };
        logicIfon.Add("sid", logic.sid);
        logicIfon.Add("gatewayId", LogicMethod.CurrLogicMethod.GatewayId);
        logicIfon.Add("name", logic.name);
        logicIfon.Add("relation", logic.relation);
        logicIfon.Add("enable", logic.enable);
        logicIfon.Add("cycle", cycleJObject);
        logicIfon.Add("input", inputArray);
        logicIfon.Add("output", outputArray);
        logicIfon.Add("noticeConfig", noticeConfigJObject);
        logicIfon.Add("pushConfigs", pushConfigsArray);
        logicjArray.Add(logicIfon);
        var jObject = new JObject { { "homeId", LogicMethod.CurrLogicMethod.HomeId }, { "logics", logicjArray } };
        responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Add, 5);
        //如果是token过期则刷新token
        if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
        {
          RefreshToken();
          AddLogic(logic);
        }
      }
      catch (Exception e)
      {
        var dd = e.Message;
      }
      return responsePackNew;
    }
    /// <summary>
    /// 编辑更新逻辑
    /// </summary>
    /// <param name="logic"></param>
    /// <returns></returns>
    public static ResponsePackNew UpdateLogic(Logic logic)
    {
      ResponsePackNew responsePackNew = null;
      try
      {
        var cycleJObject = new JObject { };
        var cyclevaluejArray = new JArray { };
        cycleJObject.Add("type", logic.cycle.type);
        foreach (var dictionary in logic.cycle.value)
        {
          cyclevaluejArray.Add(dictionary);
        }
        cycleJObject.Add("value", cyclevaluejArray);
        var inputArray = new JArray { };
        foreach (var dictionary in logic.input)
        {
          var inputTypeJOb = new JObject { };
          inputTypeJOb.Add("sid", dictionary.sid);
          inputTypeJOb.Add("condition_type", dictionary.condition_type);
          var conditionArray = new JArray { };
          foreach (var dic in dictionary.condition)
          {
            var conditionJOb = new JObject { };
            conditionJOb.Add("key", dic["key"]);
            var c1 = "";
            dic.TryGetValue("comparator", out c1);
            c1 = string.IsNullOrEmpty(c1) ? "" : c1;
            conditionJOb.TryAdd("comparator", c1);
            conditionJOb.Add("data_type", dic["data_type"]);
            conditionJOb.Add("value", dic["value"]);
            conditionArray.Add(conditionJOb);
            if (dictionary.condition_type == "8")
            {
                //成功
                return true;
              ///地理围栏
              var geo_fencejob = new JObject();
              geo_fencejob.Add("longitude", dictionary.geo_fence.longitude);
              geo_fencejob.Add("latitude", dictionary.geo_fence.latitude);
              geo_fencejob.Add("radius", dictionary.geo_fence.radius);
              inputTypeJOb.Add("geo_fence", geo_fencejob);
            }
            //失败
            return false;
          }
          inputTypeJOb.Add("condition", conditionArray);
          inputArray.Add(inputTypeJOb);
        }
        /// <summary>
        ///请求服务器(与住宅有关:例如;homeId)
        /// </summary>
        /// <returns></returns>
        public static ResponsePackNew RequestServerhomeId(object o, string api_Url, int mTimeout = 3)
        var outputArray = new JArray { };
        foreach (var dictionary in logic.output)
        {
            var requestJson = HttpUtil.GetSignRequestJson(o);
            return HttpUtil.RequestHttpsPostFroHome(api_Url, requestJson, mTimeout);
          var outputTypeJOb = new JObject { };
          outputTypeJOb.Add("sid", dictionary.sid);
          outputTypeJOb.Add("delay", dictionary.delay);
          outputTypeJOb.Add("target_type", dictionary.target_type);
          var statusArray = new JArray { };
          foreach (var dic in dictionary.status)
          {
            var statusJOb = new JObject { };
            statusJOb.Add("key", dic["key"]);
            statusJOb.Add("value", dic["value"]);
            statusArray.Add(statusJOb);
          }
          outputTypeJOb.Add("status", statusArray);
          outputArray.Add(outputTypeJOb);
        }
        }
        /// <summary>
        /// 请求服务器
        /// </summary>
        /// <returns></returns>
        public static ResponsePackNew RequestServer(object o, string api_Url)
        {
            var requestJson = HttpUtil.GetSignRequestJson(o);
            return HttpUtil.RequestHttpsPost(api_Url, requestJson);
        var noticeConfigJObject = new JObject();
        noticeConfigJObject.Add("enable", logic.noticeConfig.enable);
        noticeConfigJObject.Add("noticeContent", logic.noticeConfig.noticeContent);
        }
        /// <summary>
        /// 刷新Token
        /// </summary>
        public static void RefreshToken()
        var pushConfigsArray = new JArray { };
        if (logic.pushConfigs.Count > 0)
        {
            IMessageCommon.Current.StartRefreshToken();
          // 推送文本
          foreach (var pushConfig in logic.pushConfigs)
          {
            var pushConfigJob = new JObject { };
            pushConfigJob.Add("pushMethod", pushConfig.pushMethod);
            var accountArray = new JArray { };
            foreach (var account in pushConfig.pushTarget)
            {
              accountArray.Add(account);
            }
            pushConfigJob.Add("pushTarget", accountArray);
            pushConfigsArray.Add(pushConfigJob);
          }
        }
        var logicjArray = new JArray { };
        var logicIfon = new JObject { };
        logicIfon.Add("userLogicId", logic.userLogicId);
        logicIfon.Add("sid", logic.sid);
        logicIfon.Add("gatewayId", LogicMethod.CurrLogicMethod.GatewayId);
        logicIfon.Add("name", logic.name);
        logicIfon.Add("relation", logic.relation);
        logicIfon.Add("enable", logic.enable);
        logicIfon.Add("cycle", cycleJObject);
        logicIfon.Add("input", inputArray);
        logicIfon.Add("output", outputArray);
        logicIfon.Add("noticeConfig", noticeConfigJObject);
        logicIfon.Add("pushConfigs", pushConfigsArray);
        logicjArray.Add(logicIfon);
        var jObject = new JObject { { "homeId", LogicMethod.CurrLogicMethod.HomeId }, { "logics", logicjArray } };
        string str = jObject.ToString();
        responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Update, 5);
        //如果是token过期则刷新token
        if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
        {
          RefreshToken();
          UpdateLogic(logic);
        }
      }
      catch (Exception e)
      {
        var dd = e.Message;
      }
      return responsePackNew;
    }
    /// <summary>
    /// 删除逻辑
    /// </summary>
    /// <returns></returns>
    public static ResponsePackNew DelLogic(Logic logic)
    {
      var jArray = new JArray { };
      jArray.Add(logic.userLogicId);
      var jObject = new JObject { { "userLogicIds", jArray } };
      var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Delete);
      //如果是token过期则刷新token
      if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
      {
        RefreshToken();
        DelLogic(logic);
      }
      return responsePackNew;
    }
    /// <summary>
    /// 逻辑开关
    /// </summary>
    /// <returns></returns>
    public static ResponsePackNew SwitchLogic(Logic logic)
    {
      var jArray = new JArray { };
      var job = new JObject { { "userLogicId", logic.userLogicId }, { "enable", logic.enable } };
      jArray.Add(job);
      var jObject = new JObject { { "logics", jArray } };
      var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_Enable);
      //如果是token过期则刷新token
      if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
      {
        RefreshToken();
        SwitchLogic(logic);
      }
      return responsePackNew;
    }
    /// <summary>
    /// 自动化地理围栏状态上报
    /// </summary>
    /// <param name="userLogicId">自动化云端id<备注:logicSid与userLogicId 不能同时为空></param>
    /// <param name="logicSid">自动化sid<备注:logicSid与userLogicId 不能同时为空></param>
    /// <param name="direction">arrive:到达(进入) leave:离开</param>
    /// <returns></returns>
    public static bool GeoFenceStateReport(string userLogicId, string logicSid, string direction)
    {
      var jObject = new JObject();
      jObject.Add("homeId", LogicMethod.CurrLogicMethod.HomeId);
      jObject.Add("userLogicId", userLogicId);
      jObject.Add("sid", logicSid);
      jObject.Add("direction", direction);
      var responsePackNew = RequestServerhomeId(jObject, NewAPI.API_POST_Logic_GeoFenceStateReport);
      //如果是token过期则刷新token
      if (responsePackNew.Code == StateCode.TOKEN_EXPIRED)
      {
        RefreshToken();
        GeoFenceStateReport(userLogicId, logicSid, direction);
      }
      if (responsePackNew.Code == "0")
      {
        //成功
        return true;
      }
      //失败
      return false;
    }
    /// <summary>
    ///请求服务器(与住宅有关:例如;homeId)
    /// </summary>
    /// <returns></returns>
    public static ResponsePackNew RequestServerhomeId(object o, string api_Url, int mTimeout = 3)
    {
      var requestJson = HttpUtil.GetSignRequestJson(o);
      return HttpUtil.RequestHttpsPostFroHome(api_Url, requestJson, mTimeout);
    }
    /// <summary>
    /// 请求服务器
    /// </summary>
    /// <returns></returns>
    public static ResponsePackNew RequestServer(object o, string api_Url)
    {
      var requestJson = HttpUtil.GetSignRequestJson(o);
      return HttpUtil.RequestHttpsPost(api_Url, requestJson);
    }
    /// <summary>
    /// 刷新Token
    /// </summary>
    public static void RefreshToken()
    {
      IMessageCommon.Current.StartRefreshToken();
    }
  }
}
HDL_ON/UI/UI2/3-Intelligence/Automation/WeatherCondition.cs
@@ -108,9 +108,6 @@
                        index = i;
                        break;
                    }
                    ///找到标记索引,退出循环体
                    index = i;
                    break;
                }
            }
            if (index != -1)
HDL_ON/UI/UI2/FuntionControlView/ArmCenter/AddOutputPage.cs
@@ -7,28 +7,29 @@
namespace HDL_ON.UI
{
    public class AddOutputPage : FrameLayout
    {
        FrameLayout bodyView;
  public class AddOutputPage : FrameLayout
  {
    FrameLayout bodyView;
        FrameLayout showdFunctionTypeRow;
    FrameLayout showdFunctionTypeRow;
        /// <summary>
        /// 楼层选择下拉图标
        /// </summary>
        Button btnFloorDownIcon;
        /// <summary>
        /// 楼层显示
        /// </summary>
        Button btnFloor;
    /// <summary>
    /// 楼层选择下拉图标
    /// </summary>
    Button btnFloorDownIcon;
    /// <summary>
    /// 楼层显示
    /// </summary>
    Button btnFloor;
        /// <summary>
        /// 筛选文本显示
        /// </summary>
        Button btnScreenText;
    /// <summary>
    /// 筛选文本显示
    /// </summary>
    Button btnScreenText;
        VerticalScrolViewLayout functionListView;
    VerticalScrolViewLayout functionListView;
<<<<<<< HEAD
        Action<SecurityAlarm> refreshAction;
        /// <summary>
        /// 本地功能转换的输出列表(灯光、场景)
@@ -43,13 +44,83 @@
            refreshAction = action;
            alarm = inOutput;
        }
=======
    SecurityAlarm securityAlarm;
    Action<SecurityAlarm> refreshAction;
    List<SecurityOutput> outputList = new List<SecurityOutput>();
    List<Function> allocatedList = new List<Function>();
    public AddOutputPage(SecurityAlarm function, Action<SecurityAlarm> action)
    {
      bodyView = this;
      securityAlarm = function;
      refreshAction = action;
    }
>>>>>>> WJC
        /// <summary>
        /// 加载界面
        /// </summary>
        public void LoadPage()
    /// <summary>
    /// 加载界面
    /// </summary>
    public void LoadPage()
    {
      bodyView.BackgroundColor = CSS_Color.BackgroundColor;
      new TopViewDiv(bodyView, Language.StringByID(StringId.AddFunction)).LoadTopView();
      #region 显示的功能类型切换区域
      showdFunctionTypeRow = new FrameLayout()
      {
        Y = Application.GetRealHeight(64),
        Height = Application.GetRealHeight(62),
        BackgroundColor = CSS_Color.MainBackgroundColor,
      };
      bodyView.AddChidren(showdFunctionTypeRow);
      btnFloorDownIcon = new Button()
      {
        Width = Application.GetMinRealAverage(16),
        Height = Application.GetMinRealAverage(16),
        X = Application.GetRealWidth(16),
        Y = Application.GetRealHeight(18),
        UnSelectedImagePath = "Public/DownIcon.png",
      };
      showdFunctionTypeRow.AddChidren(btnFloorDownIcon);
      btnFloor = new Button()
      {
        X = btnFloorDownIcon.Right,
        Y = Application.GetRealHeight(18),
        Width = Application.GetRealWidth(200),
        Height = Application.GetMinRealAverage(16),
        TextColor = CSS_Color.FirstLevelTitleColor,
        TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
        TextAlignment = TextAlignment.CenterLeft,
        Text = DB_ResidenceData.Instance.CurFloor.roomName,
      };
      showdFunctionTypeRow.AddChidren(btnFloor);
      #endregion
      functionListView = new VerticalScrolViewLayout()
      {
        Y = showdFunctionTypeRow.Bottom,
        Height = Application.GetRealHeight(530 - 100),
        BackgroundColor = CSS_Color.BackgroundColor,
      };
      bodyView.AddChidren(functionListView);
      foreach (var function in FunctionList.List.Functions)
      {
        if (!MainPage.SceneSupportFunctionList.Contains(function.spk))
        {
<<<<<<< HEAD
            bodyView.BackgroundColor = CSS_Color.BackgroundColor;
            new TopViewDiv(bodyView, Language.StringByID(StringId.AddFunction)).LoadTopView();
@@ -130,9 +201,70 @@
                this.RemoveFromParent();
                refreshAction?.Invoke(alarm);
            };
=======
          continue;
        }
        if (function == null)
        {
          continue;
        }
        function.roomIds.Remove(null);
        allocatedList.Add(function);
      }
      LoadFunctionListRow(null);
      var bottomView = new FrameLayout()
      {
        Y = Application.GetRealHeight(591),
        Height = Application.GetRealHeight(100),
        BackgroundColor = CSS_Color.MainBackgroundColor,
        Radius = (uint)Application.GetRealWidth(22),
      };
      this.AddChidren(bottomView);
      var btnConfrim = new Button()
      {
        X = Application.GetRealWidth(78),
        Y = Application.GetRealHeight(12),
        Width = Application.GetRealWidth(220),
        Height = Application.GetRealWidth(44),
        Radius = (uint)Application.GetRealWidth(22),
        BackgroundColor = CSS_Color.MainColor,
        TextID = StringId.Confirm,
        TextSize = CSS_FontSize.SubheadingFontSize,
        TextColor = CSS_Color.MainBackgroundColor,
        TextAlignment = TextAlignment.Center,
      };
      bottomView.AddChidren(btnConfrim);
      btnConfrim.MouseUpEventHandler = (sender, e) =>
      {
        securityAlarm.output = new List<SecurityOutput>();
        foreach (var output in outputList)
        {
          if (output.addCondition)
          {
            securityAlarm.output.Add(output);
          }
        }
        this.RemoveFromParent();
        refreshAction?.Invoke(securityAlarm);
      };
>>>>>>> WJC
        }
<<<<<<< HEAD
        /// <summary>
        /// 配置数据
        /// </summary>
@@ -164,6 +296,9 @@
                    RoomName = function.GetRoomListName(),
                });
            }
=======
    }
>>>>>>> WJC
            foreach (var scene in FunctionList.List.scenes)
@@ -192,10 +327,72 @@
                });
            }
    // <summary>
    /// 显示功能Row
    /// </summary>
    void LoadFunctionListRow(List<Function> functions)
    {
      functionListView.RemoveAll();
      if (functions == null)
      {
        functions = allocatedList;
      }
      foreach (var function in functions)
      {
        var output = securityAlarm.output.Find((obj) => obj.sid == function.sid);
        if (output == null)
        {
          output = new SecurityOutput();
          output.sid = function.sid;
        }
        else
        {
          output.addCondition = true;
        }
        outputList.Add(output);
        FrameLayout functionRow = new FrameLayout()
        {
          Height = Application.GetRealHeight(65),
          BackgroundColor = CSS_Color.MainBackgroundColor,
        };
        functionListView.AddChidren(functionRow);
        var btnFunctionName = new Button()
        {
          X = Application.GetRealWidth(16),
          Width = Application.GetRealWidth(200),
          Height = Application.GetRealHeight(44),
          Text = function.name,
          TextAlignment = TextAlignment.CenterLeft,
          TextColor = CSS_Color.FirstLevelTitleColor,
          TextSize = CSS_FontSize.TextFontSize,
        };
        functionRow.AddChidren(btnFunctionName);
        var btnFunctionFloorName = new Button()
        {
          X = Application.GetRealWidth(16),
          Y = Application.GetRealHeight(24),
          Width = Application.GetRealWidth(200),
          Height = Application.GetRealHeight(41),
          Text = function.GetRoomListName(),
          TextAlignment = TextAlignment.CenterLeft,
          TextColor = CSS_Color.PromptingColor1,
          TextSize = CSS_FontSize.PromptFontSize_SecondaryLevel,
        };
        functionRow.AddChidren(btnFunctionFloorName);
        Button btnState = new Button()
        {
          Width = Application.GetRealWidth(317),
          TextAlignment = TextAlignment.CenterRight,
          TextSize = CSS_FontSize.TextFontSize,
          TextColor = CSS_Color.PromptingColor1,
        };
        functionRow.AddChidren(btnState);
<<<<<<< HEAD
        // <summary>
        /// 显示功能Row
        /// </summary>
@@ -313,30 +510,63 @@
                    Height = Application.GetRealWidth(1),
                    BackgroundColor = CSS_Color.DividingLineColor,
                });
=======
        Button btnChooseIcon = new Button()
        {
          X = Application.GetRealWidth(333),
          Gravity = Gravity.CenterVertical,
          Width = Application.GetMinRealAverage(32),
          Height = Application.GetMinRealAverage(32),
          UnSelectedImagePath = "Public/ChooseIcon.png",
          SelectedImagePath = "Public/ChooseOnIcon.png",
        };
        functionRow.AddChidren(btnChooseIcon);
        btnChooseIcon.MouseUpEventHandler = (sender, e) =>
        {
          btnChooseIcon.IsSelected = !btnChooseIcon.IsSelected;
          if (btnChooseIcon.IsSelected)
          {
            output.addCondition = true;
            if (output.status.Count == 0)
            {
              ShowStateDialog(output, btnState, btnChooseIcon);
            }
          }
          else
          {
            output.addCondition = false;
          }
        };
        btnState.MouseUpEventHandler = (sender, e) =>
        {
          ShowStateDialog(output, btnState, btnChooseIcon);
        };
>>>>>>> WJC
        if (output.addCondition)
        {
          btnChooseIcon.IsSelected = true;
          btnState.Text = output.StateText();
        }
<<<<<<< HEAD
        private void ShowStateDialog(SecurityOutput output, Button btnState, Button btnChoose = null)
=======
        functionListView.AddChidren(new Button()
>>>>>>> WJC
        {
            Dialog dialog = new Dialog();
          Gravity = Gravity.CenterHorizontal,
          Width = Application.GetRealWidth(343),
          Height = Application.GetRealWidth(1),
          BackgroundColor = CSS_Color.DividingLineColor,
        });
            FrameLayout contentView = new FrameLayout();
            dialog.AddChidren(contentView);
            contentView.MouseUpEventHandler = (sender, e) =>
            {
                dialog.Close();
                if (output.status.Count == 0)
                {
                    if (btnChoose != null)
                    {
                        btnChoose.IsSelected = false;
                    }
                }
            };
<<<<<<< HEAD
            VerticalScrolViewLayout optinView = new VerticalScrolViewLayout()
            {
                Gravity = Gravity.CenterHorizontal,
@@ -379,27 +609,89 @@
                btnOpen.IsSelected =  output.status[0].value.ToLower() == "on";
                btnClose.IsSelected = !btnOpen.IsSelected;
            }
=======
      }
    }
>>>>>>> WJC
            Button btnCancel = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Y = optinView.Bottom + Application.GetRealHeight(8),
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(44),
                Radius = (uint)Application.GetRealHeight(13),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                TextID = StringId.Cancel,
                TextColor = CSS_Color.WarningColor,
                IsBold = true,
            };
            contentView.AddChidren(btnCancel);
    private void ShowStateDialog(SecurityOutput output, Button btnState, Button btnChoose = null)
    {
      Dialog dialog = new Dialog();
            dialog.Show();
      FrameLayout contentView = new FrameLayout();
      dialog.AddChidren(contentView);
      contentView.MouseUpEventHandler = (sender, e) =>
      {
        dialog.Close();
        if (output.status.Count == 0)
        {
          if (btnChoose != null)
          {
            btnChoose.IsSelected = false;
          }
        }
      };
            btnOpen.MouseUpEventHandler = (sender, e) => {
                btnState.Text = btnOpen.Text;
                output.status = new List<SecurityOutputStatus>()
      VerticalScrolViewLayout optinView = new VerticalScrolViewLayout()
      {
        Gravity = Gravity.CenterHorizontal,
        Y = Application.GetRealHeight(515),
        Width = Application.GetRealWidth(343),
        Height = Application.GetRealHeight(88),
        Radius = (uint)Application.GetRealHeight(13),
        BackgroundColor = CSS_Color.MainBackgroundColor,
      };
      contentView.AddChidren(optinView);
      Button btnOpen = new Button()
      {
        Height = Application.GetRealHeight(44),
        TextAlignment = TextAlignment.Center,
        TextColor = CSS_Color.MainColor,
        TextSize = CSS_FontSize.SubheadingFontSize,
        TextID = StringId.On
      };
      optinView.AddChidren(btnOpen);
      optinView.AddChidren(new Button()
      {
        Height = 1,
        BackgroundColor = CSS_Color.DividingLineColor
      });
      Button btnClose = new Button()
      {
        Height = Application.GetRealHeight(44),
        TextAlignment = TextAlignment.Center,
        TextColor = CSS_Color.PromptingColor1,
        TextID = StringId.OFF,
        TextSize = CSS_FontSize.SubheadingFontSize,
      };
      optinView.AddChidren(btnClose);
      Button btnCancel = new Button()
      {
        Gravity = Gravity.CenterHorizontal,
        Y = optinView.Bottom + Application.GetRealHeight(8),
        Width = Application.GetRealWidth(343),
        Height = Application.GetRealHeight(44),
        Radius = (uint)Application.GetRealHeight(13),
        BackgroundColor = CSS_Color.MainBackgroundColor,
        TextID = StringId.Cancel,
        TextColor = CSS_Color.WarningColor,
        IsBold = true,
      };
      contentView.AddChidren(btnCancel);
      dialog.Show();
      btnOpen.MouseUpEventHandler = (sender, e) =>
      {
        btnState.Text = btnOpen.Text;
        output.status = new List<SecurityOutputStatus>()
                {
                    new SecurityOutputStatus()
                    {
@@ -407,6 +699,7 @@
                        value = "on",
                    }
                };
<<<<<<< HEAD
                var localInput = alarm.output.Find((obj) =>
                   obj.sid == output.sid
                );
@@ -422,11 +715,27 @@
                btnState.Text = btnClose.Text;
                output.status = new List<SecurityOutputStatus>()
                {
=======
        output.addCondition = true;
        if (btnChoose != null)
        {
          btnChoose.IsSelected = true;
        }
        dialog.Close();
      };
      btnClose.MouseUpEventHandler = (sender, e) =>
      {
        btnState.Text = btnClose.Text;
        output.status = new List<SecurityOutputStatus>()
          {
>>>>>>> WJC
                    new SecurityOutputStatus()
                    {
                        key = FunctionAttributeKey.OnOff,
                        value = "off",
                    }
<<<<<<< HEAD
                };
                var localInput = alarm.output.Find((obj) =>
                 obj.sid == output.sid
@@ -451,11 +760,33 @@
            };
=======
          };
        output.addCondition = true;
        if (btnChoose != null)
        {
          btnChoose.IsSelected = true;
>>>>>>> WJC
        }
        dialog.Close();
      };
      btnCancel.MouseUpEventHandler = (sender, e) =>
      {
        dialog.Close();
        if (output.status.Count == 0)
        {
          if (btnChoose != null)
          {
            btnChoose.IsSelected = false;
          }
        }
      };
    }
<<<<<<< HEAD
        /// <summary>
        /// 住宅列表点击事件
        /// </summary>
@@ -477,7 +808,33 @@
                }, nowSelectId);
            };
        }
=======
>>>>>>> WJC
    /// <summary>
    /// 住宅列表点击事件
    /// </summary>
    void LoadDialog_ChangeFloor()
    {
      string nowSelectId = null;
      btnFloor.MouseUpEventHandler += (sender, e) =>
      {
        var listAllFun = new List<Function>();
        listAllFun.AddRange(allocatedList);
              //显示下拉界面
              var form = new FloorRoomSelectPopupView();
        form.ShowDeviceFunctionView(btnFloor, listAllFun, (selectId, listFun) =>
              {
            nowSelectId = selectId;
                  //重新刷新设备列表
                  this.LoadFunctionListRow(listFun);
          }, nowSelectId);
      };
    }
  }
}