[#74] Weighing: Try to reconnect tcp scales on first error
All checks were successful
Test / Run tests (push) Successful in 3m0s
All checks were successful
Test / Run tests (push) Successful in 3m0s
This commit is contained in:
@@ -53,9 +53,16 @@ namespace Elwig.Helpers.Weighing {
|
|||||||
return line[1..^1];
|
return line[1..^1];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task<WeighingResult> Weigh(bool incIdentNr) {
|
protected async Task<WeighingResult> Weigh(bool incIdentNr, bool retry = true) {
|
||||||
await SendCommand(incIdentNr ? '\x05' : '?');
|
string record;
|
||||||
string record = await ReceiveResponse();
|
try {
|
||||||
|
await SendCommand(incIdentNr ? '\x05' : '?');
|
||||||
|
record = await ReceiveResponse();
|
||||||
|
} catch (IOException) {
|
||||||
|
if (!retry || Tcp == null) throw;
|
||||||
|
ReconnectTcp();
|
||||||
|
return await Weigh(incIdentNr, false);
|
||||||
|
}
|
||||||
if (record.Length != 45)
|
if (record.Length != 45)
|
||||||
throw new FormatException("Invalid response from scale: Received record has invalid size");
|
throw new FormatException("Invalid response from scale: Received record has invalid size");
|
||||||
var line = record[2..];
|
var line = record[2..];
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ namespace Elwig.Helpers.Weighing {
|
|||||||
|
|
||||||
protected enum Output { RTS, DTR, OUT1, OUT2 };
|
protected enum Output { RTS, DTR, OUT1, OUT2 };
|
||||||
|
|
||||||
|
protected readonly string Connection;
|
||||||
protected SerialPort? Serial = null;
|
protected SerialPort? Serial = null;
|
||||||
protected SerialPort? ControlSerialEmpty = null, ControlSerialFilling = null;
|
protected SerialPort? ControlSerialEmpty = null, ControlSerialFilling = null;
|
||||||
protected TcpClient? Tcp = null;
|
protected TcpClient? Tcp = null;
|
||||||
@@ -37,6 +38,7 @@ namespace Elwig.Helpers.Weighing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Scale(string cnx, string? empty, string? filling, int? limit, string? log, bool softFail = false, bool failSilent = false) {
|
protected Scale(string cnx, string? empty, string? filling, int? limit, string? log, bool softFail = false, bool failSilent = false) {
|
||||||
|
Connection = cnx;
|
||||||
if (cnx.StartsWith("serial:")) {
|
if (cnx.StartsWith("serial:")) {
|
||||||
try {
|
try {
|
||||||
Serial = Utils.OpenSerialConnection(cnx);
|
Serial = Utils.OpenSerialConnection(cnx);
|
||||||
@@ -95,6 +97,14 @@ namespace Elwig.Helpers.Weighing {
|
|||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void ReconnectTcp() {
|
||||||
|
if (Connection.StartsWith("tcp:")) {
|
||||||
|
Tcp = Utils.OpenTcpConnection(Connection);
|
||||||
|
Stream = Tcp.GetStream();
|
||||||
|
Reader = new(Stream, Encoding.ASCII, false, 512);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected static Output? ConvertOutput(string? value) {
|
protected static Output? ConvertOutput(string? value) {
|
||||||
return value switch {
|
return value switch {
|
||||||
null => null,
|
null => null,
|
||||||
|
|||||||
@@ -33,7 +33,9 @@ namespace Elwig.Helpers.Weighing {
|
|||||||
protected async Task<string> ReceiveResponse() {
|
protected async Task<string> ReceiveResponse() {
|
||||||
var line = await Reader.ReadUntilAsync("\r\n");
|
var line = await Reader.ReadUntilAsync("\r\n");
|
||||||
if (LogPath != null) await File.AppendAllTextAsync(LogPath, line);
|
if (LogPath != null) await File.AppendAllTextAsync(LogPath, line);
|
||||||
if (line == null || line.Length < 4 || !line.StartsWith('<') || !line.EndsWith(">\r\n")) {
|
if (line == null) {
|
||||||
|
throw new IOException("Verbindung zu Waage verloren");
|
||||||
|
} else if (line.Length < 4 || !line.StartsWith('<') || !line.EndsWith(">\r\n")) {
|
||||||
throw new FormatException("Invalid response from scale");
|
throw new FormatException("Invalid response from scale");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,9 +74,16 @@ namespace Elwig.Helpers.Weighing {
|
|||||||
return line[1..^3];
|
return line[1..^3];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task<WeighingResult> Weigh(bool incIdentNr) {
|
protected async Task<WeighingResult> Weigh(bool incIdentNr, bool retry = true) {
|
||||||
await SendCommand(incIdentNr ? $"RN{InternalScaleNr}" : $"RM{InternalScaleNr}");
|
string record;
|
||||||
string record = await ReceiveResponse();
|
try {
|
||||||
|
await SendCommand(incIdentNr ? $"RN{InternalScaleNr}" : $"RM{InternalScaleNr}");
|
||||||
|
record = await ReceiveResponse();
|
||||||
|
} catch (IOException) {
|
||||||
|
if (!retry || Tcp == null) throw;
|
||||||
|
ReconnectTcp();
|
||||||
|
return await Weigh(incIdentNr, false);
|
||||||
|
}
|
||||||
if (record.Length != 62)
|
if (record.Length != 62)
|
||||||
throw new FormatException("Invalid response from scale: Received record has invalid size");
|
throw new FormatException("Invalid response from scale: Received record has invalid size");
|
||||||
var line = record[2..];
|
var line = record[2..];
|
||||||
|
|||||||
Reference in New Issue
Block a user