WorkAreaViewModel.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using CommunityToolkit.Mvvm.ComponentModel;
  2. using CommunityToolkit.Mvvm.Input;
  3. using PLCIOPointTool.Services;
  4. using ValueType = PLCIOPointTool.Services.ValueType;
  5. namespace PLCIOPointTool.ViewModels;
  6. public partial class WorkAreaViewModel : ObservableObject, IDisposable
  7. {
  8. private readonly ICommunicator _communicator;
  9. private bool disposedValue;
  10. [ObservableProperty]
  11. [NotifyCanExecuteChangedFor(nameof(SendCommand))]
  12. [NotifyCanExecuteChangedFor(nameof(ReadCommand))]
  13. private bool _isConnected;
  14. [ObservableProperty]
  15. private string _sentSymbolName;
  16. [ObservableProperty]
  17. private string _sentValue;
  18. [ObservableProperty]
  19. private int _sentValueTypeIndex;
  20. [ObservableProperty]
  21. private string _readSymbolName;
  22. [ObservableProperty]
  23. private string _readValue;
  24. [ObservableProperty]
  25. private int _readValueTypeIndex;
  26. [ObservableProperty]
  27. private ValueType[] _valueTypes;
  28. public WorkAreaViewModel(ICommunicator communicator)
  29. {
  30. _isConnected = false;
  31. _sentSymbolName = string.Empty;
  32. _sentValue = string.Empty;
  33. _sentValueTypeIndex = -1;
  34. _readSymbolName = string.Empty;
  35. _readValue = string.Empty;
  36. _readValueTypeIndex = -1;
  37. _valueTypes = Enum.GetValues<ValueType>();
  38. _communicator = communicator;
  39. _communicator.ConnectionStatusChanged += OnConnectionStatusChanged;
  40. }
  41. [RelayCommand(CanExecute = nameof(IsConnected))]
  42. private void Send()
  43. {
  44. if (string.IsNullOrWhiteSpace(SentSymbolName) || string.IsNullOrWhiteSpace(SentValue) || SentValueTypeIndex < 0)
  45. {
  46. return;
  47. }
  48. Task.Run(() =>
  49. {
  50. _communicator.SetValue(SentSymbolName, SentValue, (ValueType)SentValueTypeIndex);
  51. });
  52. }
  53. [RelayCommand(CanExecute = nameof(IsConnected))]
  54. private void Read()
  55. {
  56. if (string.IsNullOrWhiteSpace(ReadSymbolName) || ReadValueTypeIndex < 0)
  57. {
  58. return;
  59. }
  60. Task.Run(() =>
  61. {
  62. _communicator.GetValue(ReadSymbolName, (ValueType)ReadValueTypeIndex);
  63. });
  64. }
  65. private void OnConnectionStatusChanged(object? sender, bool e)
  66. {
  67. App.Current.Dispatcher.Invoke(() =>
  68. {
  69. IsConnected = e;
  70. });
  71. }
  72. protected virtual void Dispose(bool disposing)
  73. {
  74. if (!disposedValue)
  75. {
  76. if (disposing)
  77. {
  78. // TODO: dispose managed state (managed objects)
  79. _communicator.ConnectionStatusChanged -= OnConnectionStatusChanged;
  80. }
  81. // TODO: free unmanaged resources (unmanaged objects) and override finalizer
  82. // TODO: set large fields to null
  83. disposedValue = true;
  84. }
  85. }
  86. // // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources
  87. // ~WorkAreaViewModel()
  88. // {
  89. // // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
  90. // Dispose(disposing: false);
  91. // }
  92. public void Dispose()
  93. {
  94. // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
  95. Dispose(disposing: true);
  96. GC.SuppressFinalize(this);
  97. }
  98. }