MainVM.cs 4.25 KB
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using HHECS.RobotTool.Common;
using HHECS.RobotTool.Service;
using HHECS.RobotTool.View;
using HHECS.RobotTool.View.CommunicationView;
using HHECS.RobotTool.View.EquipmentView;
using HHECS.RobotTool.View.RobotConfigView;
using System.Collections.ObjectModel;
using System.Windows;
using MessageBox = HandyControl.Controls.MessageBox;

namespace HHECS.RobotTool.ViewModel
{
    internal partial class MainVM : ObservableObject
    {
        [ObservableProperty]
        private bool btnStartEnabled = true;

        [ObservableProperty]
        private bool btnStopEnabled = false;

        [ObservableProperty]
        private ObservableCollection<LogModel> logModels = new ObservableCollection<LogModel>();

        [ObservableProperty]
        private CommunicationPage communicationPage = new CommunicationPage();

        [ObservableProperty]
        private EquipmentPage equipmentPage = new EquipmentPage();

        [ObservableProperty]
        private RobotConfigPage robotConfigPage = new RobotConfigPage();

        [ObservableProperty]
        private GrooveComputerPage grooveComputerPage = new GrooveComputerPage();

        [ObservableProperty]
        private bool kukaServerStatus;

        private readonly CenterService _centerService;
        private readonly KukaService _kukaService;
        private readonly SystemLog _log = SystemLog.GetInstance();

        public MainVM(CenterService centerService, KukaService kukaService)
        {
            _centerService = centerService;
            _kukaService = kukaService;
            RefreshLog();
        }

        [RelayCommand]
        public void Start()
        {
            BtnStartEnabled = false;
            BtnStopEnabled = true;
            _centerService.Start();
        }

        [RelayCommand]
        public void Stop()
        {
            BtnStartEnabled = true;
            BtnStopEnabled = false;
            _centerService.Stop();
        }

        [RelayCommand]
        public void KukaServer()
        {
            if (KukaServerStatus)
            {
                var result = _kukaService.StartTcpServer();
                if (!result.Success)
                {
                    KukaServerStatus = false;
                    MessageBox.Error($"Kuka Tcp 服务启动失败:{result.Msg}");
                }
                _log.LogSuccess($"Kuka Tcp 服务已启动");
            }
            else
            {
                _kukaService.StopTcpServer();
                _log.LogInfo($"Kuka Tcp 服务已关闭");
            }
        }

        private void RefreshLog()
        {
            Task.Run(() =>
            {
                Application.Current.Dispatcher.Invoke(async () =>
                {
                    do
                    {
                        while (!_log.IsEmpty)
                        {
                            var log = _log.GetLog();
                            if (log == null)
                            {
                                await Task.Delay(100);
                                continue;
                            }

                            var oldItem = LogModels.Where(x => x.Messages.Equals(log.Messages)).FirstOrDefault();
                            if (oldItem != null)
                            {
                                oldItem.CreateTime = log.CreateTime;
                                LogModels = new ObservableCollection<LogModel>(LogModels.OrderByDescending(x => x.CreateTime));
                            }
                            else
                            {
                                LogModels.Insert(0, new LogModel()
                                {
                                    LogType = log.LogType,
                                    Messages = log.Messages,
                                    CreateTime = log.CreateTime
                                });
                            }
                            if (LogModels.Count > 50)
                            {
                                LogModels.Remove(LogModels.Last());
                            }
                        }
                        await Task.Delay(100);
                    } while (true);
                });
            });
        }
    }
}