using Cowain.Base.Models; using Cowain.Base.ViewModels; using Microsoft.Extensions.Logging; using Plugin.Cowain.Driver.Abstractions; using Plugin.Cowain.Driver.IServices; using Plugin.Cowain.Driver.ViewModels; namespace Plugin.Cowain.Driver; public class DeviceMonitor : IDeviceMonitor { private IServiceProvider _serviceProvider; private List _deviceThreads = new List(); public List Devices => GetDeviceViewModels(); public List DeviceThreads => _deviceThreads; private readonly List alarms = new(); public List Alarms => alarms; private readonly ILogger _logger; public DeviceMonitor(IServiceProvider serviceProvider, ILogger logger) { _serviceProvider = serviceProvider; _logger = logger; } public ResultModel GetDriver(string name) { var dev = _deviceThreads.FirstOrDefault(x => x.Device.DeviceName == name); if (dev == null) { return ResultModel.Error("device is null"); } return ResultModel.Success(dev.Driver); } public ResultModel GetDevice(string name) { var dev = _deviceThreads.FirstOrDefault(x => x.Device.DeviceName == name); if (dev == null) { return ResultModel.Error("device is null"); } return ResultModel.Success(dev.Device); } public ResultModel GetVariable(string plc, string address) { var dev = GetDevice(plc); if (!dev.IsSuccess) { return ResultModel.Error("device is null"); } var variable = dev.Data?.Variables?.FirstOrDefault(x => x.Address == address); if (variable == null) return ResultModel.Error("variable is null"); return ResultModel.Success(variable); } public ResultModel GetActionParam(string plc, string address) { var dev = GetDevice(plc); if (!dev.IsSuccess) { return ResultModel.Error("device is null"); } if (dev.Data == null) { return ResultModel.Error("device is null"); } var device = dev.Data; if (device.VarActions == null) { return ResultModel.Error($"设备 {device.DeviceName} 的动作列表为空"); } var q = from v in device.Variables join va in device.VarActions on v.Id equals va.TagId where v.Address == address select va.Param; var param = q.FirstOrDefault(); return string.IsNullOrEmpty(param) ? ResultModel.Error("action param is null") : ResultModel.Success(param); } public void AddDevice(IDriver driver, IActionPluginService actionPluginService, DeviceViewModel device) { var deviceThread = new DeviceThread(driver, actionPluginService, _serviceProvider, device); _deviceThreads.Add(deviceThread); } public List GetDeviceViewModels() { return _deviceThreads.Select(x => x.Device).ToList(); } }