업무용 소스 예제

SwitchComManager Class

안요사님 2021. 12. 3. 15:47
728x90
반응형
728x90
public class SKPStateInfo
    {
                                public double inputVolt {get;set;}
                                public double current {get;set;}
                                public double cpuTemp {get;set;}
                                public int overCurrentVolt {get;set;}
                                public byte skpVersion {get;set;}
        public SKPStateInfo()
        {
            inputVolt = 0;
            current = 0;
            cpuTemp = 0;
            overCurrentVolt = 0;
            skpVersion = 0x01;
        }
    }

    public class OperControlInfo
    {
                                public byte soundType { get; set; }
                                public byte sonarCommSwitchType { get; set; }
                                public byte switchBrightness { get; set; }
                                public byte stateDispBrightness { get; set; }
                                public byte operLampTest { get; set; }
                                public byte skpVersion { get; set; }
    }

    public class SwitchComManager
    {
        const byte STX = 0x7F;
        const byte ETX = 0x7E;

        static SerialPort _serialPort = null;
        static DispatcherTimer _timer = null;

                                        public static void OpenPort(string portName)
        {
            if (_serialPort == null)
            {
                _serialPort = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One);
                _serialPort.DtrEnable = true;
                _serialPort.RtsEnable = true;
                _serialPort.DataReceived += _serialPort_DataReceived;
            }

            if (_timer == null)
            {
                _timer = new DispatcherTimer();
                _timer.Tag = 0;
                _timer.Interval = TimeSpan.FromMilliseconds(20);
                _timer.Tick += _timer_Tick;
            }
            if (!_timer.IsEnabled)
                _timer.Start();

            if (!_serialPort.IsOpen)
                _serialPort.Open();
        }


        static Queue<List<byte>> _frameQueue = new Queue<List<byte>>();
        static List<byte> _datas = new List<byte>();

                                                static void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] buf = new byte[_serialPort.BytesToRead];
            _serialPort.Read(buf, 0, buf.Length);
            foreach (byte b in buf)
            {
                if (b.Equals(STX))
                {
                    _datas.Clear();
                    _datas.Add(b);
                }
                else if (b.Equals(ETX))
                {
                    _datas.Add(b);
                    _frameQueue.Enqueue(_datas);
                }
                else _datas.Add(b);
            }
        }

                                public static void ClosePort()
        {

            if (_serialPort != null && _serialPort.IsOpen)
            {
                if (_timer != null && _timer.IsEnabled)
                    _timer.Stop();
                _serialPort.Close();
            }

        }

        public delegate void ReceivedDataDelegate(string rdata);
        public static event ReceivedDataDelegate OnRecievedData;

        static void _timer_Tick(object sender, EventArgs e)
        {
            if (Convert.ToInt32(_timer.Tag) == 1) return;
            _timer.Tag = 1;

            if (_frameQueue.Count > 0)
            {
                List<byte> datas = _frameQueue.Dequeue();
                if (datas.Count >= 3)
                {
                    byte msgID = datas[2];

                    switch (msgID)
                    {
                        case 0x20:                             CheckReqSKPState(datas);
                            break;
                        case 0x31:                             CheckSwitchState(datas);
                            break;
                    }

                                        if (OnRecievedData != null) OnRecievedData("Received Data: " + string.Join(" ", datas.Select(item => string.Format("0x{0:X2}", item)).ToArray()));
                }
            }

            _timer.Tag = 0;
        }

        private static void CheckSwitchState(List<byte> datas)
        {
            try
            {
                OperControlInfo info = new OperControlInfo();
                info.soundType = datas[3];                 info.sonarCommSwitchType = datas[4];                 info.switchBrightness = datas[5];                 info.stateDispBrightness = datas[6];                 info.operLampTest = datas[7];                 info.skpVersion = datas[10];             }
            catch (Exception ee)
            {
                TraceManager.AddLog(string.Format("{0}r\n{1}", ee.StackTrace, ee.Message));
                System.Diagnostics.Debug.WriteLine(string.Format("{0}r\n{1}", ee.StackTrace, ee.Message));
            }
        }

        private static void CheckReqSKPState(List<byte> datas)
        {
            try
            {
                byte switchVer = datas[6];
                byte chkSum = datas[7];

                SetSKPState(_skpStateInfo);
            }
            catch (Exception ee)
            {
                TraceManager.AddLog(string.Format("{0}r\n{1}", ee.StackTrace, ee.Message));
                System.Diagnostics.Debug.WriteLine(string.Format("{0}r\n{1}", ee.StackTrace, ee.Message));
            }
        }

        static SKPStateInfo _skpStateInfo = new SKPStateInfo();
        public static SKPStateInfo SkpStateInfo
        {
            get { return _skpStateInfo; }
            set { _skpStateInfo = value; }
        }

        private static void SetSKPState(SKPStateInfo info)
        {
            try
            {
                if (_serialPort != null && _serialPort.IsOpen)
                {
                    List<byte> datas = new List<byte>();
                    datas.Add(STX);
                    datas.Add(0x0B);                     datas.Add(0x21);                     datas.Add((byte)(Convert.ToUInt16(info.inputVolt * 10) & 0xFF));                     datas.Add((byte)(Convert.ToUInt16(info.current * 10) & 0xFF));                     datas.Add((byte)(Convert.ToUInt16(info.cpuTemp) & 0xFF));                     datas.Add((byte)(info.overCurrentVolt));                     datas.Add((byte)(0x00));                     datas.Add(info.skpVersion); 
                    byte svalue = datas[0];
                    for (int i = 1; i <= 8; i++)
                        svalue ^= datas[i];
                    datas.Add((byte)(svalue & 0xFF));                     datas.Add(ETX);

                    _serialPort.Write(datas.ToArray(), 0, datas.Count);
                }

            }
            catch (Exception ee)
            {
                TraceManager.AddLog(string.Format("{0}r\n{1}", ee.StackTrace, ee.Message));
                System.Diagnostics.Debug.WriteLine(string.Format("{0}r\n{1}", ee.StackTrace, ee.Message));
            }
        }


                                public static void CommandOperationControl(OperControlInfo info)
        {

            if (_serialPort != null && _serialPort.IsOpen)
            {
                List<byte> datas = new List<byte>();
                datas.Add(STX);
                datas.Add(0x0D);                 datas.Add(0x30);                 datas.Add(info.soundType);                 datas.Add(info.sonarCommSwitchType);                 datas.Add(info.switchBrightness);                 datas.Add(info.stateDispBrightness);                 datas.Add(info.operLampTest);                 datas.Add(0x00);                 datas.Add(0x00);                 datas.Add(info.skpVersion); 
                byte svalue = datas[0];
                for (int i = 1; i <= 10; i++)
                    svalue ^= datas[i];
                datas.Add((byte)(svalue & 0xFF));                 datas.Add(ETX);

                _serialPort.Write(datas.ToArray(), 0, datas.Count);
            }
        }
    }
728x90
반응형