Files
laatzen/Common/OmniPlus/Connections/UniProConnection.cs
T

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