using System;
using System.Threading;
using SHJX.Service.Common.Extend;
using SHJX.Service.Common.ReadXML;
using SHJX.Service.Model.Control;
using SHJX.Service.ServerClient.Interface;
using SHJX.Service.ServerClient.TempController;
using SHJX.Service.Common.Logging;
using Microsoft.Extensions.Logging;
namespace SHJX.Service.ServerClient.RS485Control
{
///
/// 消解位通信
///
public class DissolvePort : SerialPortImp, PortControlImp
{
private static readonly ILogger logger = LogFactory.BuildLogger(typeof(DissolvePort));
private readonly ReadConfigUtil _config;
///
/// 消解位
///
/// 日志
/// 配置
public DissolvePort( ReadConfigUtil config)
: base(config)
{
_config = config;
config.GetSpeed.ForEach(item => {
if (item.NodeName == "MotorD")
speedD = item.Speed;
});
}
private double speedD = 0;
public object Read(PortArgs args)
{
object obj = args.ReadWay switch
{
"OriginalPosition" => GetOriginalPosition(args),
_ => JudgeStorage(args.NodeId),
};
return obj;
}
public object GetOriginalPosition(PortArgs args)
{
var res = JudgeStorage(args.NodeId);
if (res is null or { Length: 0 }) return false;
return res[3].Equals('0');
}
public bool Write(PortArgs args)
{
var res = args.WriteWay switch
{
WriteWay.Normotopia => MotorGoBack(args.NodeId, 3),
WriteWay.Antiposition => MotorGoBackDissolvePortM(args),
WriteWay.Move => Move(args.NodeId, args.Distance,speedD),
WriteWay.Stop => MotorStop(args.NodeId),
WriteWay.Speed => MotorSpeed(args.NodeId, args.Distance),
WriteWay.AcSpeed => MotorAcSpeed(args.NodeId, args.Distance),
WriteWay.DeSpeed => MotorDeSpeed(args.NodeId, args.Distance),
_ => throw new ArgumentNullException(args.WriteWay.GetEnumDesc())
};
return res;
}
///
/// 移动
///
///
///
///
public bool Move(byte nodeId, long distance,Double Speed)
{
MotorMove(nodeId, distance);
Thread.Sleep((int)(Math.Abs(distance) / 20000 * 300* Speed + 500));
return true;
}
private bool MotorGoBackDissolvePortM(PortArgs args)
{
if (args.ManualOrAuto=="Auto") {
MotorMove(args.NodeId, -2000 * _config.DissolveMoveDistance);
Thread.Sleep(800);
MotorMove(args.NodeId, 2000 * _config.DissolveMoveDistance);
Thread.Sleep(800);
MotorMove(args.NodeId, -2000 * _config.DissolveMoveDistance);
Thread.Sleep(800);
MotorMove(args.NodeId, 2000 * _config.DissolveMoveDistance);
Thread.Sleep(800);
MotorMove(args.NodeId, -2000 * _config.DissolveMoveDistance);
Thread.Sleep(800);
MotorMove(args.NodeId, 2000 * _config.DissolveMoveDistance);
Thread.Sleep(Convert.ToInt32(_config.CoolingPipeWatingTime) * 15000);
}
MotorGoBackDissolvePort(args.NodeId, 4);
//Thread.Sleep((int)(Math.Abs(distance) / 20000 * 300 * Speed + 500));
return true;
}
}
}