ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
    반응형

    댓글

Designed by Tistory.