HDL-ON_Android/Application.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL-ON_Android/HDL-ON_Android.csproj | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/UI/MainPage.cs | ●●●●● 补丁 | 查看 | 原始文档 | 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 | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/UI/UI2/3-Intelligence/Automation/LogicMethod.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/UI/UI2/3-Intelligence/Automation/Send.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/UI/UI2/3-Intelligence/Automation/WeatherCondition.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
HDL_ON/UI/UI2/FuntionControlView/ArmCenter/AddOutputPage.cs | ●●●●● 补丁 | 查看 | 原始文档 | 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.zipBinary files differ
HDL_ON/UI/UI2/3-Intelligence/Automation.zipBinary 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); }; } } }