using BPASmartClient.Compiler;
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
namespace BPASmartClient.SCADAControl.CustomerControls
{
///
/// TheRedis.xaml 的交互逻辑
///
public partial class TheRedis : UserControl, IExecutable, IDisposable
{
Image imageZC = null;
Image imageYC = null;
Image imageGZ = null;
TextBlock textBlock = null;
FRedisClient fRedisClient = new FRedisClient();
public TheRedis()
{
InitializeComponent();
Width = 40;
Height = 40;
this.SizeChanged += TheRedis_SizeChanged;
}
private void TheRedis_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (textBlock == null)
{
foreach (Image tb in FindVisualChildren(this))
{
if (tb.Tag != null)
{
if (tb.Tag.ToString() == "正常")
{
imageZC = tb;
}
if (tb.Tag.ToString() == "运行")
{
imageYC = tb;
}
if (tb.Tag.ToString() == "故障")
{
imageGZ = tb;
}
}
}
foreach (TextBlock tb in FindVisualChildren(this))
{
if (tb.Tag != null)
{
if (tb.Tag.ToString() == "显示文字")
{
textBlock = tb;
}
}
}
}
}
public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren(child))
{
yield return childOfChild;
}
}
}
}
public string ControlType => "控件";
private bool isExecuteState;
public bool IsExecuteState
{
get { return isExecuteState; }
set
{
isExecuteState = value;
if (IsExecuteState)
{
Register();
}
}
}
DispatcherTimer timer = new DispatcherTimer();
public void Register()
{
if (Direction == 0)
{
try
{
if (!string.IsNullOrEmpty(DataSouceInformation))
{
fRedisClient.Connect(DataSouceInformation);
}
}
catch (Exception ex)
{
Direction = 2;
}
}
timer.Interval = TimeSpan.FromMilliseconds(TimeCount);
timer.Tick += Timer_Tick;
timer.Start();
}
private async void Timer_Tick(object sender, EventArgs e)
{
Config.GetInstance().RunJsScipt(TikcExecute);
if (TestData)
{
keyValuePairs1.Clear();
for (int i = 0; i < 20; i++)
{
Random ran = new Random();
int n = ran.Next(0, 100);
keyValuePairs1[i.ToString()] = "10." + n;
keyValuePairs1["Left"+i.ToString()] = new Random().Next(0,10)>5?true: false;
keyValuePairs1["Right"+i.ToString()] = new Random().Next(0, 10) > 5 ? true : false;
}
Class_DataBus.GetInstance().Dic_RedisData["Test"] = keyValuePairs1;
Class_DataBus.GetInstance().Dic_RedisDataBinding = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(Class_DataBus.GetInstance().Dic_RedisData));
Class_DataBus.GetInstance().refreshDataAction("Test");
}
else
{
if (fRedisClient._connection != null && fRedisClient._connection.IsConnected)
{
Direction = 1;
}
else
{
Direction = 0;
try
{
if (!string.IsNullOrEmpty(DataSouceInformation))
fRedisClient.Connect(DataSouceInformation);
}
catch (Exception ex)
{
Direction = 2;
}
}
if (Direction == 1) //定时读取数据
{
try
{
if (!string.IsNullOrEmpty(DeviceName))
{
RedisValue obj = fRedisClient.RedisGet(DeviceName);
List str = JsonConvert.DeserializeObject>(obj.ToString());
Dictionary keyValues = new Dictionary();
Dictionary keyValuesType = new Dictionary();
str?.ForEach(jon =>
{
keyValues[jon.VarName] = GetValuesType(jon.DataType, jon.VarVaule);
keyValuesType[jon.VarName] = jon.DataType.ToString();
});
Class_DataBus.GetInstance().Dic_RedisData[DeviceName] = keyValues;
Class_DataBus.GetInstance().Dic_RedisDataBinding = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(Class_DataBus.GetInstance().Dic_RedisData));
Class_DataBus.GetInstance().Dic_RedisDataType[DeviceName] = keyValuesType;
Class_DataBus.GetInstance().refreshDataAction(DeviceName);
if (PropertyChange != null) PropertyChange(this, null);
}
else
{
fRedisClient.GetKeys()?.ToList().ForEach(par =>
{
//所有变量集合
//PublishInfo
List str = JsonConvert.DeserializeObject>(par.Value);
Dictionary keyValues = new Dictionary();
Dictionary keyValuesType = new Dictionary();
str?.ForEach(jon =>
{
keyValues[jon.VarName] = GetValuesType(jon.DataType, jon.VarVaule);
keyValuesType[jon.VarName] = jon.DataType.ToString();
});
Class_DataBus.GetInstance().Dic_RedisData[par.Key] = keyValues;
Class_DataBus.GetInstance().Dic_RedisDataBinding = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(Class_DataBus.GetInstance().Dic_RedisData));
Class_DataBus.GetInstance().Dic_RedisDataType[par.Key] = keyValuesType;
Class_DataBus.GetInstance().refreshDataAction(par.Key);
});
if (PropertyChange != null) PropertyChange(this, null);
}
}
catch (Exception ex)
{
}
}
}
}
///
/// 根据变量获取变量实际值
///
///
///
///
public object GetValuesType(EDataType eData, string Value)
{
try
{
if (!string.IsNullOrEmpty(Value))
{
switch (eData)
{
case EDataType.Bool:
return Convert.ToBoolean(Value);
break;
case EDataType.Byte:
return Convert.ToByte(Value);
break;
case EDataType.Int:
return Convert.ToInt16(Value);
break;
case EDataType.Word:
return Convert.ToUInt16(Value);
break;
case EDataType.Dint:
return Convert.ToInt32(Value);
break;
case EDataType.Dword:
return Convert.ToUInt32(Value);
break;
case EDataType.Float:
return Convert.ToSingle(Value);
break;
default:
break;
}
}
return null;
}
catch (Exception ex)
{
return null;
}
}
public void Start() => timer.Start();
public void Stop() => timer.Stop();
public void Dispose()
{
timer.Stop();
Direction = 0;
FDataSouce = "";
if (IsRun) IsRun = false;
}
#region 属性
public bool TestData
{
get { return (bool)GetValue(TestDataProperty); }
set { SetValue(TestDataProperty, value); }
}
public static readonly DependencyProperty TestDataProperty =
DependencyProperty.Register("TestData", typeof(bool), typeof(TheRedis),
new PropertyMetadata(false, new PropertyChangedCallback(OnTestDataPropertyChanged)));
private static void OnTestDataPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as TheRedis)?.RefreshTest();
}
#region MyRegion
Dictionary keyValuePairs1 = new Dictionary();
#endregion
public void RefreshTest()
{
}
[Category("值设定")]
public int Direction
{
get { return (int)GetValue(DirectionProperty); }
set { SetValue(DirectionProperty, value); }
}
public static readonly DependencyProperty DirectionProperty =
DependencyProperty.Register("Direction", typeof(int), typeof(TheRedis),
new PropertyMetadata(0, new PropertyChangedCallback(OnPropertyChanged)));
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
(d as TheRedis)?.Refresh();
}
public void Refresh()
{
if (textBlock != null)
{
if (Direction == 1)
{
imageZC.Visibility = Visibility.Collapsed;
imageYC.Visibility = Visibility.Visible;
imageGZ.Visibility = Visibility.Collapsed;
textBlock.Visibility = Visibility.Visible;
textBlock.Text = "运行中";
textBlock.Foreground = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#FF2077EC"));
}
else if (Direction == 2)
{
imageZC.Visibility = Visibility.Collapsed;
imageYC.Visibility = Visibility.Collapsed;
imageGZ.Visibility = Visibility.Visible;
textBlock.Visibility = Visibility.Visible;
textBlock.Text = "故障";
textBlock.Foreground = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#FFFF0202"));
}
else
{
imageZC.Visibility = Visibility.Visible;
imageYC.Visibility = Visibility.Collapsed;
imageGZ.Visibility = Visibility.Collapsed;
textBlock.Visibility = Visibility.Visible;
textBlock.Text = "未运行";
textBlock.Foreground = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#FF02F9FF"));
}
}
}
///
/// 执行内容
///
[Category("事件")]
public string TikcExecute
{
get { return (string)GetValue(TikcExecuteProperty); }
set { SetValue(TikcExecuteProperty, value); }
}
public static readonly DependencyProperty TikcExecuteProperty =
DependencyProperty.Register("TikcExecute", typeof(string), typeof(TheRedis), new PropertyMetadata(string.Empty));
#endregion
#region 数据绑定模块
public event EventHandler PropertyChange; //声明一个事件
[Category("数据绑定-数据来源")]
public int TimeCount
{
get { return (int)GetValue(TimeCountProperty); }
set { SetValue(TimeCountProperty, value); }
}
public static readonly DependencyProperty TimeCountProperty =
DependencyProperty.Register("TimeCount", typeof(int), typeof(TheRedis), new PropertyMetadata(100));
[Category("数据绑定-数据来源")]
public string DataSouceInformation
{
get { return (string)GetValue(DataSouceInformationProperty); }
set { SetValue(DataSouceInformationProperty, value); }
}
public static readonly DependencyProperty DataSouceInformationProperty =
DependencyProperty.Register("DataSouceInformation", typeof(string), typeof(TheRedis), new PropertyMetadata("124.222.238.75:16000,password=123456,defaultDatabase=1"));
[Category("数据绑定-数据来源")]
public string DeviceName
{
get { return (string)GetValue(DeviceNameProperty); }
set { SetValue(DeviceNameProperty, value); }
}
public static readonly DependencyProperty DeviceNameProperty =
DependencyProperty.Register("DeviceName", typeof(string), typeof(TheRedis), new PropertyMetadata(string.Empty));
[Category("数据绑定")]
public string FDataSouce
{
get { return (string)GetValue(FDataSouceProperty); }
set { SetValue(FDataSouceProperty, value); }
}
public static readonly DependencyProperty FDataSouceProperty =
DependencyProperty.Register("FDataSouce", typeof(string), typeof(TheRedis), new PropertyMetadata(string.Empty, new PropertyChangedCallback(onFDataSouceChanged)));
private static void onFDataSouceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as TheRedis)?.DataSouceRefresh();
public void DataSouceRefresh()
{
try
{
//if (!string.IsNullOrEmpty(FDataSouce))
{
GenerateData = (string)CSharpConfig.GetInstance().RunCSharp(Code, new object[] { FDataSouce });
}
}
catch (Exception ex)
{
}
}
public static string _code = "public string main(string message) \n{ \n //请在此填写你的代码\n\n return message; \n}\n";
[Category("数据绑定")]
public string Code
{
get { return (string)GetValue(CodeProperty); }
set { SetValue(CodeProperty, value); }
}
public static readonly DependencyProperty CodeProperty =
DependencyProperty.Register("Code", typeof(string), typeof(TheRedis), new PropertyMetadata(_code));
[Category("数据绑定")]
public bool IsRun
{
get { return (bool)GetValue(RunProperty); }
set { SetValue(RunProperty, value); }
}
public static readonly DependencyProperty RunProperty =
DependencyProperty.Register("IsRun", typeof(bool), typeof(TheRedis), new PropertyMetadata(false, new PropertyChangedCallback(onIsRunChanged)));
private static void onIsRunChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as TheRedis)?.IsRunRefresh();
public void IsRunRefresh()
{
//测试运行
if (IsRun)
IsExecuteState = true;
else
{
IsExecuteState = false;
Dispose();
}
}
[Category("数据绑定")]
public string GenerateData
{
get { return (string)GetValue(GenerateDataProperty); }
set { SetValue(GenerateDataProperty, value); }
}
public static readonly DependencyProperty GenerateDataProperty =
DependencyProperty.Register("GenerateData", typeof(string), typeof(TheRedis), new PropertyMetadata(string.Empty));
#endregion
}
}