using Infrastructure.Helper;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using ZR.Service.mes.andon;
using ZR.Service.mes.andon.Iservice;
using static System.Formats.Asn1.AsnWriter;
namespace ZR.Service.Utils.MyAlarmLigth
{
///
/// 调漆房IO端口监听+灯控类(X1-X8监听 → 触发对应灯控方法)
///
public class TiaoQiFangLight : IDisposable
{
// 核心配置(仅保留必要参数,对齐测试代码风格)
private const byte MODBUS_SLAVE_ID = 0x01;
private const ushort DI_START_ADDR = 0x0000;
private const int POLLING_INTERVAL_MS = 200;
private const int DI_COUNT = 8;
// 依赖注入(仅保留核心依赖)
private readonly AlarmLightModbus _modbusClient;
private readonly ILogger _logger;
// 状态缓存+监听控制(精简命名)
private readonly bool[] _lastDiState = new bool[DI_COUNT];
private CancellationTokenSource _cts;
private Task _listenTask;
//private AndonAlarmLevelService andonAlarmLevelService = new AndonAlarmLevelService();
///
/// 构造函数(精简参数,日志可选)
///
public TiaoQiFangLight(AlarmLightModbus modbusClient, ILogger logger = null)
{
_modbusClient = modbusClient;
_logger = logger;
Array.Fill(_lastDiState, false); // 初始化未按下
}
///
/// 启动监听(精简逻辑,无冗余判断)
///
public void StartListen()
{
if (_listenTask?.IsCompleted == false)
{
_logger?.LogWarning("调漆房IO监听已启动,无需重复执行");
return;
}
_cts = new CancellationTokenSource();
_listenTask = Task.Run(() => ListenDiLoop(_cts.Token), _cts.Token);
}
///
/// 停止监听(精简释放逻辑)
///
public void StopListen()
{
if (_cts == null) return;
_cts.Cancel();
_listenTask?.Wait(1000);
_logger?.LogInformation("❌ 停止X1-X8监听");
}
///
/// 核心:轮询监听DI状态(精简循环逻辑,对齐测试代码异常处理)
///
private async Task ListenDiLoop(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
try
{
// ====== 关键修改:用ReadDiscreteInputs读取DI端口 ======
List diStates = _modbusClient.ReadDiscreteInputs(
MODBUS_SLAVE_ID,
DI_START_ADDR,
(ushort)DI_COUNT // 转为ushort匹配方法参数
);
// 结果校验
if (diStates == null || diStates.Count != DI_COUNT)
{
await Task.Delay(POLLING_INTERVAL_MS, cancellationToken);
continue;
}
for (int i = 0; i < DI_COUNT; i++)
{
bool isPressed = diStates[i]; // true=按下,false=未按下
string portName = $"X{i + 1}";
// 仅“从未按下→按下”时触发
if (isPressed && !_lastDiState[i])
{
TriggerLightMethod(i + 1);
}
_lastDiState[i] = isPressed; // 更新缓存
}
}
catch (OperationCanceledException)
{
_logger?.LogInformation("监听循环被取消,正常退出");
break;
}
catch (Exception cmdEx)
{
}
await Task.Delay(POLLING_INTERVAL_MS, cancellationToken);
}
}
///
/// 触发灯控方法(精简逻辑,仅保留核心映射)
///
private void TriggerLightMethod(int portNumber)
{
byte lightUnitId = 0x01; // 警灯站号(可按需替换为ReadAlarmlightNumber)
try
{
//X1、X2、X3红按钮,X4绿按钮,X5红按钮
//Y1蜂鸣器、Y2红灯、Y3黄灯、Y4绿灯
//Y1->0; Y2->1; y3->2; y4->3
switch (portNumber)
{
// X1→ 红按钮
case 1:
_modbusClient.WriteSingleCoil(lightUnitId, 0, true); //0-Y1地址蜂鸣器
_modbusClient.WriteSingleCoil(lightUnitId, 1, true); //1-Y2地址红灯
_modbusClient.WriteSingleCoil(lightUnitId, 2, false); //2-Y3地址黄灯
_modbusClient.WriteSingleCoil(lightUnitId, 3, false); //3-Y4地址绿灯
break;
// X2→ 红按钮
case 2:
_modbusClient.WriteSingleCoil(lightUnitId, 0, true); //0-Y1地址蜂鸣器
_modbusClient.WriteSingleCoil(lightUnitId, 1, true); //1-Y2地址红灯
_modbusClient.WriteSingleCoil(lightUnitId, 2, false); //2-Y3地址黄灯
_modbusClient.WriteSingleCoil(lightUnitId, 3, false); //3-Y4地址绿灯
break;
// X3→ 红按钮
case 3:
_modbusClient.WriteSingleCoil(lightUnitId, 0, true); //0-Y1地址蜂鸣器
_modbusClient.WriteSingleCoil(lightUnitId, 1, true); //1-Y2地址红灯
_modbusClient.WriteSingleCoil(lightUnitId, 2, false); //2-Y3地址黄灯
_modbusClient.WriteSingleCoil(lightUnitId, 3, false); //3-Y4地址绿灯
break;
// X4→ 绿按钮
case 4:
_modbusClient.WriteSingleCoil(lightUnitId, 0, false); //0-Y1地址蜂鸣器
_modbusClient.WriteSingleCoil(lightUnitId, 1, false); //1-Y2地址红灯
_modbusClient.WriteSingleCoil(lightUnitId, 2, false); //2-Y3地址黄灯
_modbusClient.WriteSingleCoil(lightUnitId, 3, true); //3-Y4地址绿灯
break;
// X5 → 红按钮
case 5:
_modbusClient.WriteSingleCoil(lightUnitId, 0, true); //0-Y1地址蜂鸣器
_modbusClient.WriteSingleCoil(lightUnitId, 1, true); //1-Y2地址红灯
_modbusClient.WriteSingleCoil(lightUnitId, 2, false); //2-Y3地址黄灯
_modbusClient.WriteSingleCoil(lightUnitId, 3, false); //3-Y4地址绿灯
break;
}
}
catch (Exception ex)
{
_logger?.LogError(ex, $"❌ X{portNumber}触发灯控方法失败");
}
}
///
/// 释放资源(精简Dispose)
///
public void Dispose()
{
StopListen();
_cts?.Dispose();
}
}
}