93 lines
2.5 KiB
C#
93 lines
2.5 KiB
C#
namespace OmniPlus.Connections
|
|
{
|
|
using OmniPlus.Enums;
|
|
using OmniPlus.Hanlers;
|
|
|
|
using System;
|
|
using System.IO.Ports;
|
|
using System.Threading;
|
|
|
|
internal class UniProConnection : SerialPortConnection
|
|
{
|
|
protected event DataReceivedHandler MessageReceived;
|
|
|
|
public UniProConnection(string portName)
|
|
{
|
|
this.Options.PortName = portName;
|
|
this.Options.BaudRate = BaudRate.K2400;
|
|
this.Options.DataBits = DataBits.X8;
|
|
this.Options.Parity = Parity.None;
|
|
this.Options.StopBits = StopBits.One;
|
|
this.Options.LogFile = $".\\UniPro\\[{portName}].txt";
|
|
}
|
|
|
|
public byte[] SendMessage(byte[] command)
|
|
{
|
|
var response = new byte[0];
|
|
var received = false;
|
|
|
|
if (command is null)
|
|
{
|
|
return response;
|
|
}
|
|
|
|
void MessageReceivedHandler(byte[] bytes)
|
|
{
|
|
response = bytes.FromUniProMessage();
|
|
received = true;
|
|
}
|
|
|
|
this.MessageReceived += MessageReceivedHandler;
|
|
|
|
var request = command.ToUniProMessage();
|
|
var sleep = 33000;
|
|
var delay = 1000;
|
|
|
|
this.Write(request);
|
|
|
|
while (!received && sleep >= 0)
|
|
{
|
|
sleep -= delay;
|
|
|
|
Thread.Sleep(delay);
|
|
}
|
|
|
|
this.MessageReceived -= MessageReceivedHandler;
|
|
|
|
return response;
|
|
}
|
|
|
|
protected override void SerialPortConnection_DataReceived(byte[] bytes)
|
|
{
|
|
var message = default(byte[]);
|
|
var length = bytes.Length;
|
|
var start = 0;
|
|
|
|
while (start < bytes.Length)
|
|
{
|
|
if (bytes[start] == OmniPlusExtensions.UNIPRO_START)
|
|
{
|
|
try
|
|
{
|
|
var messageLength = bytes[start + 2];
|
|
messageLength += OmniPlusExtensions.UNIPRO_MIN_LENGTH;
|
|
message = new byte[messageLength];
|
|
|
|
Array.Copy(bytes, start, message, 0, messageLength);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
this.SerialPortConnection_LogMessage(e.ToString());
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
start++;
|
|
}
|
|
|
|
this.MessageReceived?.Invoke(message);
|
|
}
|
|
}
|
|
}
|