spc-kiosk-pb/Agent/OLEDevice/DeviceCashdrawer.cs

553 lines
25 KiB
C#
Raw Permalink Normal View History

2019-06-16 05:12:09 +00:00
using System;
using System.Threading;
using System.Runtime.InteropServices;
using System.IO.Ports;
using Cosmos.UserFrame;
using Cosmos.Common;
using Cosmos.ServiceProvider;
using Microsoft.PointOfService;
/*-----------------------------------------------------------------------------------------------*/
// 설 명 : CahsDrawer 제어
// 작 성 자 :
// 변경 이력 :
/*-----------------------------------------------------------------------------------------------*/
namespace Cosmos.OLEDevice
{
/// <summary>
/// CASHDRAWER 제어 CLASS
/// </summary>
public class DeviceCashdrawer : ICashdrawerUs
{
#region VctDraw2kSs.dll
[DllImport("VctDraw2kSs.dll", EntryPoint = "OpenDrawPort")]
public static extern int OpenDrawPortFor9700();
[DllImport("VctDraw2kSs.dll", EntryPoint = "CloseDrawPort")]
public static extern int CloseDrawPortFor9700();
[DllImport("VctDraw2kSs.dll", EntryPoint = "OpenDraw")]
public static extern void OpenDrawFor9700();
#endregion
#region TgDrawA.dll
[DllImport("TgDrawA.dll", EntryPoint = "OpenDrawPort")]
public static extern int OpenDrawPortForTg();
[DllImport("TgDrawA.dll", EntryPoint = "CloseDrawPort")]
public static extern int CloseDrawPortForTg();
[DllImport("TgDrawA.dll", EntryPoint = "OpenDraw")]
public static extern void OpenDrawForTg();
#endregion
/// <summary>
/// StateServer Object (StateServer 객체)
/// </summary>
public StateServer StateObject = (StateServer)StateServer.GetInstance();
/// <summary>
/// Device 상태 정보 객체
/// </summary>
public DeviceStatus devStatus = new DeviceStatus();
/// <summary>
/// POS 기본 정보
/// </summary>
public PosStatus m_cPosStatus = null;
/// <summary>
/// Pos for .Net CashDrawer 객체
/// </summary>
private CashDrawer cashdrawer = null;
/// <summary>
/// Pos for .Net의 Device 정보를 가져오기 위한 객체
/// </summary>
private PosExplorer posExplorer = null;
/// <summary>
/// RS232통신을 위한 시리얼포트 객체
/// </summary>
private SerialPort m_serialPort = null;
private IPosPrinterUs objPosPrinter = null;
/// <summary>
///
/// </summary>g
private int m_sUpdateStatus = 0;
/// <summary>
/// 0:OPOS, 1:RS232(프린터에 연결), 2:IBM본체에 연결하는 돈통
/// <para>DRAWER_TYPE 참고</para>
/// </summary>
private int drawerType = 0;
#region
/// <summary>
/// 생성자
/// </summary>
public DeviceCashdrawer()
{
try
{
try
{
posExplorer = new PosExplorer();
}
catch (Exception ex) { }
devStatus = (DeviceStatus)StateObject.DEVICE;
m_cPosStatus = (PosStatus)StateObject.POS;
objPosPrinter = (IPosPrinterUs)(new SManager()).InitServiceInstance(ServiceLists.AGENT_OLEDEVICE.DLL, ServiceLists.AGENT_OLEDEVICE.DEVICE_POSPRINTER);
DeviceStatusInit();
}
catch (Exception ex)
{
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
ex.Message);
}
}
/// <summary>
/// 초기화
/// </summary>
private void DeviceStatusInit()
{
devStatus.Cashdrawer.Status = "";
devStatus.Cashdrawer.DeviceName = "";
devStatus.Cashdrawer.Open = false;
}
#endregion
#region OPEN/CLOSE
/// <summary>
/// 디바이스 Open시 처리함수
/// </summary>
/// <param name="sDeviceType">장비종류(ex- "Msr","PosPrinter","Scanner"...)</param>
/// <param name="sLogicalName">레지스트리 항목(ex- "DefaultMsr","DefaultPosPrinter","DefaultScanner"...)</param>
/// <returns></returns>
public bool OpenDevice(string sDeviceType, string sLogicalName)
{
bool bRet = false;
try
{
if(devStatus.Cashdrawer.UseYn == false)
{
return false;
}
if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._1_PRINTER)
{
if(devStatus.Printer.UseYn == false)
{
return false;
}
devStatus.Cashdrawer.Open = true;
devStatus.Cashdrawer.Status = "SUCCESS";
}
else if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._2_OPOS_IBM)
{
OpenDeviceByOPOS(sDeviceType, sLogicalName);
}
else if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._3_DLL_TPS8700)
{
OpenDrawForTg();
bRet = true;
}
else if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._4_DLL_VPS9700)
{
OpenDrawFor9700();
bRet = true;
}
else if (m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._5_IBM_MAIN)
{
OpenDeviceByRS232(m_cPosStatus.Base.OlePosCashDrawerSerialPortNumber, m_cPosStatus.Base.OlePosCashDrawerBaudRate);
}
bRet = true;
}
catch (Exception ex)
{
devStatus.Cashdrawer.Open = false;
devStatus.Cashdrawer.Status = "CashDrawer Device Open Exception";
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status + "/" + ex.Message);
return bRet;
}
return bRet;
}
public bool OpenDeviceByOPOS(string sDeviceType, string sLogicalName)
{
bool bRet = false;
try
{
DeviceInfo devInfo = null;
if (sDeviceType == DeviceType.CashDrawer && sLogicalName == PosConst.OPOS_LDN.CASHDRAWER)
{
devInfo = posExplorer.GetDevice(DeviceType.CashDrawer, PosConst.OPOS_LDN.CASHDRAWER);
}
else
{
devStatus.Cashdrawer.Open = false;
devStatus.Cashdrawer.Status = "DEVICE INFO ERROR";
UserLog.WriteLogFile(UserCom.LOG_IOS, UserCom.ERROR_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
"DeviceCashdrawer.OpenDeviceByOPOS()", devStatus.Printer.Status);
return bRet;
}
if(devInfo == null)
{
devStatus.Cashdrawer.Open = false;
devStatus.Cashdrawer.Status = "DEVICE INFO ERROR";
UserLog.WriteLogFile(UserCom.LOG_IOS, UserCom.ERROR_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
"DeviceCashdrawer.OpenDeviceByOPOS()", devStatus.Printer.Status);
return bRet;
}
cashdrawer = (CashDrawer)posExplorer.CreateInstance(devInfo);
if(cashdrawer != null)
{
cashdrawer.StatusUpdateEvent += new StatusUpdateEventHandler(CashDrawer_StatusUpdateEventDataEvent);
try
{
cashdrawer.Open();
}
catch(Exception ex)
{
devStatus.Cashdrawer.Status = "OPEN FAIL";
UserLog.WriteLogFile(UserCom.LOG_IOS, UserCom.ERROR_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
"DeviceCashdrawer.OpenDeviceByOPOS()", devStatus.Printer.Status);
return bRet;
}
try
{
cashdrawer.Claim(1000);
}
catch(Exception ex)
{
devStatus.Cashdrawer.Status = "CLAIM FAIL";
UserLog.WriteLogFile(UserCom.LOG_IOS, UserCom.ERROR_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
"DeviceCashdrawer.OpenDeviceByOPOS()", devStatus.Printer.Status);
return bRet;
}
try
{
cashdrawer.DeviceEnabled = true;
}
catch(Exception ex)
{
devStatus.Cashdrawer.Status = "DEVICE ENABLED FAIL";
UserLog.WriteLogFile(UserCom.LOG_IOS, UserCom.ERROR_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
"DeviceCashdrawer.OpenDeviceByOPOS()", devStatus.Printer.Status);
return bRet;
}
devStatus.Cashdrawer.DeviceName = devInfo.ServiceObjectName;
devStatus.Cashdrawer.Open = true;
devStatus.Cashdrawer.Status = "Success";
bRet = true;
}
}
catch (Exception ex)
{
devStatus.Cashdrawer.Open = false;
devStatus.Cashdrawer.Status = "CashDrawer Device Open Exception";
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status + "/" + ex.Message);
}
return bRet;
}
public bool OpenDeviceByRS232(string sSerialPort, long lBaudrate)
{
bool bRet = false;
try
{
if(m_serialPort != null)
{
m_serialPort.Close();
System.Threading.Thread.Sleep(50);
m_serialPort = null;
}
if(m_serialPort == null)
{
m_serialPort = new SerialPort();
if(m_serialPort == null)
{
devStatus.Cashdrawer.Open = false;
devStatus.Cashdrawer.Status = "SERIAL PORT ERROR";
UserLog.WriteLogFile(UserCom.LOG_IOS,
UserCom.WARNING_LEVEL,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status);
return bRet;
}
m_serialPort.NewLine = "\r\n";
m_serialPort.Encoding = System.Text.Encoding.GetEncoding("ks_c_5601-1987");
m_serialPort.WriteBufferSize = 1024 * 3;
m_serialPort.PortName = sSerialPort;
m_serialPort.BaudRate = (int)lBaudrate;
m_serialPort.DataBits = 8;
m_serialPort.StopBits = StopBits.One;
m_serialPort.Parity = Parity.None;
m_serialPort.Open();
if(m_serialPort.IsOpen == false)
{
devStatus.Cashdrawer.Open = false;
devStatus.Cashdrawer.Status = "SERIAL PORT OPEN ERROR";
UserLog.WriteLogFile(UserCom.LOG_IOS,
UserCom.WARNING_LEVEL,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status);
return bRet;
}
devStatus.Cashdrawer.Open = true;
devStatus.Cashdrawer.Status = "SUCCESS";
bRet = true;
}
}
catch (Exception ex)
{
devStatus.Cashdrawer.Open = false;
devStatus.Cashdrawer.Status = "CashDrawer Device Open Exception";
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
ex.Message);
}
return bRet;
}
/// <summary>
/// 디바이스 Close시 처리함수</para>
/// </summary>
/// <returns></returns>
public bool CloseDevice()
{
bool bRet = false;
try
{
if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._2_OPOS_IBM)
{
if (cashdrawer == null)
return bRet;
cashdrawer.DeviceEnabled = false;
cashdrawer.Release();
cashdrawer.Close();
cashdrawer = null;
}
else if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._3_DLL_TPS8700)
{
CloseDrawPortForTg();
}
else if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._4_DLL_VPS9700)
{
CloseDrawPortFor9700();
}
else if(m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._5_IBM_MAIN)
{
if(m_serialPort == null)
{
UserLog.WriteLogFile(UserCom.LOG_IOS, UserCom.WARNING_LEVEL, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
"DeviceCashdrawer.CloseDevice()", "m_serialPort == null");
return bRet;
}
m_serialPort.Close();
m_serialPort = null;
}
bRet = true;
devStatus.Cashdrawer.Status = "CLOSE";
devStatus.Cashdrawer.Open = false;
}
catch (Exception ex)
{
devStatus.Cashdrawer.Status = "CLOSE EXCEPTION";
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status + "/" + ex.Message);
}
return bRet;
}
#endregion
#region POS for .NET
/// <summary>
/// Cashdrawer 상태 변경에 따른 이벤트 처리
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CashDrawer_StatusUpdateEventDataEvent(object sender, StatusUpdateEventArgs e)
{
try
{
m_sUpdateStatus = e.Status;
switch (m_sUpdateStatus)
{
case CashDrawer.StatusOpen:
devStatus.Cashdrawer.Status = "DRAWER OPENED";
break;
case CashDrawer.StatusClosed:
devStatus.Cashdrawer.Status = "DRAWER CLOSED";
break;
}
if (PosOLEDevice.m_delegateOlePos != null)
PosOLEDevice.m_delegateOlePos(PosConst.OPOS_DEVICE.CASHDRAWER, devStatus.Cashdrawer.Status, string.Empty, string.Empty);
}
catch (Exception ex)
{
devStatus.Cashdrawer.Status = "STATUS UPDATE EVENT ERROR";
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status + "-" + ex.Message);
}
}
#endregion
#region
/// <summary>
/// 돈통 개방
/// </summary>
public void OpenCashDrawer()
{
bool bRet = false;
try
{
if (devStatus.Cashdrawer.Open == false)
{
OpenDevice(DeviceType.CashDrawer, PosConst.OPOS_LDN.CASHDRAWER);
}
if (devStatus.Cashdrawer.Open == true)
{
if (m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._1_PRINTER)
{
objPosPrinter.OpenCashDrawer();
bRet = true;
}
else if (m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._2_OPOS_IBM)
{
cashdrawer.OpenDrawer();
bRet = true;
}
else if (m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._3_DLL_TPS8700)
{
OpenDrawForTg();
bRet = true;
}
else if (m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._4_DLL_VPS9700)
{
OpenDrawFor9700();
bRet = true;
}
else if (m_cPosStatus.Base.OlePosCashDrawerType == PosConst.POS_DEVICE_LIST.CASHDRAWER._5_IBM_MAIN)
{
TransmitCommand(PosConst.ESCP_COMMAND.CASHDRAWER_OPEN_IBMHOST, true);
bRet = true;
}
else
{
devStatus.Cashdrawer.Status = "DRAWER TYPE ERROR";
UserLog.WriteLogFile(UserCom.LOG_IOS,
UserCom.WARNING_LEVEL,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status);
}
devStatus.Cashdrawer.Status = "DRAWER OPEN";
}
}
catch (Exception ex)
{
devStatus.Cashdrawer.Status = "DRAWER OPEN ERROR";
UserLog.WriteLogFile(UserCom.LOG_IOS,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
devStatus.Cashdrawer.Status + "/" + ex.Message);
}
UserLog.WriteLogFile(UserCom.LOG_IOS,
UserCom.INFO_LEVEL,
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명)
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name + "." + // Class Name (Class Name (클래스명))
System.Reflection.MethodBase.GetCurrentMethod().Name + "()", // Function Name (Function Name (함수명))
"Open Drawer=" + (bRet ? "SUCCESS" : "FAIL"));
}
#endregion
#region SerialPort
private void TransmitCommand(byte[] aCmd, bool bSleepOn = true)
{
if (m_serialPort.IsOpen == true)
{
int iOffset = 0;
//int iReadBuf = 2048;
int iReadBuf = m_serialPort.WriteBufferSize;
while (true)
{
if (iOffset >= aCmd.Length)
{
break;
}
if (iReadBuf + iOffset > aCmd.Length)
{
iReadBuf = aCmd.Length - iOffset;
}
m_serialPort.Write(aCmd, iOffset, iReadBuf);
iOffset += iReadBuf;
System.Threading.Thread.Sleep(10);
}
//m_serialPort.Write(Encoding.Default.GetString(aCmd, 0, aCmd.Length));
if (bSleepOn == true) System.Threading.Thread.Sleep(30);
}
}
#endregion
}
}