using System; using System.Text; using System.Threading; using System.Runtime.InteropServices; //using Microsoft.PointOfService; using System.ComponentModel; using Cosmos.BaseFrame; using Cosmos.UserFrame; using Cosmos.Common; using Cosmos.CommonManager; /*-----------------------------------------------------------------------------------------------*/ // 설 명 : Hand Scanner 제어 // 작 성 자 : // 변경 이력 : /*-----------------------------------------------------------------------------------------------*/ namespace Cosmos.OLEDevice { public class DeviceScanner : IScannerUs { /// /// StateServer Object (StateServer 객체) /// public StateServer StateObject = (StateServer)StateServer.GetInstance(); /// /// Device 상태 정보 객체 /// public DeviceStatus devStatus = new DeviceStatus(); ///// ///// Pos for .Net Scanner 객체 ///// //private Scanner scanner = null; ///// ///// Pos for .Net의 Device 정보를 가져오기 위한 객체 ///// //private PosExplorer posExplorer = null; private string m_sScanData = string.Empty; private string m_sScanDataLabel = string.Empty; private string m_sScanDataType = string.Empty; private BackgroundWorker bw = null; private int m_nErrorCount = 0; /// /// 생성자 /// public DeviceScanner() { try { //posExplorer = new PosExplorer(); devStatus = (DeviceStatus)StateObject.DEVICE; DeviceStatusInit(); bw = new BackgroundWorker(); m_nErrorCount = 0; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DevicePosPrinter.Devicescanner()", ex.Message); } } /// /// 디바이스 Open시 처리함수 /// /// 장비종류(ex- "Msr","PosPrinter","Scanner"...) /// 레지스트리 항목(ex- "DefaultMsr","DefaultPosPrinter","DefaultScanner"...) /// public bool OpenDevice(string sDeviceType, string sLogicalName) { bool bRet = false; try { //DeviceInfo devinfo = null; //if (sDeviceType == DeviceType.Scanner && sLogicalName == PosConst.OPOS_LDN.SCANNER) // devinfo = posExplorer.GetDevice(DeviceType.Scanner, PosConst.OPOS_LDN.SCANNER); //else //{ // devStatus.Scanner.Open = false; // devStatus.Scanner.Status = "DEVICE INFO ERROR"; // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.OpenDevice()", devStatus.Scanner.Status); // return bRet; //} //if (devinfo == null) //{ // devStatus.Scanner.Open = false; // devStatus.Scanner.Status = "DEVICE INFO ERROR"; // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.OpenDevice()", devStatus.Scanner.Status); // return bRet; //} //scanner = (Scanner)posExplorer.CreateInstance(devinfo); //if (scanner != null) //{ // scanner.DataEvent += new DataEventHandler(Scanner_DataEvent); // scanner.ErrorEvent += new DeviceErrorEventHandler(Scanner_ErrorEvent); // try // { // scanner.Open(); // } // catch (Exception ex) // { // devStatus.Scanner.Status = "OPEN FAIL"; // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.OpenDevice()", devStatus.Scanner.Status + " " + ex.Message); // //UserLog.WriteAMSLog("DEV", "ERR", "0103", "GunScanner " + devStatus.Scanner.Status); // return bRet; // } // try // { // scanner.Claim(1000); // } // catch (Exception ex) // { // devStatus.Scanner.Status = "CLAIM FAIL"; // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "Devicescanner.OpenDevice()", devStatus.Scanner.Status + " " + ex.Message); // //UserLog.WriteAMSLog("DEV", "ERR", "0203", "GunScanner " + devStatus.Scanner.Status); // //장비관련 AMS 로그 삭제 요청(2015.07.23) // return bRet; // } // try // { // scanner.DeviceEnabled = true; // } // catch (Exception ex) // { // devStatus.Scanner.Status = "DEVICE ENABLED FAIL"; // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.OpenDevice()", devStatus.Scanner.Status + " " + ex.Message); // return bRet; // } // try // { // scanner.DataEventEnabled = true; // } // catch (Exception ex) // { // devStatus.Scanner.Status = "DATAEVENT ENABLED FAIL"; // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.OpenDevice()", devStatus.Scanner.Status + " " + ex.Message); // return bRet; // } // scanner.DecodeData = true; // devStatus.Scanner.Open = true; // devStatus.Scanner.Status = "Success"; // bw.DoWork += OlePosHandler; // bRet = true; //} //m_nErrorCount = 0; } catch (Exception ex) { devStatus.Scanner.Open = false; devStatus.Scanner.Status = "DEVICE OPEN EXCEPTION"; UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DeviceScanner.OpenDevice()", devStatus.Scanner.Status + " " + ex.Message); return bRet; } return bRet; } ///// ///// ///// ///// ///// //private void Scanner_DataEvent(object sender, DataEventArgs e) //{ // try // { // if(!bw.IsBusy) // { // ASCIIEncoding encoder = new ASCIIEncoding(); // m_sScanData = encoder.GetString(scanner.ScanData); // m_sScanDataLabel = encoder.GetString(scanner.ScanDataLabel); // m_sScanDataType = scanner.ScanDataType.ToString(); // devStatus.Scanner.Data = m_sScanData; // devStatus.Scanner.DataLabel = ""; // //for (int i = 0; i < m_sScanDataLabel.Length; i++) // //{ // // if (CmUtil.IsNumber(m_sScanDataLabel.Substring(i, 1)) == true) // // devStatus.Scanner.DataLabel += m_sScanDataLabel.Substring(i, 1); // //} // string sChgDataLabel = ""; // for (int i = 0; i < scanner.ScanDataLabel.Length; i++) // { // if (scanner.ScanDataLabel[i] == (byte)29) // sChgDataLabel += "|"; // else // sChgDataLabel += Convert.ToChar(scanner.ScanDataLabel[i]).ToString(); // } // for (int i = 0; i < sChgDataLabel.Length; i++) // { // if (CmUtil.IsNumber(sChgDataLabel.Substring(i, 1)) == true) // { // devStatus.Scanner.DataLabel = sChgDataLabel.Substring(i, sChgDataLabel.Length - i); // break; // } // //if (sChgDataLabel.Substring(i, 1) != string.Format("{0}", (char)10) && sChgDataLabel.Substring(i, 1) != string.Format("{0}", (char)13)) // //{ // // devStatus.Scanner.DataLabel = devStatus.Scanner.DataLabel + sChgDataLabel.Substring(i, 1); // //} // } // devStatus.Scanner.DataType = m_sScanDataType; // UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.Scanner_DataEvent()", // "Data=" + m_sScanData + ", DataLabel=" + m_sScanDataLabel + "=>" + devStatus.Scanner.DataLabel + ", DataType=" + m_sScanDataType); // bw.RunWorkerAsync(); // } // else // { // UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.Scanner_DataEvent()", "스캐너 이벤트 처리 전 이벤트 발생 불가"); // //Cosmos.CommonManager.WinManager.ErrorMessage("해당 화면에서 스캐너를 입력 할 수 없습니다.", "스캐너 입력 오류", true); // //MessageStartTimer(100); // } // //if (PosOLEDevice.m_delegateOlePos != null) // // PosOLEDevice.m_delegateOlePos(PosConst.OPOS_DEVICE.SCANNER, m_sScanData, devStatus.Scanner.DataLabel, m_sScanDataType); // //else // //{ // // UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // // "DeviceScanner.Scanner_DataEvent()", "이벤트 전송 대상 없음."); // // Cosmos.CommonManager.WinManager.ErrorMessage("해당 화면에서 스캐너를 입력 할 수 없습니다.", "스캐너 입력 오류", true); // //} // } // catch (Exception ex) // { // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.Scanner_DataEvent()", ex.Message); // devStatus.Scanner.Status = "DATAEVENT ERROR"; // } // finally // { // scanner.ClearInput(); // scanner.DataEventEnabled = true; // } //} /// /// /// /// /// private void OlePosHandler(object sender, DoWorkEventArgs e) { try { if (PosOLEDevice.m_delegateOlePos != null) PosOLEDevice.m_delegateOlePos(PosConst.OPOS_DEVICE.SCANNER, string.Empty, devStatus.Scanner.DataLabel, string.Empty); else { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DeviceScanner.OlePosHandler()", "이벤트 전송 대상 없음."); //Cosmos.CommonManager.WinManager.ErrorMessage("해당 화면에서 스캐너를 입력 할 수 없습니다.", "스캐너 입력 오류", true); //MessageStartTimer(100); } } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DeviceScanner.OlePosHandler()", ex.Message); } } //private void MessageStartTimer(int dueTime) //{ // try // { // Thread thrBeep = new Thread(new ThreadStart(OnBeepSound)); // thrBeep.Start(); // } // catch (Exception ex) // { // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.MessageStartTimer()", ex.Message); // } //} //private void OnBeepSound() //{ // try // { // CmMessage m_PosConfig = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + "PosConfig.INI"); // string sPosUseType = m_PosConfig.GetMessage("olepos").GetMessageValue("PosUseType"); // string sKeyboard = m_PosConfig.GetMessage("control").GetMessageValue("Keyboard"); // for (int i = 0; i < 5; i++) // { // WinManager.BuzzSoundOn(sPosUseType, sKeyboard); // Thread.Sleep(200); // } // //CmMessage m_PosConfig = CmMessage.MakeMessageFromFile(BaseCom.NxIniPath + "PosConfig.INI"); // //string sPosUseType = m_PosConfig.GetMessage("olepos").GetMessageValue("PosUseType"); // //string sKeyboard = m_PosConfig.GetMessage("control").GetMessageValue("Keyboard"); // //for (int i = 0; i < 5; i++) // //{ // // if (sPosUseType == "2" || sPosUseType == "9" || sPosUseType == "4" || sKeyboard == "2") // // // POS모델 ==> 2:7K, 9.B20(Toshiba) 4.3000XC(분스) // // // POS키보드 ==> (0:104, 1:40, 2:32) // // Console.Beep(); // // else // // BuzzOn(0, 0); // // Thread.Sleep(200); // //} // } // catch (Exception ex) // { // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.OnBeepSound()", ex.Message); // } //} //private void MessageStartTimer(int dueTime) //{ // if (m_nErrorCount < 2) // { // Timer t = new Timer(new TimerCallback(MessageTimerProc)); // t.Change(dueTime, 0); // } //} //private void MessageTimerProc(object state) //{ // m_nErrorCount++; // // The state object is the Timer object. // Timer t = (Timer)state; // t.Dispose(); // Cosmos.CommonManager.WinManager.ErrorMessage("해당 화면에서 스캐너를 입력 할 수 없습니다.", "스캐너 입력 오류", true); // m_nErrorCount--; //} ///// ///// ///// ///// ///// //private void Scanner_ErrorEvent(object sender, DeviceErrorEventArgs e) //{ // try // { // ASCIIEncoding encoder = new ASCIIEncoding(); // m_sScanData = encoder.GetString(scanner.ScanData); // m_sScanDataLabel = encoder.GetString(scanner.ScanDataLabel); // m_sScanDataType = scanner.ScanDataType.ToString(); // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.Scanner_ErrorEvent()", // "ErrorEvent 발생 ScanData=[" + m_sScanData + "] ScanDataLabel=[" + m_sScanDataLabel + "] ScanDataType=[" + m_sScanDataType + "]"); // devStatus.Scanner.Data = string.Empty; // devStatus.Scanner.DataLabel = string.Empty; // scanner.ClearInput(); // scanner.DataEventEnabled = true; // devStatus.Scanner.Status = "ERROR EVENT"; // } // catch (Exception ex) // { // UserLog.WriteLogFile(UserCom.LOG_ERROR, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) // "DeviceScanner.Scanner_ErrorEvent()", ex.Message); // devStatus.Scanner.Status = "ErrorEvent Error 발생"; // } //} /// /// Scanner StateServer 정보 초기화 /// private void DeviceStatusInit() { devStatus.Scanner.Data = ""; devStatus.Scanner.DataLabel = ""; devStatus.Scanner.DataType = ""; devStatus.Scanner.DeviceName = ""; devStatus.Scanner.Status = ""; devStatus.Scanner.Open = false; } /// /// 디바이스 Close시 처리함수 /// /// public bool CloseDevice() { bool bRet = false; try { //if (scanner == null) // return bRet; //scanner.DataEventEnabled = false; //scanner.DeviceEnabled = false; //scanner.Release(); //scanner.Close(); //scanner = null; bRet = true; devStatus.Scanner.Status = "CLOSE"; devStatus.Scanner.Open = false; bw.DoWork -= OlePosHandler; } catch (Exception ex) { bw.DoWork -= OlePosHandler; UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DeviceScanner.CloseDevice()", ex.Message); devStatus.Scanner.Status = "CLOSE EXCEPTION"; } return bRet; } /// /// 장비의 Event 발생 Enable 상태 설정 /// True:사용가능, False:사용불가능 /// public bool DeviceEnabled { get { try { //if (scanner.DeviceEnabled && scanner.DataEventEnabled) // return true; //else return false; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DeviceScanner.DeviceEnabled()", ex.Message); return false; } } set { try { bool bRet = SetDeviceEnabled(value); } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DeviceScanner.DeviceEnabled()", ex.Message); } } } /// /// 장비의 Event 발생 Enable 상태 설정 /// True:사용가능, False:사용불가능 /// /// /// private bool SetDeviceEnabled(bool bEnable) { bool bRet = false; try { //scanner.DataEventEnabled = bEnable; //scanner.DeviceEnabled = bEnable; devStatus.Scanner.Status = "DEVICE ENABLED " + bEnable.ToString(); bRet = true; } catch (Exception ex) { UserLog.WriteLogFile(UserCom.LOG_IOS, System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name, // Project Name (프로젝트명) "DeviceScanner.SetDeviceEnabled()", ex.Message); devStatus.Scanner.Status = "DEVICE ENABLED FAIL"; } return bRet; } } }