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

using Cosmos.UserFrame;

namespace Cosmos.Measuring
{
    class ScalePoleDisplay
    {
        #region 클래스 변수 선언
        private static SerialPort m_cSerialPort = null;
        #endregion 클래스 변수 선언

        #region 생성자
        #endregion 생성자

        #region OPEN / CLOSE 처리 함수
        public bool OpenScalePoleDisplay(string sSerialPort, long lBaudrate)
        {
            bool bRet = false;

            try
            {
                if(m_cSerialPort != null)
                {
                    //grayber@20180307 시리얼 포트 flush 추가 start  - Open 함수 Input Output 버퍼 삭제(주석처리) 
                    m_cSerialPort.DiscardInBuffer();
                    m_cSerialPort.DiscardOutBuffer();
                    //grayber@20180307 시리얼 포트 flush 추가 end

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

                m_cSerialPort = new SerialPort();

                m_cSerialPort.NewLine = "\r\n";
                m_cSerialPort.Encoding = Encoding.Default;
                m_cSerialPort.WriteBufferSize = 512;
                m_cSerialPort.PortName = sSerialPort;
                m_cSerialPort.BaudRate = (int)lBaudrate;
                m_cSerialPort.ReadTimeout = 500;
                m_cSerialPort.WriteTimeout = 2000;
                m_cSerialPort.DataBits = 8;
                m_cSerialPort.StopBits = StopBits.One;
                m_cSerialPort.Parity = Parity.None;
                m_cSerialPort.Handshake = Handshake.None;

                m_cSerialPort.Open();
                if(m_cSerialPort.IsOpen == false)
                {
                    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 (함수명))
                                         "SERIAL PORT OPEN ERROR");
                    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);
            }

            //grayber@20171222 저울,라벨프린터, PoleDisplay 디버그 로그 추가 start
#if true // 로그추가
            //grayber@20171222 디버그 로그 추가 - 저울 디버그
            UserLog.WriteLogFile(UserCom.LOG_OP,
                             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]" + bRet);
#endif
            //grayber@20171222 저울,라벨프린터, PoleDisplay 디버그 로그 추가 end

            return bRet;
        }

        public bool CloseScalePoleDisplay()
        {
            bool bRet = false;
            try
            {
                if(m_cSerialPort == 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_cSerialPort_Scale == null)");
                    return bRet;
                }

                //grayber@20180307 시리얼 포트 flush 추가 start  - Close 함수 Input Output 버퍼 삭제
                m_cSerialPort.DiscardInBuffer();
                m_cSerialPort.DiscardOutBuffer();
                //grayber@20180307 시리얼 포트 flush 추가 end

                m_cSerialPort.Close();
                bRet = true;
                //grayber@20180307 시리얼 포트 flush 추가 start - try 문 밖으로 이동 (기존)
                //m_cSerialPort = null;
                //grayber@20180307 시리얼 포트 flush 추가 end
            }
            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);
            }
            //grayber@20180307 시리얼 포트 flush 추가 start - try 문 밖으로 이동 (변경)
            m_cSerialPort = null;
            //grayber@20180307 시리얼 포트 flush 추가 end
            return bRet;
        }
        #endregion OPEN / CLOSE 처리 함수

        #region 출력 함수
        public void WriteToScalePoleDisplay(string sScaleData)
        {
            try
            {

                m_cSerialPort.WriteLine(sScaleData);
                System.Threading.Thread.Sleep(500);

                m_cSerialPort.WriteLine(sScaleData);
                System.Threading.Thread.Sleep(500);

                m_cSerialPort.WriteLine(sScaleData);
                System.Threading.Thread.Sleep(500);
            }
            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 출력 함수
    }
}
