You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
9.7 KiB
C#

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using HslCommunication.Enthernet;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SlnMesnac.Business.@base;
using SlnMesnac.Business.util;
using SlnMesnac.Config;
using SlnMesnac.Model.AirportApiEntity;
using SlnMesnac.Model.dto;
using SlnMesnac.Repository;
using SlnMesnac.Repository.service;
using SlnMesnac.TouchSocket;
using SlnMesnac.WPF.Page.ControlPage;
using SlnMesnac.WPF.Page.Generate;
using SlnMesnac.WPF.Page.IndexPage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
namespace SlnMesnac.WPF.ViewModel
{
public class MainWindowViewModel : ViewModelBase
{
private readonly ILogger<MainWindowViewModel> _logger;
private readonly ILogger<BaseTaskInfoBusiness> _BaseTaskInfoBusinesslogger;
private readonly ILogger<BaseAGVBusiness> _baseAGVBusinessLogger;
private readonly ILogger<VisionBusiness> _VisionBusinessLogger;
private readonly ILogger<BaseStateRefreshBusiness> _StateRefreshBusinessLogger;
private IAirportTaskService _Taskservice;
private IAGVStateService _AGVStateService;
private IAGVMapPointService _AGVMapPointService;
private IAGVSettingService _AGVSettingService;
private IAGVJobService _agvJobService;
private IVisionSettingService _visionSettingService;
private TcpServer _tcpServer;
private ApiServer _apiServer;
//代码生成
private readonly GenerateControl generateControl = new GenerateControl();
private IndexContent indexContent = new IndexContent();
private UserTaskControl taskControl = new UserTaskControl();
private AppConfig _appConfig;
private AirPorthttpClient _airPorthttpClient;
private BaseTaskInfoBusiness _baseTaskInfoBusiness;
private BaseStateRefreshBusiness _baseStateRefreshBusiness;
private BaseAGVBusiness _baseAGVBusiness;
private VisionBusiness _visionBusiness;
private System.Timers.Timer _timer;
#region 参数定义
/// <summary>
/// AGV状态
/// </summary>
private int _visionStatus = 0;
public int VisionStatus
{
get { return _visionStatus; }
set { _visionStatus = value; RaisePropertyChanged(nameof(VisionStatus)); }
}
/// <summary>
/// AGV状态
/// </summary>
private int _agvStatus = 0;
public int AgvStatus
{
get { return _agvStatus; }
set { _agvStatus = value; RaisePropertyChanged(nameof(AgvStatus)); }
}
public System.Windows.Controls.UserControl _content;
public System.Windows.Controls.UserControl UserContent
{
get { return _content; }
set
{
_content = value;
RaisePropertyChanged(nameof(UserContent));
}
}
#endregion
#region 事件定义
/// <summary>
/// 界面跳转按钮事件
/// </summary>
public RelayCommand<object> ControlOnClickCommand { get; set; }
/// <summary>
/// 打开系统键盘
/// </summary>
public RelayCommand OpenSystemKeyboardCommand { get; set; }
/// <summary>
/// 窗体控制
/// </summary>
public RelayCommand<object> FormControlCommand { get; set; }
#endregion
public MainWindowViewModel()
{
_appConfig = App.ServiceProvider.GetService<AppConfig>();
_logger = App.ServiceProvider.GetService<ILogger<MainWindowViewModel>>();
_BaseTaskInfoBusinesslogger = App.ServiceProvider.GetService<ILogger<BaseTaskInfoBusiness>>();
_baseAGVBusinessLogger = App.ServiceProvider.GetService<ILogger<BaseAGVBusiness>>();
_VisionBusinessLogger = App.ServiceProvider.GetService<ILogger<VisionBusiness>>();
_Taskservice = App.ServiceProvider.GetService<IAirportTaskService>();
_AGVStateService = App.ServiceProvider.GetService<IAGVStateService>();
_AGVMapPointService = App.ServiceProvider.GetService<IAGVMapPointService>();
_AGVSettingService = App.ServiceProvider.GetService<IAGVSettingService>();
_agvJobService = App.ServiceProvider.GetService<IAGVJobService>();
_visionSettingService = App.ServiceProvider.GetService<IVisionSettingService>();
_tcpServer = App.ServiceProvider.GetService<TcpServer>();
_airPorthttpClient = App.ServiceProvider.GetService<AirPorthttpClient>();
_baseTaskInfoBusiness = BaseTaskInfoBusiness.GetInstance(_BaseTaskInfoBusinesslogger,
_Taskservice, _AGVStateService, _AGVMapPointService, _agvJobService, _visionSettingService,
_tcpServer, _airPorthttpClient, _baseAGVBusiness, _visionBusiness);
_baseAGVBusiness = BaseAGVBusiness.GetInstance(_baseAGVBusinessLogger, _airPorthttpClient, _AGVStateService, _AGVMapPointService, _appConfig, _agvJobService, _AGVSettingService);
_visionBusiness = VisionBusiness.GetInstance(_VisionBusinessLogger, _tcpServer, _Taskservice, _visionSettingService, _AGVStateService, _agvJobService);
_baseStateRefreshBusiness = BaseStateRefreshBusiness.GetInstance(_StateRefreshBusinessLogger, _AGVStateService, _airPorthttpClient, _AGVSettingService);
_apiServer = new ApiServer();
ControlOnClickCommand = new RelayCommand<object>(obj => ControlOnClick(obj));
FormControlCommand = new RelayCommand<object>(x => FormControl(x));
StopAllTaskActionInvoke();
UserContent = indexContent;
Init();
}
private void Init()
{
//Timer
_timer = new System.Timers.Timer();
_timer.Interval = 1500;
_timer.Elapsed += (s, e) =>
{
RefreshStateValue();
};
_timer.Start();
}
private void RefreshStateValue()
{
VisionStatus = _visionBusiness.GetState;
AgvStatus = _airPorthttpClient.GetConnectState();
}
/// <summary>
/// 窗体控制
/// </summary>
/// <param name="obj"></param>
private void FormControl(object obj)
{
try
{
string controlType = obj as string;
switch (controlType)
{
// 关闭当前窗口
case "Exit":
//Environment.Exit(0);
Application.Current.Shutdown();
break;
case "Generate":
UserContent = generateControl;
break;
// 还原 或者 最大化当前窗口
case "Normal":
if (Application.Current.MainWindow.WindowState == WindowState.Normal)
{
Application.Current.MainWindow.WindowState = WindowState.Maximized;
break;
}
if (Application.Current.MainWindow.WindowState == WindowState.Maximized)
{
Application.Current.MainWindow.WindowState = WindowState.Normal;
break;
}
break;
// 最小化当前窗口
case "Minimized":
Application.Current.MainWindow.WindowState = WindowState.Minimized;
break;
case "StartAGVStateRefresh":
_baseStateRefreshBusiness.AGVStateUpdateTimerOperation(TimerControl.Start);
break;
case "StopAGVStateRefresh":
_baseStateRefreshBusiness.AGVStateUpdateTimerOperation(TimerControl.Stop);
break;
case "StartTaskRefresh":
_baseTaskInfoBusiness.TaskStateUpdateTimerOperation(TimerControl.Start);
break;
case "StopTaskRefresh":
_baseTaskInfoBusiness.TaskStateUpdateTimerOperation(TimerControl.Stop);
break;
case "TestButton":
_logger.LogInformation($"测试按钮运行");
break;
default:
break;
}
}
catch (Exception ex)
{
_logger.LogError("窗体控制逻辑异常" + ex.Message);
}
}
/// <summary>
/// 停止所有任务和事件
/// </summary>
public void StopAllTaskActionInvoke()
{
taskControl.StopTaskAction = () =>
{
_baseTaskInfoBusiness.StopAllTask();
};
}
/// <summary>
/// 界面跳转
/// </summary>
private void ControlOnClick(object obj)
{
try
{
string? info = obj as string;
switch (info)
{
case "Index":
UserContent = indexContent;
break;
case "Control":
UserContent = taskControl;
break;
default: break;
}
}
catch (Exception ex)
{
_logger.LogError("界面跳转逻辑异常", ex);
}
}
}
}