using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Team.FFFeederService
{
public class VibrationFrequencyDetector : IDisposable
{
///
/// C++ DLL结构体对应C#版本
///
[StructLayout(LayoutKind.Sequential)]
public struct ST_APAFedColC
{
public int inFedAct;
public UInt16 u16VoiMot0;
public UInt16 u16VoiMot1;
public UInt16 u16VoiMot2;
public UInt16 u16VoiMot3;
public UInt16 u16VoiMot4;
public UInt16 u16VoiMot5;
public UInt16 u16VoiMot6;
public UInt16 u16VoiMot7;
public UInt16 u16VoiMot8;
public UInt16 u16VoiMot9;
public UInt16 u16VoiMotA;
public UInt16 u16VoiMotB;
public UInt16 u16VoiMotC;
public UInt16 u16VoiMotD;
public UInt16 u16VoiMotE;
public UInt16 u16VoiMotF;
public UInt16 u16DuartTim;
}
[StructLayout(LayoutKind.Sequential)]
public struct ST_APAMateInf
{
public float fMatePosX;
public float fMatePosY;
public int Sta;
}
[StructLayout(LayoutKind.Sequential)]
public struct ST_APAParamRe
{
public int Sta;
public UInt16 u16MinAmp;
public UInt16 u16MaxAmp;
public UInt16 u16MinFre;
public UInt16 u16MaxFre;
public UInt16 u16Tim;
}
// 委托定义 - 对应C++回调函数
public delegate int APAFedColCallback(ST_APAFedColC stFecColC);
public delegate ST_APAMateInf APACoordReCallback();
public delegate int APALogicAdjEndCallback(int enAdjSta);
// 存储回调引用以防止垃圾回收
///
/// Feeder动作执行结果回调
///
private APAFedColCallback _fedColCallback;
private APACoordReCallback _coordReCallback;
private APALogicAdjEndCallback _logicAdjEndCallback;
// DLL导入
private const string DllName = "AutoParaADJ.dll";
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
private static extern int APATask();
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
private static extern int APAInit(
APACoordReCallback VisCoor_cb,
APAFedColCallback FedCol_cb,
APALogicAdjEndCallback LogEnd_cb,
int FedType,
int enAct);
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
private static extern int APALogicStaCol(int Sta);
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
private static extern int APALogicParamSet(
ushort u16MinAmp,
ushort u16MaxAmp,
ushort u16MinFre,
ushort u16MaxFre,
ushort u16Tim);
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
private static extern ST_APAParamRe APALogicParamRe();
// 事件 - 用于向C#代码传递回调数据
///
/// 设置振动参数并执行动作后的回调事件
///
public event Action OnExecuteFeedervibration;
///
/// 相机拍照获取物料位置回调事件
///
///
public delegate Tuple ExecutePhotoDelegate();
public event ExecutePhotoDelegate OnExecutePhoto;
///
/// 逻辑调整结束回调事件,0 :失败 1:运行中 3:完成调频 6:验证结束
///
public event Action OnExecuteResult;
///
/// 初始化振动检测器
///
/// Feeder类型
/// 动作编号
/// 初始化结果
public bool Initialize(int fedType, int enAct)
{
// 创建并保存回调委托实例
_coordReCallback = onExecutePhoto;
_fedColCallback = (ST_APAFedColC stFecColC) =>
{
OnExecuteFeedervibration?.Invoke(stFecColC);
return 1; // 返回成功
};
_logicAdjEndCallback = (int enAdjSta) =>
{
OnExecuteResult?.Invoke(enAdjSta);
return 1; // 返回成功
};
// 调用DLL初始化函数
int result = APAInit(_coordReCallback, _fedColCallback, _logicAdjEndCallback, 1, enAct);
return result == 1; // 假设0表示成功
}
///
/// 启动振动检测任务
///
/// 任务启动结果
public bool StartTask()
{
int result = APATask();
return result == 0; // 假设0表示成功
}
///
/// 设置逻辑参数
///
/// 最小振幅
/// 最大振幅
/// 最小频率
/// 最大频率
/// 设置结果
public bool SetLogicParameters(ushort minAmplitude, ushort maxAmplitude,
ushort minFrequency, ushort maxFrequency, ushort durationValue)
{
int result = APALogicParamSet(minAmplitude, maxAmplitude, minFrequency, maxFrequency, durationValue);
return result == 0; // 假设0表示成功
}
///
/// 获取逻辑参数
///
/// 最小振幅
/// 最大振幅
/// 最小频率
/// 最大频率
/// 获取结果
public ST_APAParamRe GetLogicParameters()
{
ST_APAParamRe result = APALogicParamRe();
return result;
}
///
/// 设置逻辑状态,0:停止 1 :启动 2:验证 3:结束
///
/// 状态值
/// 设置结果
public bool SetLogicState(int state)
{
int result = APALogicStaCol(state);
return result == 0; // 假设0表示成功
}
///
/// 释放资源
///
public void Dispose()
{
// 清理回调引用
_fedColCallback = null;
_coordReCallback = null;
_logicAdjEndCallback = null;
// 其他清理工作...
}
private ST_APAMateInf onExecutePhoto()
{
var res = OnExecutePhoto?.Invoke();
return new ST_APAMateInf
{
fMatePosX = res.Item2,
fMatePosY = res.Item3,
Sta = res.Item1 ? 1 : 0
};
}
}
}