ITC81DB_V8/ITC81DB/SerialManager/SerialManager.cs

276 lines
8.6 KiB
C#
Raw Normal View History

2023-12-04 02:13:33 +00:00
#define CONSOLE_DBUGGING
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Collections;
namespace ITC81DB.SerialManager
{
public partial class SerialMgrComm
{
public delegate void ObjectEventHandler(object data);
public static event ObjectEventHandler SerialPortMessageReceive;
public static event ObjectEventHandler SerialPortErrMessageReceive;
public static void IntializeSerialManager()
{
//Console.Write("Initialize Serial Manager \n");
// Register Callback
fnSerialMgrDebugCallback = serialDebugCallback;
DLL_SerialMgr_Register_DebugCB(fnSerialMgrDebugCallback);
fnSerialMgrPortConnectCallback = serialPortConnectCallback;
DLL_SerialMgr_Register_ConnectCB(fnSerialMgrPortConnectCallback);
fnSerialVersionCallback = serialVersionCallback;
DLL_SerialMgr_Register_VersionCB(fnSerialVersionCallback);
fnSerialMgrRcvPacketCallback = serialRcvPacketMsgCallback;
DLL_SerialMgr_Register_RcvPacketCB(fnSerialMgrRcvPacketCallback);
fnSerialMgrRcvErrPacketCallback = serialRcvErrPacketMsgCallback;
DLL_SerialMgr_Register_RcvErrPacketCB(fnSerialMgrRcvErrPacketCallback);
// test
//DLL_SerialMgr_HelloWorld();
// get the lib version
DLL_SerialMgr_Getversion();
// activate the dll thread
DLL_SerialMgr_Activation();
}
#region DLL_CALLBACK
private static void serialVersionCallback(StringBuilder versionInfo)
{
try
{
//Console.Write("\n-------------------------------\n");
//Console.Write("lib version = " + versionInfo + "\n");
//Console.Write("-------------------------------\n");
}
catch (Exception e)
{
throw (e);
}
}
private static void serialPortConnectCallback(StringBuilder commPort, int status, int errDetail)
{
try
{
//Console.Write(commPort + ": status = " + status.ToString() +" , detail = " + errDetail.ToString() + "\n");
}
catch (Exception e)
{
throw (e);
}
}
private static void serialDebugCallback(int type, StringBuilder pMessage)
{
try
{
//Console.Write(pMessage);
}
catch (Exception e)
{
throw (e);
}
}
// https://stackoverflow.com/questions/22938756/how-to-marshal-c-array-to-c-sharp-via-intptr
public static void serialRcvPacketMsgCallback(StringBuilder commPort, IntPtr pData, int length)
{
try
{
if (commPort.Length == 0)
return;
if ( (pData == IntPtr.Zero) || (length == 0) )
return;
byte[] data = new byte[length];
Marshal.Copy(pData, data, 0, (int)length);
string sdata = Encoding.Default.GetString(data, 0, data.Length);
if (SerialPortMessageReceive != null)
SerialPortMessageReceive(sdata);
#if TEST_CB
String commPortStr = commPort.ToString();
serialPortMessageByte(commPortStr, data, length);
#endif
//if(commPort.ToString() != "COM2:")
// Console.Write("comm port : " + commPort + ", length = " + length.ToString() + "\n");
#if TEST_DEBUG
// https://stackoverflow.com/questions/1342922/console-writeline-as-hexadecimal
int index = 0;
foreach (byte temp in data)
{
Console.Write(temp.ToString("X2") + " ");
index++;
if (index % 16 == 0) Console.Write("\n");
}
Console.Write("\n");
#endif
//data = null;
//GC.Collect();
//GC.WaitForPendingFinalizers();
}
catch (Exception e)
{
throw (e);
}
}
public static void serialRcvErrPacketMsgCallback(StringBuilder commPort, IntPtr pData, int length)
{
try
{
if (commPort.Length == 0)
return;
if ((pData == IntPtr.Zero) || (length == 0))
return;
byte[] data = new byte[length];
Marshal.Copy(pData, data, 0, (int)length);
string sdata = Encoding.Default.GetString(data, 0, data.Length);
if (SerialPortErrMessageReceive != null)
SerialPortErrMessageReceive(sdata);
//String commPortStr = commPort.ToString();
//serialPortMessageByte(commPortStr, data, length);
//if(commPort.ToString() != "COM2:")
// Console.Write("Err : comm port : " + commPort + ", length = " + length.ToString() + "\n");
#if (TEST_DEBUG1)
// https://stackoverflow.com/questions/1342922/console-writeline-as-hexadecimal
int index = 0;
foreach (byte temp in data)
{
Console.Write(temp.ToString("X2") + " ");
index++;
if (index == 5) break;
if (index % 16 == 0) Console.Write("\n");
}
Console.Write("\n");
#endif
// https://dhshin94.tistory.com/135
//data = null;
//GC.Collect();
//GC.WaitForPendingFinalizers();
}
catch (Exception e)
{
throw (e);
}
}
#endregion // DLL_CALLBACK
#region DLL_COMMAND
public static void serialPortOpen(String commPort, int BaudRate, int stopBit, int parity, int dataBit)
{
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
DLL_SerialMgr_PortOpen(pCommPort, BaudRate, stopBit, parity, dataBit);
}
public static void serialPortClose(String commPort)
{
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
DLL_SerialMgr_PortClose(pCommPort);
}
public static void serialPortMessageByte(String commport, byte[] data, int length)
{
IntPtr pCommPort = Marshal.StringToBSTR(commport.ToString());
IntPtr ptr = Marshal.AllocHGlobal(length);
Marshal.Copy(data, 0, ptr, length);
DLL_SerialMgr_PortSendMsg(pCommPort, ptr, length);
//string sdata = Encoding.Default.GetString(data, 0, data.Length);
Marshal.FreeHGlobal(ptr);
// if (SerialPortMessageReceive != null)
// SerialPortMessageReceive(sdata);
}
//https://stackoverflow.com/questions/13418795/convert-byte-array-to-structure-in-the-compact-framework
public static void serialPortMessage(String commPort, String Message)
{
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
StringBuilder sb = new StringBuilder();
sb.Append((char)0x02);
sb.Append(Message);
sb.Append((char)0x03);
Message = sb.ToString();
byte[] buffer = Encoding.ASCII.GetBytes(Message);
int count = Encoding.ASCII.GetByteCount(Message);
//byte[] buffer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//int count = 10;
IntPtr ptr = Marshal.AllocHGlobal(count);
Marshal.Copy(buffer, 0, ptr, count);
DLL_SerialMgr_PortSendMsg(pCommPort, ptr, count);
Marshal.FreeHGlobal(ptr);
}
public static void serialPortMessageRaw(String commPort, String Message)
{
IntPtr pCommPort = Marshal.StringToBSTR(commPort.ToString());
byte[] buffer = Encoding.ASCII.GetBytes(Message);
int count = Encoding.ASCII.GetByteCount(Message);
//byte[] buffer = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//int count = 10;
IntPtr ptr = Marshal.AllocHGlobal(count);
Marshal.Copy(buffer, 0, ptr, count);
DLL_SerialMgr_PortSendMsg(pCommPort, ptr, count);
Marshal.FreeHGlobal(ptr);
}
#endregion
}
}