123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- using System.IO;
- using OpenCvSharp;
- using System.Threading;
- //namespace picoapi_cshape
- namespace OTSMeasureApp.ServiceCenter
- {
-
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct PACKET_HEAD_STRUCT
- {
- public uint dwSize;
- public uint dwMsg;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct CHK_CERTIFICATION_CODE
- {
- public PACKET_HEAD_STRUCT Header;
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- public byte[] btCode;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_COLUMN_PARAMETERS_COMMAND
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwRequest;
- public uint dwInterval;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct SET_COLUMN_PARAMETERS_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwSet;
- public uint dwGunHV;
- public uint dwMag;
- public uint dwSpot;
- public uint dwWD;
- public uint dwBrightness;
- public uint dwContast;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_COLUMN_PARAMETERS_STRUCT_HUIHONG
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwData;
- public uint dwState;
- public uint dwSignal;
- public uint dwGunHV;
- public uint dwScanSpeed;
- public uint dwMag;
- public uint dwSpot;
- public uint dwWD;
- public uint dwBrightness;
- public uint dwContast;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_STAGE_PARAMETERS_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwData;
- public float dwXPos;
- public float dwYPos;
- public float dwZPos;
- public float dwRPos;
- public float dwTPos;
- public float dwLimit;
- public float dwXMax;
- public float dwYMax;
- public float dwZMax;
- public float dwRMax;
- public float dwTMax;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct SET_STAGE_PARAMETERS_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwSet;
- public uint dwXPos;
- public uint dwYPos;
- public uint dwZPos;
- public uint dwRPos;
- public uint dwTPos;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_STAGE_PARAMETERS_COMMAND
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwRequest;
- public uint dwInterval;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_STAGE_MOVE_COMPLETED_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwAxis;
- public uint dwMotion;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_SCANMODE_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwDataType;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct SET_SCANMODE_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwDataType;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_SCANSPEED_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwDataType;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct SET_SCANSPEED_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwDataType;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct GET_IMAGE_STRUCT
- {
- public PACKET_HEAD_STRUCT Header;
- public int dwDataType;
- public uint LIVE;
- public uint SCANSPEED;
- public uint width;
- public uint height;
- public uint chanel;
- }
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- public struct SET_STAGE_AXIS_STOP_COMMAND
- {
- public PACKET_HEAD_STRUCT Header;
- public uint dwAxisStop;
- }
- public class ModelInfo
- {
- string currentPath = AppDomain.CurrentDomain.BaseDirectory;
- public const string DLL_FIlENAME = "D:\\proj\\opton\\SEM API\\SemApiTest\\bin\\Release\\SemApi.dll";
-
- }
- public class PicoSmartApi_cshape
- {
- #region exten c api
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern IntPtr create();
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void set_port(IntPtr m_api, int port);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int get_port(IntPtr m_api);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void set_ip(IntPtr m_api, string server_ip);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int start(IntPtr m_api);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int stop(IntPtr m_api);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void GET_COLUMN(IntPtr m_api, uint dwRequest, uint dwInterval);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int GET_COLUMN_MSGDATA(IntPtr m_api, ref GET_COLUMN_PARAMETERS_STRUCT_HUIHONG COLUMN_PARAMETERS, int iWaitMs);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void SET_COLUMN(IntPtr m_api, uint dwSet, uint dwGunHV, uint dwMag, uint dwSpot, uint dwBrightness, uint dwContast);
-
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void GET_STAGE(IntPtr m_api, uint dwRequest, uint dwInterval);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int GET_STAGE_MSGDATA(IntPtr m_api, ref GET_STAGE_PARAMETERS_STRUCT STAGE_PARAMETERS, int iWaitMs);//硬件最小发送间隔默认为1秒
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int GET_STAGE_MOVE(IntPtr m_api, ref GET_STAGE_MOVE_COMPLETED_STRUCT STAGE_MOVE, int iWaitMs);//硬件最小发送间隔默认为1秒
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void SET_STAGE(IntPtr m_api, uint dwSet, float dwXPos, float dwYPos, float dwZPos, float dwRPos, float dwTPos);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void STOP_STAGE(IntPtr m_api);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void GET_IMAGE(IntPtr m_api, uint dwDataType, int image_index, int chanel, int speed, int live);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int GET_IMAGE_MSGDATA(IntPtr m_api, IntPtr IMAGE, int iWaitMs);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void GET_SCANMODE(IntPtr m_api);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
-
- private static extern int GET_SCANMODE_MSGDATA(IntPtr m_api, ref GET_SCANMODE_STRUCT SCANMODE, int iWaitMs);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void SET_SCANMODE(IntPtr m_api, uint dwDataType);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void GET_SCANSPEED(IntPtr m_api);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int GET_SCANSPEED_MSGDATA(IntPtr m_api, ref GET_SCANSPEED_STRUCT SCANSPEED, int iWaitMs);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern void SET_SCANSPEED(IntPtr m_api, uint dwDataType);
- [DllImport(ModelInfo.DLL_FIlENAME, CallingConvention = CallingConvention.Cdecl)]
- private static extern int isStart(IntPtr api);
- #endregion
- #region c# api
- private IntPtr m_api = IntPtr.Zero;
- public PicoSmartApi_cshape()
- {
- if (File.Exists(ModelInfo.DLL_FIlENAME) == false)
- return;
- this.m_api = create();
- }
- public void set_port(int port)
- {
- set_port(m_api, port);
- }
- public int get_port()
- {
- return get_port(m_api);
- }
- public void set_ip(string ip)
- {
- set_ip(m_api, ip);
- }
- public int start()
- {
- return start(m_api);
- }
- public int stop()
- {
- return stop(m_api);
- }
- public void GET_COLUMN(uint dwRequest, uint dwInterval)
- {
- GET_COLUMN(m_api, dwRequest, dwInterval);
- }
- public int GET_COLUMN_MSGDATA(ref GET_COLUMN_PARAMETERS_STRUCT_HUIHONG COLUMN_PARAMETERS, int iWaitMs)
- {
- return GET_COLUMN_MSGDATA(m_api, ref COLUMN_PARAMETERS, iWaitMs);
- }
- public void SET_COLUMN(uint dwSet, uint dwGunHV, uint dwMag, uint dwSpot, uint dwBrightness, uint dwContast)
- {
- SET_COLUMN(m_api, dwSet, dwGunHV, dwMag, dwSpot, dwBrightness, dwContast);
- }
-
- public void GET_STAGE(uint dwRequest, uint dwInterval)
- {
- GET_STAGE(m_api, dwRequest, dwInterval);
- }
- public int GET_STAGE_MSGDATA(ref GET_STAGE_PARAMETERS_STRUCT STAGE_PARAMETERS, int iWaitMs)//硬件最小发送间隔默认为1秒
- {
- return GET_STAGE_MSGDATA(m_api, ref STAGE_PARAMETERS, iWaitMs);
- }
- public int GET_STAGE_MOVE( ref GET_STAGE_MOVE_COMPLETED_STRUCT STAGE_MOVE, int iWaitMs)//硬件最小发送间隔默认为1秒
- {
- return GET_STAGE_MOVE( m_api,ref STAGE_MOVE, iWaitMs);//硬件最小发送间隔默认为1秒
- }
- public void SET_STAGE( uint dwSet, float dwXPos, float dwYPos, float dwZPos, float dwRPos, float dwTPos)
- {
- SET_STAGE(m_api, dwSet, dwXPos, dwYPos, dwZPos, dwRPos, dwTPos);
- }
- public void STOP_STAGE()
- {
- STOP_STAGE( m_api);
- }
-
- public void GET_IMAGE( uint dwDataType, int image_index, int chanel=3, int speed=0, int live=1)
- {
- GET_IMAGE( m_api, dwDataType, image_index, chanel, speed, live);
- }
- public int GET_IMAGE_MSGDATA(ref Mat IMAGE, int iWaitMs)
- {
- return GET_IMAGE_MSGDATA(m_api, IMAGE.CvPtr, iWaitMs);
- }
- public void GET_SCANMODE()
- {
- GET_SCANMODE( m_api);
- }
- public int GET_SCANMODE_MSGDATA(ref GET_SCANMODE_STRUCT SCANMODE, int iWaitMs)
- {
- return GET_SCANMODE_MSGDATA( m_api, ref SCANMODE, iWaitMs);
- }
-
- public void SET_SCANMODE( uint dwDataType)
- {
- SET_SCANMODE( m_api, dwDataType);
- }
- public void GET_SCANSPEED()
- {
- GET_SCANSPEED( m_api);
- }
- public int GET_SCANSPEED_MSGDATA( ref GET_SCANSPEED_STRUCT SCANSPEED, int iWaitMs)
- {
- return GET_SCANSPEED_MSGDATA( m_api, ref SCANSPEED, iWaitMs);
- }
- public void SET_SCANSPEED( uint dwDataType)
- {
- SET_SCANSPEED( m_api, dwDataType);
- }
- public int isStart()
- {
- return isStart(m_api);
- }
- #endregion
- #region custom thread
- private Thread recThread;
- private volatile bool rec_running; // 用于控制线程运行的布尔变量
-
- // 定义一个事件,用于通知主线程消费产品
- public event Action<GET_COLUMN_PARAMETERS_STRUCT_HUIHONG> COLUMN_MSGProduced;
- public event Action<Mat>IMAGE_MSGProduced;
-
- // 启动生产者线程
- public void StartProducing()
- {
- if (recThread == null || !recThread.IsAlive)
- {
- rec_running = true;
- recThread = new Thread(Produce);
- recThread.Start();
- }
- }
- // 停止生产者线程
- public void StopProducing()
- {
- rec_running = false;
- if (recThread != null && recThread.IsAlive)
- {
- recThread.Join(); // 等待线程终止
- }
- }
- private GET_COLUMN_PARAMETERS_STRUCT_HUIHONG COLUMN = new GET_COLUMN_PARAMETERS_STRUCT_HUIHONG();
- // 生产方法(线程入口点)
- private void Produce()
- {
- GET_COLUMN(0, 1);
- Mat IMAGE= new Mat();
- while (rec_running)
- {
- if(GET_COLUMN_MSGDATA(ref COLUMN,10)==1)
- {
- OnGET_COLUMN_MSG(COLUMN);
- }
- if(GET_IMAGE_MSGDATA(ref IMAGE,10)==1)
- {
- onGET_IMAGE_MSG(IMAGE);
- }
- Thread.Sleep(1);
- }
- IMAGE.Dispose();
- }
- // 触发产品生产事件
- public virtual void OnGET_COLUMN_MSG(GET_COLUMN_PARAMETERS_STRUCT_HUIHONG product)
- {
- COLUMN_MSGProduced?.Invoke(product);
- }
- public void onGET_IMAGE_MSG(Mat image)
- {
- IMAGE_MSGProduced?.Invoke(image);
- }
- #endregion
- }
- }
|