using Aitex.Core.RT.DataCenter; using Caliburn.Micro.Core; using MECF.Framework.Common.Device.LinMot; using MECF.Framework.Common.OperationCenter; using MECF.Framework.Common.Persistent.SRD; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace CyberX8_Themes.UserControls { /// /// LinMotOtherControl.xaml 的交互逻辑 /// public partial class LinMotOtherControl : UserControl { #region 属性 public static readonly DependencyProperty ModuleNameProperty = DependencyProperty.Register("ModuleName", typeof(string), typeof(LinMotOtherControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); /// /// 模块名称 /// public string ModuleName { get { return (string)this.GetValue(ModuleNameProperty); } set { this.SetValue(ModuleNameProperty, value); } } public static readonly DependencyProperty ModuleTitleProperty = DependencyProperty.Register("ModuleTitle", typeof(string), typeof(LinMotOtherControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); /// /// 标题 /// public string ModuleTitle { get { return (string)this.GetValue(ModuleTitleProperty); } set { this.SetValue(ModuleTitleProperty, value); } } public static readonly DependencyProperty ParentModuleProperty = DependencyProperty.Register("ParentModule", typeof(string), typeof(LinMotOtherControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); /// /// ParentModule /// public string ParentModule { get { return (string)this.GetValue(ParentModuleProperty); } set { this.SetValue(ParentModuleProperty, value); } } public static readonly DependencyProperty IsConnectedProperty = DependencyProperty.Register("IsConnected", typeof(bool), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); /// /// 连接状态 /// public bool IsConnected { get { return (bool)this.GetValue(IsConnectedProperty); } set { this.SetValue(IsConnectedProperty, value); } } public static readonly DependencyProperty StatusWordProperty = DependencyProperty.Register("StatusWord", typeof(short), typeof(LinMotOtherControl), new FrameworkPropertyMetadata((short)0, new PropertyChangedCallback(StatusWordPropertyChangedCallBack))); /// /// 状态字 /// public short StatusWord { get { return (short)this.GetValue(StatusWordProperty); } set { this.SetValue(StatusWordProperty, value); } } private static void StatusWordPropertyChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e) { short statusWord = (short)e.NewValue; d.SetValue(ReadyProperty, (statusWord & 0x01) == 1); d.SetValue(DisableProperty, (statusWord & 0b0100) >> 2 == 0); d.SetValue(ErrorProperty, ((statusWord & 0b01000) >> 3 == 1) || ((statusWord & 0b01000000000000) >> 12 == 1)); d.SetValue(InitProperty, (statusWord & 0b0100000000000) >> 11 == 1); d.SetValue(RunProperty, (statusWord & 0b010000000000000) >> 13 == 1); } public static readonly DependencyProperty ReadyProperty = DependencyProperty.Register("Ready", typeof(bool), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); public bool Ready { get { return (bool)this.GetValue(ReadyProperty); } set { SetValue(ReadyProperty, value); } } public static readonly DependencyProperty DisableProperty = DependencyProperty.Register("Disable", typeof(bool), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); public bool Disable { get { return (bool)this.GetValue(DisableProperty); } set { SetValue(DisableProperty, value); } } public static readonly DependencyProperty RunProperty = DependencyProperty.Register("Run", typeof(bool), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); public bool Run { get { return (bool)this.GetValue(RunProperty); } set { SetValue(RunProperty, value); } } public static readonly DependencyProperty ErrorProperty = DependencyProperty.Register("Error", typeof(bool), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); public bool Error { get { return (bool)this.GetValue(ErrorProperty); } set { SetValue(ErrorProperty, value); } } public static readonly DependencyProperty InitProperty = DependencyProperty.Register("Init", typeof(bool), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)); public bool Init { get { return (bool)this.GetValue(InitProperty); } set { SetValue(InitProperty, value); } } public static readonly DependencyProperty DirectionProperty = DependencyProperty.Register("Direction", typeof(string), typeof(LinMotOtherControl), new FrameworkPropertyMetadata("",new PropertyChangedCallback(DirectionChangedCallBack))); public string Direction { get { return (string)this.GetValue(DirectionProperty); } set { SetValue(DirectionProperty, value); } } public static readonly DependencyProperty LinMotDeviceDataProperty = DependencyProperty.Register("LinMotDeviceData", typeof(LinMotDeviceData), typeof(LinMotOtherControl) ,new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender)); public LinMotDeviceData LinMotDeviceData { get { return (LinMotDeviceData)this.GetValue(LinMotDeviceDataProperty); } set { SetValue(LinMotDeviceDataProperty, value); } } public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(double), typeof(LinMotOtherControl)); public double Position { get { return (double)this.GetValue(PositionProperty); } set { SetValue(PositionProperty, value); } } public static readonly DependencyProperty CycleProperty = DependencyProperty.Register("Cycle", typeof(int), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(10)); public int Cycle { get { return (int)this.GetValue(CycleProperty); } set { SetValue(CycleProperty, value); } } public static readonly DependencyProperty CurrentScanProperty = DependencyProperty.Register("CurrentScan", typeof(int), typeof(LinMotOtherControl), new FrameworkPropertyMetadata(0)); public int CurrentScan { get { return (int)this.GetValue(CurrentScanProperty); } set { SetValue(CurrentScanProperty, value); } } public static readonly DependencyProperty AccelProperty = DependencyProperty.Register("Accel", typeof(string), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); public string Accel { get { return (string)this.GetValue(AccelProperty); } set { SetValue(AccelProperty, value); } } public static readonly DependencyProperty DecelProperty = DependencyProperty.Register("Decel", typeof(string), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); public string Decel { get { return (string)this.GetValue(DecelProperty); } set { SetValue(DecelProperty, value); } } public static readonly DependencyProperty SpeedProperty = DependencyProperty.Register("Speed", typeof(string), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender)); public string Speed { get { return (string)this.GetValue(SpeedProperty); } set { SetValue(SpeedProperty, value); } } public static readonly DependencyProperty InputSpeedProperty = DependencyProperty.Register("InputSpeed", typeof(double), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender)); public double InputSpeed { get { return (double)this.GetValue(InputSpeedProperty); } set { SetValue(InputSpeedProperty, value); } } public static readonly DependencyProperty InputDecelProperty = DependencyProperty.Register("InputDecel", typeof(double), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender)); public double InputDecel { get { return (double)this.GetValue(InputDecelProperty); } set { SetValue(InputDecelProperty, value); } } public static readonly DependencyProperty InputAccelProperty = DependencyProperty.Register("InputAccel", typeof(double), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender)); public double InputAccel { get { return (double)this.GetValue(InputAccelProperty); } set { SetValue(InputAccelProperty, value); } } public static readonly DependencyProperty SelectDirectionItemSourceProperty = DependencyProperty.Register("SelectDirectionItem", typeof(List), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata(new List() { "up", "down" }, FrameworkPropertyMetadataOptions.AffectsRender)); public List SelectDirectionItemSource { get { return (List)this.GetValue(SelectDirectionItemSourceProperty); } set { SetValue(SelectDirectionItemSourceProperty, value); } } public static readonly DependencyProperty DirectionSelectedItemProperty = DependencyProperty.Register("DirectionSelectedItem", typeof(string), typeof(LinMotOtherControl) , new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnItemsSourceChanged))); /// /// DirectionSelectedItem /// public string DirectionSelectedItem { get { return (string)this.GetValue(DirectionSelectedItemProperty); } set { this.SetValue(DirectionSelectedItemProperty, value);} } private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { LinMotDevice data = (LinMotDevice)d.GetValue(DataContextProperty); string direction = (string)e.NewValue; if ("up".Equals(direction)) { d.SetValue(InputSpeedProperty, data.LinMotDeviceData.UpMaxSpeed); d.SetValue(InputAccelProperty, (double)data.LinMotDeviceData.UpMaxAcceleration); d.SetValue(InputDecelProperty, (double)data.LinMotDeviceData.UpMaxDeceleration); } else if ("down".Equals(direction)) { d.SetValue(InputSpeedProperty, data.LinMotDeviceData.DownMaxSpeed); d.SetValue(InputAccelProperty, (double)data.LinMotDeviceData.DownMaxAcceleration); d.SetValue(InputDecelProperty, (double)data.LinMotDeviceData.DownMaxDeceleration); } else { d.SetValue(InputSpeedProperty, 0.00); d.SetValue(InputAccelProperty, 0.00); d.SetValue(InputDecelProperty, 0.00); } } } public static readonly DependencyProperty IsEditEnableProperty = DependencyProperty.Register("IsEditEnable", typeof(bool), typeof(LinMotOtherControl)); public bool IsEditEnable { get { return (bool)this.GetValue(IsEditEnableProperty); } set { SetValue(IsEditEnableProperty, value); } } /// /// 方向改变后的回调函数 /// /// /// private static void DirectionChangedCallBack(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if(e.NewValue!=null) { string newValue = e.NewValue.ToString(); LinMotDevice data = (LinMotDevice)sender.GetValue(DataContextProperty); LinMotDeviceData linMotDeviceData = data.LinMotDeviceData; if (linMotDeviceData != null) { if (newValue == "up") { sender.SetValue(SpeedProperty, linMotDeviceData.UpMaxSpeed.ToString()); sender.SetValue(AccelProperty, linMotDeviceData.UpMaxAcceleration.ToString()); sender.SetValue(DecelProperty, linMotDeviceData.UpMaxDeceleration.ToString()); } else if(newValue=="down") { sender.SetValue(SpeedProperty, linMotDeviceData.DownMaxSpeed.ToString()); sender.SetValue(AccelProperty, linMotDeviceData.DownMaxAcceleration.ToString()); sender.SetValue(DecelProperty, linMotDeviceData.DownMaxDeceleration.ToString()); } else { sender.SetValue(SpeedProperty, ""); sender.SetValue(AccelProperty, ""); sender.SetValue(DecelProperty, ""); } } } } #endregion /// /// 构造函数 /// public LinMotOtherControl() { InitializeComponent(); } /// /// 启动 /// /// /// private void Start_Click(object sender, RoutedEventArgs e) { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.StartPosition",Cycle); } private void Stop_Click(object sender, RoutedEventArgs e) { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Stop"); } private void Abort_Click(object sender, RoutedEventArgs e) { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Abort"); } private void Reset_Click(object sender, RoutedEventArgs e) { InvokeClient.Instance.Service.DoOperation($"{ModuleName}.Reset"); } private void Apply_Click(object sender, RoutedEventArgs e) { if (String.IsNullOrEmpty(DirectionSelectedItem)) { MessageBox.Show("Select direction first", "Warning", MessageBoxButton.OK, MessageBoxImage.Error); } else if (DirectionSelectedItem == "up") { double speed = InputSpeed == 0.00 ? LinMotDeviceData.UpMaxSpeed : InputSpeed; int acc = InputAccel == 0.00 ? LinMotDeviceData.UpMaxAcceleration : (int)InputAccel; int dec = InputDecel == 0.00 ? LinMotDeviceData.UpMaxDeceleration : (int)InputDecel; InvokeClient.Instance.Service.DoOperation($"{ModuleName}.UpdateSpeedData", ModuleName, DirectionSelectedItem, speed, acc, dec); } else { double speed = InputSpeed != 0.00 ? InputSpeed : LinMotDeviceData.DownMaxSpeed; int acc = InputAccel != 0.00 ? (int)InputAccel : LinMotDeviceData.DownMaxAcceleration; int dec = InputDecel != 0.00 ? (int)InputDecel : LinMotDeviceData.DownMaxDeceleration; InvokeClient.Instance.Service.DoOperation($"{ModuleName}.UpdateSpeedData", ModuleName, DirectionSelectedItem, speed, acc, dec); } } private void Status_Click(object sender, RoutedEventArgs e) { IsEditEnable = false; } private void Setting_Click(object sender, RoutedEventArgs e) { IsEditEnable = true; } } }