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