using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.IO;
using System.IO.Ports;

using Cosmos.UserFrame;
using Cosmos.Common;
using Cosmos.CommonManager;

namespace Cosmos.OLEDevice
{
    public class DeviceLabelPrinter : ILabelPrinterUs
    {
        /// <summary>
        /// StateServer Object (StateServer 객체)
        /// </summary>
        public StateServer StateObject = (StateServer)StateServer.GetInstance();
        /// <summary>
        /// Device 상태 정보 객체
        /// </summary>
        public DeviceStatus devStatus = null;

        /// <summary>
        /// Pos 상태 정보 객체
        /// </summary>
        public PosStatus m_cPosStatus = null;

        /// <summary>
        /// RS232통신을 위한 시리얼포트 객체
        /// </summary>
        private SerialPort m_serialPort = null;

        private BackgroundWorker bw = null;

        public DeviceLabelPrinter()
        {
            try
            {
                m_cPosStatus = (PosStatus)StateObject.POS;
                devStatus = (DeviceStatus)StateObject.DEVICE;
                bw = new BackgroundWorker();

                DeviceInit();
            }
            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);
            }
        }

        private void DeviceInit()
        {
            devStatus.LabelPrinter.Data = string.Empty;
        }

        #region OPEN/CLOSE 처리 함수
        /// <summary>
        /// 디바이스 OPEN시 처리 함수
        /// </summary>
        /// <returns></returns>
        public bool OpenDevice(string sSerialPort, long lBaudrate)
        {
            bool bRet = false;
            try
            {
                if (m_serialPort != null)
                {
                    //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 start (주석처리)
                    //m_serialPort.DiscardInBuffer();
                    //m_serialPort.DiscardOutBuffer();
                    //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end

                    m_serialPort.Close();
                    System.Threading.Thread.Sleep(50);
                    m_serialPort = null;
                }

                if (m_serialPort == null)
                {
                    m_serialPort = new SerialPort();
                    //m_serialPort = new SerialPort(sSerialPort, (int)lBaudrate, Parity.None, 8, StopBits.One);
                    if (m_serialPort == null)
                    {
                        devStatus.LabelPrinter.Open = false;
                        devStatus.LabelPrinter.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.LabelPrinter.Status);
                        return bRet;
                    }

                    m_serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                    m_serialPort.PinChanged += new SerialPinChangedEventHandler(serialPort_PinChanged);
                    m_serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(serialPort_ErrorReceived);

                    m_serialPort.NewLine = "\r\n";
                    m_serialPort.Encoding = System.Text.Encoding.GetEncoding("ks_c_5601-1987");

                    m_serialPort.WriteBufferSize = 1024 * 1024;
                    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.Handshake = Handshake.None;
                    m_serialPort.ReadTimeout = 500;
                    m_serialPort.WriteTimeout = 2000;

                    m_serialPort.Open();
                    if (m_serialPort.IsOpen == false)
                    {
                        devStatus.LabelPrinter.Open = false;
                        devStatus.LabelPrinter.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.LabelPrinter.Status);
                        return bRet;
                    }

                    devStatus.LabelPrinter.Open = true;
                    devStatus.LabelPrinter.Status = "SUCCESS";

                    bw.DoWork += OlePosHandler;
                    bRet = true;
                }
                else
                {
                    devStatus.LabelPrinter.Open = false;
                    devStatus.LabelPrinter.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.LabelPrinter.Status);
                    return bRet;
                }
            }
            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);
            }

            return bRet;
        }
        /// <summary>
        /// 디바이스 CLOSE시 처리 함수
        /// </summary>
        /// <returns></returns>
        public bool CloseDevice()
        {
            bool bRet = false;
            try
            {
                if (m_serialPort == null)
                {
                    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 (함수명))
                                         "Close fail(m_serialPort == null)");
                    return bRet;
                }

                //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 start
                m_serialPort.DiscardInBuffer();
                m_serialPort.DiscardOutBuffer();
                //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end

                m_serialPort.Close();
                bRet = true;
                m_serialPort = null;
                devStatus.LabelPrinter.Status = "CLOSE";
                devStatus.LabelPrinter.Open = false;
                bw.DoWork -= OlePosHandler;
            }
            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);
            }

            return bRet;
        }
        #endregion

        #region 이벤트 처리
        private void OlePosHandler(object sender, DoWorkEventArgs e)
        {
            try
            {
                if (PosOLEDevice.m_delegateOlePos != null)
                    PosOLEDevice.m_delegateOlePos(PosConst.OPOS_DEVICE.LABELPRINTER, devStatus.Scale.Data, string.Empty, string.Empty);
                else
                {
                    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 (함수명))
                                         "이벤트 전송 대상 없음");
                }
            }
            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);
            }
        }

        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort serialPort = (SerialPort)sender;
            byte[] bytRecvBuf = new byte[serialPort.BytesToRead];

            try
            {
                if (!bw.IsBusy)
                {
                    serialPort.Read(bytRecvBuf, 0, bytRecvBuf.Length);

                    bw.RunWorkerAsync();
                }
                else
                {
                    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 (함수명))
                                         "이벤트 처리 전 이벤트 발생 불가");
                }
            }
            catch (Exception ex)
            {

            }
        }

        private void serialPort_PinChanged(object sender, SerialPinChangedEventArgs e)
        {
            throw new NotImplementedException();
        }

        private void serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
        {
            throw new NotImplementedException();
        }
        #endregion

        #region 명령어 처리 함수
        /// <summary>
        /// 일반 제품정보 라벨 프린터 출력 함수
        /// </summary>
        /// <param name="sProductNm_Ko">제품명(한글) ex)"파인트"</param>
        /// <param name="sProductNm_En">제품명(영문) ex)"Pint"</param>
        /// <param name="sWeight">중량 ex)"340g"</param>
        /// <param name="sStoreNm">점포명 ex)"양재사옥점"</param>
        public void PrintProductWeightInfo(string sProductNm_Ko, string sProductNm_En, string sWeight, string sStoreNm)
        {
            string[] sCommands = null;
            try
            {
                if (m_cPosStatus.Base.OlePosLabelPrinterModel == PosConst.POS_DEVICE_LIST.LABEL_PRINTER.OLD_TYPE)
                {
                    sCommands = new string[] { "CLL\r\n"                                                // 메모리 클리어
                                             , "NEW\r\n"                                                // 새로운 명령어 시작
                                             , "CLIP ON\r\n"
                                             , "NASC 949\r\n"                                           // intermec 한글폰트 설정

                                             , "FONT \"HYGothic-Medium\",12\r\n"
                                             , "PRPOS 0,150\r\n"
                                             //grayber@20180308 시리얼 포트 버퍼 초기화 start
                                             //, "PRTXT \"" + sProductNm_Ko + " : " + sWeight + "\"\r\n"
                                             , "PRTXT \"" + sProductNm_Ko + " : " + string.Format( "{0:#,###}",CmUtil.IntParse(sWeight)) + "\"\r\n"
                                             //grayber@20180308 시리얼 포트 버퍼 초기화 end
                                             , "FONT \"HYGothic-Medium\",9\r\n"
                                             , "PRPOS 0,110\r\n"
                                             , "PRTXT \"" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\"\r\n"

                                             , "PRPOS 0,70\r\n"
                                             //grayber@20180308 시리얼 포트 버퍼 초기화 start
                                             //, "PRTXT \"" + sStoreNm + "\"\r\n"
                                             , "PRTXT \"" + sStoreNm +" 점" + "\"\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end
                                             , "PF\r\n" };
                }
                else if(m_cPosStatus.Base.OlePosLabelPrinterModel == PosConst.POS_DEVICE_LIST.LABEL_PRINTER.NEW_TYPE)
                {
                    sCommands = new string[] { "SETUP \"MEDIA,MEDIA SIZE,LENGTH,1200\"\r\n"             // 용지출력범위 조정
                                             , "CLL\r\n"                                                // 메모리 클리어
                                             , "NEW\r\n"                                                // 새로운 명령어 시작
                                             , "CLIP ON\r\n"
                                             , "NASC 949\r\n"                                           // intermec 한글폰트 설정

                                             , "FONT \"HYGothic-Medium\",9\r\n"
                                             , "PRPOS 110,290\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 start
                                             //, "PRTXT \"" + sStoreNm + "\"\r\n"
                                             , "PRTXT \"" + sStoreNm + " 점" + "\"\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end

                                             , "FONT \"HYGothic-Medium\",5\r\n"
                                             , "PRPOS 110,270\r\n"
                                             , "PRTXT \"" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\"\r\n"

                                             , "FONT \"HYGothic-Medium\",7\r\n"
                                             , "PRPOS 70,50\r\n"
                                             , "PRTXT \"" + sProductNm_En + "\"\r\n"

                                             , "FONT \"HYGothic-Medium\",9\r\n"
                                             , "PRPOS 70,20\r\n"
                                             , "PRTXT \"" + sProductNm_Ko + "\"\r\n"

                                             , "FONT \"HYGothic-Medium\",14\r\n"
                                             , "PRPOS 170,20\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 start
                                             //, "PRTXT \"" + sWeight + "\"\r\n"
                                             , "PRTXT \"" + string.Format( "{0:#,###}",CmUtil.IntParse(sWeight)) + "\"\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end
                                             , "PF\r\n" };
                }
                else
                {
                    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 (함수명))
                                         "Check label printer model configuration.");
                    return;
                }

                if(sCommands != null)
                    WriteCommand(sCommands);
            }
            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>
        /// 02O(해피오더) 제품정보 라벨 프린터 출력 함수
        /// </summary>
        /// <param name="sProductNm">제품명 ex)"패밀리"</param>
        /// <param name="sOrderNo">주문번호 ex)"123456"</param>
        /// <param name="sWeight">중량 ex)"990g"</param>
        /// <param name="sContent_1">ex) "플레이버1/플레이버2/플레이버3"</param>
        /// <param name="sContent_2">ex) "플레이버4/플레이버5/플레이버6"</param>
        /// <param name="sStoreNm">점포명 ex)"양재사옥"</param>
        /// <param name="sOrderYmdhms">주문시간 ex)"2016-06-23 14:00:00"</param>
        /// <param name="sPackingYmdhms">포장시간 ex)"2016-06-23 14:20:00"</param>
        public void PrintO2OProductInfo(string sProductNm, string sOrderNo, string sWeight, string sContent_1, string sContent_2, string sStoreNm, string sOrderYmdhms, string sPackingYmdhms)
        {
            string[] sCommands = null;
            try
            {
                if (m_cPosStatus.Base.OlePosLabelPrinterModel == PosConst.POS_DEVICE_LIST.LABEL_PRINTER.OLD_TYPE)
                {
                    sCommands = new string[] { "CLL\r\n"
                                             , "NEW\r\n"
                                             , "CLIP ON\r\n"
                                             , "FONT \"HYGothic-Medium\",12\r\n"
                                             , "NASC 949\r\n"

                                             , "PRPOS 0,190\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 start
                                             //, "PRTXT \"" + sProductNm + " / " + sWeight + " (" + sOrderNo + ")\"\r\n"
                                             , "PRTXT \"" + sProductNm + " / " + string.Format( "{0:#,###}", CmUtil.IntParse( sWeight)) + " (" + sOrderNo + ")\"\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end
                                             , "FONT \"HYGothic-Medium\",9\r\n"

                                             , "PRPOS 0,150\r\n"
                                             , "PRTXT \"" + sContent_1 + "\"\r\n"

                                             , "PRPOS 0,110\r\n"
                                             , "PRTXT \"" + sContent_2 + "\"\r\n"

                                             , "PRPOS 0,50\r\n"
                                             , "PRTXT \"주문 " + sOrderYmdhms + "\"\r\n"

                                             , "PRPOS 0,10\r\n"
                                             , "PRTXT \"포장 " + sPackingYmdhms + "\"\r\n"
                                             , "PF\r\n" };
                }
                else if (m_cPosStatus.Base.OlePosLabelPrinterModel == PosConst.POS_DEVICE_LIST.LABEL_PRINTER.NEW_TYPE)
                {
                    sCommands = new string[] { "SETUP \"MEDIA,MEDIA SIZE,Length,1200\"\r\n"             // 라벨프린터 용지범위 수정
                                             , "CLL\r\n"                                                // 메모리 클리어
                                             , "NEW\r\n"                                                // 새로운 명령어 시작
                                             , "CLIP ON\r\n"
                                             , "NASC 949\r\n"                                           // intermec 한글폰트 설정

                                             , "FONT \"HYGothic-Medium\",9\r\n"
                                             , "PRPOS 110,290\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 start
                                             //, "PRTXT \"" + sStoreNm + "\"\r\n"
                                             , "PRTXT \"" + sStoreNm + " 점" + "\"\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end

                                             , "FONT \"HYGothic-Medium\",5\r\n"
                                             , "PRPOS 90,270\r\n"
                                             , "PRTXT \"주문 " + sOrderYmdhms + "\"\r\n"

                                             , "PRPOS 90,250\r\n"
                                             , "PRTXT \"포장 " + sPackingYmdhms + "\"\r\n"

                                             , "FONT \"HYGothic-Medium\",9\r\n"
                                             , "PRPOS 60,200\r\n"
                                             , "PRTXT \"" + sProductNm + "(" + sOrderNo + ")" + "\"\r\n"

                                             , "FONT \"HYGothic-Medium\",8\r\n"
                                             , "PRPOS 60,170\r\n"
                                             , "PRTXT \"" + sContent_1 + "\"\r\n"

                                             , "PRPOS 60,150\r\n"
                                             , "PRTXT \"" + sContent_2 + "\"\r\n"

                                             , "FONT \"HYGothic-Medium\",14\r\n"
                                             , "PRPOS 200,20\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 start
                                             //, "PRTXT \"" + sWeight + "\"\r\n"
                                             , "PRTXT \"" + string.Format("{0:#,###}", CmUtil.IntParse(sWeight)) + "\"\r\n"
                                             //grayber@20180308 라벨프린터 처리, 시리얼 포트 버퍼 초기화 end
                                             , "PF\r\n" };
                }
                else
                {
                    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 (함수명))
                                         "Check label printer model configuration.");
                    return;
                }

                if (sCommands != null)
                    WriteCommand(sCommands);
            }
            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>
        /// <param name="sProductNm_Ko">제품명(한글) ex)"파인트"</param>
        /// <param name="sBarcode_Data">바코드 ex)"zxcgfdsgfhgsf"</param>
        /// <param name="sStoreNm">점포명 ex)"양재사옥점"</param>
        public void PrintProductBarCodeInfo(string sProductNm_Ko, string sBarcode_Data, string sStoreNm)
        {
            string[] sCommands = null;
            try
            {
                if (m_cPosStatus.Base.OlePosLabelPrinterModel == PosConst.POS_DEVICE_LIST.LABEL_PRINTER.OLD_TYPE)
                {
                    sCommands = new string[] { "CLL\r\n"                                                // 메모리 클리어
                                             , "NEW\r\n"                                                // 새로운 명령어 시작
                                             , "CLIP ON\r\n"
                                             , "BF ON\r\n"                                          
                                             , "PP 100,90\r\n"
                                             , "BM 1\r\n"
                                             , "BT \"CODE128\r\n"
                                             , "BF \"Swiss 721 BT\",7\r\n"
                                             , "PB \"" + sBarcode_Data + "\"\r\n"
                                             , "FONT \"HYGothic-Medium\",10\r\n"
                                             , "NASC 949\r\n"
                                             , "PP 20,40\r\n"
                                             , "PT \"" + sProductNm_Ko + "\"\r\n"
                                             , "PF\r\n" };
                }
                else if (m_cPosStatus.Base.OlePosLabelPrinterModel == PosConst.POS_DEVICE_LIST.LABEL_PRINTER.NEW_TYPE)
                {
                    sCommands = new string[] { "SETUP \"MEDIA,MEDIA SIZE,LENGTH,1200\"\r\n"             // 용지출력범위 조정
                                             , "CLL\r\n"                                                // 메모리 클리어
                                             , "NEW\r\n"                                                // 새로운 명령어 시작
                                             , "BF ON\r\n"
                                             , "PP 90,150\r\n"                                          
                                             , "BH 50\r\n"
                                             , "BM 1\r\n"
                                             , "BT \"CODE128\r\n"
                                             , "BF \"Swiss 721 BT\",7\r\n"
                                             , "PB \"" + sBarcode_Data + "\"\r\n"
                                             , "NASC 949\r\n"
                                             , "FONT \"HYGothic-Medium\",9\r\n"
                                             , "PP 130,290\r\n"
                                             , "PT \"" + sStoreNm + "\" 점\r\n"
                                             , "FONT \"HYGothic-Medium\",5\r\n"
                                             , "PP 130,270\r\n"
                                             , "PT \"시간" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "\"\r\n"
                                             , "FONT \"HYGothic-Medium\",9\r\n"
                                             , "PP 90,20\r\n"
                                             , "PT \"" + sProductNm_Ko + "\"\r\n"
                                             , "PF\r\n" };
                }
                else
                {
                    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 (함수명))
                                         "Check label printer model configuration.");
                    return;
                }

                if (sCommands != null)
                    WriteCommand(sCommands);
            }
            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>
        /// Write commands to port.
        /// </summary>
        /// <param name="sCommands"></param>
        private void WriteCommand(string[] sCommands)
        {
            try
            {
                if(devStatus.LabelPrinter.Open)
                {
                    foreach(string cmd in sCommands)
                    {
                        m_serialPort.Write(cmd);
                    }
                }                
            }
            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);
            }
        }
        #endregion
    }
}
