diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs
index eb3d714a4..1b9e1281e 100644
--- a/TBF/Properties/AssemblyInfo.cs
+++ b/TBF/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
-[assembly: AssemblyVersion("3.9.3069.8")]
-[assembly: AssemblyFileVersion("3.9.3069.8")]
+[assembly: AssemblyVersion("3.9.3134.0")]
+[assembly: AssemblyFileVersion("3.9.3134.0")]
diff --git a/TBF/Resources/Strings.Designer.cs b/TBF/Resources/Strings.Designer.cs
index f5f49dd9e..b36eb5c49 100644
--- a/TBF/Resources/Strings.Designer.cs
+++ b/TBF/Resources/Strings.Designer.cs
@@ -1427,6 +1427,15 @@ namespace TBF.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Delay between pictures.
+ ///
+ internal static string DelaySendImage {
+ get {
+ return ResourceManager.GetString("DelaySendImage", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Density.
///
@@ -2723,15 +2732,6 @@ namespace TBF.Resources {
}
}
- ///
- /// Looks up a localized string similar to iPerl Communication in progress.
- ///
- internal static string iPerl_Communication_in_progress {
- get {
- return ResourceManager.GetString("iPerl_Communication_in_progress", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to ITS-27 calibration coefficients.
///
@@ -3101,6 +3101,15 @@ namespace TBF.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Meter Communication in progress.
+ ///
+ internal static string Meter_Communication_in_progress {
+ get {
+ return ResourceManager.GetString("Meter_Communication_in_progress", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Sensors.
///
@@ -3839,6 +3848,15 @@ namespace TBF.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Pictures Count.
+ ///
+ internal static string PictureCouts {
+ get {
+ return ResourceManager.GetString("PictureCouts", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to PID.
///
@@ -4640,6 +4658,15 @@ namespace TBF.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Radio Communication failed.
+ ///
+ internal static string Radio_Communication_failed {
+ get {
+ return ResourceManager.GetString("Radio_Communication_failed", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Rate of change [%].
///
diff --git a/TBF/Resources/Strings.cs.Designer.cs b/TBF/Resources/Strings.cs.Designer.cs
index da6c77484..4e0c89a9c 100644
--- a/TBF/Resources/Strings.cs.Designer.cs
+++ b/TBF/Resources/Strings.cs.Designer.cs
@@ -1931,15 +1931,6 @@ namespace TBF.Resources {
}
}
- ///
- /// Looks up a localized string similar to iPERL Komunikace probíhá.
- ///
- internal static string iPerl_Communication_in_progress {
- get {
- return ResourceManager.GetString("iPerl_Communication_in_progress", resourceCulture);
- }
- }
-
///
/// Looks up a localized string similar to Jazyk.
///
@@ -2147,6 +2138,15 @@ namespace TBF.Resources {
}
}
+ ///
+ /// Looks up a localized string similar to Komunikace s vodemerem probíhá.
+ ///
+ internal static string Meter_Communication_in_progress {
+ get {
+ return ResourceManager.GetString("Meter_Communication_in_progress", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Testované typy měřičů.
///
diff --git a/TBF/Resources/Strings.cs.resx b/TBF/Resources/Strings.cs.resx
index e97e9a6ae..2a45ee942 100644
--- a/TBF/Resources/Strings.cs.resx
+++ b/TBF/Resources/Strings.cs.resx
@@ -1020,8 +1020,8 @@
Současně s předchozím krokem
-
- iPERL Komunikace probíhá
+
+ Komunikace s vodemerem probíhá
Jazyk
diff --git a/TBF/Resources/Strings.de.Designer.cs b/TBF/Resources/Strings.de.Designer.cs
index e69de29bb..b3ab2e3d1 100644
--- a/TBF/Resources/Strings.de.Designer.cs
+++ b/TBF/Resources/Strings.de.Designer.cs
@@ -0,0 +1,6398 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace TBF.Resources {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Strings_de {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Strings_de() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TBF.Resources.Strings.de", typeof(Strings_de).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to {0} - schliese Ventil Entwässerung.
+ ///
+ internal static string _0_close_the_drain_valve {
+ get {
+ return ResourceManager.GetString("_0_close_the_drain_valve", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to {0} - öffnen Ventil Entwässerung.
+ ///
+ internal static string _0_open_the_drain_valve {
+ get {
+ return ResourceManager.GetString("_0_open_the_drain_valve", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to {0} Pfad '{1}' genutzt von {2} Tests gleichzeitig wird entfernt.{3}.
+ ///
+ internal static string _0_path_1_used_by_2_tests_will_be_removed_3 {
+ get {
+ return ResourceManager.GetString("_0_path_1_used_by_2_tests_will_be_removed_3", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to {0} Pfad '{1}' genutzt von {2}Tests werden umbenannt in '{3}'.{4}.
+ ///
+ internal static string _0_path_1_used_by_2_tests_will_be_renamed_to_3_4 {
+ get {
+ return ResourceManager.GetString("_0_path_1_used_by_2_tests_will_be_renamed_to_3_4", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to {0} - Warten bis Prüfbehälter mehr als {1} ltr enthällt..
+ ///
+ internal static string _0_wait_until_tank_contains_more_then_1_l {
+ get {
+ return ResourceManager.GetString("_0_wait_until_tank_contains_more_then_1_l", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to {0} - warten bis Prüfbehälter leer ist.
+ ///
+ internal static string _0_wait_until_the_tank_is_empty {
+ get {
+ return ResourceManager.GetString("_0_wait_until_the_tank_is_empty", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to <kein>.
+ ///
+ internal static string _none_ {
+ get {
+ return ResourceManager.GetString("_none_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to (Getrennt).
+ ///
+ internal static string _offline {
+ get {
+ return ResourceManager.GetString("_offline", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abrechen.
+ ///
+ internal static string Abort {
+ get {
+ return ResourceManager.GetString("Abort", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abbruch Zyklus.
+ ///
+ internal static string Abort_cycle {
+ get {
+ return ResourceManager.GetString("Abort_cycle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unterbrechen.
+ ///
+ internal static string Abort_session {
+ get {
+ return ResourceManager.GetString("Abort_session", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Info TBF.
+ ///
+ internal static string About_Test_Bench_Framework {
+ get {
+ return ResourceManager.GetString("About_Test_Bench_Framework", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abtastkopf Ein/Aus.
+ ///
+ internal static string Activate_Deactivate_heads {
+ get {
+ return ResourceManager.GetString("Activate_Deactivate_heads", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vorgang.
+ ///
+ internal static string Activity {
+ get {
+ return ResourceManager.GetString("Activity", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hinzufügen.
+ ///
+ internal static string Add {
+ get {
+ return ResourceManager.GetString("Add", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Neu.
+ ///
+ internal static string AddBtnText {
+ get {
+ return ResourceManager.GetString("AddBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Adresse.
+ ///
+ internal static string Address {
+ get {
+ return ResourceManager.GetString("Address", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Justierung läuft ....
+ ///
+ internal static string Adjustment_in_progress {
+ get {
+ return ResourceManager.GetString("Adjustment_in_progress", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Administrator.
+ ///
+ internal static string Administrator {
+ get {
+ return ResourceManager.GetString("Administrator", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Luftdichte [kg/m3].
+ ///
+ internal static string Air_density_kg_m3 {
+ get {
+ return ResourceManager.GetString("Air_density_kg_m3", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Luftfeuchtigkeit.
+ ///
+ internal static string Air_humidity {
+ get {
+ return ResourceManager.GetString("Air_humidity", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Umgebungsdruck.
+ ///
+ internal static string Air_pressure {
+ get {
+ return ResourceManager.GetString("Air_pressure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Umgebungstemperatur.
+ ///
+ internal static string Air_temperature {
+ get {
+ return ResourceManager.GetString("Air_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Alle Ereignisse.
+ ///
+ internal static string All_events {
+ get {
+ return ResourceManager.GetString("All_events", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Alle Prüfpunkte müssen durchgeführt werden.
+ ///
+ internal static string All_tests_must_be_completed {
+ get {
+ return ResourceManager.GetString("All_tests_must_be_completed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Luftfeuchtigkeit.
+ ///
+ internal static string Ambient_humidity {
+ get {
+ return ResourceManager.GetString("Ambient_humidity", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Umgebungsdruck.
+ ///
+ internal static string Ambient_pressure {
+ get {
+ return ResourceManager.GetString("Ambient_pressure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Umgebungstemperatur.
+ ///
+ internal static string Ambient_temperature {
+ get {
+ return ResourceManager.GetString("Ambient_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ein Ausnahmefehler ist aufgetreten!.
+ ///
+ internal static string An_unhandled_error_occured {
+ get {
+ return ResourceManager.GetString("An_unhandled_error_occured", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Das TBF Programm wurde bereits ausgeführt. Bitte schließen Sie das Programm im Taskmanager..
+ ///
+ internal static string Another_instance_is_running {
+ get {
+ return ResourceManager.GetString("Another_instance_is_running", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Beliebig.
+ ///
+ internal static string any {
+ get {
+ return ResourceManager.GetString("any", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zulassung.
+ ///
+ internal static string Approval {
+ get {
+ return ResourceManager.GetString("Approval", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zulassung Datum.
+ ///
+ internal static string Approval_date {
+ get {
+ return ResourceManager.GetString("Approval_date", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zulassung Nr.:.
+ ///
+ internal static string Approval_ID {
+ get {
+ return ResourceManager.GetString("Approval_ID", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zulassungszeichen.
+ ///
+ internal static string Approval_info {
+ get {
+ return ResourceManager.GetString("Approval_info", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zugelassen von:.
+ ///
+ internal static string Approved_by {
+ get {
+ return ResourceManager.GetString("Approved_by", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Die Anordnung der Zähler.
+ ///
+ internal static string Arrangement_of_meters {
+ get {
+ return ResourceManager.GetString("Arrangement_of_meters", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Die Anordnung der Prüfpunkte.
+ ///
+ internal static string Arrangement_of_tests {
+ get {
+ return ResourceManager.GetString("Arrangement_of_tests", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bei Temperatur.
+ ///
+ internal static string At_temperature {
+ get {
+ return ResourceManager.GetString("At_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nebenzähler.
+ ///
+ internal static string Aux {
+ get {
+ return ResourceManager.GetString("Aux", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nebenzähler.
+ ///
+ internal static string Aux_ {
+ get {
+ return ResourceManager.GetString("Aux_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nebenzähler.
+ ///
+ internal static string Aux_Water_Meter {
+ get {
+ return ResourceManager.GetString("Aux_Water_Meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nebenzähler-Stand.
+ ///
+ internal static string Aux_Water_Meter_State {
+ get {
+ return ResourceManager.GetString("Aux_Water_Meter_State", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nebenzähler Seriennummer.
+ ///
+ internal static string Aux_WM_SerialNr {
+ get {
+ return ResourceManager.GetString("Aux_WM_SerialNr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Komponenten:.
+ ///
+ internal static string Available_Components_ {
+ get {
+ return ResourceManager.GetString("Available_Components_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse.
+ ///
+ internal static string Available_results {
+ get {
+ return ResourceManager.GetString("Available_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to < Zurück.
+ ///
+ internal static string BackBtnText {
+ get {
+ return ResourceManager.GetString("BackBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Waage.
+ ///
+ internal static string Balance {
+ get {
+ return ResourceManager.GetString("Balance", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zählerlos.
+ ///
+ internal static string Batch {
+ get {
+ return ResourceManager.GetString("Batch", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zählerlos Nr..
+ ///
+ internal static string Batch_nr {
+ get {
+ return ResourceManager.GetString("Batch_nr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand.
+ ///
+ internal static string Bench {
+ get {
+ return ResourceManager.GetString("Bench", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand.
+ ///
+ internal static string Bench_chdr {
+ get {
+ return ResourceManager.GetString("Bench_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Der Prüfstand ist nicht in Betrieb. Sie können die Einstellungen ändern, um das Problem zu lösen..
+ ///
+ internal static string Bench_is_not_running {
+ get {
+ return ResourceManager.GetString("Bench_is_not_running", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Der Prüfstandsname ist ungültig. Bitte wählen Sie einen anderen Namen..
+ ///
+ internal static string Bench_name_conflict_Use_another_name_pls {
+ get {
+ return ResourceManager.GetString("Bench_name_conflict_Use_another_name_pls", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand Parameter.
+ ///
+ internal static string Bench_parameters {
+ get {
+ return ResourceManager.GetString("Bench_parameters", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüftisch.
+ ///
+ internal static string BenchTabPageTitle {
+ get {
+ return ResourceManager.GetString("BenchTabPageTitle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zwische Test ({0}: Schritt {1}/{2}).
+ ///
+ internal static string Between_tests_sequence_i_n {
+ get {
+ return ResourceManager.GetString("Between_tests_sequence_i_n", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datum eingeben {0}.
+ ///
+ internal static string BuildDateStr {
+ get {
+ return ResourceManager.GetString("BuildDateStr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nebenleitung.
+ ///
+ internal static string Bypass {
+ get {
+ return ResourceManager.GetString("Bypass", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kalkulieren.
+ ///
+ internal static string calculated {
+ get {
+ return ResourceManager.GetString("calculated", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kalender.
+ ///
+ internal static string Calendar {
+ get {
+ return ResourceManager.GetString("Calendar", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kalibrierung.
+ ///
+ internal static string Calibration {
+ get {
+ return ResourceManager.GetString("Calibration", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kalibrierschein.
+ ///
+ internal static string Calibration_certificate {
+ get {
+ return ResourceManager.GetString("Calibration_certificate", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kalibrierschein gültigkeit abgelaufen.
+ ///
+ internal static string Calibration_certificate_validity_expired {
+ get {
+ return ResourceManager.GetString("Calibration_certificate_validity_expired", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kalibrier-Koeffizient.
+ ///
+ internal static string Calibration_coefficients {
+ get {
+ return ResourceManager.GetString("Calibration_coefficients", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kalibriertechniker.
+ ///
+ internal static string Calibration_Specialist {
+ get {
+ return ResourceManager.GetString("Calibration_Specialist", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kamera.
+ ///
+ internal static string Camera {
+ get {
+ return ResourceManager.GetString("Camera", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kamerafehler.
+ ///
+ internal static string Camera_error {
+ get {
+ return ResourceManager.GetString("Camera_error", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abbrechen.
+ ///
+ internal static string CancelBtnText {
+ get {
+ return ResourceManager.GetString("CancelBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verbindung mit der Datenbank nicht möglich..
+ ///
+ internal static string Cannot_connect_to_the_database {
+ get {
+ return ResourceManager.GetString("Cannot_connect_to_the_database", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pfad für Prüfstrecke kann nicht geladen werden..
+ ///
+ internal static string Cannot_load_bench_path {
+ get {
+ return ResourceManager.GetString("Cannot_load_bench_path", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pfad für Wasserzulauf kann nicht geladen werden..
+ ///
+ internal static string Cannot_load_feeding_path {
+ get {
+ return ResourceManager.GetString("Cannot_load_feeding_path", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pfad für Messtrecke kann nicht geladen werden..
+ ///
+ internal static string Cannot_load_output_path {
+ get {
+ return ResourceManager.GetString("Cannot_load_output_path", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pfad für Abtastung kann nicht geladen werden..
+ ///
+ internal static string Cannot_load_sensor_path {
+ get {
+ return ResourceManager.GetString("Cannot_load_sensor_path", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Änderungen können nicht gespeichert werden..
+ ///
+ internal static string Cannot_save_changes {
+ get {
+ return ResourceManager.GetString("Cannot_save_changes", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zertifikat.
+ ///
+ internal static string Certificate {
+ get {
+ return ResourceManager.GetString("Certificate", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse gehen verloren! Wollen sie fortfahren?.
+ ///
+ internal static string Changes_will_be_lost_Do_you_want_to_proceed {
+ get {
+ return ResourceManager.GetString("Changes_will_be_lost_Do_you_want_to_proceed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kanal.
+ ///
+ internal static string Channel {
+ get {
+ return ResourceManager.GetString("Channel", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Waagebehälter Volumen prüfen.
+ ///
+ internal static string Checking_tank_capacity {
+ get {
+ return ResourceManager.GetString("Checking_tank_capacity", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Klasse.
+ ///
+ internal static string Class {
+ get {
+ return ResourceManager.GetString("Class", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse löschen.
+ ///
+ internal static string Clear_results {
+ get {
+ return ResourceManager.GetString("Clear_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Löschen.
+ ///
+ internal static string ClearBtnText {
+ get {
+ return ResourceManager.GetString("ClearBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Im Uhrzeigersinn.
+ ///
+ internal static string Clockwise {
+ get {
+ return ResourceManager.GetString("Clockwise", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to geschlossen.
+ ///
+ internal static string close {
+ get {
+ return ResourceManager.GetString("close", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Schließe das Entleerventil.
+ ///
+ internal static string Close_emptying_valve {
+ get {
+ return ResourceManager.GetString("Close_emptying_valve", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Schutzhaube schließen!.
+ ///
+ internal static string Close_the_cover {
+ get {
+ return ResourceManager.GetString("Close_the_cover", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Beenden.
+ ///
+ internal static string CloseBtnText {
+ get {
+ return ResourceManager.GetString("CloseBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to TBF Programm schließt.
+ ///
+ internal static string Closing_Test_Bench_Framework {
+ get {
+ return ResourceManager.GetString("Closing_Test_Bench_Framework", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Schließen des Programms.
+ ///
+ internal static string Closing_the_program {
+ get {
+ return ResourceManager.GetString("Closing_the_program", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Behälter Schließen.
+ ///
+ internal static string Closing_the_tank {
+ get {
+ return ResourceManager.GetString("Closing_the_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Schließen Ventil Zulauf und Pumpe Aus.
+ ///
+ internal static string Closing_valve_Pump_off {
+ get {
+ return ResourceManager.GetString("Closing_valve_Pump_off", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kommunikation.
+ ///
+ internal static string Communication {
+ get {
+ return ResourceManager.GetString("Communication", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vergleichen.
+ ///
+ internal static string Compare {
+ get {
+ return ResourceManager.GetString("Compare", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Komponente.
+ ///
+ internal static string Component {
+ get {
+ return ResourceManager.GetString("Component", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Komponenten {0} fehlgeschlagen. Ergebnisse nicht gerduckt..
+ ///
+ internal static string Component_0_crashed_Results_not_printed {
+ get {
+ return ResourceManager.GetString("Component_0_crashed_Results_not_printed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Komponenten {0} fehlgeschlagen. Ergebnisse nicht gespeichert..
+ ///
+ internal static string Component_0_crashed_Results_not_saved {
+ get {
+ return ResourceManager.GetString("Component_0_crashed_Results_not_saved", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstandskomponenten Klasse.
+ ///
+ internal static string Component_class {
+ get {
+ return ResourceManager.GetString("Component_class", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verbund.
+ ///
+ internal static string Compound {
+ get {
+ return ResourceManager.GetString("Compound", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verbundzähler {0}.
+ ///
+ internal static string Compound_meter_0 {
+ get {
+ return ResourceManager.GetString("Compound_meter_0", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verbundwasserzähler.
+ ///
+ internal static string Compound_meters {
+ get {
+ return ResourceManager.GetString("Compound_meters", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Konditionen.
+ ///
+ internal static string Conditions {
+ get {
+ return ResourceManager.GetString("Conditions", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Konfiguration.
+ ///
+ internal static string Configuration {
+ get {
+ return ResourceManager.GetString("Configuration", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Konfigurieren.
+ ///
+ internal static string Configure {
+ get {
+ return ResourceManager.GetString("Configure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand konfigurieren (Passwort erforderlich).
+ ///
+ internal static string ConfigureDatabaseText {
+ get {
+ return ResourceManager.GetString("ConfigureDatabaseText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Lesen bestätigen.
+ ///
+ internal static string Confirm_read {
+ get {
+ return ResourceManager.GetString("Confirm_read", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bestätigung.
+ ///
+ internal static string Confirmation {
+ get {
+ return ResourceManager.GetString("Confirmation", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verbindungszeichenfolge.
+ ///
+ internal static string Connection_string {
+ get {
+ return ResourceManager.GetString("Connection_string", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Weiter.
+ ///
+ internal static string Continue {
+ get {
+ return ResourceManager.GetString("Continue", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Mit dem nächsten Prüfpunkt fortfahren?.
+ ///
+ internal static string Continue_in_the_cycle {
+ get {
+ return ResourceManager.GetString("Continue_in_the_cycle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wassertemperaturregelung.
+ ///
+ internal static string Control_water_temp_chdr {
+ get {
+ return ResourceManager.GetString("Control_water_temp_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kopieren.
+ ///
+ internal static string CopyBtnText {
+ get {
+ return ResourceManager.GetString("CopyBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to © 2013 - {0} Sensus GmbH.
+ ///
+ internal static string CopyrightStr {
+ get {
+ return ResourceManager.GetString("CopyrightStr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Korrigiert.
+ ///
+ internal static string Corrected {
+ get {
+ return ResourceManager.GetString("Corrected", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Korrektur.
+ ///
+ internal static string Correction {
+ get {
+ return ResourceManager.GetString("Correction", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Gegen den Uhrzeigersinn.
+ ///
+ internal static string Counterclockwise {
+ get {
+ return ResourceManager.GetString("Counterclockwise", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datenbank erzeugen.
+ ///
+ internal static string Create_DB {
+ get {
+ return ResourceManager.GetString("Create_DB", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Errstellt von.
+ ///
+ internal static string Created_by {
+ get {
+ return ResourceManager.GetString("Created_by", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Strom.
+ ///
+ internal static string Current {
+ get {
+ return ResourceManager.GetString("Current", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kürzlich benutzte Datenbank wurde wieder hergestellt..
+ ///
+ internal static string Currently_used_database_was_restored {
+ get {
+ return ResourceManager.GetString("Currently_used_database_was_restored", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Daten.
+ ///
+ internal static string Data {
+ get {
+ return ResourceManager.GetString("Data", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zählerdateneingabe.
+ ///
+ internal static string Data_entry {
+ get {
+ return ResourceManager.GetString("Data_entry", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datenbank Einstellungen.
+ ///
+ internal static string Database_Settings {
+ get {
+ return ResourceManager.GetString("Database_Settings", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datenbank Typ.
+ ///
+ internal static string Database_type {
+ get {
+ return ResourceManager.GetString("Database_type", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datum.
+ ///
+ internal static string Date {
+ get {
+ return ResourceManager.GetString("Date", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datum und Uhrzeit.
+ ///
+ internal static string Date_and_time {
+ get {
+ return ResourceManager.GetString("Date_and_time", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datum / Uhrzeit.
+ ///
+ internal static string Date_time {
+ get {
+ return ResourceManager.GetString("Date_time", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Die Datenbank wurde erfolgreich erstellt..
+ ///
+ internal static string DB_was_successfully_created {
+ get {
+ return ResourceManager.GetString("DB_was_successfully_created", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Die vorhandene Datenbank wird überschrieben..
+ ///
+ internal static string DB_will_be_overwritten {
+ get {
+ return ResourceManager.GetString("DB_will_be_overwritten", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Basis Einheiten.
+ ///
+ internal static string Default_units {
+ get {
+ return ResourceManager.GetString("Default_units", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dichte.
+ ///
+ internal static string Density {
+ get {
+ return ResourceManager.GetString("Density", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dichtekorektur.
+ ///
+ internal static string Density_correction {
+ get {
+ return ResourceManager.GetString("Density_correction", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Beschreibung.
+ ///
+ internal static string DescriptionColHdr {
+ get {
+ return ResourceManager.GetString("DescriptionColHdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Erkennung erfolgt.
+ ///
+ internal static string Detection_completed {
+ get {
+ return ResourceManager.GetString("Detection_completed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Erkennung fehlgeschlagen.
+ ///
+ internal static string Detection_failed {
+ get {
+ return ResourceManager.GetString("Detection_failed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Schwellwert [%].
+ ///
+ internal static string DetectionThresholdPct {
+ get {
+ return ResourceManager.GetString("DetectionThresholdPct", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to feststellen.
+ ///
+ internal static string determine {
+ get {
+ return ResourceManager.GetString("determine", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Gerät.
+ ///
+ internal static string Device {
+ get {
+ return ResourceManager.GetString("Device", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vorgabe.
+ ///
+ internal static string dflt {
+ get {
+ return ResourceManager.GetString("dflt", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Richtung und Impulse sind OK.
+ ///
+ internal static string Direction_and_pulses_are_OK {
+ get {
+ return ResourceManager.GetString("Direction_and_pulses_are_OK", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Richtung is nicht OK.
+ ///
+ internal static string Direction_is_NOK {
+ get {
+ return ResourceManager.GetString("Direction_is_NOK", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Umschaltung.
+ ///
+ internal static string Diverter {
+ get {
+ return ResourceManager.GetString("Diverter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten sie diese Sitzung beenden?.
+ ///
+ internal static string Do_you_really_want_to_abort_this_session {
+ get {
+ return ResourceManager.GetString("Do_you_really_want_to_abort_this_session", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten Sie den Abschnitt '{0}' löschen?.
+ ///
+ internal static string Do_you_really_want_to_delete_sequence_0 {
+ get {
+ return ResourceManager.GetString("Do_you_really_want_to_delete_sequence_0", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wollen sie wirklich eine unvollständigen Modus wiederherstellen?.
+ ///
+ internal static string Do_you_really_want_to_restore_uncompleted_session {
+ get {
+ return ResourceManager.GetString("Do_you_really_want_to_restore_uncompleted_session", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten sie ein Backup der Konfiguration erstellen?.
+ ///
+ internal static string Do_you_want_to_back_up_configuration_qm {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_back_up_configuration_qm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten sie ein Backup der Ergebnisse erstellen?.
+ ///
+ internal static string Do_you_want_to_back_up_results_qm {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_back_up_results_qm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten Sie diese Zelle kopieren in alle Zellen darunter?.
+ ///
+ internal static string Do_you_want_to_copy_this_value_to_all_cells_below_this_cell {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_copy_this_value_to_all_cells_below_this_cell", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten Sie die Prüfvorlage löschen?.
+ ///
+ internal static string Do_you_want_to_delete_the_procedure {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_delete_the_procedure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wollen Sie das TBF Programm beenden?.
+ ///
+ internal static string Do_you_want_to_exit_TBF {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_exit_TBF", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten Sie fortfahren?.
+ ///
+ internal static string Do_you_want_to_proceed {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_proceed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten sie die Konfiguration von Datenbank-Datei{0} wieder herstellen?.
+ ///
+ internal static string Do_you_want_to_restore_configuration_DB_from_file_0_qm {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_restore_configuration_DB_from_file_0_qm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten sie die Ergebnisse von der Datenbank-Datei{0} wieder herstellen?.
+ ///
+ internal static string Do_you_want_to_restore_results_DB_from_file_0_qm {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_restore_results_DB_from_file_0_qm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wollen sie die Änderungen speichern?.
+ ///
+ internal static string Do_you_want_to_save_changes {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_save_changes", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten Sie die Prüfvorlage speichern?.
+ ///
+ internal static string Do_you_want_to_save_the_procedure {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_save_the_procedure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten sie die betreffenden Tests und Prüfvorgänge updaten?.
+ ///
+ internal static string Do_you_want_to_update_related_tests_and_procedures {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_update_related_tests_and_procedures", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Möchten sie "Use wizard" Tests updaten?.
+ ///
+ internal static string Do_you_want_to_update_tests_QM {
+ get {
+ return ResourceManager.GetString("Do_you_want_to_update_tests_QM", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abwärts.
+ ///
+ internal static string DownBtnText {
+ get {
+ return ResourceManager.GetString("DownBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Entwässern nach.
+ ///
+ internal static string Draining_after {
+ get {
+ return ResourceManager.GetString("Draining_after", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Entwässern davor.
+ ///
+ internal static string Draining_before {
+ get {
+ return ResourceManager.GetString("Draining_before", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abweichung pro Jahr.
+ ///
+ internal static string Drift_per_year {
+ get {
+ return ResourceManager.GetString("Drift_per_year", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Leckage Dauer.
+ ///
+ internal static string Duration_Leak_s {
+ get {
+ return ResourceManager.GetString("Duration_Leak_s", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dauer [ms].
+ ///
+ internal static string Duration_ms {
+ get {
+ return ResourceManager.GetString("Duration_ms", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pmax Dauer.
+ ///
+ internal static string Duration_PMax_s {
+ get {
+ return ResourceManager.GetString("Duration_PMax_s", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dauer [s].
+ ///
+ internal static string Duration_s {
+ get {
+ return ResourceManager.GetString("Duration_s", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzereigenschaften ändern.
+ ///
+ internal static string Edit_User {
+ get {
+ return ResourceManager.GetString("Edit_User", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bearbeiten.
+ ///
+ internal static string EditBtnText {
+ get {
+ return ResourceManager.GetString("EditBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Not-Aus.
+ ///
+ internal static string Emergency_STOP {
+ get {
+ return ResourceManager.GetString("Emergency_STOP", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Entleeren.
+ ///
+ internal static string Empty {
+ get {
+ return ResourceManager.GetString("Empty", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Behälter entleeren.
+ ///
+ internal static string Empty_the_tank {
+ get {
+ return ResourceManager.GetString("Empty_the_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Entleeren.
+ ///
+ internal static string Emptying_chdr {
+ get {
+ return ResourceManager.GetString("Emptying_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Enwässern ({0}: Schritt {1}/{2}).
+ ///
+ internal static string Emptying_i_n {
+ get {
+ return ResourceManager.GetString("Emptying_i_n", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Behälter entleeren.
+ ///
+ internal static string Emptying_tank {
+ get {
+ return ResourceManager.GetString("Emptying_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Entleerventil.
+ ///
+ internal static string Emptying_valve {
+ get {
+ return ResourceManager.GetString("Emptying_valve", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Aktivieren "Bemerkung".
+ ///
+ internal static string Enable_Remark {
+ get {
+ return ResourceManager.GetString("Enable_Remark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ende.
+ ///
+ internal static string End {
+ get {
+ return ResourceManager.GetString("End", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bedingung für das Ende.
+ ///
+ internal static string End_Condition {
+ get {
+ return ResourceManager.GetString("End_Condition", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnis speichern.
+ ///
+ internal static string End_session {
+ get {
+ return ResourceManager.GetString("End_session", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Endstand.
+ ///
+ internal static string End_State {
+ get {
+ return ResourceManager.GetString("End_State", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dauerversuch Zyklen.
+ ///
+ internal static string Endurance_cycle {
+ get {
+ return ResourceManager.GetString("Endurance_cycle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dauerversuch Zyklen Ausführen.
+ ///
+ internal static string Endurance_cycle_execution {
+ get {
+ return ResourceManager.GetString("Endurance_cycle_execution", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dauerversuch Zyklen Stufen.
+ ///
+ internal static string Endurance_cycle_steps {
+ get {
+ return ResourceManager.GetString("Endurance_cycle_steps", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Energie.
+ ///
+ internal static string Energy {
+ get {
+ return ResourceManager.GetString("Energy", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Passwort eingeben..
+ ///
+ internal static string Enter_password {
+ get {
+ return ResourceManager.GetString("Enter_password", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Geben Sie die Protokolldaten ein.
+ ///
+ internal static string Enter_protocol_data {
+ get {
+ return ResourceManager.GetString("Enter_protocol_data", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Eingabe Seriennr. am Ende.
+ ///
+ internal static string Enter_SNs_at_the_end {
+ get {
+ return ResourceManager.GetString("Enter_SNs_at_the_end", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Geben Sie die WZ-Daten ein.
+ ///
+ internal static string Enter_water_meter_data {
+ get {
+ return ResourceManager.GetString("Enter_water_meter_data", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehl. Korr.- [%].
+ ///
+ internal static string Err_cor_neg_pct_chdr {
+ get {
+ return ResourceManager.GetString("Err_cor_neg_pct_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehl. Korr.+ [%].
+ ///
+ internal static string Err_cor_pos_pct_chdr {
+ get {
+ return ResourceManager.GetString("Err_cor_pos_pct_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehlergrenze - [%].
+ ///
+ internal static string Err_limit_neg_pct_chdr {
+ get {
+ return ResourceManager.GetString("Err_limit_neg_pct_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehlergrenze + [%].
+ ///
+ internal static string Err_limit_pos_pct_chdr {
+ get {
+ return ResourceManager.GetString("Err_limit_pos_pct_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler.
+ ///
+ internal static string Error {
+ get {
+ return ResourceManager.GetString("Error", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler beim Laden der Benutzer aus der Datenbank..
+ ///
+ internal static string Error_loading_users_from_the_database {
+ get {
+ return ResourceManager.GetString("Error_loading_users_from_the_database", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler [%].
+ ///
+ internal static string Error_pct {
+ get {
+ return ResourceManager.GetString("Error_pct", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler Speicherparameter von {0}.
+ ///
+ internal static string Error_saving_parameters_of_0 {
+ get {
+ return ResourceManager.GetString("Error_saving_parameters_of_0", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler beim Erzeugen der Datenbank..
+ ///
+ internal static string Error_while_creating_DB_Reason {
+ get {
+ return ResourceManager.GetString("Error_while_creating_DB_Reason", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler beim Schreiben in Datei:.
+ ///
+ internal static string Error_writing_into_file_ {
+ get {
+ return ResourceManager.GetString("Error_writing_into_file_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dauer [s]:.
+ ///
+ internal static string Estimated_time_s_ {
+ get {
+ return ResourceManager.GetString("Estimated_time_s_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bewerten.
+ ///
+ internal static string Evaluate {
+ get {
+ return ResourceManager.GetString("Evaluate", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Berrechnetes Volumen.
+ ///
+ internal static string Evaluate_volume {
+ get {
+ return ResourceManager.GetString("Evaluate_volume", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verdunstung.
+ ///
+ internal static string Evaporation {
+ get {
+ return ResourceManager.GetString("Evaporation", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Veranstaltungen.
+ ///
+ internal static string Event_logs {
+ get {
+ return ResourceManager.GetString("Event_logs", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ereignisauslöser.
+ ///
+ internal static string Event_triggers {
+ get {
+ return ResourceManager.GetString("Event_triggers", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Beenden.
+ ///
+ internal static string Exit {
+ get {
+ return ResourceManager.GetString("Exit", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Exportieren.
+ ///
+ internal static string Export {
+ get {
+ return ResourceManager.GetString("Export", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to NiO.
+ ///
+ internal static string Failed {
+ get {
+ return ResourceManager.GetString("Failed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to {0}' Eingabe fehlerhaft ({1}) .
+ ///
+ internal static string failed_0_1_exclamation {
+ get {
+ return ResourceManager.GetString("failed_0_1_exclamation", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler beim Erzeugen der Beispiel-Datenbank..
+ ///
+ internal static string Failed_to_create_a_sample_database {
+ get {
+ return ResourceManager.GetString("Failed_to_create_a_sample_database", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler beim Exportieren der Datenbank..
+ ///
+ internal static string Failed_to_export_the_database {
+ get {
+ return ResourceManager.GetString("Failed_to_export_the_database", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler beim initialisieren von Teil '{0}':{1}{2}.
+ ///
+ internal static string Failed_to_initialize_component_0_1_2 {
+ get {
+ return ResourceManager.GetString("Failed_to_initialize_component_0_1_2", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehler beim initialisieren von Gerät '{0}':{1}{2}.
+ ///
+ internal static string Failed_to_initialize_device_0_1_2 {
+ get {
+ return ResourceManager.GetString("Failed_to_initialize_device_0_1_2", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Schnell.
+ ///
+ internal static string fast {
+ get {
+ return ResourceManager.GetString("fast", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzulauf.
+ ///
+ internal static string Feeding_chdr {
+ get {
+ return ResourceManager.GetString("Feeding_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzulauf.
+ ///
+ internal static string FeedingTabPageTitle {
+ get {
+ return ResourceManager.GetString("FeedingTabPageTitle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Befüllen.
+ ///
+ internal static string Fill {
+ get {
+ return ResourceManager.GetString("Fill", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Befüllen mit Wasser ?.
+ ///
+ internal static string Fill_with_water {
+ get {
+ return ResourceManager.GetString("Fill_with_water", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Filter.
+ ///
+ internal static string Filter {
+ get {
+ return ResourceManager.GetString("Filter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Beenden Sie die Messungen bitte.
+ ///
+ internal static string Finish_the_session_please {
+ get {
+ return ResourceManager.GetString("Finish_the_session_please", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Beenden.
+ ///
+ internal static string FinishBtnText {
+ get {
+ return ResourceManager.GetString("FinishBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Reparatur.
+ ///
+ internal static string Fix {
+ get {
+ return ResourceManager.GetString("Fix", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Durchfluss.
+ ///
+ internal static string Flow {
+ get {
+ return ResourceManager.GetString("Flow", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Durchfluss nicht erreicht.
+ ///
+ internal static string Flow_adjustment_failed {
+ get {
+ return ResourceManager.GetString("Flow_adjustment_failed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to MID-Temperatur ausserhalb der Prüfbedingungen!.
+ ///
+ internal static string Flow_meter_temperature_range_does_not_fit_this_test_conditions {
+ get {
+ return ResourceManager.GetString("Flow_meter_temperature_range_does_not_fit_this_test_conditions", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Durchflussprofil Empfindlichkeit Klasse.
+ ///
+ internal static string Flow_profile_sensitivity_class {
+ get {
+ return ResourceManager.GetString("Flow_profile_sensitivity_class", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellung Durchfluss.
+ ///
+ internal static string Flow_selection {
+ get {
+ return ResourceManager.GetString("Flow_selection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Durchflussmesser.
+ ///
+ internal static string Flowmeter {
+ get {
+ return ResourceManager.GetString("Flowmeter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fußzeile.
+ ///
+ internal static string Footer {
+ get {
+ return ResourceManager.GetString("Footer", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to von.
+ ///
+ internal static string from {
+ get {
+ return ResourceManager.GetString("from", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vollständiger Name.
+ ///
+ internal static string Full_name {
+ get {
+ return ResourceManager.GetString("Full_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Allgemein.
+ ///
+ internal static string General {
+ get {
+ return ResourceManager.GetString("General", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ermittle das Gewicht des Wassers im Behälter.
+ ///
+ internal static string Get_mass_of_water_in_the_tank {
+ get {
+ return ResourceManager.GetString("Get_mass_of_water_in_the_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Greifen.
+ ///
+ internal static string Grab {
+ get {
+ return ResourceManager.GetString("Grab", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bilder markieren.
+ ///
+ internal static string Grabbing_images {
+ get {
+ return ResourceManager.GetString("Grabbing_images", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Grafik.
+ ///
+ internal static string Graphs {
+ get {
+ return ResourceManager.GetString("Graphs", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Gruppen.
+ ///
+ internal static string Groups {
+ get {
+ return ResourceManager.GetString("Groups", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Laborleiter.
+ ///
+ internal static string Head_of_Lab {
+ get {
+ return ResourceManager.GetString("Head_of_Lab", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kopfzeile.
+ ///
+ internal static string Header {
+ get {
+ return ResourceManager.GetString("Header", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wärmezähler.
+ ///
+ internal static string Heat_meter {
+ get {
+ return ResourceManager.GetString("Heat_meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wärmezähler Optionen.
+ ///
+ internal static string Heat_meter_options {
+ get {
+ return ResourceManager.GetString("Heat_meter_options", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wärmezählersensoren.
+ ///
+ internal static string Heat_meter_sensors {
+ get {
+ return ResourceManager.GetString("Heat_meter_sensors", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wärmezähler.
+ ///
+ internal static string HeatMetersTabPageTitle {
+ get {
+ return ResourceManager.GetString("HeatMetersTabPageTitle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hilfe.
+ ///
+ internal static string Help {
+ get {
+ return ResourceManager.GetString("Help", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Änderungen, Historie.
+ ///
+ internal static string History_of_changes {
+ get {
+ return ResourceManager.GetString("History_of_changes", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Horizontal.
+ ///
+ internal static string Horizontally {
+ get {
+ return ResourceManager.GetString("Horizontally", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to ID Nummer.
+ ///
+ internal static string ID {
+ get {
+ return ResourceManager.GetString("ID", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ignorieren.
+ ///
+ internal static string Ignore {
+ get {
+ return ResourceManager.GetString("Ignore", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ignorieren.
+ ///
+ internal static string IgnoreBtnText {
+ get {
+ return ResourceManager.GetString("IgnoreBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Importieren.
+ ///
+ internal static string Import {
+ get {
+ return ResourceManager.GetString("Import", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Information.
+ ///
+ internal static string Information {
+ get {
+ return ResourceManager.GetString("Information", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Invalid {0}.
+ ///
+ internal static string Invalid_0 {
+ get {
+ return ResourceManager.GetString("Invalid_0", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehlerhafte Losnr..
+ ///
+ internal static string Invalid_batch_number {
+ get {
+ return ResourceManager.GetString("Invalid_batch_number", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Auftrieb falsch. Bitte um Korrektur!.
+ ///
+ internal static string Invalid_buoyancy_parameter_Correct_pls {
+ get {
+ return ResourceManager.GetString("Invalid_buoyancy_parameter_Correct_pls", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ungültige Einstellung. Bitte um Korrektur!.
+ ///
+ internal static string Invalid_calib_info_Correct_pls {
+ get {
+ return ResourceManager.GetString("Invalid_calib_info_Correct_pls", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehlerhafte Dichte-Parameter.\r\n Bitte um Korrektur..
+ ///
+ internal static string Invalid_density_parameter_Correct_pls {
+ get {
+ return ResourceManager.GetString("Invalid_density_parameter_Correct_pls", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ungültiges Passwort.
+ ///
+ internal static string Invalid_password {
+ get {
+ return ResourceManager.GetString("Invalid_password", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fehlerhafte Q2 Korrekturfaktoren.
+ ///
+ internal static string Invalid_Q2_correction_factors {
+ get {
+ return ResourceManager.GetString("Invalid_Q2_correction_factors", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ungültiger Benutzername, Passwort oder Prüfstand.
+ ///
+ internal static string Invalid_user_password_or_bench {
+ get {
+ return ResourceManager.GetString("Invalid_user_password_or_bench", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ungültiger Benutzername oder Passwort .
+ ///
+ internal static string Invalid_username_or_password {
+ get {
+ return ResourceManager.GetString("Invalid_username_or_password", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to IST-27 Kalibrier Koeffizient.
+ ///
+ internal static string ITS27_calibration_coefficients {
+ get {
+ return ResourceManager.GetString("ITS27_calibration_coefficients", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to ITS-90 Kalibrier-Koeffizient.
+ ///
+ internal static string ITS90_calibration_coefficients {
+ get {
+ return ResourceManager.GetString("ITS90_calibration_coefficients", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to ITS-90 Test.
+ ///
+ internal static string ITS90_test {
+ get {
+ return ResourceManager.GetString("ITS90_test", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Länge.
+ ///
+ internal static string L {
+ get {
+ return ResourceManager.GetString("L", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Sprache.
+ ///
+ internal static string Language {
+ get {
+ return ResourceManager.GetString("Language", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Letzte Änderung von.
+ ///
+ internal static string Last_changed_by {
+ get {
+ return ResourceManager.GetString("Last_changed_by", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Letzter Zyklus, bitte warten.
+ ///
+ internal static string Last_cycle_wait_please {
+ get {
+ return ResourceManager.GetString("Last_cycle_wait_please", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Links.
+ ///
+ internal static string Left {
+ get {
+ return ResourceManager.GetString("Left", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstellenleiter.
+ ///
+ internal static string Legalizator {
+ get {
+ return ResourceManager.GetString("Legalizator", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Weniger.
+ ///
+ internal static string LessBtnText {
+ get {
+ return ResourceManager.GetString("LessBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserstand.
+ ///
+ internal static string Level {
+ get {
+ return ResourceManager.GetString("Level", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Live.
+ ///
+ internal static string Live {
+ get {
+ return ResourceManager.GetString("Live", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Laden des Prüfvorgangs.
+ ///
+ internal static string Loading_the_procedure {
+ get {
+ return ResourceManager.GetString("Loading_the_procedure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abschließen.
+ ///
+ internal static string LockBtnText {
+ get {
+ return ResourceManager.GetString("LockBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Protokoll.
+ ///
+ internal static string Logging {
+ get {
+ return ResourceManager.GetString("Logging", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hauptzähler.
+ ///
+ internal static string Main {
+ get {
+ return ResourceManager.GetString("Main", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hauptzähler.
+ ///
+ internal static string Main_ {
+ get {
+ return ResourceManager.GetString("Main_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Haupt-Messabweichung.
+ ///
+ internal static string Main_uncertainty {
+ get {
+ return ResourceManager.GetString("Main_uncertainty", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hauptzähler.
+ ///
+ internal static string Main_Water_Meter {
+ get {
+ return ResourceManager.GetString("Main_Water_Meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hauptzählerstand.
+ ///
+ internal static string Main_Water_Meter_State {
+ get {
+ return ResourceManager.GetString("Main_Water_Meter_State", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hauptzähler Seriennummer.
+ ///
+ internal static string Main_WM_SerialNr {
+ get {
+ return ResourceManager.GetString("Main_WM_SerialNr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wartungstechniker.
+ ///
+ internal static string Maintenance_Specialist {
+ get {
+ return ResourceManager.GetString("Maintenance_Specialist", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Behälter entleeren.
+ ///
+ internal static string Make_tank_empty {
+ get {
+ return ResourceManager.GetString("Make_tank_empty", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Manuelle Steuerung deaktiviert.
+ ///
+ internal static string Manual_control_disabled {
+ get {
+ return ResourceManager.GetString("Manual_control_disabled", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Manuelle Wasserstandsmessung!.
+ ///
+ internal static string Manual_level_measurement {
+ get {
+ return ResourceManager.GetString("Manual_level_measurement", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Masse.
+ ///
+ internal static string Mass {
+ get {
+ return ResourceManager.GetString("Mass", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Masse dif. [kg]:.
+ ///
+ internal static string Mass_diff_kg_ {
+ get {
+ return ResourceManager.GetString("Mass_diff_kg_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Refferenzmasse Messung timeout.
+ ///
+ internal static string Mass_measurement_timeout {
+ get {
+ return ResourceManager.GetString("Mass_measurement_timeout", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Massemessmethode.
+ ///
+ internal static string Mass_method {
+ get {
+ return ResourceManager.GetString("Mass_method", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Masse wiederholungen.
+ ///
+ internal static string Mass_repeats {
+ get {
+ return ResourceManager.GetString("Mass_repeats", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Massespanne [kg].
+ ///
+ internal static string Mass_spread_kg {
+ get {
+ return ResourceManager.GetString("Mass_spread_kg", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Max. Massezunahme [Kg].
+ ///
+ internal static string Max_mass_increase_kg {
+ get {
+ return ResourceManager.GetString("Max_mass_increase_kg", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Max. Druckabfall [bar].
+ ///
+ internal static string Max_pressure_drop_bar {
+ get {
+ return ResourceManager.GetString("Max_pressure_drop_bar", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to (max._X_ alphanumerische Zeichen).
+ ///
+ internal static string MaxChars {
+ get {
+ return ResourceManager.GetString("MaxChars", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Max. erlaubter Druck!.
+ ///
+ internal static string Maximum_admissible_pressure {
+ get {
+ return ResourceManager.GetString("Maximum_admissible_pressure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiegen.
+ ///
+ internal static string Measure_the_mass {
+ get {
+ return ResourceManager.GetString("Measure_the_mass", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Gemessen.
+ ///
+ internal static string Measured {
+ get {
+ return ResourceManager.GetString("Measured", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Messen der Refferenzmasse.
+ ///
+ internal static string Measuring_the_reference_mass {
+ get {
+ return ResourceManager.GetString("Measuring_the_reference_mass", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiegen.
+ ///
+ internal static string Measuring_the_weight {
+ get {
+ return ResourceManager.GetString("Measuring_the_weight", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Meldung.
+ ///
+ internal static string Message {
+ get {
+ return ResourceManager.GetString("Message", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzähler.
+ ///
+ internal static string Meter {
+ get {
+ return ResourceManager.GetString("Meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Meter Kommunikation läuft.
+ ///
+ internal static string Meter_Communication_in_progress {
+ get {
+ return ResourceManager.GetString("Meter_Communication_in_progress", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzähler geprüft.
+ ///
+ internal static string Meter_types_tested {
+ get {
+ return ResourceManager.GetString("Meter_types_tested", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Messsensoren.
+ ///
+ internal static string MetersTabPageTitle {
+ get {
+ return ResourceManager.GetString("MetersTabPageTitle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Methode {0} kann nicht benutzt werden!.
+ ///
+ internal static string Method_0_cannot_be_used {
+ get {
+ return ResourceManager.GetString("Method_0_cannot_be_used", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfverfahren.
+ ///
+ internal static string Method_chdr {
+ get {
+ return ResourceManager.GetString("Method_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Auswahl Prüfart.
+ ///
+ internal static string Method_selection {
+ get {
+ return ResourceManager.GetString("Method_selection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Metr. Klasse.
+ ///
+ internal static string Metrological_class {
+ get {
+ return ResourceManager.GetString("Metrological_class", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Messtechniker.
+ ///
+ internal static string Metrologist {
+ get {
+ return ResourceManager.GetString("Metrologist", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Metr.Daten.
+ ///
+ internal static string Metrology {
+ get {
+ return ResourceManager.GetString("Metrology", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Min. Höhe.
+ ///
+ internal static string Min_height {
+ get {
+ return ResourceManager.GetString("Min_height", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Min. Breite.
+ ///
+ internal static string Min_width {
+ get {
+ return ResourceManager.GetString("Min_width", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Drucksensor fehlt!.
+ ///
+ internal static string Missing_a_pressure_meter {
+ get {
+ return ResourceManager.GetString("Missing_a_pressure_meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Maßstab fehlt.
+ ///
+ internal static string Missing_a_scale {
+ get {
+ return ResourceManager.GetString("Missing_a_scale", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfbehälter nicht gefunden!.
+ ///
+ internal static string Missing_a_tank_with_volume_measurement {
+ get {
+ return ResourceManager.GetString("Missing_a_tank_with_volume_measurement", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ventil fehlt um Vergleichsmessung durchzuführen!.
+ ///
+ internal static string Missing_a_valve_for_comparative_method {
+ get {
+ return ResourceManager.GetString("Missing_a_valve_for_comparative_method", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Modus.
+ ///
+ internal static string Mode {
+ get {
+ return ResourceManager.GetString("Mode", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Mehr.
+ ///
+ internal static string More {
+ get {
+ return ResourceManager.GetString("More", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Mehr.
+ ///
+ internal static string MoreBtnText {
+ get {
+ return ResourceManager.GetString("MoreBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Montage.
+ ///
+ internal static string Mounting {
+ get {
+ return ResourceManager.GetString("Mounting", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Stummschaltung des Alarms.
+ ///
+ internal static string Mute_alarm {
+ get {
+ return ResourceManager.GetString("Mute_alarm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Name.
+ ///
+ internal static string Name {
+ get {
+ return ResourceManager.GetString("Name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Keine Nr..
+ ///
+ internal static string NaN {
+ get {
+ return ResourceManager.GetString("NaN", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to P Prüfstrecke .
+ ///
+ internal static string New_bench_path_name {
+ get {
+ return ResourceManager.GetString("New_bench_path_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to P Wasserzulauf.
+ ///
+ internal static string New_feeding_path_name {
+ get {
+ return ResourceManager.GetString("New_feeding_path_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to P heiß.
+ ///
+ internal static string New_heat_meters_path_name {
+ get {
+ return ResourceManager.GetString("New_heat_meters_path_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to - Kopie.
+ ///
+ internal static string New_name_copy {
+ get {
+ return ResourceManager.GetString("New_name_copy", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to P Durchfluss.
+ ///
+ internal static string New_output_path_name {
+ get {
+ return ResourceManager.GetString("New_output_path_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvorgang.
+ ///
+ internal static string New_procedure_name {
+ get {
+ return ResourceManager.GetString("New_procedure_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Profil.
+ ///
+ internal static string New_profile_name {
+ get {
+ return ResourceManager.GetString("New_profile_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Neues Durchflussvolumen.
+ ///
+ internal static string New_Q_names {
+ get {
+ return ResourceManager.GetString("New_Q_names", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to P Sensor.
+ ///
+ internal static string New_sensors_path_name {
+ get {
+ return ResourceManager.GetString("New_sensors_path_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfung .
+ ///
+ internal static string New_test_name {
+ get {
+ return ResourceManager.GetString("New_test_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Neue Bezeichnung.
+ ///
+ internal static string New_transition_name {
+ get {
+ return ResourceManager.GetString("New_transition_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Neue Tabelle.
+ ///
+ internal static string NewTabBtnText {
+ get {
+ return ResourceManager.GetString("NewTabBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nächste.
+ ///
+ internal static string Next {
+ get {
+ return ResourceManager.GetString("Next", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nächstes Prüfvolumen.
+ ///
+ internal static string Next_test_volume {
+ get {
+ return ResourceManager.GetString("Next_test_volume", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Weiter >.
+ ///
+ internal static string NextBtnText {
+ get {
+ return ResourceManager.GetString("NextBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nein.
+ ///
+ internal static string no {
+ get {
+ return ResourceManager.GetString("no", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Keine Info vorhanden!.
+ ///
+ internal static string No_info_available {
+ get {
+ return ResourceManager.GetString("No_info_available", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Keine Ergebnisse zu drucken!.
+ ///
+ internal static string No_results_to_print {
+ get {
+ return ResourceManager.GetString("No_results_to_print", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzähler fehlt!.
+ ///
+ internal static string No_water_meter {
+ get {
+ return ResourceManager.GetString("No_water_meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Es ist kein Prüfstand in der Programmkonfiguration definiert..
+ ///
+ internal static string NoBenchMsg {
+ get {
+ return ResourceManager.GetString("NoBenchMsg", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nein.
+ ///
+ internal static string NoBtn {
+ get {
+ return ResourceManager.GetString("NoBtn", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datenbankverbindung konnte nicht hergestellt werden..
+ ///
+ internal static string NoDatabaseMsg {
+ get {
+ return ResourceManager.GetString("NoDatabaseMsg", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bemerkung.
+ ///
+ internal static string Notes {
+ get {
+ return ResourceManager.GetString("Notes", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to <Keine Konfiguration notwendig>.
+ ///
+ internal static string nothing_to_configure {
+ get {
+ return ResourceManager.GetString("nothing_to_configure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benachrichtigung.
+ ///
+ internal static string Notification {
+ get {
+ return ResourceManager.GetString("Notification", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nr..
+ ///
+ internal static string Nr {
+ get {
+ return ResourceManager.GetString("Nr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Anzahl Zähler in der Gruppe.
+ ///
+ internal static string Nr_meters_in_a_group {
+ get {
+ return ResourceManager.GetString("Nr_meters_in_a_group", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to OK.
+ ///
+ internal static string OkBtnText {
+ get {
+ return ResourceManager.GetString("OkBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to offen.
+ ///
+ internal static string open {
+ get {
+ return ResourceManager.GetString("open", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abtastkopf wurde deaktiviert vom Benutzer!.
+ ///
+ internal static string Opto_head_was_disabled_by_the_user {
+ get {
+ return ResourceManager.GetString("Opto_head_was_disabled_by_the_user", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Andere.
+ ///
+ internal static string Other {
+ get {
+ return ResourceManager.GetString("Other", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Regelstrecke.
+ ///
+ internal static string Output_chdr {
+ get {
+ return ResourceManager.GetString("Output_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ausgabe.
+ ///
+ internal static string OutputTabPageTitle {
+ get {
+ return ResourceManager.GetString("OutputTabPageTitle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druckdifferenz.
+ ///
+ internal static string P_delta {
+ get {
+ return ResourceManager.GetString("P_delta", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck ein .
+ ///
+ internal static string P_in {
+ get {
+ return ResourceManager.GetString("P_in", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck Eingang Ende.
+ ///
+ internal static string P_in_end {
+ get {
+ return ResourceManager.GetString("P_in_end", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck Eingang Start.
+ ///
+ internal static string P_in_start {
+ get {
+ return ResourceManager.GetString("P_in_start", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck aus.
+ ///
+ internal static string P_out {
+ get {
+ return ResourceManager.GetString("P_out", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck Ausgang Ende.
+ ///
+ internal static string P_out_end {
+ get {
+ return ResourceManager.GetString("P_out_end", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck Ausgang Start.
+ ///
+ internal static string P_out_start {
+ get {
+ return ResourceManager.GetString("P_out_start", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Seite.
+ ///
+ internal static string Page {
+ get {
+ return ResourceManager.GetString("Page", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Parameter.
+ ///
+ internal static string Parameter {
+ get {
+ return ResourceManager.GetString("Parameter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Parameter.
+ ///
+ internal static string Parameters {
+ get {
+ return ResourceManager.GetString("Parameters", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Übergeordnete Komponente.
+ ///
+ internal static string Parent {
+ get {
+ return ResourceManager.GetString("Parent", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Übergeordneter Name.
+ ///
+ internal static string Parent_name {
+ get {
+ return ResourceManager.GetString("Parent_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Teil.
+ ///
+ internal static string Part {
+ get {
+ return ResourceManager.GetString("Part", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to iO.
+ ///
+ internal static string Passed {
+ get {
+ return ResourceManager.GetString("Passed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Passwort.
+ ///
+ internal static string Password {
+ get {
+ return ResourceManager.GetString("Password", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Passwörter sind unterschiedlich! Bitte neu eingeben!.
+ ///
+ internal static string Passwords_different {
+ get {
+ return ResourceManager.GetString("Passwords_different", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pfade.
+ ///
+ internal static string Paths {
+ get {
+ return ResourceManager.GetString("Paths", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to PID-Regler.
+ ///
+ internal static string PID {
+ get {
+ return ResourceManager.GetString("PID", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstrecke.
+ ///
+ internal static string Pipeline {
+ get {
+ return ResourceManager.GetString("Pipeline", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bitte ändern Sie die folgenden Einstellungen:.
+ ///
+ internal static string Please_change_the_following_settings {
+ get {
+ return ResourceManager.GetString("Please_change_the_following_settings", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bitte wählen Sie anderen Übergangname für Sequenz.
+ ///
+ internal static string Please_choose_another_transition_sequence_name {
+ get {
+ return ResourceManager.GetString("Please_choose_another_transition_sequence_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ende.
+ ///
+ internal static string Please_select_a_cycle_a_test_or_empty {
+ get {
+ return ResourceManager.GetString("Please_select_a_cycle_a_test_or_empty", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wählen Sie eine Prüfvorlage.
+ ///
+ internal static string Please_select_a_procedure {
+ get {
+ return ResourceManager.GetString("Please_select_a_procedure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bitte wählen Sie eine Prüfung aus..
+ ///
+ internal static string Please_select_a_test {
+ get {
+ return ResourceManager.GetString("Please_select_a_test", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bitte wählen Sie einen Prüfstand aus..
+ ///
+ internal static string PLs_select_testbench {
+ get {
+ return ResourceManager.GetString("PLs_select_testbench", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bestellung.
+ ///
+ internal static string PO {
+ get {
+ return ResourceManager.GetString("PO", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Leistung [%].
+ ///
+ internal static string PowerPct {
+ get {
+ return ResourceManager.GetString("PowerPct", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck tief.
+ ///
+ internal static string Pr_down {
+ get {
+ return ResourceManager.GetString("Pr_down", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck hoch.
+ ///
+ internal static string Pr_up {
+ get {
+ return ResourceManager.GetString("Pr_up", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck Prüfstrecke max. [bar].
+ ///
+ internal static string Press_lim_hi_chdr {
+ get {
+ return ResourceManager.GetString("Press_lim_hi_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck Prüfstrecke min. [bar].
+ ///
+ internal static string Press_lim_lo_chdr {
+ get {
+ return ResourceManager.GetString("Press_lim_lo_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to OK Drücken um Prüfstand zu starten.
+ ///
+ internal static string Press_OK_to_start_the_bench {
+ get {
+ return ResourceManager.GetString("Press_OK_to_start_the_bench", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Drucken Sie OK, wenn Sie fertig sind..
+ ///
+ internal static string Press_OK_when_done {
+ get {
+ return ResourceManager.GetString("Press_OK_when_done", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck.
+ ///
+ internal static string Pressure {
+ get {
+ return ResourceManager.GetString("Pressure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck bis [bar].
+ ///
+ internal static string Pressure_hi_bar {
+ get {
+ return ResourceManager.GetString("Pressure_hi_bar", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck von [bar].
+ ///
+ internal static string Pressure_lo_bar {
+ get {
+ return ResourceManager.GetString("Pressure_lo_bar", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druckverlust Klasse.
+ ///
+ internal static string Pressure_loss_class {
+ get {
+ return ResourceManager.GetString("Pressure_loss_class", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Drucksensor.
+ ///
+ internal static string Pressure_meter {
+ get {
+ return ResourceManager.GetString("Pressure_meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellung Druck.
+ ///
+ internal static string Pressure_selection {
+ get {
+ return ResourceManager.GetString("Pressure_selection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vorherige.
+ ///
+ internal static string Previous {
+ get {
+ return ResourceManager.GetString("Previous", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vorherige Ergebnisse.
+ ///
+ internal static string Previous_results {
+ get {
+ return ResourceManager.GetString("Previous_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vorheriger Schritt fehlt oder nicht OK !.
+ ///
+ internal static string Previous_step_is_missing_or_NOK {
+ get {
+ return ResourceManager.GetString("Previous_step_is_missing_or_NOK", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck wiederholen.
+ ///
+ internal static string Print_again {
+ get {
+ return ResourceManager.GetString("Print_again", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nur gute Ergebnisse Drucken.
+ ///
+ internal static string Print_only_good_results {
+ get {
+ return ResourceManager.GetString("Print_only_good_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nur die letzte Messung Drucken.
+ ///
+ internal static string Print_only_the_last_measurement {
+ get {
+ return ResourceManager.GetString("Print_only_the_last_measurement", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to WZ-Ergebnisse Drucken.
+ ///
+ internal static string Print_watermeter_results {
+ get {
+ return ResourceManager.GetString("Print_watermeter_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Drucken.
+ ///
+ internal static string PrintBtnText {
+ get {
+ return ResourceManager.GetString("PrintBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Gedruckt.
+ ///
+ internal static string Printed {
+ get {
+ return ResourceManager.GetString("Printed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Drucker.
+ ///
+ internal static string Printer {
+ get {
+ return ResourceManager.GetString("Printer", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Drucker.
+ ///
+ internal static string PrinterBtnText {
+ get {
+ return ResourceManager.GetString("PrinterBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Druck.
+ ///
+ internal static string Printing {
+ get {
+ return ResourceManager.GetString("Printing", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvorlage.
+ ///
+ internal static string Procedure {
+ get {
+ return ResourceManager.GetString("Procedure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvorlage {0} hinzugefügt..
+ ///
+ internal static string Procedure_0_added {
+ get {
+ return ResourceManager.GetString("Procedure_0_added", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvorlage {0} geändert..
+ ///
+ internal static string Procedure_0_modified {
+ get {
+ return ResourceManager.GetString("Procedure_0_modified", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvorlage Name.
+ ///
+ internal static string Procedure_name {
+ get {
+ return ResourceManager.GetString("Procedure_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvorlagen.
+ ///
+ internal static string Procedures {
+ get {
+ return ResourceManager.GetString("Procedures", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prozess.
+ ///
+ internal static string Process {
+ get {
+ return ResourceManager.GetString("Process", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Hersteller.
+ ///
+ internal static string Producer {
+ get {
+ return ResourceManager.GetString("Producer", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Produktname.
+ ///
+ internal static string Product_name {
+ get {
+ return ResourceManager.GetString("Product_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Profile.
+ ///
+ internal static string Profile {
+ get {
+ return ResourceManager.GetString("Profile", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Profil {0} hinzugefügt.
+ ///
+ internal static string Profile_0_added {
+ get {
+ return ResourceManager.GetString("Profile_0_added", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Profil {0} geändert..
+ ///
+ internal static string Profile_0_modified {
+ get {
+ return ResourceManager.GetString("Profile_0_modified", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Programm muss beendet werden!.
+ ///
+ internal static string Program_must_be_closed {
+ get {
+ return ResourceManager.GetString("Program_must_be_closed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Neustart erforderlich.
+ ///
+ internal static string Program_restart_is_required_to_apply_some_settings {
+ get {
+ return ResourceManager.GetString("Program_restart_is_required_to_apply_some_settings", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Programmversion passt nicht..
+ ///
+ internal static string Program_version_does_not_match {
+ get {
+ return ResourceManager.GetString("Program_version_does_not_match", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verlauf.
+ ///
+ internal static string Progress {
+ get {
+ return ResourceManager.GetString("Progress", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Projektnummer.
+ ///
+ internal static string Project_number {
+ get {
+ return ResourceManager.GetString("Project_number", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prompt.
+ ///
+ internal static string Prompt {
+ get {
+ return ResourceManager.GetString("Prompt", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Eigenschaften.
+ ///
+ internal static string Properties {
+ get {
+ return ResourceManager.GetString("Properties", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Geschützter Prüfprozess.
+ ///
+ internal static string Protected_procedure {
+ get {
+ return ResourceManager.GetString("Protected_procedure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Protokoll.
+ ///
+ internal static string Protocol {
+ get {
+ return ResourceManager.GetString("Protocol", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Protokollname.
+ ///
+ internal static string Protocol_title {
+ get {
+ return ResourceManager.GetString("Protocol_title", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Veröffentlichen.
+ ///
+ internal static string Publish {
+ get {
+ return ResourceManager.GetString("Publish", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Impulse.
+ ///
+ internal static string Pulses {
+ get {
+ return ResourceManager.GetString("Pulses", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Impulse gezählt!.
+ ///
+ internal static string Pulses_count {
+ get {
+ return ResourceManager.GetString("Pulses_count", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Impulse OK.
+ ///
+ internal static string Pulses_count_is_OK {
+ get {
+ return ResourceManager.GetString("Pulses_count_is_OK", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to .
+ ///
+ internal static string PulsesPerKilogram {
+ get {
+ return ResourceManager.GetString("PulsesPerKilogram", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Impuls per kWh.
+ ///
+ internal static string PulsesPerKWh {
+ get {
+ return ResourceManager.GetString("PulsesPerKWh", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Impulse pro Liter.
+ ///
+ internal static string PulsesPerLtr {
+ get {
+ return ResourceManager.GetString("PulsesPerLtr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to .
+ ///
+ internal static string PulsesPerUnit {
+ get {
+ return ResourceManager.GetString("PulsesPerUnit", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pumpe.
+ ///
+ internal static string Pump {
+ get {
+ return ResourceManager.GetString("Pump", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pumpe läuft.
+ ///
+ internal static string Pump_is_running {
+ get {
+ return ResourceManager.GetString("Pump_is_running", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pumpe Leistung [%].
+ ///
+ internal static string Pump_power_pct {
+ get {
+ return ResourceManager.GetString("Pump_power_pct", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bestellung.
+ ///
+ internal static string Purchase_order {
+ get {
+ return ResourceManager.GetString("Purchase_order", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bestellung darf max. {0} Ziffern haben!.
+ ///
+ internal static string Purchase_order_may_have_max_N_characters {
+ get {
+ return ResourceManager.GetString("Purchase_order_may_have_max_N_characters", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Befüllen.
+ ///
+ internal static string Purge_Begin {
+ get {
+ return ResourceManager.GetString("Purge_Begin", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand befüllen?.
+ ///
+ internal static string Purge_bench_qm {
+ get {
+ return ResourceManager.GetString("Purge_bench_qm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Entwässern.
+ ///
+ internal static string Purge_End {
+ get {
+ return ResourceManager.GetString("Purge_End", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Spülen.
+ ///
+ internal static string Purging {
+ get {
+ return ResourceManager.GetString("Purging", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Spülen ({0}: Schritt {1}/{2}).
+ ///
+ internal static string Purging_i_n {
+ get {
+ return ResourceManager.GetString("Purging_i_n", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Q von.
+ ///
+ internal static string Q_from {
+ get {
+ return ResourceManager.GetString("Q_from", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Q von [l/h].
+ ///
+ internal static string Q_from_lph {
+ get {
+ return ResourceManager.GetString("Q_from_lph", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Q-Set Methode.
+ ///
+ internal static string Q_set_method_chdr {
+ get {
+ return ResourceManager.GetString("Q_set_method_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Q Ziel.
+ ///
+ internal static string Q_tg {
+ get {
+ return ResourceManager.GetString("Q_tg", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Q bis.
+ ///
+ internal static string Q_to {
+ get {
+ return ResourceManager.GetString("Q_to", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Q bis [l/h].
+ ///
+ internal static string Q_to_lph {
+ get {
+ return ResourceManager.GetString("Q_to_lph", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Qfall.
+ ///
+ internal static string Qfall {
+ get {
+ return ResourceManager.GetString("Qfall", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Qmax [m3/h].
+ ///
+ internal static string Qmax {
+ get {
+ return ResourceManager.GetString("Qmax", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Qmin [m3/h].
+ ///
+ internal static string Qmin {
+ get {
+ return ResourceManager.GetString("Qmin", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Qn [m3/h].
+ ///
+ internal static string Qn {
+ get {
+ return ResourceManager.GetString("Qn", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Qsteig.
+ ///
+ internal static string Qrise {
+ get {
+ return ResourceManager.GetString("Qrise", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Qt [m3/h].
+ ///
+ internal static string Qt {
+ get {
+ return ResourceManager.GetString("Qt", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Frage.
+ ///
+ internal static string Question {
+ get {
+ return ResourceManager.GetString("Question", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Durchflussänderung [%].
+ ///
+ internal static string RateOfChangePct {
+ get {
+ return ResourceManager.GetString("RateOfChangePct", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fertig.
+ ///
+ internal static string Ready {
+ get {
+ return ResourceManager.GetString("Ready", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Reduktionsart.
+ ///
+ internal static string Red_type_chdr {
+ get {
+ return ResourceManager.GetString("Red_type_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Referenzfehler [%]:.
+ ///
+ internal static string Ref_error_pct_ {
+ get {
+ return ResourceManager.GetString("Ref_error_pct_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ref.durchfluss [m3/h]:.
+ ///
+ internal static string Ref_flow_m3h_ {
+ get {
+ return ResourceManager.GetString("Ref_flow_m3h_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ref.Frequenz [Hz]:.
+ ///
+ internal static string Ref_freq_Hz_ {
+ get {
+ return ResourceManager.GetString("Ref_freq_Hz_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Referenzmassendichte [kg/m3].
+ ///
+ internal static string Ref_mass_dens_kg_m3 {
+ get {
+ return ResourceManager.GetString("Ref_mass_dens_kg_m3", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ref.Impulse.
+ ///
+ internal static string Ref_pulses {
+ get {
+ return ResourceManager.GetString("Ref_pulses", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ref. Impulse gezählt!.
+ ///
+ internal static string Ref_pulses_count {
+ get {
+ return ResourceManager.GetString("Ref_pulses_count", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ref.Volumen [l]:.
+ ///
+ internal static string Ref_volume_l_ {
+ get {
+ return ResourceManager.GetString("Ref_volume_l_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to IDM.
+ ///
+ internal static string Reference {
+ get {
+ return ResourceManager.GetString("Reference", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Refferenzmasse Fehlmessung.
+ ///
+ internal static string Reference_mass_measurement_error {
+ get {
+ return ResourceManager.GetString("Reference_mass_measurement_error", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Aktualisierung.
+ ///
+ internal static string Refresh {
+ get {
+ return ResourceManager.GetString("Refresh", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Reg.Ventil.
+ ///
+ internal static string Reg_valve {
+ get {
+ return ResourceManager.GetString("Reg_valve", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Reg.Ventilpositionen.
+ ///
+ internal static string Reg_valve_pos {
+ get {
+ return ResourceManager.GetString("Reg_valve_pos", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Relativer Q von.
+ ///
+ internal static string RelativeQfrom {
+ get {
+ return ResourceManager.GetString("RelativeQfrom", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Relativer Q bis.
+ ///
+ internal static string RelativeQto {
+ get {
+ return ResourceManager.GetString("RelativeQto", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vorherige Ergebnisse Herunterladen.
+ ///
+ internal static string Reload_previous_results {
+ get {
+ return ResourceManager.GetString("Reload_previous_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zeit.
+ ///
+ internal static string remaining_time {
+ get {
+ return ResourceManager.GetString("remaining_time", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bemerkung.
+ ///
+ internal static string Remark {
+ get {
+ return ResourceManager.GetString("Remark", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Remote Datenbank kann nicht Exportiert werden!.
+ ///
+ internal static string Remote_database_cannot_be_exported {
+ get {
+ return ResourceManager.GetString("Remote_database_cannot_be_exported", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Remote Datenbank kann nicht Importiert werden!.
+ ///
+ internal static string Remote_database_cannot_be_imported {
+ get {
+ return ResourceManager.GetString("Remote_database_cannot_be_imported", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Fernzugriff auf Datenbank is nicht kompatibel..
+ ///
+ internal static string Remote_db_is_not_compatible {
+ get {
+ return ResourceManager.GetString("Remote_db_is_not_compatible", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Entfernen.
+ ///
+ internal static string Remove {
+ get {
+ return ResourceManager.GetString("Remove", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Alles entfernen.
+ ///
+ internal static string Remove_all {
+ get {
+ return ResourceManager.GetString("Remove_all", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Löschen.
+ ///
+ internal static string RemoveBtnText {
+ get {
+ return ResourceManager.GetString("RemoveBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Tabelle entfernen.
+ ///
+ internal static string RemoveTabBtnText {
+ get {
+ return ResourceManager.GetString("RemoveTabBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Tabelle umbenennen.
+ ///
+ internal static string RenameTabBtnText {
+ get {
+ return ResourceManager.GetString("RenameTabBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Passwort wiederholen.
+ ///
+ internal static string Repeat_password {
+ get {
+ return ResourceManager.GetString("Repeat_password", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiederh. Nr..
+ ///
+ internal static string Repeats_nr_chdr {
+ get {
+ return ResourceManager.GetString("Repeats_nr_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiederholung.
+ ///
+ internal static string Repetition {
+ get {
+ return ResourceManager.GetString("Repetition", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Solltemperatur [°C].
+ ///
+ internal static string Required_temperature_C {
+ get {
+ return ResourceManager.GetString("Required_temperature_C", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Waage resetten!.
+ ///
+ internal static string Resetting_scales {
+ get {
+ return ResourceManager.GetString("Resetting_scales", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Widerstand.
+ ///
+ internal static string Resistance {
+ get {
+ return ResourceManager.GetString("Resistance", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Auflösung.
+ ///
+ internal static string Resolution {
+ get {
+ return ResourceManager.GetString("Resolution", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bitte starten Sie die Anwendung erneut um die Änderungen zu übernehmen..
+ ///
+ internal static string Restart_To_Apply_Changes {
+ get {
+ return ResourceManager.GetString("Restart_To_Apply_Changes", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiederherstellen.
+ ///
+ internal static string Restore {
+ get {
+ return ResourceManager.GetString("Restore", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Modus wiederherstellen.
+ ///
+ internal static string Restore_session {
+ get {
+ return ResourceManager.GetString("Restore_session", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnis.
+ ///
+ internal static string Result {
+ get {
+ return ResourceManager.GetString("Result", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse.
+ ///
+ internal static string Results {
+ get {
+ return ResourceManager.GetString("Results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse von Zählerlos {0}.
+ ///
+ internal static string Results_of_batch_0 {
+ get {
+ return ResourceManager.GetString("Results_of_batch_0", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiederholen.
+ ///
+ internal static string Retry {
+ get {
+ return ResourceManager.GetString("Retry", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiederholen.
+ ///
+ internal static string RetryBtnText {
+ get {
+ return ResourceManager.GetString("RetryBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Datenbankverbindung wiederherstellen.
+ ///
+ internal static string RetryDatabaseText {
+ get {
+ return ResourceManager.GetString("RetryDatabaseText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Revision??.
+ ///
+ internal static string Revision {
+ get {
+ return ResourceManager.GetString("Revision", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to RFID Kommunikation fehlgeschlagen!.
+ ///
+ internal static string RFID_communication_failed {
+ get {
+ return ResourceManager.GetString("RFID_communication_failed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Rechts.
+ ///
+ internal static string Right {
+ get {
+ return ResourceManager.GetString("Right", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to ROI Daten.
+ ///
+ internal static string ROI_Data {
+ get {
+ return ResourceManager.GetString("ROI_Data", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to ROI-Erkennung läuft.
+ ///
+ internal static string ROI_Detection_in_Progress {
+ get {
+ return ResourceManager.GetString("ROI_Detection_in_Progress", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Speichern.
+ ///
+ internal static string Save {
+ get {
+ return ResourceManager.GetString("Save", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wieder speichern.
+ ///
+ internal static string Save_again {
+ get {
+ return ResourceManager.GetString("Save_again", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Speichern.
+ ///
+ internal static string Save_column_widths {
+ get {
+ return ResourceManager.GetString("Save_column_widths", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Speichern aller Ergebniss..
+ ///
+ internal static string Saving_all_results {
+ get {
+ return ResourceManager.GetString("Saving_all_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Speichern und Drucken Ergebnisse.
+ ///
+ internal static string Saving_and_printing_results {
+ get {
+ return ResourceManager.GetString("Saving_and_printing_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Speichern Konfiguration..
+ ///
+ internal static string Saving_configuration {
+ get {
+ return ResourceManager.GetString("Saving_configuration", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Speichern Konfiguration fehlheschlagen..
+ ///
+ internal static string Saving_configuration_failed {
+ get {
+ return ResourceManager.GetString("Saving_configuration_failed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse speichern!.
+ ///
+ internal static string Saving_results {
+ get {
+ return ResourceManager.GetString("Saving_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Speichern Ergebnisse fehlgeschlagen..
+ ///
+ internal static string Saving_results_failed {
+ get {
+ return ResourceManager.GetString("Saving_results_failed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Waage Kommunikationsfehler!.
+ ///
+ internal static string Scale_communication_error {
+ get {
+ return ResourceManager.GetString("Scale_communication_error", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Waage Kommunikation timeout!.
+ ///
+ internal static string Scale_communication_timeout {
+ get {
+ return ResourceManager.GetString("Scale_communication_timeout", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bildschirm.
+ ///
+ internal static string ScreenBtnText {
+ get {
+ return ResourceManager.GetString("ScreenBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to s.
+ ///
+ internal static string sec {
+ get {
+ return ResourceManager.GetString("sec", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wähle Kaltwasser.
+ ///
+ internal static string Select_COLD_tank {
+ get {
+ return ResourceManager.GetString("Select_COLD_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Komponenten Auswahl.
+ ///
+ internal static string Select_Component {
+ get {
+ return ResourceManager.GetString("Select_Component", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wähle Heißwasser.
+ ///
+ internal static string Select_HOT_tank {
+ get {
+ return ResourceManager.GetString("Select_HOT_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wählen Sie Bilder aus und drücken Sie 'Wiederholen', um die Erkennung zu wiederholen.
+ ///
+ internal static string Select_images_and_press_Retry_to_retry_RoI_detection {
+ get {
+ return ResourceManager.GetString("Select_images_and_press_Retry_to_retry_RoI_detection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wähle Warmwasser.
+ ///
+ internal static string Select_WARM_tank {
+ get {
+ return ResourceManager.GetString("Select_WARM_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse ausgewählt.
+ ///
+ internal static string Selected_results {
+ get {
+ return ResourceManager.GetString("Selected_results", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Messs..
+ ///
+ internal static string Sensor {
+ get {
+ return ResourceManager.GetString("Sensor", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abtastung.
+ ///
+ internal static string Sensors {
+ get {
+ return ResourceManager.GetString("Sensors", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abtastsysteme.
+ ///
+ internal static string Sensors_chdr {
+ get {
+ return ResourceManager.GetString("Sensors_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Sensus Erweiterungen.
+ ///
+ internal static string Sensus_extensions {
+ get {
+ return ResourceManager.GetString("Sensus_extensions", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Versendet.
+ ///
+ internal static string Sent {
+ get {
+ return ResourceManager.GetString("Sent", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Seriennummer.
+ ///
+ internal static string Serial_number {
+ get {
+ return ResourceManager.GetString("Serial_number", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Seriennummer.
+ ///
+ internal static string SerialNr {
+ get {
+ return ResourceManager.GetString("SerialNr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Session.
+ ///
+ internal static string Session {
+ get {
+ return ResourceManager.GetString("Session", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellen Kaltwasser Kühltemperatur.
+ ///
+ internal static string Set_cold_water_cooling_temperature {
+ get {
+ return ResourceManager.GetString("Set_cold_water_cooling_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to setze Durchfluss.
+ ///
+ internal static string Set_flow {
+ get {
+ return ResourceManager.GetString("Set_flow", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellen Heißwasser Kühltemperatur.
+ ///
+ internal static string Set_hot_water_cooling_temperature {
+ get {
+ return ResourceManager.GetString("Set_hot_water_cooling_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellen Heißwasser Heiztemperatur.
+ ///
+ internal static string Set_hot_water_heating_temperature {
+ get {
+ return ResourceManager.GetString("Set_hot_water_heating_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Setze Pfad.
+ ///
+ internal static string Set_route {
+ get {
+ return ResourceManager.GetString("Set_route", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellen Warmwasser Kühltemperatur.
+ ///
+ internal static string Set_warm_water_cooling_temperature {
+ get {
+ return ResourceManager.GetString("Set_warm_water_cooling_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellen Warmwasser Heiztemperatur.
+ ///
+ internal static string Set_warm_water_heating_temperature {
+ get {
+ return ResourceManager.GetString("Set_warm_water_heating_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Temperatur einstellen.
+ ///
+ internal static string Setting_temperature {
+ get {
+ return ResourceManager.GetString("Setting_temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfdurchfluss einstellen.
+ ///
+ internal static string Setting_the_flow {
+ get {
+ return ResourceManager.GetString("Setting_the_flow", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abpressdruck einstellen.
+ ///
+ internal static string Setting_the_water_pressure {
+ get {
+ return ResourceManager.GetString("Setting_the_water_pressure", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einstellungen.
+ ///
+ internal static string Settings {
+ get {
+ return ResourceManager.GetString("Settings", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Schwere.
+ ///
+ internal static string Severity {
+ get {
+ return ResourceManager.GetString("Severity", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kurzbeschreibung.
+ ///
+ internal static string Short_dercription {
+ get {
+ return ResourceManager.GetString("Short_dercription", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kurzbeschreibung.
+ ///
+ internal static string Short_description {
+ get {
+ return ResourceManager.GetString("Short_description", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kurze Impulse.
+ ///
+ internal static string Short_pulses {
+ get {
+ return ResourceManager.GetString("Short_pulses", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Anzeigen.
+ ///
+ internal static string Show {
+ get {
+ return ResourceManager.GetString("Show", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Anzeigen Ende Zyklus.
+ ///
+ internal static string Show_cycle_end_form {
+ get {
+ return ResourceManager.GetString("Show_cycle_end_form", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Anzeige der deaktivierten Positionen.
+ ///
+ internal static string Show_disabled_positions {
+ get {
+ return ResourceManager.GetString("Show_disabled_positions", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dialog anzeigen.
+ ///
+ internal static string ShowDialog {
+ get {
+ return ResourceManager.GetString("ShowDialog", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to PC ausschalten nach Beendigung der TBF.
+ ///
+ internal static string Shut_down_computer_after_exiting_TBF {
+ get {
+ return ResourceManager.GetString("Shut_down_computer_after_exiting_TBF", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Geräte herunterfahren.
+ ///
+ internal static string Shutting_down_devices {
+ get {
+ return ResourceManager.GetString("Shutting_down_devices", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Seite.
+ ///
+ internal static string Side {
+ get {
+ return ResourceManager.GetString("Side", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Parallel mit Folgeschritt.
+ ///
+ internal static string Simultaneous_with_next_step {
+ get {
+ return ResourceManager.GetString("Simultaneous_with_next_step", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prallel mit vorherigem Schritt.
+ ///
+ internal static string Simultaneous_with_previous_step {
+ get {
+ return ResourceManager.GetString("Simultaneous_with_previous_step", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Einzel.
+ ///
+ internal static string SingleBtnText {
+ get {
+ return ResourceManager.GetString("SingleBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ursprung.
+ ///
+ internal static string Source {
+ get {
+ return ResourceManager.GetString("Source", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Stabil.
+ ///
+ internal static string stable {
+ get {
+ return ResourceManager.GetString("stable", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Start.
+ ///
+ internal static string Start {
+ get {
+ return ResourceManager.GetString("Start", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Start Prüfzyklus.
+ ///
+ internal static string Start_cycle {
+ get {
+ return ResourceManager.GetString("Start_cycle", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Starte die Pumpe.
+ ///
+ internal static string Start_the_pump {
+ get {
+ return ResourceManager.GetString("Start_the_pump", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Starte Prüfpunkt.
+ ///
+ internal static string Start_the_test {
+ get {
+ return ResourceManager.GetString("Start_the_test", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Starten Sie den Prüfstand.
+ ///
+ internal static string Start_the_test_bench {
+ get {
+ return ResourceManager.GetString("Start_the_test_bench", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfung start.
+ ///
+ internal static string Starting_system {
+ get {
+ return ResourceManager.GetString("Starting_system", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Kamera Start.
+ ///
+ internal static string Starting_the_cameras {
+ get {
+ return ResourceManager.GetString("Starting_the_cameras", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pumpe starten.
+ ///
+ internal static string Starting_the_pump {
+ get {
+ return ResourceManager.GetString("Starting_the_pump", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Startventil.
+ ///
+ internal static string StartValve {
+ get {
+ return ResourceManager.GetString("StartValve", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Stand.
+ ///
+ internal static string State {
+ get {
+ return ResourceManager.GetString("State", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Stopp.
+ ///
+ internal static string Stop {
+ get {
+ return ResourceManager.GetString("Stop", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Pumpe anhalten.
+ ///
+ internal static string Stop_the_pump {
+ get {
+ return ResourceManager.GetString("Stop_the_pump", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfung anhalten.
+ ///
+ internal static string Stop_the_test {
+ get {
+ return ResourceManager.GetString("Stop_the_test", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Stop Rückflussventil.
+ ///
+ internal static string StopBFValve_chdr {
+ get {
+ return ResourceManager.GetString("StopBFValve_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Anhalten.
+ ///
+ internal static string Stopping {
+ get {
+ return ResourceManager.GetString("Stopping", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Durchfluss Anhalten.
+ ///
+ internal static string Stopping_flow_for_the_fixed_start {
+ get {
+ return ResourceManager.GetString("Stopping_flow_for_the_fixed_start", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Filter Fehlimpulse WZ!.
+ ///
+ internal static string SupressWMTrills {
+ get {
+ return ResourceManager.GetString("SupressWMTrills", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Umschaltpunkt suchen.
+ ///
+ internal static string Switching_flow_detection {
+ get {
+ return ResourceManager.GetString("Switching_flow_detection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Umschaltpunkte.
+ ///
+ internal static string Switching_Points {
+ get {
+ return ResourceManager.GetString("Switching_Points", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T Wärmebad.
+ ///
+ internal static string T_bath {
+ get {
+ return ResourceManager.GetString("T_bath", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T kalt.
+ ///
+ internal static string T_cold {
+ get {
+ return ResourceManager.GetString("T_cold", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T kalt Kühlen.
+ ///
+ internal static string T_cold_cooling {
+ get {
+ return ResourceManager.GetString("T_cold_cooling", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T kalt von.
+ ///
+ internal static string T_cold_from {
+ get {
+ return ResourceManager.GetString("T_cold_from", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T kalt bis.
+ ///
+ internal static string T_cold_to {
+ get {
+ return ResourceManager.GetString("T_cold_to", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T div.
+ ///
+ internal static string T_div {
+ get {
+ return ResourceManager.GetString("T_div", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T heiß Kühlen.
+ ///
+ internal static string T_hot_cooling {
+ get {
+ return ResourceManager.GetString("T_hot_cooling", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T heiß heizen.
+ ///
+ internal static string T_hot_heating {
+ get {
+ return ResourceManager.GetString("T_hot_heating", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T ein.
+ ///
+ internal static string T_in {
+ get {
+ return ResourceManager.GetString("T_in", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T einlass.
+ ///
+ internal static string T_inlet {
+ get {
+ return ResourceManager.GetString("T_inlet", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T aus.
+ ///
+ internal static string T_out {
+ get {
+ return ResourceManager.GetString("T_out", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T auslauf.
+ ///
+ internal static string T_outlet {
+ get {
+ return ResourceManager.GetString("T_outlet", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T m kalt.
+ ///
+ internal static string T_ref_cold {
+ get {
+ return ResourceManager.GetString("T_ref_cold", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T m warm.
+ ///
+ internal static string T_ref_warm {
+ get {
+ return ResourceManager.GetString("T_ref_warm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T warm.
+ ///
+ internal static string T_warm {
+ get {
+ return ResourceManager.GetString("T_warm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T warm Kühlen.
+ ///
+ internal static string T_warm_cooling {
+ get {
+ return ResourceManager.GetString("T_warm_cooling", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T warm von.
+ ///
+ internal static string T_warm_from {
+ get {
+ return ResourceManager.GetString("T_warm_from", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T warm heizen.
+ ///
+ internal static string T_warm_heating {
+ get {
+ return ResourceManager.GetString("T_warm_heating", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T warm bis.
+ ///
+ internal static string T_warm_to {
+ get {
+ return ResourceManager.GetString("T_warm_to", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T v kalt.
+ ///
+ internal static string T_work_cold {
+ get {
+ return ResourceManager.GetString("T_work_cold", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to T v warm.
+ ///
+ internal static string T_work_warm {
+ get {
+ return ResourceManager.GetString("T_work_warm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfdurchfluss Hi [m3/h]:.
+ ///
+ internal static string Target_flow_hi_m3h_ {
+ get {
+ return ResourceManager.GetString("Target_flow_hi_m3h_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfdurchfluss Lo [m3/h]:.
+ ///
+ internal static string Target_flow_lo_m3h_ {
+ get {
+ return ResourceManager.GetString("Target_flow_lo_m3h_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfimpulse:.
+ ///
+ internal static string Target_ref_pulses_ {
+ get {
+ return ResourceManager.GetString("Target_ref_pulses_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvolumen [l]:.
+ ///
+ internal static string Target_volume_l_ {
+ get {
+ return ResourceManager.GetString("Target_volume_l_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ziel Q [m3/h].
+ ///
+ internal static string TargetQ {
+ get {
+ return ResourceManager.GetString("TargetQ", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Tarrieren.
+ ///
+ internal static string Tarring {
+ get {
+ return ResourceManager.GetString("Tarring", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Obere Temperaturgrenze.
+ ///
+ internal static string Temp_lim_hi_chdr {
+ get {
+ return ResourceManager.GetString("Temp_lim_hi_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Untere Temperaturgrenze.
+ ///
+ internal static string Temp_lim_lo_chdr {
+ get {
+ return ResourceManager.GetString("Temp_lim_lo_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Temperatur.
+ ///
+ internal static string Temperature {
+ get {
+ return ResourceManager.GetString("Temperature", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Temperaturklasse.
+ ///
+ internal static string Temperature_class {
+ get {
+ return ResourceManager.GetString("Temperature_class", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfpunkt.
+ ///
+ internal static string Test {
+ get {
+ return ResourceManager.GetString("Test", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand.
+ ///
+ internal static string Test_bench {
+ get {
+ return ResourceManager.GetString("Test_bench", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstandskomponenten Konfiguration.
+ ///
+ internal static string Test_Bench_Components_Configuration {
+ get {
+ return ResourceManager.GetString("Test_Bench_Components_Configuration", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstandsdaten.
+ ///
+ internal static string Test_bench_data {
+ get {
+ return ResourceManager.GetString("Test_bench_data", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Grunddaten Spezifikation.
+ ///
+ internal static string Test_Bench_Databases_Specification {
+ get {
+ return ResourceManager.GetString("Test_Bench_Databases_Specification", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand wird von diesem Computer gesteuert.
+ ///
+ internal static string Test_bench_is_controlled_by_this_computer {
+ get {
+ return ResourceManager.GetString("Test_bench_is_controlled_by_this_computer", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstandsname.
+ ///
+ internal static string Test_bench_name {
+ get {
+ return ResourceManager.GetString("Test_bench_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstand Nr..
+ ///
+ internal static string Test_bench_number {
+ get {
+ return ResourceManager.GetString("Test_bench_number", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfstände :.
+ ///
+ internal static string Test_Benches_ {
+ get {
+ return ResourceManager.GetString("Test_Benches_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfpunkt.
+ ///
+ internal static string Test_chdr {
+ get {
+ return ResourceManager.GetString("Test_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfung abgeschlossen.
+ ///
+ internal static string Test_completed {
+ get {
+ return ResourceManager.GetString("Test_completed", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Teste Verbindung.
+ ///
+ internal static string Test_connection {
+ get {
+ return ResourceManager.GetString("Test_connection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfung läuft.
+ ///
+ internal static string Test_in_progress {
+ get {
+ return ResourceManager.GetString("Test_in_progress", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Korrigierte Prüfung.
+ ///
+ internal static string Test_measured_corrected {
+ get {
+ return ResourceManager.GetString("Test_measured_corrected", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfart.
+ ///
+ internal static string Test_method {
+ get {
+ return ResourceManager.GetString("Test_method", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvorlage.
+ ///
+ internal static string Test_name {
+ get {
+ return ResourceManager.GetString("Test_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfung vorbereiten.
+ ///
+ internal static string Test_preparation {
+ get {
+ return ResourceManager.GetString("Test_preparation", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfungsprofile.
+ ///
+ internal static string Test_profiles {
+ get {
+ return ResourceManager.GetString("Test_profiles", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Test Profilselektion.
+ ///
+ internal static string Test_profiles_selection {
+ get {
+ return ResourceManager.GetString("Test_profiles_selection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wiederholungsprüfungen; Anzahl überschritten!.
+ ///
+ internal static string Test_repetition_count_exceeded_upper_limit {
+ get {
+ return ResourceManager.GetString("Test_repetition_count_exceeded_upper_limit", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ergebnisse werden verloren gehen..
+ ///
+ internal static string Test_results_will_be_lost {
+ get {
+ return ResourceManager.GetString("Test_results_will_be_lost", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfung Start ({0}: Schritt {1}/{2}).
+ ///
+ internal static string Test_start_sequence_i_n {
+ get {
+ return ResourceManager.GetString("Test_start_sequence_i_n", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ürüfung Stop ({0}: Schritt {1}/{2}).
+ ///
+ internal static string Test_stop_sequence_i_n {
+ get {
+ return ResourceManager.GetString("Test_stop_sequence_i_n", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Dauer.
+ ///
+ internal static string Test_time {
+ get {
+ return ResourceManager.GetString("Test_time", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfvolumen überschreitet Wägevolumen.
+ ///
+ internal static string Test_volume_exceeds_the_scale_capacity {
+ get {
+ return ResourceManager.GetString("Test_volume_exceeds_the_scale_capacity", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfer.
+ ///
+ internal static string Tester {
+ get {
+ return ResourceManager.GetString("Tester", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüftechniker.
+ ///
+ internal static string Testing_Specialist {
+ get {
+ return ResourceManager.GetString("Testing_Specialist", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfpunkte sind Spalten.
+ ///
+ internal static string Tests_are_columns {
+ get {
+ return ResourceManager.GetString("Tests_are_columns", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Prüfpunkte sind Zeilen.
+ ///
+ internal static string Tests_are_rows {
+ get {
+ return ResourceManager.GetString("Tests_are_rows", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Die folgenden Komponenten sind im Simulationsmodus:.
+ ///
+ internal static string The_following_components_are_in_simulation_mode_ {
+ get {
+ return ResourceManager.GetString("The_following_components_are_in_simulation_mode_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Keine optischen Impulse vorhanden.
+ ///
+ internal static string There_are_no_opto_pulses {
+ get {
+ return ResourceManager.GetString("There_are_no_opto_pulses", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Stab. Zeit [s].
+ ///
+ internal static string Time2MassMsrmt_chdr {
+ get {
+ return ResourceManager.GetString("Time2MassMsrmt_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zeit zur Durchflusseinst. [s].
+ ///
+ internal static string TimeBeforeSettingFlow {
+ get {
+ return ResourceManager.GetString("TimeBeforeSettingFlow", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zeit Durchfl. IO-Start [s].
+ ///
+ internal static string TimeFlow2Start_chdr {
+ get {
+ return ResourceManager.GetString("TimeFlow2Start_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zeit abgelaufen.
+ ///
+ internal static string Timeout {
+ get {
+ return ResourceManager.GetString("Timeout", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zeit Pumpe-Startventil [s].
+ ///
+ internal static string TimePump2StartV_chdr {
+ get {
+ return ResourceManager.GetString("TimePump2StartV_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to bis.
+ ///
+ internal static string to {
+ get {
+ return ResourceManager.GetString("to", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Tol. Abzug [%].
+ ///
+ internal static string Tol_red_pct_chdr {
+ get {
+ return ResourceManager.GetString("Tol_red_pct_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Übergangsequenz.
+ ///
+ internal static string Transition_sequence {
+ get {
+ return ResourceManager.GetString("Transition_sequence", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zwischen den Wiederholungsprüfungen.
+ ///
+ internal static string TransitionBetween_chdr {
+ get {
+ return ResourceManager.GetString("TransitionBetween_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ubergang - Ende.
+ ///
+ internal static string TransitionEnd_chdr {
+ get {
+ return ResourceManager.GetString("TransitionEnd_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Übergänge.
+ ///
+ internal static string Transitions {
+ get {
+ return ResourceManager.GetString("Transitions", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ubergang - Start.
+ ///
+ internal static string TransitionStart_chdr {
+ get {
+ return ResourceManager.GetString("TransitionStart_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Richtung ändern.
+ ///
+ internal static string Turning_direction {
+ get {
+ return ResourceManager.GetString("Turning_direction", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Type.
+ ///
+ internal static string Type {
+ get {
+ return ResourceManager.GetString("Type", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Messunsicherheit.
+ ///
+ internal static string Uncertainty {
+ get {
+ return ResourceManager.GetString("Uncertainty", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Messunsicherheit der Korrektur.
+ ///
+ internal static string Uncertainty_of_correction {
+ get {
+ return ResourceManager.GetString("Uncertainty_of_correction", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unsicherheit [%].
+ ///
+ internal static string Uncertainty_pct_chdr {
+ get {
+ return ResourceManager.GetString("Uncertainty_pct_chdr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unbestätigte Ereignisse.
+ ///
+ internal static string Unconfirmed_events {
+ get {
+ return ResourceManager.GetString("Unconfirmed_events", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Es trat ein unbehandelter Fehler auf in .
+ ///
+ internal static string Unhandled_error_occured_in_ {
+ get {
+ return ResourceManager.GetString("Unhandled_error_occured_in_", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to .
+ ///
+ internal static string Units {
+ get {
+ return ResourceManager.GetString("Units", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ändern.
+ ///
+ internal static string UnlockBtnText {
+ get {
+ return ResourceManager.GetString("UnlockBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Abwahl Aktueller Behälter.
+ ///
+ internal static string Unselect_current_tank {
+ get {
+ return ResourceManager.GetString("Unselect_current_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Aufwärts.
+ ///
+ internal static string UpBtnText {
+ get {
+ return ResourceManager.GetString("UpBtnText", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Update.
+ ///
+ internal static string Update {
+ get {
+ return ResourceManager.GetString("Update", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Verwendung {0}.
+ ///
+ internal static string Use_0 {
+ get {
+ return ResourceManager.GetString("Use_0", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzer.
+ ///
+ internal static string User {
+ get {
+ return ResourceManager.GetString("User", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzercode.
+ ///
+ internal static string User_code {
+ get {
+ return ResourceManager.GetString("User_code", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Anmelden.
+ ///
+ internal static string User_Login {
+ get {
+ return ResourceManager.GetString("User_Login", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzer.
+ ///
+ internal static string User_Management {
+ get {
+ return ResourceManager.GetString("User_Management", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzername.
+ ///
+ internal static string User_name {
+ get {
+ return ResourceManager.GetString("User_name", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzername.
+ ///
+ internal static string Username {
+ get {
+ return ResourceManager.GetString("Username", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzername bereits vorhanden. Bitte einen anderen Benutzername wählen..
+ ///
+ internal static string Username_taken {
+ get {
+ return ResourceManager.GetString("Username_taken", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzer.
+ ///
+ internal static string Users {
+ get {
+ return ResourceManager.GetString("Users", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Benutzer und Gruppen.
+ ///
+ internal static string Users_and_groups {
+ get {
+ return ResourceManager.GetString("Users_and_groups", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Gültig bis.
+ ///
+ internal static string Valid_until {
+ get {
+ return ResourceManager.GetString("Valid_until", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wert.
+ ///
+ internal static string Value {
+ get {
+ return ResourceManager.GetString("Value", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Version.
+ ///
+ internal static string Version {
+ get {
+ return ResourceManager.GetString("Version", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Version {0}.
+ ///
+ internal static string VersionStr {
+ get {
+ return ResourceManager.GetString("VersionStr", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Vertikal.
+ ///
+ internal static string Vertically {
+ get {
+ return ResourceManager.GetString("Vertically", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Virtuelle Prüfstandssequenz.
+ ///
+ internal static string Virtual_bench_sequence {
+ get {
+ return ResourceManager.GetString("Virtual_bench_sequence", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Spannung.
+ ///
+ internal static string Voltage {
+ get {
+ return ResourceManager.GetString("Voltage", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Volumen.
+ ///
+ internal static string Volume {
+ get {
+ return ResourceManager.GetString("Volume", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Auswahl Volumen und Fehlergrenzen.
+ ///
+ internal static string Volume_and_error_selection {
+ get {
+ return ResourceManager.GetString("Volume_and_error_selection", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Volumen im Behälter.
+ ///
+ internal static string Volume_to_tank {
+ get {
+ return ResourceManager.GetString("Volume_to_tank", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Volumen im Behälter überschreitet die Waagenkapazität!.
+ ///
+ internal static string Volume_to_tank_exceeds_the_scale_capacity {
+ get {
+ return ResourceManager.GetString("Volume_to_tank_exceeds_the_scale_capacity", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Volumen im Behälter höher als Prüfvolumen!.
+ ///
+ internal static string Volume_to_tank_is_larger_then_the_test_volume {
+ get {
+ return ResourceManager.GetString("Volume_to_tank_is_larger_then_the_test_volume", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Bitte warten.
+ ///
+ internal static string Wait_please {
+ get {
+ return ResourceManager.GetString("Wait_please", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Warten bis.
+ ///
+ internal static string Wait_until {
+ get {
+ return ResourceManager.GetString("Wait_until", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Warte bis {0} Messbehälter leer ist!.
+ ///
+ internal static string Wait_until_0_tank_is_empty {
+ get {
+ return ResourceManager.GetString("Wait_until_0_tank_is_empty", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Warnung.
+ ///
+ internal static string Warning {
+ get {
+ return ResourceManager.GetString("Warning", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasser.
+ ///
+ internal static string Water {
+ get {
+ return ResourceManager.GetString("Water", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserstand in mm.
+ ///
+ internal static string Water_level_in_mm {
+ get {
+ return ResourceManager.GetString("Water_level_in_mm", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzähler.
+ ///
+ internal static string Water_Meter {
+ get {
+ return ResourceManager.GetString("Water_Meter", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzähler Daten.
+ ///
+ internal static string Water_meter_data {
+ get {
+ return ResourceManager.GetString("Water_meter_data", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to WZ-Serienummer-Stand.
+ ///
+ internal static string Water_Meter_SNs_States {
+ get {
+ return ResourceManager.GetString("Water_Meter_SNs_States", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to WZ-Stand.
+ ///
+ internal static string Water_Meter_States {
+ get {
+ return ResourceManager.GetString("Water_Meter_States", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Wasserzähler Typen.
+ ///
+ internal static string Water_meter_types {
+ get {
+ return ResourceManager.GetString("Water_meter_types", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Zählerdaten.
+ ///
+ internal static string Water_meters {
+ get {
+ return ResourceManager.GetString("Water_meters", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to WZ_Stand.
+ ///
+ internal static string WMState {
+ get {
+ return ResourceManager.GetString("WMState", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to iPERL falsche Durchflussrichtung!.
+ ///
+ internal static string Wrong_iPerl_counting_direction {
+ get {
+ return ResourceManager.GetString("Wrong_iPerl_counting_direction", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Eichjahr.
+ ///
+ internal static string Year_of_production {
+ get {
+ return ResourceManager.GetString("Year_of_production", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ja.
+ ///
+ internal static string yes {
+ get {
+ return ResourceManager.GetString("yes", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Ja.
+ ///
+ internal static string YesBtn {
+ get {
+ return ResourceManager.GetString("YesBtn", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Nullstellen.
+ ///
+ internal static string Zeroing_chdr {
+ get {
+ return ResourceManager.GetString("Zeroing_chdr", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/TBF/Resources/Strings.de.resx b/TBF/Resources/Strings.de.resx
index 1af7a2954..675a32298 100644
--- a/TBF/Resources/Strings.de.resx
+++ b/TBF/Resources/Strings.de.resx
@@ -1023,8 +1023,8 @@
Prallel mit vorherigem Schritt
-
- iPerl Kommunikation läuft
+
+ Meter Kommunikation läuft
Sprache
diff --git a/TBF/Resources/Strings.it.resx b/TBF/Resources/Strings.it.resx
index 84f8d64d5..b700dfed6 100644
--- a/TBF/Resources/Strings.it.resx
+++ b/TBF/Resources/Strings.it.resx
@@ -1017,8 +1017,8 @@
simultaneo con il passo precedente
-
- iPerl comunicazioni in corso
+
+ Meter comunicazioni in corso
lingua
diff --git a/TBF/Resources/Strings.pl.resx b/TBF/Resources/Strings.pl.resx
index a68877112..7036778c3 100644
--- a/TBF/Resources/Strings.pl.resx
+++ b/TBF/Resources/Strings.pl.resx
@@ -1011,8 +1011,8 @@
Jednocześnie z poprzednim krokiem
-
- Komunikacja z iPERL w toku
+
+ Komunikacja z vodomera w toku
Język
diff --git a/TBF/Resources/Strings.resx b/TBF/Resources/Strings.resx
index 98c8cd654..064b2ec0a 100644
--- a/TBF/Resources/Strings.resx
+++ b/TBF/Resources/Strings.resx
@@ -543,6 +543,12 @@
Pulses per liter
+
+ Delay between pictures
+
+
+ Pictures Count
+
Component
@@ -1042,8 +1048,8 @@
Simultaneous with previous step
-
- iPerl Communication in progress
+
+ Meter Communication in progress
Language
@@ -1732,6 +1738,9 @@
RFID communication failed
+
+ Radio Communication failed
+
Disabled by user
diff --git a/TBF/Resources/Strings.ru.resx b/TBF/Resources/Strings.ru.resx
index 1bb6a3835..ec13473b8 100644
--- a/TBF/Resources/Strings.ru.resx
+++ b/TBF/Resources/Strings.ru.resx
@@ -1011,8 +1011,8 @@
Одновременно с предыдущим шагом
-
- Осуществляется связь с iPerl
+
+ Осуществляется связь с водомером
Язык
diff --git a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs
index 8d222e048..d94f7471f 100644
--- a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs
+++ b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/TestStartEndForm.cs
@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
+using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using log4net;
@@ -70,6 +71,9 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
int lastWmNr1;
Bitmap lastImage; /// non-zoomed image
Bitmap zoomedImage;
+ private readonly List currentImageGroup = new List();//multiple pictures
+ private int currentImageGroupIndex;
+ private bool mouseOverPictureBox;
Thread imageProcessingThread; /// Thread to process images
public delegate void OcrTextObtainedDelegate(int ix, bool isEnd, string text);
@@ -96,6 +100,12 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
public TestStartEndForm()
{
InitializeComponent();
+
+ KeyPreview = true;
+
+ pictureBox1.MouseWheel += pictureBox1_MouseWheel;
+ pictureBox1.MouseEnter += pictureBox1_MouseEnter;
+ pictureBox1.MouseLeave += pictureBox1_MouseLeave;
this.Icon = Properties.Resources.TBF_icon;
@@ -483,15 +493,46 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
startTextBoxes[i].TextChanged += new System.EventHandler(this.startTextBoxX_TextChanged);
startTextBoxes[i].KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.startTextBoxX_KeyPress);
startTextBoxes[i].MouseDown += new System.Windows.Forms.MouseEventHandler(this.startTextBoxX_MouseDown);
+ startTextBoxes[i].Enter += startTextBoxX_Enter;
}
+ private void startTextBoxX_Enter(object sender, EventArgs e)
+ {
+ var textBox = sender as TextBox;
+ if (textBox == null) { return; }
+
+ int physPos = PhysPos(textBox, startTextBoxes);
+
+ if (physPos >= 0)
+ {
+ LoadImage(sender, Tst.Start, physPos);
+ }
+ }
+
+
+
private void EndTextBox_EnableHanders(int i)
{
endTextBoxes[i].AcceptsTabChanged += new System.EventHandler(this.endTextBoxX_AcceptsTabChanged);
endTextBoxes[i].TextChanged += new System.EventHandler(this.endTextBoxX_TextChanged);
endTextBoxes[i].KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.endTextBoxX_KeyPress);
endTextBoxes[i].MouseDown += new System.Windows.Forms.MouseEventHandler(this.endTextBoxX_AcceptsTabChanged);
+ endTextBoxes[i].Enter += endTextBoxX_Enter;
}
+
+ private void endTextBoxX_Enter(object sender, EventArgs e)
+ {
+ var textBox = sender as TextBox;
+ if (textBox == null) { return; }
+
+ int physPos = PhysPos(textBox, endTextBoxes);
+
+ if (physPos >= 0)
+ {
+ LoadImage(sender, Tst.End, physPos);
+ }
+ }
+
private void TestStartEndForm_FormClosed(object sender, FormClosedEventArgs e)
{
@@ -763,7 +804,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
TextBox clickedTextBox = sender as TextBox;
if (clickedTextBox != null)
{
- var physPos = PhysPos(clickedTextBox, startTextBoxes);
+ var physPos = PhysPos(clickedTextBox, endTextBoxes);//startTextBoxes);
if (physPos < 0)
{
@@ -1069,7 +1110,7 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
TextBox clickedTextBox = sender as TextBox;
if (clickedTextBox != null)
{
- var physPos = PhysPos(clickedTextBox, startTextBoxes);
+ var physPos = PhysPos(clickedTextBox, endTextBoxes);//startTextBoxes);
if (physPos < 0)
{
@@ -1134,65 +1175,479 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
///
/// Tst.Start or Tst.End
/// 0..23
- void LoadImage(object sender, Tst startOrEnd, int physPos)
- {
- int wmNr1b = phys2wm[physPos]; /// 0 means no WM
- if (wmNr1b <= 0) return;
+ void LoadImage( object sender, Tst startOrEnd, int physPos)
+ {
+ if (physPos < 0 || physPos >= phys2wm.Length)
+ {
+ return;
+ }
- wmNr0b = wmNr1b - 1;
+ int wmNr1b = phys2wm[physPos];
- string imageFileName;
- if (startOrEnd == Tst.Start && startImages[wmNr0b] != null)
- imageFileName = startImages[wmNr0b];
- else if (startOrEnd == Tst.End && endImages[wmNr0b] != null)
- imageFileName = endImages[wmNr0b];
- else
- imageFileName = string.Empty;
+ // Hodnota 0 znamená, že na tejto fyzickej pozícii nie je vodomer.
+ if (wmNr1b <= 0)
+ {
+ return;
+ }
- if (imageFileName == lastImageName)
- {
- return;
- }
+ wmNr0b = wmNr1b - 1;
- lastImageName = imageFileName;
- lastWmNr1 = wmNr1b;
+ string imageFileName = GetBaseImageFileName(
+ startOrEnd,
+ wmNr0b);
- if (string.IsNullOrEmpty(imageFileName) || !File.Exists(imageFileName))
- {
- lastImage = null;
- }
- else
- {
- using (Bitmap tempBmp = Image.FromFile(imageFileName) as Bitmap)
+ lastWmNr1 = wmNr1b;
+
+ if (string.IsNullOrWhiteSpace(imageFileName))
+ {
+ ClearImageGroup();
+ LoadImageFile(null);
+ return;
+ }
+
+ /*
+ * Ak používateľ zvolil iný vodomer alebo Start/End obrázok,
+ * vytvoríme novú skupinu:
+ *
+ * TestAdvance-1-start.bmp
+ * TestAdvance-1-start_img01_....bmp
+ * TestAdvance-1-start_img02_....bmp
+ */
+ if (!string.Equals(
+ imageFileName,
+ lastImageName,
+ StringComparison.OrdinalIgnoreCase))
+ {
+ lastImageName = imageFileName;
+
+ LoadImageGroup(imageFileName);
+
+ // Pôvodný kompatibilný obrázok bude zobrazený ako prvý.
+ currentImageGroupIndex = 0;
+ }
+ else
+ {
+ /*
+ * Súbory mohli vzniknúť až po prvom otvorení dialógu,
+ * preto skupinu pri opätovnom výbere obnovíme.
+ */
+ RefreshCurrentImageGroup();
+ }
+
+ if (currentImageGroup.Count == 0)
+ {
+ LoadImageFile(null);
+ return;
+ }
+
+ currentImageGroupIndex = Math.Max(
+ 0,
+ Math.Min(
+ currentImageGroupIndex,
+ currentImageGroup.Count - 1));
+
+ LoadImageFile(
+ currentImageGroup[currentImageGroupIndex]);
+ }
+
+ ///
+ /// base name of image file
+ ///
+ ///
+ ///
+ ///
+ private string GetBaseImageFileName(
+ Tst startOrEnd,
+ int waterMeterIndex)
+ {
+ if (waterMeterIndex < 0 ||
+ waterMeterIndex >= WaterMetersCount)
+ {
+ return null;
+ }
+
+ if (startOrEnd == Tst.Start)
+ {
+ if (startImages == null ||
+ waterMeterIndex >= startImages.Length)
{
- Rectangle rect;
- if (tempBmp.Height < tempBmp.Width)
+ return null;
+ }
+
+ return startImages[waterMeterIndex];
+ }
+
+ if (startOrEnd == Tst.End)
+ {
+ if (endImages == null ||
+ waterMeterIndex >= endImages.Length)
+ {
+ return null;
+ }
+
+ return endImages[waterMeterIndex];
+ }
+
+ return null;
+ }
+
+ ///
+ /// load group of images
+ ///
+ ///
+ private void LoadImageGroup(
+ string baseImageFileName)
+ {
+ currentImageGroup.Clear();
+ currentImageGroupIndex = 0;
+
+ if (string.IsNullOrWhiteSpace(baseImageFileName))
+ {
+ return;
+ }
+
+ string fullBaseFileName;
+
+ try
+ {
+ fullBaseFileName =
+ Path.GetFullPath(baseImageFileName);
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Cannot create image group from invalid path: " +
+ $"file='{baseImageFileName}', " +
+ $"error={exc.Message}");
+
+ return;
+ }
+
+ string directory =
+ Path.GetDirectoryName(fullBaseFileName);
+
+ string baseName =
+ Path.GetFileNameWithoutExtension(fullBaseFileName);
+
+ string extension =
+ Path.GetExtension(fullBaseFileName);
+
+ if (string.IsNullOrWhiteSpace(directory) ||
+ string.IsNullOrWhiteSpace(baseName))
+ {
+ return;
+ }
+
+ /*
+ * Pôvodný obrázok pridáme ako prvý.
+ */
+ if (File.Exists(fullBaseFileName))
+ {
+ currentImageGroup.Add(fullBaseFileName);
+ }
+
+ if (!Directory.Exists(directory))
+ {
+ return;
+ }
+
+ string searchPattern =
+ $"{baseName}_img*{extension}";
+
+ try
+ {
+ List timedImages =
+ Directory
+ .GetFiles(
+ directory,
+ searchPattern,
+ SearchOption.TopDirectoryOnly)
+ .OrderBy(GetTimedImageIndex)
+ .ThenBy(
+ fileName => fileName,
+ StringComparer.OrdinalIgnoreCase)
+ .ToList();
+
+ foreach (string timedImage in timedImages)
+ {
+ if (!currentImageGroup.Contains(
+ timedImage,
+ StringComparer.OrdinalIgnoreCase))
{
- int hght = tempBmp.Height;
- int leftMargin = (tempBmp.Width - hght) / 2;
- rect = new Rectangle(leftMargin, 0, hght, hght);
- }
- else
- {
- int hght = tempBmp.Height;
- int wdth = tempBmp.Width;
- int margin = (hght - wdth) / 2;
- rect = new Rectangle(0, margin, wdth, wdth);
- }
- //int hght = tempBmp.Height;
- //int leftMargin = (tempBmp.Width - hght) / 2;
- //lastImage = new Bitmap(tempBmp.Clone(new Rectangle(leftMargin, 0, hght, hght), tempBmp.PixelFormat));
- lastImage = new Bitmap(tempBmp.Clone(rect, tempBmp.PixelFormat));
- if (isZoomed[wmNr0b])
- {
- zoomedImage = MakeZoomedImage(lastImage, zoomCenterLoc[wmNr0b]);
+ currentImageGroup.Add(timedImage);
}
}
- }
- ShowImage();
- }
+ log.Debug(
+ $"Image group loaded: " +
+ $"baseFile='{fullBaseFileName}', " +
+ $"searchPattern='{searchPattern}', " +
+ $"imagesCount={currentImageGroup.Count}");
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Cannot load image group: " +
+ $"baseFile='{fullBaseFileName}', " +
+ $"pattern='{searchPattern}', " +
+ $"error={exc.Message}");
+ }
+ }
+ ///
+ /// grouping by time
+ ///
+ ///
+ ///
+ private static int GetTimedImageIndex(
+ string fileName)
+ {
+ if (string.IsNullOrWhiteSpace(fileName))
+ {
+ return int.MaxValue;
+ }
+ string nameWithoutExtension =
+ Path.GetFileNameWithoutExtension(fileName);
+
+ Match match = Regex.Match(
+ nameWithoutExtension,
+ @"_img(?\d+)_",
+ RegexOptions.IgnoreCase);
+
+ if (!match.Success)
+ {
+ return int.MaxValue;
+ }
+
+ int imageIndex;
+
+ return int.TryParse(
+ match.Groups["index"].Value,
+ out imageIndex)
+ ? imageIndex
+ : int.MaxValue;
+ }
+
+ ///
+ /// refreshing current image group
+ ///
+ private void RefreshCurrentImageGroup()
+ {
+ if (string.IsNullOrWhiteSpace(lastImageName))
+ {
+ return;
+ }
+
+ string currentlySelectedFile =
+ currentImageGroupIndex >= 0 &&
+ currentImageGroupIndex < currentImageGroup.Count
+ ? currentImageGroup[currentImageGroupIndex]
+ : null;
+
+ LoadImageGroup(lastImageName);
+
+ if (string.IsNullOrWhiteSpace(currentlySelectedFile))
+ {
+ return;
+ }
+
+ int restoredIndex =
+ currentImageGroup.FindIndex(
+ fileName =>
+ string.Equals(
+ fileName,
+ currentlySelectedFile,
+ StringComparison.OrdinalIgnoreCase));
+
+ if (restoredIndex >= 0)
+ {
+ currentImageGroupIndex = restoredIndex;
+ }
+ }
+ /// --- picture load ---
+ private void LoadImageFile(
+ string imageFileName)
+ {
+ DisposeLoadedImages();
+
+ if (string.IsNullOrWhiteSpace(imageFileName) ||
+ !File.Exists(imageFileName))
+ {
+ log.Debug(
+ $"Image cannot be displayed because the file does not exist: " +
+ $"file='{imageFileName}'");
+
+ ShowImage();
+ return;
+ }
+
+ try
+ {
+ using (var tempBmp =
+ new Bitmap(imageFileName))
+ {
+ Rectangle rect =
+ CreateSquareCropRectangle(tempBmp);
+
+ using (Bitmap croppedImage =
+ tempBmp.Clone(
+ rect,
+ tempBmp.PixelFormat))
+ {
+ lastImage =
+ new Bitmap(croppedImage);
+ }
+ }
+
+ if (isZoomed[wmNr0b])
+ {
+ zoomedImage =
+ MakeZoomedImage(
+ lastImage,
+ zoomCenterLoc[wmNr0b]);
+ }
+
+ log.Debug(
+ $"Image displayed from group: " +
+ $"waterMeter={lastWmNr1}, " +
+ $"groupIndex={currentImageGroupIndex + 1}/" +
+ $"{currentImageGroup.Count}, " +
+ $"file='{imageFileName}'");
+ }
+ catch (Exception exc)
+ {
+ log.Error(
+ $"Cannot load image: " +
+ $"file='{imageFileName}', " +
+ $"error={exc.Message}",
+ exc);
+
+ DisposeLoadedImages();
+ }
+
+ ShowImage();
+ }
+
+ /// --- block picture Crop help method ---
+ private static Rectangle CreateSquareCropRectangle( Bitmap bitmap)
+ {
+ int size = Math.Min( bitmap.Width, bitmap.Height);
+ int x = (bitmap.Width - size) / 2;
+ int y = (bitmap.Height - size) / 2;
+
+ return new Rectangle( x, y, size, size);
+ }
+
+ // --- block release old pictures ---
+ private void DisposeLoadedImages()
+ {
+ if (lastImage != null)
+ {
+ lastImage.Dispose();
+ lastImage = null;
+ }
+
+ if (zoomedImage != null)
+ {
+ zoomedImage.Dispose();
+ zoomedImage = null;
+ }
+ }
+
+ private void ClearImageGroup()
+ {
+ currentImageGroup.Clear();
+ currentImageGroupIndex = 0;
+ lastImageName = null;
+ }
+
+ // --- block picture exchange ---
+ private void ShowPreviousImageFromGroup()
+ {
+ ShowImageFromGroup(-1);
+ }
+
+ private void ShowNextImageFromGroup()
+ {
+ ShowImageFromGroup(1);
+ }
+
+ private void ShowImageFromGroup(
+ int direction)
+ {
+ if (direction == 0 ||
+ currentImageGroup.Count <= 1)
+ {
+ return;
+ }
+
+ int newIndex =
+ currentImageGroupIndex + direction;
+
+ /*
+ * Cyklické prepínanie:
+ *
+ * posledný -> prvý
+ * prvý -> posledný
+ */
+ if (newIndex < 0)
+ {
+ newIndex =
+ currentImageGroup.Count - 1;
+ }
+ else if (newIndex >= currentImageGroup.Count)
+ {
+ newIndex = 0;
+ }
+
+ currentImageGroupIndex = newIndex;
+
+ LoadImageFile(
+ currentImageGroup[currentImageGroupIndex]);
+ }
+
+
+ // --- mouse events ---
+
+ private void pictureBox1_MouseEnter(
+ object sender,
+ EventArgs e)
+ {
+ mouseOverPictureBox = true;
+
+ /*
+ * PictureBox štandardne nemusí mať focus.
+ * Focus pomôže zachytiť klávesy aj koliesko.
+ */
+ pictureBox1.Focus();
+ }
+
+ private void pictureBox1_MouseLeave(
+ object sender,
+ EventArgs e)
+ {
+ mouseOverPictureBox = false;
+ }
+
+ private void pictureBox1_MouseWheel(
+ object sender,
+ MouseEventArgs e)
+ {
+ if (!mouseOverPictureBox ||
+ currentImageGroup.Count <= 1)
+ {
+ return;
+ }
+
+ if (e.Delta > 0)
+ {
+ ShowPreviousImageFromGroup();
+ }
+ else if (e.Delta < 0)
+ {
+ ShowNextImageFromGroup();
+ }
+ }
///
/// Left click = Zoom, Right click = Unzoom
@@ -1276,7 +1731,9 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
{
if (lastImage == null)
{
+ Image previousImage = pictureBox1.Image;
pictureBox1.Image = new Bitmap(TBF.Properties.Resources.Empty);
+ previousImage?.Dispose();
return;
}
@@ -1312,10 +1769,108 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder
Brush brush = (brightness > 160) ? darkBrush : lightBrush;
grph.DrawString(lastWmNr1.ToString(), font, brush, margin, margin);
+
+ DrawImageInfo(grph, tempBmp);
}
+ Image oldPictureBoxImage = pictureBox1.Image;
pictureBox1.Image = tempBmp;
+ oldPictureBoxImage?.Dispose();
}
+
+ private void DrawImageInfo( Graphics graphics, Bitmap bitmap)
+ {
+ if (graphics == null)
+ {
+ throw new ArgumentNullException(nameof(graphics));
+ }
+
+ if (bitmap == null)
+ {
+ throw new ArgumentNullException(nameof(bitmap));
+ }
+
+ string currentImageFileName = GetCurrentImageFileName();
+
+ if (string.IsNullOrWhiteSpace(currentImageFileName))
+ {
+ return;
+ }
+
+ string fileName = Path.GetFileName(currentImageFileName);
+
+ string displayText = fileName;
+
+ Match match = Regex.Match( fileName, @"_img(?\d+)_(?\d{8})_(?
- public interface ITestMethodSmart
+ public interface ITestMethodSmart : ITestMethod
{
}
diff --git a/TBF/Rig/Network/Camera/CJMS11/Camera.cs b/TBF/Rig/Network/Camera/CJMS11/Camera.cs
index 88971451d..552432ddd 100644
--- a/TBF/Rig/Network/Camera/CJMS11/Camera.cs
+++ b/TBF/Rig/Network/Camera/CJMS11/Camera.cs
@@ -3,6 +3,7 @@
///
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
@@ -19,6 +20,7 @@ using System.Windows.Forms;
using log4net;
using Renci.SshNet;
using Common;
+using Config.Entities;
using FluentNHibernate.Conventions;
using Newtonsoft.Json;
using TBF.Rig.Network.Telnet;
@@ -54,7 +56,8 @@ namespace TBF.Rig.Network.Camera.CJMS11
const string ClpPassword = "C1ern4V0d4";
-
+ private readonly SemaphoreSlim cameraReadLock = new SemaphoreSlim(1, 1);
+ //private readonly SemaphoreSlim cameraWriteLock = new SemaphoreSlim(1, 1);
///
/// Properties
@@ -67,10 +70,20 @@ namespace TBF.Rig.Network.Camera.CJMS11
{
get {
if (roiConfiguration!=null) {return roiConfiguration;}
- else { roiConfiguration = GetFirstRoiChild(); return roiConfiguration; }
+ else { roiConfiguration = GetFirstRoiCfgChild(); return roiConfiguration; }
}
set { if (roiConfiguration == null) roiConfiguration = value;}
}
+
+ private RoiForFixedStartCJMS11.Roi _roi;
+ public RoiForFixedStartCJMS11.Roi CamRoi
+ {
+ get {
+ if (_roi!=null) {return _roi;}
+ else { _roi = GetFirstRoiChild(); return _roi; }
+ }
+ set { if (_roi == null) _roi = value;}
+ }
public IPAddress IPAddress { get { return ipAddress; } }
IPAddress ipAddress;
@@ -132,26 +145,34 @@ namespace TBF.Rig.Network.Camera.CJMS11
int cameraTcpLocalPort;
TcpClient cameraTcpClient;
private NetworkStream cameraStream = null;
- private StreamWriter cameraWriter = null;
+ //private StreamWriter cameraWriter = null;
private StreamReader cameraReader = null;
private Image lastImage;
private bool lockCameraInitialisation = false;
Thread liveStreamListenerThread;
- static bool stopLiveStreamListenerFlag;
+ private bool stopLiveStreamListenerFlag;
public bool IsGrabImageListenerThreadAlive { get { return grabImageListenerThread != null && grabImageListenerThread.IsAlive; } }
Thread grabImageListenerThread;
- static bool stopGrabImageListenerFlag;
+ private bool stopGrabImageListenerFlag;
public void SetStopGrabImageListenerFlag() { stopGrabImageListenerFlag = true; }
Thread stopUIListenerThread;
- static bool stopUIListenerFlag;
+ private bool stopUIListenerFlag;
Thread saveImageListenerThread;
- static bool stopSaveImageListenerFlag;
+ private bool stopSaveImageListenerFlag;
public bool IsSaveImageListenerThreadAlive { get { return saveImageListenerThread != null && saveImageListenerThread.IsAlive; } }
+ ///
+ /// Send images part
+ ///
+ private Task> sendImagesTask;
+ private CancellationTokenSource sendImagesCts;
+
+ public bool IsSendImagesInProgress => sendImagesTask != null && !sendImagesTask.IsCompleted;
+
///
/// ROI related parameters
///
@@ -201,15 +222,21 @@ namespace TBF.Rig.Network.Camera.CJMS11
/// Detect a camera
CameraDetectionResult cameraDetectionResult = null;
- var detectJmsCamera = DetectJMSCamera();
- var timeoutTask = Task.Delay(TimeSpan.FromSeconds(2));
-
- //No Test
- var completedTask = Task.WhenAny(detectJmsCamera, timeoutTask).Result;
- if (completedTask == timeoutTask)
+ try
{
- cameraDetectionResult = new CameraDetectionResult();
- cameraDetectionResult.IsDetected = false;
+ cameraDetectionResult = Task
+ .Run(() => DetectJMSCamera())
+ .GetAwaiter()
+ .GetResult();
+ }
+ catch (Exception exc)
+ {
+ log.Error($"Camera detection failed: {exc.Message}");
+
+ cameraDetectionResult = new CameraDetectionResult
+ {
+ IsDetected = false
+ };
}
//test
@@ -217,11 +244,7 @@ namespace TBF.Rig.Network.Camera.CJMS11
// var detectJmsCamera2 = DetectJMSCamera("192.168.0.168",32456);
// Task.WaitAll(detectJmsCamera, detectJmsCamera1, detectJmsCamera2);
- if (cameraDetectionResult == null)
- {
- cameraDetectionResult = detectJmsCamera.Result;
- }
-
+
if (CameraCfg.DebugLevel == DebugMode.AutoDetect)
{
CameraCfg.DebugLevel = cameraDetectionResult.IsDetected ? DebugMode.DetectedOn : DebugMode.DetectedOff;
@@ -233,14 +256,30 @@ namespace TBF.Rig.Network.Camera.CJMS11
if (cameraDetectionResult.IsDetected)
{
- UiBridge.Bridge.OnCameraInfo(cameraIdx, string.Format("{0} ver.{1} {2} s/n {3}", Name, sdCardVer, ipAddress, CameraCfg.HardwareAddress));
+ ipAddress = cameraDetectionResult.IpAddress;
- // start live stream, grab image, ... listener thread
- UiBridge.Bridge.CameraUICmdHandler += HandleCameraUiCmd;
-
- //PromptCameraReceivedHandler += OnPromptReceivedCamera;
-
- ImageCameraHandler += OnPromptImageReceived;
+ UiBridge.Bridge.OnCameraInfo(
+ cameraIdx,
+ string.Format(
+ "{0} ver.{1} {2} s/n {3}",
+ Name,
+ sdCardVer,
+ ipAddress,
+ CameraCfg.HardwareAddress));
+
+ // start live stream, grab image, ... listener thread
+ UiBridge.Bridge.CameraUICmdHandler -= HandleCameraUiCmd;
+ UiBridge.Bridge.CameraUICmdHandler += HandleCameraUiCmd;
+
+ //PromptCameraReceivedHandler -= OnPromptReceivedCamera;
+ //PromptCameraReceivedHandler += OnPromptReceivedCamera;
+
+ ImageCameraHandler -= OnPromptImageReceived;
+ ImageCameraHandler += OnPromptImageReceived;
+
+ ImagesCameraHandler -= OnPromptImagesReceived;
+ ImagesCameraHandler += OnPromptImagesReceived;
+
}
else
{
@@ -250,12 +289,30 @@ namespace TBF.Rig.Network.Camera.CJMS11
}
private void OnPromptImageReceived(object sender, PromptReceivedImageEventArgs e)
+ {
+ if (e == null || e.image == null || cameraIdx != e.idxCamera)
+ {
+ return;
+ }
+
+ /*
+ * Bridge dostane svoju vlastnú kópiu.
+ */
+ Image bridgeImage = CloneImageToBitmap(e.image);
+
+ UiBridge.Bridge.OnImage( e.idxCamera, bridgeImage);
+
+ log.Debug( $"Image received from camera: {e.idxCamera}, pushed to bridge UI!");
+ }
+
+ private void OnPromptImagesReceived(object sender, PromptReceivedImagesEventArgs e)
{
if (e != null && e.image != null)
{
if (this.cameraIdx == e.idxCamera)
{
UiBridge.Bridge.OnImage(e.idxCamera, e.image);
+ log.Debug($"Image received from camera: {e.idxCamera}, pushed to bridge UI!");
}
}
}
@@ -396,134 +453,477 @@ namespace TBF.Rig.Network.Camera.CJMS11
{
return await DetectJMSCamera(CameraCfg.IPAddressCJMS, iPort);
}
+
+ async Task DetectJMSCamera( string ipAddressParam, int portParam)
+ {
+ var result = new CameraDetectionResult
+ {
+ IsDetected = false,
+ IpAddress = null,
+ Hardware = null,
+ Revision = null,
+ Serial = null,
+ SdCardVersion = null
+ };
+
+ if (CameraCfg.DebugLevel == DebugMode.Simulate)
+ {
+ result.IsDetected = true;
+ return result;
+ }
+
+ if (string.IsNullOrWhiteSpace(ipAddressParam))
+ {
+ log.Error( $"Camera {CameraCfg.Name}: IP address is missing.");
+ return result;
+ }
+
+ var detectionStopwatch = Stopwatch.StartNew();
+
+ try
+ {
+ using (var client = new TcpClient())
+ {
+ Task connectTask =
+ client.ConnectAsync(
+ ipAddressParam,
+ portParam);
+
+ Task timeoutTask =
+ Task.Delay(TimeSpan.FromSeconds(1));
+
+ Task completedTask =
+ await Task.WhenAny(
+ connectTask,
+ timeoutTask)
+ .ConfigureAwait(false);
+
+ if (completedTask == timeoutTask)
+ {
+ client.Close();
+ throw new TimeoutException( $"Camera connection timeout after 1 second: {ipAddressParam}:{portParam}");
+ }
+
+ // Vyhodí SocketException, ak ConnectAsync zlyhal.
+ await connectTask.ConfigureAwait(false);
+
+ if (!client.Connected)
+ {
+ throw new IOException( $"Camera connection was not established: {ipAddressParam}:{portParam}");
+ }
+
+ log.Debug( $"Camera connected: name={CameraCfg.Name}, IP={ipAddressParam}, port={portParam}");
+
+ using (NetworkStream stream = client.GetStream())
+ {
+ // Jeden reader pre celé spojenie.
+ var reader = new CameraLineReader( stream, 64 * 1024);
+
+ this.ipAddress = IPAddress.Parse(ipAddressParam);
+
+ /*
+ * 1. Nastavenie typu kamery
+ */
+ string configMessage = getConfigMessage();
+
+ JmsPacket typeCameraAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.type_camera_,
+ configMessage,
+ 5000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ if (typeCameraAnswer == null || typeCameraAnswer.JmsMessage.Status != MessageStatus.ACK)
+ {
+ log.Warn( $"type_camera failed: " + $"camera={CameraCfg.Name}, " + $"IP={ipAddressParam}, " + $"answer={FormatPacketForLog(typeCameraAnswer)}");
+ }
+
+ /*
+ * 2. Prepare camera
+ */
+ JmsPacket prepareAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.prepare_camera_,
+ null,
+ 3000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ bool alreadyOpened =
+ prepareAnswer != null &&
+ prepareAnswer.JmsMessage.Status ==
+ MessageStatus.NACK &&
+ !string.IsNullOrEmpty(
+ prepareAnswer.JmsMessage.Payload) &&
+ prepareAnswer.JmsMessage.Payload.Contains(
+ "OPENED");
+
+ if (alreadyOpened)
+ {
+ log.Debug( $"Camera already opened: " + $"name={CameraCfg.Name}, " + $"IP={ipAddressParam}");
+ }
+ else if (prepareAnswer == null || prepareAnswer.JmsMessage.Status != MessageStatus.ACK)
+ {
+ log.Warn( $"Prepare camera failed: " + $"camera={CameraCfg.Name}, " + $"IP={ipAddressParam}, " + $"answer={FormatPacketForLog(prepareAnswer)}");
+
+ /*
+ * Pokus o reset:
+ * close -> prepare
+ */
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.close_,
+ null,
+ 2000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ prepareAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.prepare_camera_,
+ null,
+ 3000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ bool restartSucceeded =
+ prepareAnswer != null &&
+ (
+ prepareAnswer.JmsMessage.Status ==
+ MessageStatus.ACK ||
+ (
+ prepareAnswer.JmsMessage.Status ==
+ MessageStatus.NACK &&
+ !string.IsNullOrEmpty(
+ prepareAnswer.JmsMessage.Payload) &&
+ prepareAnswer.JmsMessage.Payload.Contains(
+ "OPENED")
+ )
+ );
+
+ if (!restartSucceeded)
+ {
+ log.Error(
+ $"Camera prepare restart failed: " +
+ $"camera={CameraCfg.Name}, " +
+ $"IP={ipAddressParam}, " +
+ $"answer={FormatPacketForLog(prepareAnswer)}");
+ }
+ }
+
+ /*
+ * 3.1 Warm-up grab after type_camera + prepare_camera.
+ *
+ * Hardvér po inicializácii potrebuje vytvoriť aspoň jeden obrázok.
+ * Obrázok pri detekcii nepotrebujeme ukladať ani posielať do UI.
+ */
+ JmsPacket grabAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.grab_image_,
+ null,
+ 10000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ if (grabAnswer == null || grabAnswer.JmsMessage == null || grabAnswer.JmsMessage.Status != MessageStatus.ACK)
+ {
+ throw new IOException( $"Camera initialization grab failed: camera={CameraCfg.Name}, " +
+ $"IP={ipAddressParam}, answer={FormatPacketForLog(grabAnswer)}");
+ }
+
+ try
+ {
+ ParsedImage initializationImage =
+ grabAnswer.JmsMessage.getImage();
+
+ if (initializationImage == null)
+ {
+ throw new IOException( "Initialization grab returned no parsed image.");
+ }
+
+ if (initializationImage.Encoding != ImageType.BASE_64)
+ {
+ throw new IOException( $"Initialization grab returned unsupported encoding: " + $"{initializationImage.Encoding}");
+ }
+
+ // Vyvolá Base64 dekódovanie a tým overí, že obrázok je platný.
+ using (Image warmUpImage = initializationImage.Image)
+ {
+ if (warmUpImage == null)
+ {
+ throw new IOException(
+ "Initialization grab returned a null image.");
+ }
+
+ log.Debug(
+ $"Initialization image captured: " +
+ $"camera={CameraCfg.Name}, " +
+ $"IP={ipAddressParam}, " +
+ $"size={warmUpImage.Width}x{warmUpImage.Height}");
+ }
+ }
+ catch (Exception exc)
+ {
+ throw new IOException( $"Cannot process initialization image: camera={CameraCfg.Name}, " +
+ $"IP={ipAddressParam}, error={exc.Message}", exc);
+ }
+
+
+
+
+ /*
+ * 3.2 Status
+ */
+ JmsPacket statusAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.status_,
+ null,
+ 3000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ if (statusAnswer == null ||
+ statusAnswer.JmsMessage.Status !=
+ MessageStatus.ACK)
+ {
+ log.Warn(
+ $"Camera status failed: " +
+ $"camera={CameraCfg.Name}, " +
+ $"IP={ipAddressParam}, " +
+ $"answer={FormatPacketForLog(statusAnswer)}");
+ }
+
+ /*
+ * 4. Get configuration
+ */
+ JmsPacket configAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.get_cfg_,
+ null,
+ 3000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ if (configAnswer == null ||
+ configAnswer.JmsMessage.Status !=
+ MessageStatus.ACK)
+ {
+ throw new IOException(
+ $"Camera get_cfg failed: " +
+ $"camera={CameraCfg.Name}, " +
+ $"IP={ipAddressParam}, " +
+ $"answer={FormatPacketForLog(configAnswer)}");
+ }
+
+ result.IpAddress =
+ IPAddress.Parse(ipAddressParam);
+
+ result.Hardware = string.Empty;
+ result.Revision = string.Empty;
+ result.Serial = string.Empty;
+ result.SdCardVersion = string.Empty;
+ result.Response = configAnswer.ToString();
+ result.IsDetected = true;
+
+ string origin =
+ string.IsNullOrEmpty(configAnswer.MessageOrigin)
+ ? "unknown origin"
+ : configAnswer.MessageOrigin;
+
+ detectionStopwatch.Stop();
+ result.Duration_ms =
+ detectionStopwatch.Elapsed.TotalMilliseconds;
+
+ log.Debug(
+ $"Camera detected: " +
+ $"name={CameraCfg.Name}, " +
+ $"duration={result.Duration_ms:F0} ms, " +
+ $"HWAddress={CameraCfg.HardwareAddress}, " +
+ $"IP={ipAddressParam}, " +
+ $"origin={origin}");
+
+ /*
+ * Voliteľný cleanup.
+ *
+ * Ak má kamera po detekcii zostať otvorená,
+ * túto časť odstráň.
+ */
+ try
+ {
+ JmsPacket closeAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.close_,
+ null,
+ 2000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ bool closeAccepted =
+ closeAnswer != null &&
+ (
+ closeAnswer.JmsMessage.Status == MessageStatus.ACK ||
+ (
+ closeAnswer.JmsMessage.Status == MessageStatus.NACK &&
+ !string.IsNullOrEmpty(closeAnswer.JmsMessage.Payload) &&
+ closeAnswer.JmsMessage.Payload.Contains(
+ "Close command already in progress")
+ )
+ );
+
+ if (!closeAccepted)
+ {
+ log.Warn(
+ $"Close after detection was not confirmed: " +
+ $"camera={CameraCfg.Name}, " +
+ $"answer={FormatPacketForLog(closeAnswer)}");
+ }
+ }
+ catch (Exception closeException)
+ {
+ log.Warn(
+ $"Camera close after detection failed: " +
+ $"{closeException.Message}");
+ }
+ /*
+ * Disconnect after detection.
+ */
+ try
+ {
+ await SendCommandAsync(
+ stream,
+ CommandM.disconnect_,
+ CancellationToken.None,
+ null)
+ .ConfigureAwait(false);
+
+ log.Debug(
+ $"Disconnect command sent after detection: " +
+ $"camera={CameraCfg.Name}, IP={ipAddressParam}");
+ }
+ catch (Exception disconnectException)
+ {
+ log.Warn(
+ $"Camera disconnect after detection failed: " +
+ $"{disconnectException.Message}");
+ }
+
+ return result;
+ }
+ }
+ }
+ catch (TimeoutException exc)
+ {
+ detectionStopwatch.Stop();
+ result.Duration_ms =
+ detectionStopwatch.Elapsed.TotalMilliseconds;
+
+ log.Error(
+ $"Camera detection timeout: " +
+ $"name={CameraCfg.Name}, " +
+ $"HWAddress={CameraCfg.HardwareAddress}, " +
+ $"IP={ipAddressParam}, " +
+ $"port={portParam}, " +
+ $"duration={result.Duration_ms:F0} ms, " +
+ $"error={exc.Message}");
+ }
+ catch (SocketException exc)
+ {
+ detectionStopwatch.Stop();
+ result.Duration_ms =
+ detectionStopwatch.Elapsed.TotalMilliseconds;
+
+ log.Error(
+ $"Camera socket connection failed: " +
+ $"name={CameraCfg.Name}, " +
+ $"IP={ipAddressParam}, " +
+ $"port={portParam}, " +
+ $"socketError={exc.SocketErrorCode}, " +
+ $"error={exc.Message}");
+ }
+ catch (Exception exc)
+ {
+ detectionStopwatch.Stop();
+ result.Duration_ms =
+ detectionStopwatch.Elapsed.TotalMilliseconds;
+
+ log.Error(
+ $"Camera detection failed: " +
+ $"name={CameraCfg.Name}, " +
+ $"HWAddress={CameraCfg.HardwareAddress}, " +
+ $"IP={ipAddressParam}, " +
+ $"port={portParam}, " +
+ $"duration={result.Duration_ms:F0} ms, " +
+ $"error={exc.Message}",
+ exc);
+ }
+
+ result.IsDetected = false;
+ result.IpAddress = null;
+ result.Hardware = null;
+ result.Revision = null;
+ result.Serial = null;
+ result.SdCardVersion = null;
+
+ return result;
+ }
- async Task DetectJMSCamera(string ipAddressParam, int portParam)
+ private static string FormatPacketForLog( JmsPacket packet)
+ {
+ if (packet == null)
+ return "";
+
+ if (packet.JmsMessage == null)
+ return "";
+
+ string payload = packet.JmsMessage.Payload;
+
+ if (!string.IsNullOrEmpty(payload) && payload.Length > 200)
+ {
+ payload = payload.Substring(0, 200) + "...";
+ }
+
+ return $"command={packet.JmsMessage.Command}, " + $"status={packet.JmsMessage.Status}, " + $"payload={payload}";
+ }
+
+ private async Task ClearPendingResponsesAsync(StreamReader reader)
{
- CameraDetectionResult result = new CameraDetectionResult();
- if (CameraCfg.IPAddressCJMS != null)
+ await cameraReadLock.WaitAsync();
+
+ try
{
- try
+ while (reader.Peek() >= 0)
{
-
- using (this.cameraTcpClient = new TcpClient())
- {
- var connectTask = this.cameraTcpClient.ConnectAsync(ipAddressParam, portParam);
- var timeoutTask = Task.Delay(TimeSpan.FromSeconds(1));
-
- var completedTask = Task.WhenAny(connectTask, timeoutTask).Result;
-
- if (completedTask == timeoutTask)
- {
- throw new TimeoutException("Connection attempt timed out after 1 second.");
- }
- //TcpClient tcpClient = await EstablishCameraConnection(CameraCfg.IPAddressCJMS, iPort);
- log.Debug(string.Format("Camera connected to server {0}:{1}.", CameraCfg.IPAddressCJMS, iPort));
- this.ipAddress = IPAddress.Parse(CameraCfg.IPAddressCJMS);
- // Get network stream
-
-
- using (NetworkStream stream = cameraTcpClient.GetStream())
- using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII) { AutoFlush = true })
- using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
- {
- stream.ReadTimeout = 1000;
-
- // Send command
- DateTime detectionStart = DateTime.Now;
-
- // create config and send
- string message = getConfigMessage();
- JmsPacket answer = SendCommandAndWaitToAnswer(writer, reader, CommandM.type_camera_,message);
- if (answer == null || answer.JmsMessage.Status != MessageStatus.ACK)
- {
- log.Error(answer);
- }
- //Prepare camera
- JmsPacket answerPrepare = SendCommandAndWaitToAnswer(writer, reader, CommandM.prepare_camera_);
- if (answerPrepare == null || answerPrepare.JmsMessage.Status != MessageStatus.ACK)
- {
- if (!(answerPrepare != null && answerPrepare.JmsMessage.Status == MessageStatus.NACK &&
- answerPrepare.JmsMessage.Payload == "OPENED")) //correct if NACK & OPENED
- {
- log.Error(answerPrepare);
- }
- else
- {
- SendCommandAndWaitToAnswer(writer, reader, CommandM.close_);
- var sendCommandAndWaitToAnswer = SendCommandAndWaitToAnswer(writer, reader, CommandM.prepare_camera_);
- if (sendCommandAndWaitToAnswer == null || sendCommandAndWaitToAnswer.JmsMessage.Status == MessageStatus.NACK) //correct if NACK & OPENED
- {
- log.Error("Restart close, prepare camera not successfully! see: " + answerPrepare);
- }
- }
- }
- //Status
- JmsPacket answerStatus = SendCommandAndWaitToAnswer(writer, reader, CommandM.status_);
- if (answerStatus == null || answerStatus.JmsMessage.Status != MessageStatus.ACK)
- {
- log.Error(answerStatus);
- }
- //Get config
- JmsPacket answerCfg = SendCommandAndWaitToAnswer(writer, reader, CommandM.get_cfg_);
- if (answerCfg == null || answerCfg.JmsMessage.Status != MessageStatus.ACK)
- {
- log.Error(answerCfg);
- }else{
- result.IpAddress = IPAddress.Parse(ipAddressParam);
- }
-
-
- result.Duration_ms = (DateTime.Now - detectionStart).TotalMilliseconds;
-
- result.Hardware = string.Empty;
- result.Revision = string.Empty;
- result.Serial = string.Empty;
- result.SdCardVersion = string.Empty;
-
- string msg = string.Format("Camera {0} detected in {1} ms: HWAddress={2} IPAddress={3} {4}",
- CameraCfg.Name,
- result.Duration_ms,
- CameraCfg.HardwareAddress,
- this.ipAddress == null ? "not detected" : this.ipAddress.ToString(),
- answerCfg.MessageOrigin);
- log.Debug(msg);
- Console.WriteLine(msg);
-
- cameraTcpClient.Dispose();
- cameraTcpClient = null;
-
- result.IsDetected = true;
- return result; /// Camera detected
- }
- }
- }
- catch (Exception exc)
- {
- log.ErrorFormat("Camera {0} with HWAddress={1} not detected : {2}", CameraCfg.Name,
- CameraCfg.HardwareAddress, exc.Message);
+ string oldLine = reader.ReadLine();
+ log.Debug("Discarded old camera response: " + oldLine);
}
}
-
- if (CameraCfg.DebugLevel == DebugMode.Simulate)
+ catch (IOException)
{
- result.Hardware = null;
- result.Revision = null;
- result.Serial = null;
- result.SdCardVersion = null;
- result.IpAddress = null;
-
- result.IsDetected = true;
- return result;
}
-
- result.Hardware = null;
- result.Revision = null;
- result.Serial = null;
- result.SdCardVersion = null;
- result.IpAddress = null;
-
- result.IsDetected = false;
- return result; /// No camera detected
+ catch (Exception exc)
+ {
+ log.Warn("ClearPendingResponses failed: " + exc.Message);
+ }
+ finally
+ {
+ cameraReadLock.Release();
+ }
}
class SensorConfig{
@@ -546,13 +946,13 @@ namespace TBF.Rig.Network.Camera.CJMS11
}
}
- private RoiCfg GetFirstRoiChild()
+ private RoiCfg GetFirstRoiCfgChild()
{
/// Load the list of components from the database
var session = TBF.DB.CreateSession(DBKind.Config);
var cmptnEntities = session.QueryOver().OrderBy(x => x.ItemNr).Asc.List();
-
+
List cfgs = new List();
IList components = new List();
foreach (var component in cmptnEntities)
@@ -561,25 +961,136 @@ namespace TBF.Rig.Network.Camera.CJMS11
{
IComponentFactory cmpntFactory = Rig.TbfComponents.CmpntFactoryFromClassName(component.ClassName);
if (cmpntFactory == null) continue;
-
+
IList tbfComponents = Rig.TbfComponents.LoadComponentsFromDB(cmptnEntities);
IComponentCfg cmpntCfgFromCmpntEntity = cmpntFactory.CmpntCfgFromCmpntEntity(component);
-
+
IComponent cmpnt = cmpntFactory.GetComponent(cmpntCfgFromCmpntEntity, components);
-
+
RoiForFixedStartCJMS11.RoiCfg roi = cmpntCfgFromCmpntEntity as RoiForFixedStartCJMS11.RoiCfg;
-
+
if (roi != null)
{
cfgs.Add(roi);
}
}
}
-
+
/// get fist found configuration
return cfgs.First();
}
+ private RoiForFixedStartCJMS11.Roi GetFirstRoiChild()
+ {
+ using (var session = TBF.DB.CreateSession(DBKind.Config))
+ {
+ var componentEntities = session
+ .QueryOver()
+ .OrderBy(x => x.ItemNr)
+ .Asc
+ .List();
+
+ IList components =
+ Rig.TbfComponents.LoadComponentsFromDB(componentEntities);
+
+ var roi = components
+ .OfType()
+ .FirstOrDefault(x =>
+ x.Cfg != null &&
+ string.Equals(
+ x.Cfg.ParentName,
+ Name,
+ StringComparison.Ordinal));
+
+ if (roi == null)
+ {
+ log.WarnFormat(
+ "No ROI child was found for camera '{0}'.",
+ Name);
+
+ return null;
+ }
+
+ var roiCfg = roi.Cfg as RoiForFixedStartCJMS11.RoiCfg;
+
+ if (roiCfg == null)
+ {
+ log.WarnFormat(
+ "ROI '{0}' has an invalid configuration type.",
+ roi.Name);
+
+ return roi;
+ }
+
+ LoadProcedureParams(session, roiCfg);
+
+ return roi;
+ }
+ }
+
+ private void LoadProcedureParams(
+ NHibernate.ISession session,
+ RoiForFixedStartCJMS11.RoiCfg roiCfg)
+ {
+ if (roiCfg == null)
+ {
+ return;
+ }
+
+ var currentProcedure = StateMachine.Procedure;
+
+ if (currentProcedure == null)
+ {
+ log.WarnFormat(
+ "Cannot load procedure parameters for ROI '{0}': " +
+ "current procedure is null.",
+ roiCfg.Name);
+
+ return;
+ }
+
+ var dbParams = session
+ .QueryOver()
+ .Where(x => x.CmpntName == roiCfg.Name)
+ .And(x => x.Procedure == currentProcedure)
+ .SingleOrDefault();
+
+ if (dbParams == null)
+ {
+ log.WarnFormat(
+ "No procedure parameters found for ROI '{0}', procedure '{1}'. " +
+ "Using default values.",
+ roiCfg.Name,
+ currentProcedure);
+
+ return;
+ }
+
+ if (roiCfg.ProcParams == null)
+ {
+ roiCfg.ProcParams = new ProcedureParams();
+ }
+
+ if (!roiCfg.ProcParams.UpdateFromDbEntity(dbParams))
+ {
+ log.WarnFormat(
+ "Failed to deserialize procedure parameters for ROI '{0}', " +
+ "procedure '{1}'.",
+ roiCfg.Name,
+ currentProcedure);
+
+ return;
+ }
+
+ log.DebugFormat(
+ "Loaded ROI procedure parameters: ROI='{0}', procedure='{1}', " +
+ "RoiPicCount={2}, RoiDeltaTimeMs={3}.",
+ roiCfg.Name,
+ currentProcedure,
+ roiCfg.ProcParams.RoiPicCount,
+ roiCfg.ProcParams.RoiDeltaTimeMs);
+ }
+
private string getConfigMessage()
{
//CameraCfg
@@ -629,7 +1140,8 @@ namespace TBF.Rig.Network.Camera.CJMS11
log.Debug("Handle CameraUICmd received - Live");
stopLiveStreamListenerFlag = false;
stopUIListenerFlag = true;
- StartLiveStreamListener(IPAddress, iPort);
+ StartLiveStreamListener();
+ //StartLiveStreamListener(IPAddress, iPort);
}
else if (e.CameraUICmd == CameraUICmd.Stop)
{
@@ -640,7 +1152,7 @@ namespace TBF.Rig.Network.Camera.CJMS11
else if (e.CameraUICmd == CameraUICmd.Grab)
{
log.Debug($"Handle CameraUICmd received - GrabImage - camera idx: {cameraIdx}");
- stopUIListenerFlag = true;
+ //stopUIListenerFlag = true;
StopUiThreads();
StartGrabImageListener();
}
@@ -704,40 +1216,59 @@ namespace TBF.Rig.Network.Camera.CJMS11
}
}
- public void SaveImageToFile(Image imageToSave, string fileNamePath)
+ public void SaveImageToFile(
+ Image imageToSave,
+ string fileNamePath)
{
if (imageToSave == null)
{
- log.Error("Nothing to save in SaveImageToFile");
- return; // nothing to save
+ throw new ArgumentNullException(nameof(imageToSave));
}
- if (fileNamePath == null || fileNamePath.IsEmpty())
+ if (string.IsNullOrWhiteSpace(fileNamePath))
{
- log.Error("Path to save missing!");
- return; // nothing to save
+ throw new ArgumentException(
+ "Path to save is missing.",
+ nameof(fileNamePath));
}
-
- try
- {
- string filePath = fileNamePath;
-
- string path = Path.GetDirectoryName(filePath);
- if (path != null && path.IsNotEmpty())
- {
- Directory.CreateDirectory(path);
- }
+ string directory =
+ Path.GetDirectoryName(fileNamePath);
- using (var clonedImage = CloneImageToBitmap(imageToSave))
- {
- clonedImage.Save(filePath, ImageFormat.Png); // encoder, encoderParams);
- }
- log.Debug("Image saved to: " + filePath);
- }catch(Exception exc)
+ if (!string.IsNullOrWhiteSpace(directory))
{
- log.Error("Error saving image: " + exc.Message);
- throw;
+ Directory.CreateDirectory(directory);
+ }
+
+ ImageFormat format =
+ GetImageFormatFromFileName(fileNamePath);
+
+ using (var clonedImage = CloneImageToBitmap(imageToSave))
+ {
+ clonedImage.Save(fileNamePath, format);
+ }
+
+ log.Debug("Image saved to: " + fileNamePath);
+ }
+
+ private static ImageFormat GetImageFormatFromFileName(
+ string fileName)
+ {
+ string extension =
+ Path.GetExtension(fileName)?.ToLowerInvariant();
+
+ switch (extension)
+ {
+ case ".bmp":
+ return ImageFormat.Bmp;
+
+ case ".jpg":
+ case ".jpeg":
+ return ImageFormat.Jpeg;
+
+ case ".png":
+ default:
+ return ImageFormat.Png;
}
}
@@ -768,9 +1299,36 @@ namespace TBF.Rig.Network.Camera.CJMS11
saveImageListenerThread.Start();
}
+ private Task saveImageTask;
+
+ public bool IsSaveImageInProgress =>
+ saveImageTask != null &&
+ !saveImageTask.IsCompleted;
+
+ public Task StartSaveImageToFileAsync( Image image, string fileName)
+ {
+ if (image == null)
+ throw new ArgumentNullException(nameof(image));
+
+ if (string.IsNullOrWhiteSpace(fileName))
+ throw new ArgumentException(
+ "File name is required.",
+ nameof(fileName));
+
+ if (saveImageTask != null && !saveImageTask.IsCompleted)
+ {
+ log.Warn( $"Image save already running: cameraIdx={cameraIdx}, file={fileName}");
+ return saveImageTask;
+ }
+
+ saveImageTask = Task.Run( () => SaveImageToFile(image, fileName));
+
+ return saveImageTask;
+ }
+
private void StartSaveImageListener()
{
- Task saveImageTask = Task.Run(() => SaveImageListener());
+ Task saveImageTask = Task.Run(() => SaveImageListenerAsynch());
var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(1));
var completedAnswerTask = Task.WhenAny(saveImageTask, timeoutAnswerTask).Result;
if (completedAnswerTask == timeoutAnswerTask)
@@ -790,7 +1348,7 @@ namespace TBF.Rig.Network.Camera.CJMS11
public void StartSaveImageListener(string filePath)
{
- Task saveImageTask = Task.Run(() => SaveImageListener());
+ Task saveImageTask = Task.Run(() => SaveImageListenerAsynch());
var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(1));
var completedAnswerTask = Task.WhenAny(saveImageTask, timeoutAnswerTask).Result;
if (completedAnswerTask == timeoutAnswerTask)
@@ -847,7 +1405,7 @@ namespace TBF.Rig.Network.Camera.CJMS11
}
// Check if the connect task completed successfully
- connectTask.GetAwaiter().GetResult(); // Throws if failed
+ //connectTask.GetAwaiter().GetResult()); // Throws if failed
if (camTcpClient.Connected)
{
@@ -914,125 +1472,244 @@ namespace TBF.Rig.Network.Camera.CJMS11
}
}
-
- public async Task SaveImageListener()
+
+
+ private async Task ConnectCameraAsync(int timeoutMs, CancellationToken ct)
{
- Image imageToReturn = null;
- using (this.cameraTcpClient = new TcpClient())
+ var client = new TcpClient();
+
+ var connectTask = client.ConnectAsync(CameraCfg.IPAddressCJMS, iPort);
+ var timeoutTask = Task.Delay(timeoutMs, ct);
+
+ var completed = await Task.WhenAny(connectTask, timeoutTask);
+
+ if (completed == timeoutTask)
{
+ client.Close();
+ throw new TimeoutException($"Connection timeout after {timeoutMs} ms.");
+ }
+
+ await connectTask;
+
+ log.Debug($"Camera connected to server {CameraCfg.IPAddressCJMS}:{iPort}.");
+ ipAddress = IPAddress.Parse(CameraCfg.IPAddressCJMS);
+
+ return client;
+ }
+
+ private async Task ConnectCameraAsync(
+ int timeoutMs,
+ CancellationToken ct,
+ int maxAttempts = 3,
+ int retryDelayMs = 300)
+ {
+ Exception lastException = null;
+
+ for (int attempt = 1; attempt <= maxAttempts; attempt++)
+ {
+ ct.ThrowIfCancellationRequested();
+
+ var client = new TcpClient();
+
try
{
- EstablishCameraConnection(ref this.cameraTcpClient, CameraCfg.IPAddressCJMS, iPort);
+ log.Debug( $"Connecting to camera: cameraIdx={cameraIdx}, IP={CameraCfg.IPAddressCJMS}, port={iPort}, " +
+ $"attempt={attempt}/{maxAttempts}");
- log.Debug(string.Format("Camera connected to server {0}:{1}.", CameraCfg.IPAddressCJMS, iPort));
- ipAddress = IPAddress.Parse(CameraCfg.IPAddressCJMS);
+ Task connectTask = client.ConnectAsync( CameraCfg.IPAddressCJMS, iPort);
+ Task timeoutTask = Task.Delay( timeoutMs, ct);
- using (cameraStream = this.cameraTcpClient.GetStream())
- using (cameraWriter = new StreamWriter(cameraStream, Encoding.ASCII) { AutoFlush = true })
- using (cameraReader = new StreamReader(cameraStream, Encoding.ASCII))
+ Task completedTask = await Task.WhenAny(connectTask, timeoutTask).ConfigureAwait(false);
+
+ if (completedTask == timeoutTask)
{
- cameraStream.ReadTimeout = 1000;
+ ct.ThrowIfCancellationRequested();
- SendCommand(CommandM.prepare_camera_);
+ client.Close();
- bool inError = false;
- stopSaveImageListenerFlag = false;
- while (!stopSaveImageListenerFlag)
- {
- try
- {
- SendCommand(CommandM.grab_image_);
- Task responseAnswerTask = cameraReader.ReadLineAsync();
- var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(1));
- var completedAnswerTask = Task.WhenAny(responseAnswerTask, timeoutAnswerTask).Result;
-
- if (completedAnswerTask == timeoutAnswerTask)
- {
- throw new TimeoutException("Answer response attempt timed out after 1 second.");
- }
-
- string responseAnswer = responseAnswerTask.Result;
- if (responseAnswer.Length > 0)
- {
- /// Process the packet
- JmsPacket newPacket = new JmsPacket(responseAnswer);
-
- switch (newPacket.JmsMessage.Command)
- {
- case CommandM.grab_image_:
- if (newPacket.JmsMessage.Status != MessageStatus.ACK)
- {
- if (inError)
- {
- return null; // camera in error - finish thread
- }
- SendCommand(CommandM.prepare_camera_);
- inError = true;
- }
- ParsedImage parsedImage = newPacket.JmsMessage.getImage();
- if (parsedImage.Encoding == ImageType.BASE_64)
- {
- Image image = parsedImage.Image;
-
-
- if (showOverlayRect && overlayRect != null && overlayThickness > 0)
- {
- int penWidth = 1;
- Pen pen = new Pen(Color.Green, penWidth);
- using (var grph = Graphics.FromImage(image))
- {
- if (penWidth != overlayThickness)
- {
- penWidth = overlayThickness;
- pen = new Pen(Color.Green, penWidth);
- }
-
- grph.DrawRectangle(pen, overlayRect);
- }
- }
-
- imageToReturn = image;
- stopSaveImageListenerFlag =
- true; // mam obrazok ukoncim a zavriem thread
- }
-
- break;
- default:
- break;
- }
- }
-
- }
- catch (Exception exc)
- {
- string msg = string.Format("Exception in MJpeg RTP listener thread: {0}", exc.Message);
- log.Error(msg);
- }
- }
-
- stopGrabImageListenerFlag = false;
- SendCommand(CommandM.close_);
- SendCommand(CommandM.disconnect_);
-
- CloseCameraResources();
-
- return imageToReturn;
-
+ throw new TimeoutException( $"Connection timeout after {timeoutMs} ms. Attempt {attempt}/{maxAttempts}.");
}
- }catch(Exception exc)
+
+ // Dôležité: načíta prípadnú SocketException.
+ await connectTask.ConfigureAwait(false);
+
+ if (!client.Connected)
+ {
+ throw new SocketException(
+ (int)SocketError.NotConnected);
+ }
+
+ client.NoDelay = true;
+
+ log.Debug( $"Camera connected: cameraIdx={cameraIdx}, IP={CameraCfg.IPAddressCJMS}, port={iPort}, " +
+ $"attempt={attempt}");
+
+ ipAddress =
+ IPAddress.Parse(
+ CameraCfg.IPAddressCJMS);
+
+ return client;
+ }
+ catch (OperationCanceledException)
{
- log.Error($"Save Image exception: {exc.Message}");
+ client.Close();
+ throw;
+ }
+ catch (Exception exc)
+ {
+ client.Close();
+ lastException = exc;
+
+ log.Warn( $"Camera connection attempt failed: cameraIdx={cameraIdx}, IP={CameraCfg.IPAddressCJMS}, " +
+ $"attempt={attempt}/{maxAttempts}, error={exc.Message}");
+
+ if (attempt < maxAttempts)
+ {
+ await Task.Delay(
+ retryDelayMs,
+ ct)
+ .ConfigureAwait(false);
+ }
}
}
- return imageToReturn;
+
+ throw new IOException(
+ $"Unable to connect to camera {CameraCfg.IPAddressCJMS}:{iPort} after {maxAttempts} attempts.",
+ lastException);
+ }
+
+ public async Task SaveImageListenerAsynch()
+ {
+ saveCts?.Cancel();
+ saveCts = new CancellationTokenSource();
+
+ return await SaveImageListenerAsynch(saveCts.Token);
+ }
+
+ public async Task SaveImageListenerAsynch(CancellationToken ct)
+ {
+ Image imageToReturn = null;
+
+ await cameraOperationLock.WaitAsync(ct);
+
+ try
+ {
+ using (TcpClient client = await ConnectCameraAsync(1000, ct))
+ using (NetworkStream stream = client.GetStream())
+ {
+ var reader = new CameraLineReader(
+ stream,
+ 64 * 1024);
+
+ JmsPacket prepareAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.prepare_camera_,
+ null,
+ 3000,
+ ct)
+ .ConfigureAwait(false);
+ bool alreadyOpened =
+ prepareAnswer != null &&
+ prepareAnswer.JmsMessage.Status ==
+ MessageStatus.NACK &&
+ !string.IsNullOrEmpty(
+ prepareAnswer.JmsMessage.Payload) &&
+ prepareAnswer.JmsMessage.Payload.Contains(
+ "OPENED");
+
+ if (alreadyOpened)
+ {
+ log.Debug( $"Camera already OPENED: " + $"cameraIdx={cameraIdx}, " + $"IP={CameraCfg.IPAddressCJMS}");
+ }
+ else if (prepareAnswer == null || prepareAnswer.JmsMessage.Status != MessageStatus.ACK)
+ {
+ log.Error( $"Prepare camera failed: " + $"cameraIdx={cameraIdx}, " + $"IP={CameraCfg.IPAddressCJMS}");
+ return null;
+ }
+
+ JmsPacket grabAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.grab_image_,
+ null,
+ 10000,
+ ct)
+ .ConfigureAwait(false);
+
+ if (grabAnswer == null || grabAnswer.JmsMessage.Status != MessageStatus.ACK)
+ {
+ log.Error( $"Grab image failed: " + $"cameraIdx={cameraIdx}, " + $"IP={CameraCfg.IPAddressCJMS}");
+ return null;
+ }
+
+ ParsedImage parsedImage = grabAnswer.JmsMessage.getImage();
+
+ if (parsedImage == null)
+ {
+ log.Error( $"Parsed image is null: " + $"cameraIdx={cameraIdx}");
+ return null;
+ }
+
+ if (parsedImage.Encoding != ImageType.BASE_64)
+ {
+ log.Error( $"Unsupported image encoding: " + $"cameraIdx={cameraIdx}, " + $"encoding={parsedImage.Encoding}");
+ return null;
+ }
+
+
+
+ imageToReturn = parsedImage.Image;
+
+ if (imageToReturn == null)
+ {
+ log.Error( $"Decoded image is null: " + $"cameraIdx={cameraIdx}");
+ return null;
+ }
+
+ DrawOverlay(imageToReturn);
+
+ await TryCloseCameraAsync( stream, reader).ConfigureAwait(false);
+
+ return imageToReturn;
+ }
+ }
+ catch (OperationCanceledException)
+ {
+ log.Debug( $"Save image cancelled: cameraIdx={cameraIdx}");
+ return null;
+ }
+ catch (TimeoutException exc)
+ {
+ log.Error( $"Save image timeout: cameraIdx={cameraIdx}, IP={CameraCfg.IPAddressCJMS}, error={exc.Message}");
+ return null;
+ }
+ catch (Exception exc)
+ {
+ log.Error( $"Save image exception: cameraIdx={cameraIdx}, IP={CameraCfg.IPAddressCJMS}, error={exc.Message}", exc);
+ return null;
+ }
+ finally
+ {
+ cameraOperationLock.Release();
+ }
}
void StopUiThreads()
{
+ liveCts?.Cancel();
+ grabCts?.Cancel();
+ saveCts?.Cancel();
+ sendImagesCts?.Cancel();
+
stopLiveStreamListenerFlag = true;
stopGrabImageListenerFlag = true;
stopUIListenerFlag = true;
+
+
log.Debug("Handle CameraUICmd StopUIListener");
var taskStopUi = Task.Run(StopUiListener);
var timeoutTask = Task.Delay(TimeSpan.FromSeconds(5));
@@ -1068,293 +1745,579 @@ namespace TBF.Rig.Network.Camera.CJMS11
//stopLiveStreamListenerFlag = false;
//stopGrabImageListenerFlag = false;
}
+
+
+
+ public bool IsGrabImageInProgress
+ {
+ get
+ {
+ return grabImageTask != null &&
+ !grabImageTask.IsCompleted;
+ }
+ }
+
+ public Task GrabImageTask
+ {
+ get { return grabImageTask; }
+ }
+
public void StartGrabImageListener()
{
- grabImageListenerThread = new Thread(GrabImageListener);
- grabImageListenerThread.Start();
+
+ _ = StartGrabImageListenerAsync();
}
- void GrabImageListener()
+
+ public Task StartGrabImageListenerAsync(
+ bool retryUntilValidImage = false,
+ int maxAttempts = 1,
+ int retryDelayMs = 200)
{
- using (this.cameraTcpClient = new TcpClient())
+ if (grabImageTask != null && !grabImageTask.IsCompleted)
{
- try
+ log.Warn(
+ $"Grab already running: cameraIdx={cameraIdx}, " +
+ $"IP={CameraCfg.IPAddressCJMS}");
+
+ return grabImageTask;
+ }
+
+ grabCts?.Cancel();
+ grabCts?.Dispose();
+
+ grabCts = new CancellationTokenSource();
+
+ if (!retryUntilValidImage)
+ {
+ maxAttempts = 1;
+ }
+
+ maxAttempts = Math.Max(1, maxAttempts);
+ retryDelayMs = Math.Max(0, retryDelayMs);
+
+ grabImageTask = GrabImageListenerWithRetryAsync(
+ grabCts.Token,
+ maxAttempts,
+ retryDelayMs);
+
+ return grabImageTask;
+ }
+
+ private async Task EstablishCameraConnectionAsync(
+ TcpClient client,
+ string ip,
+ int port,
+ int timeoutMs)
+ {
+ Task connectTask = client.ConnectAsync(ip, port);
+ Task timeoutTask = Task.Delay(timeoutMs);
+
+ Task completedTask = await Task.WhenAny(connectTask, timeoutTask);
+
+ if (completedTask == timeoutTask)
+ throw new TimeoutException($"Connection attempt timed out after {timeoutMs} ms.");
+
+ await connectTask;
+ }
+
+ private Task grabImageTask;
+ private CancellationTokenSource grabCts;
+ //private CancellationTokenSource liveCts;
+ private CancellationTokenSource saveCts;
+
+ private readonly SemaphoreSlim cameraOperationLock = new SemaphoreSlim(1, 1);
+
+
+
+ private async Task GrabImageListenerWithRetryAsync(
+ CancellationToken ct,
+ int maxAttempts,
+ int retryDelayMs)
+ {
+ bool lockAcquired = false;
+
+ try
+ {
+ await cameraOperationLock.WaitAsync(ct).ConfigureAwait(false);
+
+ lockAcquired = true;
+
+ for (int attempt = 1;
+ attempt <= maxAttempts;
+ attempt++)
{
- EstablishCameraConnection(ref this.cameraTcpClient, CameraCfg.IPAddressCJMS, iPort);
+ ct.ThrowIfCancellationRequested();
- log.Info(string.Format("Camera connected to server {0}:{1}.", CameraCfg.IPAddressCJMS, iPort));
- ipAddress = IPAddress.Parse(CameraCfg.IPAddressCJMS);
- // Get network stream
+ Image image = null;
-
- using (cameraStream = this.cameraTcpClient.GetStream())
- using (cameraWriter = new StreamWriter(cameraStream, Encoding.ASCII) { AutoFlush = true })
- using (cameraReader = new StreamReader(cameraStream, Encoding.ASCII))
+ try
{
- cameraStream.ReadTimeout = 1000;
+ log.Debug( $"Starting grab image attempt: cameraIdx={cameraIdx}, attempt={attempt}/{maxAttempts}");
- try
+ image = await GrabImageSingleAttemptAsync(ct).ConfigureAwait(false);
+
+ if (IsValidGrabbedImage(image))
{
- SendCommand(CommandM.prepare_camera_);
- }
- catch (Exception exc)
- {
- log.Error($"Initialisation of connection readers failed: {exc.Message}");
- return;
- }
+ /*
+ * Obrázok upravíme ešte predtým,
+ * než ho sprístupníme iným threadom.
+ */
+ ImageUtils.Rotate(
+ image,
+ RoiConfiguration.ImageRotation);
- stopGrabImageListenerFlag = false;
- int iCountOf_NACK = 0;
- int iActualImageIndex = 0;
+ DrawOverlay(image);
- SendCommand(CommandM.grab_image_);
-
+ /*
+ * UI dostane vlastnú Image inštanciu.
+ * Originál zostáva pre návrat z Task
+ * a následné uloženie do súboru.
+ */
+ Image imageForUi = CloneImageToBitmap(image);
- while (!stopGrabImageListenerFlag)
- {
try
{
-
- Task responseAnswerTask = cameraReader.ReadLineAsync();
- var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(1));
- var completedAnswerTask = Task.WhenAny(responseAnswerTask, timeoutAnswerTask).Result;
-
- if (completedAnswerTask == timeoutAnswerTask)
- {
- throw new TimeoutException("Answer response attempt timed out after 1 second.");
- }
-
- string responseAnswer = responseAnswerTask.Result;
- if (responseAnswer.Length > 0)
- {
- /// Process the packet
- JmsPacket newPacket = new JmsPacket(responseAnswer);
-
- if (newPacket.JmsMessage.Status != MessageStatus.ACK)
- {
- if (iCountOf_NACK < 5)
- {
- iCountOf_NACK++;
- continue;
- }
-
- log.ErrorFormat("Error occured more as 5 time in GrabImageListener: {0}",
- newPacket.JmsMessage.Status);
- stopGrabImageListenerFlag = true; // mam obrazok ukoncim a zavriem thread
- break;
- }
- else
- {
-
- switch (newPacket.JmsMessage.Command)
- {
- case CommandM.grab_image_:
- ParsedImage parsedImage = newPacket.JmsMessage.getImage();
- if (parsedImage.Encoding == ImageType.BASE_64)
- {
- Image image = parsedImage.Image;
-
-
- if (showOverlayRect && overlayRect != null && overlayThickness > 0)
- {
- int penWidth = 1;
- Pen pen = new Pen(Color.Green, penWidth);
- using (var grph = Graphics.FromImage(image))
- {
- if (penWidth != overlayThickness)
- {
- penWidth = overlayThickness;
- pen = new Pen(Color.Green, penWidth);
- }
-
- grph.DrawRectangle(pen, overlayRect);
- }
- }
-
- OnImageReceived(this, this.cameraIdx, image, RoiConfiguration.ImageRotation);
- iActualImageIndex++;
- if (iActualImageIndex >= RoiConfiguration.ImageOpacity.Count)
- {
- stopGrabImageListenerFlag =
- true; // mam obrazok ukoncim a zavriem thread
- }
- }
-
- break;
- }
- }
- }
+ OnImageReceived( this, cameraIdx, imageForUi, ImageRotation.None);
}
- catch (Exception exc)
+ catch
{
- log.Error($"Grab Image - Hardware Addr: {CameraCfg.HardwareAddress} Camera IP: {CameraCfg.IPAddressCJMS}, Port: {iPort} Exception in MJpeg RTP listener thread: { exc.Message}");
+ imageForUi.Dispose();
+ throw;
}
+
+ log.Debug( $"Valid image received: cameraIdx={cameraIdx}, attempt={attempt}/{maxAttempts}, " +
+ $"size={image.Width}x{image.Height}");
+
+ return image;
}
+ image?.Dispose();
- stopGrabImageListenerFlag = false;
- SendCommandAndWaitToAnswer(cameraWriter, cameraReader, CommandM.close_);
- SendCommandAndWaitToAnswer(cameraWriter, cameraReader, CommandM.disconnect_);
-
- CloseCameraResources();
-
- return;
+ log.Warn(
+ $"Invalid image received: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"attempt={attempt}/{maxAttempts}");
}
- }catch(Exception exc)
+ catch (OperationCanceledException)
+ {
+ image?.Dispose();
+ throw;
+ }
+ catch (Exception exc)
+ {
+ image?.Dispose();
+
+ log.Warn(
+ $"Grab image attempt failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"attempt={attempt}/{maxAttempts}, " +
+ $"error={exc.Message}");
+ }
+
+ if (attempt < maxAttempts &&
+ retryDelayMs > 0)
+ {
+ await Task.Delay(retryDelayMs, ct)
+ .ConfigureAwait(false);
+ }
+ }
+
+ log.Error(
+ $"No valid image received after all attempts: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"attempts={maxAttempts}");
+
+ UiBridge.Bridge.OnImage(cameraIdx, null);
+
+ return null;
+ }
+ catch (OperationCanceledException)
+ {
+ log.Debug(
+ $"Grab image cancelled: " +
+ $"cameraIdx={cameraIdx}");
+
+ throw;
+ }
+ finally
+ {
+ if (lockAcquired)
{
- log.Error($"Grab Image - Hardware Addr: {CameraCfg.HardwareAddress} Camera IP: {CameraCfg.IPAddressCJMS}, Port: {iPort} exception: {exc.Message}");
- UiBridge.Bridge.OnImage(this.cameraIdx, null);
+ cameraOperationLock.Release();
}
}
}
- void SendImageListener()
+ private static bool IsValidGrabbedImage(Image image)
{
- using (this.cameraTcpClient = new TcpClient())
+ if (image == null)
{
+ return false;
+ }
+
+ try
+ {
+ if (image.Width <= 0 ||
+ image.Height <= 0)
+ {
+ return false;
+ }
+
+ // Vytvorenie Bitmap zároveň preverí,
+ // či je obrázok použiteľný cez GDI+.
+ using (var bitmap = new Bitmap(image))
+ {
+ return bitmap.Width > 0 &&
+ bitmap.Height > 0;
+ }
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ private async Task GrabImageSingleAttemptAsync(
+ CancellationToken ct)
+ {
+ TcpClient client = null;
+ NetworkStream stream = null;
+ CameraLineReader reader = null;
+
+ try
+ {
+ client =
+ await ConnectCameraAsync(5000, ct)
+ .ConfigureAwait(false);
+
+ stream = client.GetStream();
+
+ reader = new CameraLineReader(
+ stream,
+ 64 * 1024);
+
+ JmsPacket prepareAnswer =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.prepare_camera_,
+ null,
+ 3000,
+ ct)
+ .ConfigureAwait(false);
+
+ bool alreadyOpened =
+ prepareAnswer != null &&
+ prepareAnswer.JmsMessage != null &&
+ prepareAnswer.JmsMessage.Status ==
+ MessageStatus.NACK &&
+ !string.IsNullOrEmpty(
+ prepareAnswer.JmsMessage.Payload) &&
+ prepareAnswer.JmsMessage.Payload.Contains(
+ "OPENED");
+
+ bool prepared =
+ prepareAnswer != null &&
+ prepareAnswer.JmsMessage != null &&
+ prepareAnswer.JmsMessage.Status ==
+ MessageStatus.ACK;
+
+ if (!prepared && !alreadyOpened)
+ {
+ log.Warn(
+ $"Prepare camera failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"answer={FormatPacketForLog(prepareAnswer)}");
+
+ return null;
+ }
+
+ if (alreadyOpened)
+ {
+ log.Debug(
+ $"Camera already OPENED: " +
+ $"cameraIdx={cameraIdx}");
+ }
+
+ await SendCommandAsync(
+ stream,
+ CommandM.grab_image_,
+ ct,
+ null)
+ .ConfigureAwait(false);
+
+ while (true)
+ {
+ ct.ThrowIfCancellationRequested();
+
+ string response =
+ await reader.ReadLineAsync(10000, ct)
+ .ConfigureAwait(false);
+
+ if (string.IsNullOrWhiteSpace(response))
+ {
+ continue;
+ }
+
+ JmsPacket packet;
+
+ try
+ {
+ packet = new JmsPacket(response);
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Cannot parse grab response: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+
+ continue;
+ }
+
+ if (packet.JmsMessage == null)
+ {
+ continue;
+ }
+
+ if (packet.JmsMessage.Command !=
+ CommandM.grab_image_)
+ {
+ log.Debug(
+ $"Unexpected response during grab: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"command={packet.JmsMessage.Command}");
+
+ continue;
+ }
+
+ if (packet.JmsMessage.Status !=
+ MessageStatus.ACK)
+ {
+ log.Warn(
+ $"Grab image returned NACK: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"payload={packet.JmsMessage.Payload}");
+
+ return null;
+ }
+
+ ParsedImage parsedImage =
+ packet.JmsMessage.getImage();
+
+ if (parsedImage == null)
+ {
+ log.Warn(
+ $"Parsed image is null: " +
+ $"cameraIdx={cameraIdx}");
+
+ return null;
+ }
+
+ if (parsedImage.Encoding !=
+ ImageType.BASE_64)
+ {
+ log.Warn(
+ $"Unsupported image encoding: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"encoding={parsedImage.Encoding}");
+
+ return null;
+ }
+
+ Image image = parsedImage.Image;
+
+ if (image == null)
+ {
+ log.Warn(
+ $"Decoded image is null: " +
+ $"cameraIdx={cameraIdx}");
+
+ return null;
+ }
+
+ return image;
+ }
+ }
+ catch (OperationCanceledException)
+ {
+ log.Debug(
+ $"Grab image attempt cancelled: " +
+ $"cameraIdx={cameraIdx}");
+
+ throw;
+ }
+ catch (TimeoutException exc)
+ {
+ log.Warn(
+ $"Grab image attempt timeout: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+
+ return null;
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Grab image attempt failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}",
+ exc);
+
+ return null;
+ }
+ finally
+ {
+ if (stream != null &&
+ reader != null)
+ {
+ try
+ {
+ await TryCloseCameraAsync(
+ stream,
+ reader)
+ .ConfigureAwait(false);
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Grab cleanup failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+ }
+ }
+
try
{
- EstablishCameraConnection(ref this.cameraTcpClient, CameraCfg.IPAddressCJMS, iPort);
-
- log.Info(string.Format("Camera connected to server {0}:{1}.", CameraCfg.IPAddressCJMS, iPort));
- ipAddress = IPAddress.Parse(CameraCfg.IPAddressCJMS);
- // Get network stream
-
-
- using (cameraStream = this.cameraTcpClient.GetStream())
- using (cameraWriter = new StreamWriter(cameraStream, Encoding.ASCII) { AutoFlush = true })
- using (cameraReader = new StreamReader(cameraStream, Encoding.ASCII))
- {
- cameraStream.ReadTimeout = 1000;
-
- try
- {
- SendCommand(CommandM.prepare_camera_);
- }
- catch (Exception exc)
- {
- log.Error($"Initialisation of connection readers failed: {exc.Message}");
- return;
- }
-
- stopGrabImageListenerFlag = false;
- int iCountOf_NACK = 0;
- int iActualImageIndex = 0;
-
- //TODO BUMI send grab image or send - based on count of images - but must work similary
- if (RoiConfiguration.ImageOpacity.Count <= 1)
- {
- SendCommand(CommandM.grab_image_);
- }
- else
- {
- SendCommand(CommandM.send_);
- }
-
- while (!stopGrabImageListenerFlag)
- {
- try
- {
-
- Task responseAnswerTask = cameraReader.ReadLineAsync();
- var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(1));
- var completedAnswerTask = Task.WhenAny(responseAnswerTask, timeoutAnswerTask).Result;
-
- if (completedAnswerTask == timeoutAnswerTask)
- {
- throw new TimeoutException("Answer response attempt timed out after 1 second.");
- }
-
- string responseAnswer = responseAnswerTask.Result;
- if (responseAnswer.Length > 0)
- {
- /// Process the packet
- JmsPacket newPacket = new JmsPacket(responseAnswer);
-
- if (newPacket.JmsMessage.Status != MessageStatus.ACK)
- {
- if (iCountOf_NACK < 5)
- {
- iCountOf_NACK++;
- continue;
- }
-
- log.ErrorFormat("Error occured more as 5 time in GrabImageListener: {0}",
- newPacket.JmsMessage.Status);
- stopGrabImageListenerFlag = true; // mam obrazok ukoncim a zavriem thread
- break;
- }
- else
- {
-
- switch (newPacket.JmsMessage.Command)
- {
- case CommandM.send_:
- case CommandM.grab_image_:
- ParsedImage parsedImage = newPacket.JmsMessage.getImage();
- if (parsedImage.Encoding == ImageType.BASE_64)
- {
- Image image = parsedImage.Image;
-
-
- if (showOverlayRect && overlayRect != null && overlayThickness > 0)
- {
- int penWidth = 1;
- Pen pen = new Pen(Color.Green, penWidth);
- using (var grph = Graphics.FromImage(image))
- {
- if (penWidth != overlayThickness)
- {
- penWidth = overlayThickness;
- pen = new Pen(Color.Green, penWidth);
- }
-
- grph.DrawRectangle(pen, overlayRect);
- }
- }
-
- OnImageReceived(this, this.cameraIdx, image, RoiConfiguration.ImageRotation,iActualImageIndex,RoiConfiguration.ImageOpacity.Count);
- iActualImageIndex++;
- if (iActualImageIndex >= RoiConfiguration.ImageOpacity.Count)
- {
- stopGrabImageListenerFlag =
- true; // mam obrazok ukoncim a zavriem thread
- }
- }
-
- break;
- }
- }
- }
- }
- catch (Exception exc)
- {
- log.Error($"Grab Image - Hardware Addr: {CameraCfg.HardwareAddress} Camera IP: {CameraCfg.IPAddressCJMS}, Port: {iPort} Exception in MJpeg RTP listener thread: { exc.Message}");
- }
- }
-
- stopGrabImageListenerFlag = false;
- SendCommandAndWaitToAnswer(cameraWriter, cameraReader, CommandM.close_);
- SendCommandAndWaitToAnswer(cameraWriter, cameraReader, CommandM.disconnect_);
-
- CloseCameraResources();
-
- return;
- }
- }catch(Exception exc)
+ stream?.Dispose();
+ }
+ catch
+ {
+ }
+
+ try
+ {
+ client?.Close();
+ client?.Dispose();
+ }
+ catch
{
- log.Error($"Grab Image - Hardware Addr: {CameraCfg.HardwareAddress} Camera IP: {CameraCfg.IPAddressCJMS}, Port: {iPort} exception: {exc.Message}");
- UiBridge.Bridge.OnImage(this.cameraIdx, null);
}
}
}
+
+ private async Task TryCloseCameraAsync(
+ NetworkStream stream,
+ CameraLineReader reader)
+ {
+ /*
+ * CLOSE
+ *
+ * Na close ešte odpoveď očakávame.
+ */
+ try
+ {
+ JmsPacket closeResponse =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.close_,
+ null,
+ 2000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+
+ if (closeResponse == null ||
+ closeResponse.JmsMessage == null)
+ {
+ log.Warn(
+ $"No close response: " +
+ $"cameraIdx={cameraIdx}");
+
+ return;
+ }
+
+ bool closeAccepted =
+ closeResponse.JmsMessage.Status ==
+ MessageStatus.ACK;
+
+ bool closeAlreadyInProgress =
+ closeResponse.JmsMessage.Status ==
+ MessageStatus.NACK &&
+ !string.IsNullOrEmpty(
+ closeResponse.JmsMessage.Payload) &&
+ closeResponse.JmsMessage.Payload.Contains(
+ "Close command already in progress");
+
+ if (closeAlreadyInProgress)
+ {
+ log.Debug(
+ $"Camera close already in progress: " +
+ $"cameraIdx={cameraIdx}");
+ }
+ else if (!closeAccepted)
+ {
+ log.Warn(
+ $"Camera close returned NACK: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"payload={closeResponse.JmsMessage.Payload}");
+ }
+ }
+ catch (TimeoutException exc)
+ {
+ log.Warn(
+ $"Close camera timeout: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Close camera failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+ }
+
+ /*
+ * DISCONNECT
+ *
+ * Dôležité: príkaz iba odošleme.
+ * Na odpoveď nečakáme.
+ */
+ try
+ {
+ if (stream.CanWrite)
+ {
+ await SendCommandAsync(
+ stream,
+ CommandM.disconnect_,
+ CancellationToken.None,
+ null)
+ .ConfigureAwait(false);
+
+ log.Debug(
+ $"Disconnect command sent: " +
+ $"cameraIdx={cameraIdx}");
+ }
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Disconnect camera failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+ }
+ }
+
+
private void CloseCameraResources()
{
cameraReader?.Close();
cameraReader = null;
- cameraWriter?.Close();
- cameraWriter = null;
+ //cameraWriter?.Close();
+ //cameraWriter = null;
cameraStream?.Close();
cameraStream = null;
cameraTcpClient?.Close();
@@ -1362,6 +2325,17 @@ namespace TBF.Rig.Network.Camera.CJMS11
cameraTcpClient = null;
}
+ public void CancelGrabImage()
+ {
+ try
+ {
+ grabCts?.Cancel();
+ }
+ catch (ObjectDisposedException)
+ {
+ // CTS už bolo uvoľnené.
+ }
+ }
///
/// listener for multiple - repetetive image receiving
@@ -1372,130 +2346,285 @@ namespace TBF.Rig.Network.Camera.CJMS11
///
///
- private void StartLiveStreamListener(IPAddress localIP, int localPort)
- {
- liveStreamListenerThread = new Thread(new ThreadStart(LiveStreamListener));
- liveStreamListenerThread.Start();
- }
+ // private void StartLiveStreamListener(IPAddress localIP, int localPort)
+ // {
+ // liveStreamListenerThread = new Thread(new ThreadStart(LiveStreamListener));
+ // liveStreamListenerThread.Start();
+ // }
+
+ private CancellationTokenSource liveCts;
+ private Task liveStreamTask;
+ private static int maxAttempts = 4;
+ private static int retryDelayMs = 1000;
- void LiveStreamListener()
+ public void StartLiveStreamListener()
{
- bool synced = false;
-
- using (this.cameraTcpClient = new TcpClient())
+ if (liveStreamTask != null && !liveStreamTask.IsCompleted)
{
- try
- {
- EstablishCameraConnection(ref this.cameraTcpClient, CameraCfg.IPAddressCJMS, iPort);
-
- log.Debug(string.Format("Camera connected to server {0}:{1}.", CameraCfg.IPAddressCJMS, iPort));
- ipAddress = IPAddress.Parse(CameraCfg.IPAddressCJMS);
- // Get network stream
-
-
- using (cameraStream = this.cameraTcpClient.GetStream())
- using (cameraWriter = new StreamWriter(cameraStream, Encoding.ASCII) { AutoFlush = true })
- using (cameraReader = new StreamReader(cameraStream, Encoding.ASCII))
- {
- cameraStream.ReadTimeout = 1000;
-
- SendCommand(CommandM.prepare_camera_);
- SendCommand(CommandM.start_stream_images_);
-
-
- stopLiveStreamListenerFlag = false;
- while (!stopLiveStreamListenerFlag)
- {
- try
- {
-
- //SendCommand(CommandM.grab_image_);
- Task responseAnswerTask = cameraReader.ReadLineAsync();
- var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(1));
- var completedAnswerTask = Task.WhenAny(responseAnswerTask, timeoutAnswerTask).Result;
-
- if (completedAnswerTask == timeoutAnswerTask)
- {
- throw new TimeoutException("Answer response attempt timed out after 1 second.");
- }
-
- string responseAnswer = responseAnswerTask.Result;
-
- if (responseAnswer.Length > 0)
- {
- /// Process the packet
- JmsPacket newPacket = new JmsPacket(responseAnswer);
- // if (synced)
- // {
- /// Sychronized: process the new packet
- switch (newPacket.JmsMessage.Command)
- {
- case CommandM.grab_image_:
- ParsedImage parsedImage = newPacket.JmsMessage.getImage();
- if (parsedImage.Encoding == ImageType.BASE_64)
- {
- Image image = parsedImage.Image;
-
-
- if (showOverlayRect && overlayRect != null && overlayThickness > 0)
- {
- int penWidth = 1;
- Pen pen = new Pen(Color.Green, penWidth);
- using (var grph = Graphics.FromImage(image))
- {
- if (penWidth != overlayThickness)
- {
- penWidth = overlayThickness;
- pen = new Pen(Color.Green, penWidth);
- }
-
- grph.DrawRectangle(pen, overlayRect);
- }
- }
-
- OnImageReceived(this, this.cameraIdx, image, RoiConfiguration.ImageRotation,0,1 );
-
- }
-
- break;
- default:
- break;
- }
- }
- }
- catch (Exception exc)
- {
- string msg = string.Format("Exception in MJpeg RTP listener thread: {0}", exc.Message);
- log.Error(msg);
- }
- }
-
- stopLiveStreamListenerFlag = false;
- //we need to wait to answer, it works on thread loop - properly access
- var sendCommandAndWaitToAnswer = SendCommandAndWaitToAnswer(cameraWriter, cameraReader, CommandM.prepare_camera_);
- if (sendCommandAndWaitToAnswer == null || sendCommandAndWaitToAnswer.JmsMessage.Status == MessageStatus.NACK) //correct if NACK & OPENED
- {
- log.Error("Stop streaming not successfully! see: " + sendCommandAndWaitToAnswer.JmsMessage.Payload);
- }
-
- //SendCommand(CommandM.close_);
- //SendCommand(CommandM.disconnect_);
-
- CloseCameraResources();
- }
- }catch(Exception exc)
- {
- log.Error($"Live Stream exception: {exc.Message}");
- UiBridge.Bridge.OnImage(this.cameraIdx, null);
- }
+ log.Warn( $"Live stream already running: cameraIdx={cameraIdx}");
+ return;
}
- return;
+ liveCts?.Cancel();
+ liveCts?.Dispose();
+
+ liveCts = new CancellationTokenSource();
+
+ liveStreamTask = LiveStreamListenerAsync(liveCts.Token);
}
+ private async Task LiveStreamListenerAsync(
+ CancellationToken ct)
+ {
+ bool lockAcquired = false;
+ TcpClient client = null;
+ NetworkStream stream = null;
+ CameraLineReader reader = null;
+ bool streamStarted = false;
+ try
+ {
+ log.Debug(
+ $"Live stream waiting for camera lock: " +
+ $"cameraIdx={cameraIdx}");
+ await cameraOperationLock
+ .WaitAsync(ct)
+ .ConfigureAwait(false);
+
+ lockAcquired = true;
+
+ log.Debug(
+ $"Live stream acquired camera lock: " +
+ $"cameraIdx={cameraIdx}");
+
+ client = await ConnectCameraAsync(
+ timeoutMs: 3000,
+ ct: ct,
+ maxAttempts: 3,
+ retryDelayMs: 300)
+ .ConfigureAwait(false);
+
+ stream = client.GetStream();
+
+ reader = new CameraLineReader( stream, 64 * 1024);
+
+ JmsPacket prepare =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.prepare_camera_,
+ null,
+ 3000,
+ ct)
+ .ConfigureAwait(false);
+
+ bool alreadyOpened =
+ prepare != null &&
+ prepare.JmsMessage != null &&
+ prepare.JmsMessage.Status ==
+ MessageStatus.NACK &&
+ !string.IsNullOrEmpty(
+ prepare.JmsMessage.Payload) &&
+ prepare.JmsMessage.Payload.Contains(
+ "OPENED");
+
+ bool prepared =
+ prepare != null &&
+ prepare.JmsMessage != null &&
+ prepare.JmsMessage.Status ==
+ MessageStatus.ACK;
+
+ if (!prepared && !alreadyOpened)
+ {
+ log.Error( $"Prepare camera for live stream failed: cameraIdx={cameraIdx}, answer={FormatPacketForLog(prepare)}");
+ return;
+ }
+
+ if (alreadyOpened)
+ {
+ log.Debug( $"Camera already opened for live stream: cameraIdx={cameraIdx}");
+ }
+
+ JmsPacket start =
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.start_stream_images_,
+ null,
+ 5000,
+ ct)
+ .ConfigureAwait(false);
+
+ if (start == null || start.JmsMessage == null || start.JmsMessage.Status != MessageStatus.ACK)
+ {
+ log.Error( $"Unable to start live stream: cameraIdx={cameraIdx}, answer={FormatPacketForLog(start)}");
+ return;
+ }
+
+ streamStarted = true;
+
+ log.Debug( $"Live stream started: cameraIdx={cameraIdx}");
+
+ while (!ct.IsCancellationRequested)
+ {
+ string response =
+ await reader.ReadLineAsync(
+ 10000,
+ ct)
+ .ConfigureAwait(false);
+
+ if (string.IsNullOrWhiteSpace(response))
+ continue;
+
+ JmsPacket packet =
+ new JmsPacket(response);
+
+ if (packet.JmsMessage == null)
+ continue;
+
+ if (packet.JmsMessage.Command !=
+ CommandM.grab_image_)
+ {
+ log.Debug( $"Unexpected packet during live stream: cameraIdx={cameraIdx}, command={packet.JmsMessage.Command}");
+ continue;
+ }
+
+ if (packet.JmsMessage.Status !=
+ MessageStatus.ACK)
+ {
+ log.Warn( $"Live frame returned NACK: cameraIdx={cameraIdx}, payload={packet.JmsMessage.Payload}");
+ continue;
+ }
+
+ ParsedImage parsed = packet.JmsMessage.getImage();
+
+ if (parsed == null || parsed.Encoding != ImageType.BASE_64)
+ {
+ continue;
+ }
+
+ Image image = parsed.Image;
+
+ if (image == null)
+ continue;
+
+ DrawOverlay(image);
+
+ OnImageReceived(
+ this,
+ cameraIdx,
+ image,
+ RoiConfiguration.ImageRotation,
+ 0,
+ 1);
+ }
+ }
+ catch (OperationCanceledException)
+ {
+ log.Debug( $"Live stream cancelled: cameraIdx={cameraIdx}");
+ }
+ catch (TimeoutException exc)
+ {
+ log.Error( $"Live stream timeout: cameraIdx={cameraIdx}, IP={CameraCfg.IPAddressCJMS}, error={exc.Message}");
+ }
+ catch (SocketException exc)
+ {
+ log.Error( $"Live stream socket error: cameraIdx={cameraIdx}, IP={CameraCfg.IPAddressCJMS}, socketError={exc.SocketErrorCode}, " +
+ $"error={exc.Message}");
+ }
+ catch (Exception exc)
+ {
+ log.Error( $"Live stream exception: cameraIdx={cameraIdx}, error={exc.Message}", exc);
+ UiBridge.Bridge.OnImage( cameraIdx, null);
+ }
+ finally
+ {
+ /*
+ * Cleanup nesmie používať zrušený ct.
+ */
+ if (stream != null &&
+ reader != null)
+ {
+ if (streamStarted)
+ {
+ try
+ {
+ await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.stop_stream_images_,
+ null,
+ 2000,
+ CancellationToken.None)
+ .ConfigureAwait(false);
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Stop live stream failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+ }
+ }
+
+ try
+ {
+ await TryCloseCameraAsync(
+ stream,
+ reader)
+ .ConfigureAwait(false);
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Live stream cleanup failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+ }
+ }
+
+ try
+ {
+ stream?.Dispose();
+ }
+ catch
+ {
+ }
+
+ try
+ {
+ client?.Close();
+ client?.Dispose();
+ }
+ catch
+ {
+ }
+
+ if (lockAcquired)
+ {
+ cameraOperationLock.Release();
+ }
+
+ log.Debug( $"Live stream finished: cameraIdx={cameraIdx}");
+ }
+ }
+
+ private void DrawOverlay(Image image)
+ {
+ if (image == null)
+ return;
+
+ if (!showOverlayRect || overlayThickness <= 0)
+ return;
+
+ using (Graphics g = Graphics.FromImage(image))
+ using (Pen pen = new Pen(Color.Green, overlayThickness))
+ {
+ g.DrawRectangle(pen, overlayRect);
+ }
+ }
//public void OnMeasurementDataReceived(object sender, MeasuredDataEventArgs msrmtData)
@@ -1552,12 +2681,16 @@ namespace TBF.Rig.Network.Camera.CJMS11
{
try
{
- if (cameraWriter != null && cameraReader != null && cameraStream!=null && cameraStream.CanWrite)
+ if (cameraStream != null && cameraStream.CanWrite)
{
- cameraWriter.WriteLineAsync(CommandMEnum.GetVal(command)).Wait();
- cameraWriter.FlushAsync();
+ string commandStr = CommandMEnum.GetVal(command) + "\n";
+ byte[] bytes = Encoding.ASCII.GetBytes(commandStr);
+
+ cameraStream.Write(bytes, 0, bytes.Length);
+ cameraStream.Flush();
}
- }catch(Exception exc)
+ }
+ catch (Exception exc)
{
log.ErrorFormat("{0} SendCommand: {1}", Name, exc.Message);
}
@@ -1565,74 +2698,88 @@ namespace TBF.Rig.Network.Camera.CJMS11
//
- private JmsPacket SendCommandAndWaitToAnswer(StreamWriter writer, StreamReader reader, CommandM command, string payload = null)
+ private async Task SendCommandAndWaitToAnswerAsync(
+ NetworkStream stream,
+ CameraLineReader reader,
+ CommandM command,
+ string payload = null,
+ int timeoutMs = 1000,
+ CancellationToken ct = default)
+{
+ await SendCommandAsync( stream, command, ct, payload).ConfigureAwait(false);
+
+ try
+ {
+ for (int iReads = 0; iReads < 6; iReads++)
+ {
+ string responseAnswer = await reader.ReadLineAsync( timeoutMs, ct).ConfigureAwait(false);
+
+ if (string.IsNullOrWhiteSpace(responseAnswer))
+ continue;
+
+ log.Debug( $"Received from camera: idx={cameraIdx}, expected={command}, length={responseAnswer.Length}, prefix={GetLogPrefix(responseAnswer, 200)}");
+
+ JmsPacket result;
+
+ try
+ {
+ result = new JmsPacket(responseAnswer);
+ }
+ catch (Exception exc)
+ {
+ log.Warn( $"Cannot parse camera response: idx={cameraIdx}, length={responseAnswer.Length}, error={exc.Message}");
+ continue;
+ }
+
+ if (result.JmsMessage == null)
+ {
+ log.Warn( $"Parsed packet contains no JmsMessage: idx={cameraIdx}");
+ continue;
+ }
+
+ if (result.JmsMessage.Command == command)
+ {
+ return result;
+ }
+
+ log.Debug( $"Unexpected response command: idx={cameraIdx}, expected={command}, received={result.JmsMessage.Command}. Reading next response.");
+ }
+
+ log.Error( $"Expected camera response not received: idx={cameraIdx}, command={command}");
+ return null;
+ }
+ catch (OperationCanceledException)
+ {
+ throw;
+ }
+ catch (TimeoutException)
+ {
+ throw;
+ }
+ catch (IOException ioEx)
+ {
+ log.Error( $"IO error while reading from camera: idx={cameraIdx}, command={command}, error={ioEx.Message}");
+ return null;
+ }
+ catch (Exception exc)
+ {
+ log.Error( $"Error while reading from camera: idx={cameraIdx}, command={command}, error={exc.Message}", exc);
+ return null;
+ }
+}
+
+ private static string GetLogPrefix(
+ string value,
+ int maximumLength)
{
- // Send command
- String command_str = CommandMEnum.GetVal(command);
- if (payload != null && payload.Length > 0)
- {
- command_str += "=" + payload;
- }
+ if (string.IsNullOrEmpty(value))
+ return string.Empty;
- command_str = command_str + " ";
- writer.WriteLineAsync(command_str).Wait();
- Console.WriteLine($@"Command '{command_str}' sent.");
+ if (value.Length <= maximumLength)
+ return value;
- JmsPacket result;
-
- string responseAnswer = "";
- try
- {
- int iReads = 0;
- while (true)
- {
- //get config
- var readLineAsync = reader.ReadLineAsync();
- var timeoutTaskRead = Task.Delay(TimeSpan.FromSeconds(1));
- var waitAny = Task.WhenAny(readLineAsync, timeoutTaskRead).Result;
- if (waitAny == timeoutTaskRead)
- {
- log.Debug("Activation timeout.");
- throw new TimeoutException("Activation timeout. No received response for command_CFG");
- }
-
- log.Debug(string.Format("received from camera: {0}", responseAnswer));
- responseAnswer = readLineAsync.Result;
-
- try
- {
- result = new JmsPacket(responseAnswer);
- }
- catch (Exception exc)
- {
- iReads++;
- continue;
- }
-
- if (result.JmsMessage.Command == command)
- {
- return result;
- }
-
- if (iReads > 5)
- {
- log.Error($"Maximum Count of unexcepted answers excited!");
- break;
- }
-
- iReads++;
- }
- }
- catch (IOException ioEx)
- {
- log.Error($"Timeout or IO error while reading from camera: {ioEx.Message}");
- }
- catch (Exception e)
- {
- log.Error(string.Format("Error while reading from camera: {0}", e.Message));
- }
-
- return null;
+ return value.Substring(0, maximumLength) +
+ "...";
}
public void Start()
@@ -1709,6 +2856,41 @@ namespace TBF.Rig.Network.Camera.CJMS11
public static event EventHandler ImagesCameraHandler;
public static event EventHandler ImageCameraHandler;
+
+ public static void OnImageReceived(
+ object sender,
+ int idxImage,
+ Image image,
+ int iImageIdx = 0,
+ int imageCount = 1)
+ {
+ if (image == null)
+ {
+ return;
+ }
+
+ log.Info( $"Image received from camera: {idxImage}, iImageIdx: {iImageIdx}, imageCount: {imageCount}");
+
+ EventHandler handler = ImageCameraHandler;
+
+ if (handler == null)
+ {
+ image.Dispose();
+ return;
+ }
+
+ try
+ {
+ handler( sender, new PromptReceivedImageEventArgs( idxImage, image));
+ log.Info( $"ImageCameraHandler reached camera: {idxImage}, iImageIdx: {iImageIdx}, imageCount: {imageCount}");
+ }
+ catch (Exception exc)
+ {
+ log.Error( $"ImageCameraHandler exception: cameraIdx={idxImage}, error={exc.Message}", exc);
+ image.Dispose();
+ }
+ }
+
///
/// This method is called from within this class when
/// a prompt string was received from the telnet server.
@@ -1716,7 +2898,7 @@ namespace TBF.Rig.Network.Camera.CJMS11
public static void OnImageReceived(object sender, int idxImage, Image image, ImageRotation imageRotation, int iImageIdx = 0, int imageCount = 1)
{
- log.Info("Image received");
+ log.Info($"Image received from camera: {idxImage}, iImageIdx: {iImageIdx}, imageCount: {imageCount}");
if (null != ImageCameraHandler)
{
@@ -1726,7 +2908,8 @@ namespace TBF.Rig.Network.Camera.CJMS11
ImageUtils.Rotate(image, imageRotation);
//Send image to bridge
- ImagesCameraHandler(sender, new PromptReceivedImagesEventArgs(idxImage, image,iImageIdx, imageCount));
+ ImageCameraHandler(sender, new PromptReceivedImageEventArgs(idxImage, image));
+ log.Info($"ImageCameraHandler reached camera: {idxImage}, iImageIdx: {iImageIdx}, imageCount: {imageCount}");
}
catch (Exception ex)
{
@@ -1735,7 +2918,684 @@ namespace TBF.Rig.Network.Camera.CJMS11
}
}
-
+ ///
+ /// This method is called from within this class when
+ /// a prompt string was received from the telnet server.
+ ///
+ public static void OnImagesReceived(
+ object sender,
+ int cameraIndex,
+ Image image,
+ int imageIndex,
+ int imageCount,
+ DateTimeOffset? frameTime)
+ {
+ if (image == null)
+ {
+ return;
+ }
+
+ log.Info( $"Images received from camera: {cameraIndex}, imageIndex={imageIndex}, " +
+ $"imageCount={imageCount}, frameTime={frameTime:O}");
+
+ EventHandler handler = ImagesCameraHandler;
+
+ if (handler == null)
+ {
+ image.Dispose();
+ return;
+ }
+
+ try
+ {
+ handler( sender,
+ new PromptReceivedImagesEventArgs(
+ cameraIndex,
+ imageIndex,
+ imageCount,
+ image,
+ frameTime));
+
+ log.Info( $"ImagesCameraHandler reached camera: {cameraIndex}, imageIndex={imageIndex}, " +
+ $"imageCount={imageCount}");
+ }
+ catch (Exception exc)
+ {
+ log.Error( $"ImagesCameraHandler failed: cameraIdx={cameraIndex}, imageIndex={imageIndex}, " +
+ $"error={exc.Message}", exc);
+ image.Dispose();
+ }
+ }
+
+ private async Task ReadCameraLineAsync(
+ NetworkStream stream,
+ int timeoutMs,
+ CancellationToken ct)
+ {
+ await cameraReadLock.WaitAsync(ct);
+
+ try
+ {
+ var line = new List();
+ var buffer = new byte[1];
+
+ while (true)
+ {
+ Task readTask = stream.ReadAsync(buffer, 0, 1, ct);
+ Task timeoutTask = Task.Delay(timeoutMs, ct);
+
+ Task completed = await Task.WhenAny(readTask, timeoutTask);
+
+ if (completed == timeoutTask)
+ {
+ ct.ThrowIfCancellationRequested();
+ throw new TimeoutException($"Camera {cameraIdx} read timeout after {timeoutMs} ms.");
+ }
+
+ int read = await readTask;
+
+ if (read == 0)
+ throw new IOException("Camera connection closed.");
+
+ if (buffer[0] == '\n')
+ break;
+
+ if (buffer[0] != '\r')
+ line.Add(buffer[0]);
+ }
+
+ return Encoding.ASCII.GetString(line.ToArray());
+ }
+ finally
+ {
+ cameraReadLock.Release();
+ }
+ }
+
+ private readonly object cameraReadSyncLock = new object();
+
+ private string ReadCameraLine(NetworkStream stream, int timeoutMs)
+ {
+ lock (cameraReadSyncLock)
+ {
+ stream.ReadTimeout = timeoutMs;
+
+ var line = new List();
+
+ while (true)
+ {
+ int b = stream.ReadByte(); // tu funguje ReadTimeout
+
+ if (b == -1)
+ throw new IOException("Camera connection closed.");
+
+ if (b == '\n')
+ break;
+
+ if (b != '\r')
+ line.Add((byte)b);
+ }
+
+ return Encoding.ASCII.GetString(line.ToArray());
+ }
+ }
+
+
+ private async Task SendCommandAsync(NetworkStream stream, CommandM command, CancellationToken ct, string payload = null)
+ {
+ string commandStr = CommandMEnum.GetVal(command);
+
+ if (!string.IsNullOrEmpty(payload))
+ {
+ commandStr += "=" + payload;
+ }
+
+ //commandStr += " ";
+ byte[] bytes = Encoding.ASCII.GetBytes(commandStr + "\n");
+
+ //await cameraWriteLock.WaitAsync();
+
+
+ log.Info($"Sending command: '{commandStr}'");
+ await stream.WriteAsync(bytes, 0, bytes.Length);
+ await stream.FlushAsync();
+ //stream.Write(bytes, 0, bytes.Length);
+ //stream.Flush();
+
+ //await stream.WriteLineAsync(commandStr);
+ //await stream.FlushAsync();
+ log.Info($"Command sent: '{commandStr}'");
+
+ }
+
+
+ private async Task ReadCameraLineWithTimeout(NetworkStream stream, int timeoutMs)
+ {
+ var readTask = Task.Run(() => ReadCameraLine(stream, timeoutMs));
+ var timeoutTask = Task.Delay(timeoutMs);
+
+ var completed = await Task.WhenAny(readTask, timeoutTask);
+
+ if (completed == timeoutTask)
+ {
+ try { stream.Close(); } catch { }
+ try { cameraTcpClient?.Close(); } catch { }
+
+ throw new TimeoutException($"Camera read timeout after {timeoutMs} ms.");
+ }
+
+ return await readTask;
+ }
+
+
+ //------------------------------ SEND PART --------------------------------------
+
+ public Task> StartSendImagesPreviewAsync(
+ int count,
+ int delayMs,
+ string taskId)
+ {
+ if (count <= 0)
+ {
+ throw new ArgumentOutOfRangeException(
+ nameof(count),
+ "Image count must be greater than zero.");
+ }
+
+ if (delayMs < 0)
+ {
+ throw new ArgumentOutOfRangeException(
+ nameof(delayMs),
+ "Delay cannot be negative.");
+ }
+
+ if (string.IsNullOrWhiteSpace(taskId))
+ {
+ throw new ArgumentException(
+ "Task ID is required.",
+ nameof(taskId));
+ }
+
+ if (sendImagesTask != null &&
+ !sendImagesTask.IsCompleted)
+ {
+ log.Warn(
+ $"Send images preview already running: " +
+ $"cameraIdx={cameraIdx}, taskId={taskId}");
+
+ return sendImagesTask;
+ }
+
+ sendImagesCts?.Cancel();
+ sendImagesCts?.Dispose();
+
+ sendImagesCts =
+ new CancellationTokenSource();
+
+ sendImagesTask =
+ SendImagesPreviewListenerAsync(
+ count,
+ delayMs,
+ taskId,
+ sendImagesCts.Token);
+
+ return sendImagesTask;
+ }
+
+ public void CancelSendImagesPreview()
+ {
+ try
+ {
+ sendImagesCts?.Cancel();
+ }
+ catch (ObjectDisposedException)
+ {
+ }
+ }
+
+ private async Task> SendImagesPreviewListenerAsync(
+ int requestedCount,
+ int delayMs,
+ string taskId,
+ CancellationToken ct)
+ {
+ bool lockAcquired = false;
+ TcpClient client = null;
+ NetworkStream stream = null;
+ CameraLineReader reader = null;
+
+ var imagesByIndex = new Dictionary();
+
+ try
+ {
+ await cameraOperationLock.WaitAsync(ct).ConfigureAwait(false);
+
+ lockAcquired = true;
+
+ client = await ConnectCameraAsync( timeoutMs: 5000, ct: ct).ConfigureAwait(false);
+ stream = client.GetStream();
+
+ reader = new CameraLineReader( stream, 64 * 1024);
+
+ /*
+ * Kamera musí byť pripravená.
+ */
+ JmsPacket prepareAnswer = await SendCommandAndWaitToAnswerAsync(
+ stream,
+ reader,
+ CommandM.prepare_camera_,
+ null,
+ 3000,
+ ct)
+ .ConfigureAwait(false);
+
+ bool prepared = prepareAnswer != null &&
+ prepareAnswer.JmsMessage != null &&
+ prepareAnswer.JmsMessage.Status == MessageStatus.ACK;
+
+ bool alreadyOpened =
+ prepareAnswer != null &&
+ prepareAnswer.JmsMessage != null &&
+ prepareAnswer.JmsMessage.Status == MessageStatus.NACK &&
+ !string.IsNullOrEmpty( prepareAnswer.JmsMessage.Payload) &&
+ prepareAnswer.JmsMessage.Payload.Contains( "OPENED");
+
+ if (!prepared && !alreadyOpened)
+ {
+ throw new IOException( $"Prepare camera for send failed: cameraIdx={cameraIdx}, " +
+ $"answer={FormatPacketForLog(prepareAnswer)}");
+ }
+
+ var request = new SendImagesRequest { Count = requestedCount, Delay = delayMs, TaskId = taskId };
+ string requestPayload = JsonConvert.SerializeObject( request, Formatting.None);
+
+ log.Debug( $"Starting send images preview: cameraIdx={cameraIdx}, count={requestedCount}, " +
+ $"delay={delayMs}, taskId={taskId}");
+
+ /*
+ * Pri send_ neposielame cez
+ * SendCommandAndWaitToAnswerAsync(),
+ * pretože očakávame viac odpovedí.
+ */
+ await SendCommandAsync(
+ stream,
+ CommandM.send_,
+ ct,
+ requestPayload)
+ .ConfigureAwait(false);
+
+ /*
+ * Timeout musí zahŕňať plánovaný čas snímania.
+ *
+ * count=5, delay=2050:
+ * približne 4 * 2050 ms medzi prvým a posledným frame
+ * plus rezerva na prenos Base64 obrázkov.
+ */
+ int totalTimeoutMs = CalculateSendTimeout( requestedCount, delayMs);
+
+ using (var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(ct))
+ {
+ timeoutCts.CancelAfter(totalTimeoutMs);
+
+ while (imagesByIndex.Count < requestedCount)
+ {
+ timeoutCts.Token.ThrowIfCancellationRequested();
+
+ string response = await reader.ReadLineAsync( 10000, timeoutCts.Token).ConfigureAwait(false);
+
+ if (string.IsNullOrWhiteSpace(response))
+ {
+ continue;
+ }
+
+ JmsPacket packet;
+
+ try
+ {
+ packet = new JmsPacket(response);
+ }
+ catch (Exception exc)
+ {
+ log.Warn( $"Cannot parse send response: cameraIdx={cameraIdx}, error={exc.Message}");
+ continue;
+ }
+
+ if (packet.JmsMessage == null)
+ {
+ continue;
+ }
+
+ if (packet.JmsMessage.Command != CommandM.send_)
+ {
+ log.Debug( $"Unexpected packet during send: cameraIdx={cameraIdx}, command={packet.JmsMessage.Command}");
+ continue;
+ }
+
+ if (packet.JmsMessage.Status != MessageStatus.ACK)
+ {
+ log.Warn( $"Send image returned NACK: cameraIdx={cameraIdx}, payload={packet.JmsMessage.Payload}");
+ continue;
+ }
+
+ string payload = packet.JmsMessage.Payload;
+
+ if (string.IsNullOrWhiteSpace(payload))
+ {
+ continue;
+ }
+
+ /*
+ * Posledný sumarizačný packet nemá
+ * pictureBase64 ani workerId.
+ */
+ if (!PayloadContainsImage(payload))
+ {
+ TryLogSendSummary( payload, cameraIdx);
+ continue;
+ }
+
+ SendImagePayload imagePayload;
+
+ try
+ {
+ imagePayload = JsonConvert.DeserializeObject(payload);
+ }
+ catch (Exception exc)
+ {
+ log.Warn( $"Cannot deserialize send image: cameraIdx={cameraIdx}, error={exc.Message}");
+ continue;
+ }
+
+ if (imagePayload == null || string.IsNullOrWhiteSpace( imagePayload.PictureBase64))
+ {
+ continue;
+ }
+
+ if (!string.Equals( imagePayload.Status, "SUCCESSFUL", StringComparison.OrdinalIgnoreCase))
+ {
+ log.Warn( $"Send image status is not successful: cameraIdx={cameraIdx}, " +
+ $"workerId={imagePayload.WorkerId}, status={imagePayload.Status}");
+ continue;
+ }
+
+ /*
+ * workerId je podľa logu 1..count.
+ */
+ int imageIndex = imagePayload.WorkerId;
+
+ if (imageIndex <= 0)
+ {
+ log.Warn( $"Invalid send image index: cameraIdx={cameraIdx}, workerId={imageIndex}");
+ continue;
+ }
+
+ /*
+ * Duplicitný packet ignorujeme.
+ */
+ if (imagesByIndex.ContainsKey( imageIndex))
+ {
+ log.Warn( $"Duplicate send image: cameraIdx={cameraIdx}, workerId={imageIndex}");
+ continue;
+ }
+
+ Image image = DecodeBase64Image( imagePayload.PictureBase64);
+
+ if (!IsValidGrabbedImage(image))
+ {
+ image?.Dispose();
+
+ log.Warn(
+ $"Invalid send image: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"workerId={imageIndex}");
+
+ continue;
+ }
+
+ DateTimeOffset? frameTime =
+ ParseFrameTime(
+ imagePayload.FrameTime);
+
+ /*
+ * Úpravy obrázka dokončíme ešte predtým,
+ * než ho odovzdáme UI.
+ */
+ ImageUtils.Rotate(
+ image,
+ RoiConfiguration.ImageRotation);
+
+ DrawOverlay(image);
+
+ var timedImage =
+ new TimedCameraImage
+ {
+ Index = imageIndex,
+ TaskId =
+ imagePayload.TaskId,
+ FrameTime = frameTime,
+ FrameTimeMillis =
+ imagePayload.FrameTimeMillis,
+ FrameGap =
+ imagePayload.FrameGap,
+ Image = image
+ };
+
+ imagesByIndex.Add(
+ imageIndex,
+ timedImage);
+
+ /*
+ * UI dostane klon.
+ * Originál zostáva vo výslednom zozname.
+ */
+ Image imageForUi = CloneImageToBitmap(image);
+
+ OnImagesReceived(
+ this,
+ cameraIdx,
+ imageForUi,
+ imageIndex,
+ requestedCount,
+ frameTime);
+
+ log.Debug( $"Send image received: cameraIdx={cameraIdx}, workerId={imageIndex}, " +
+ $"received={imagesByIndex.Count}/{requestedCount}, frameTime={frameTime:O}, " +
+ $"size={image.Width}x{image.Height}");
+ }
+ }
+
+ List result =
+ imagesByIndex
+ .OrderBy(x => x.Key)
+ .Select(x => x.Value)
+ .ToList();
+
+ log.Debug(
+ $"Send images preview completed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"received={result.Count}, " +
+ $"taskId={taskId}");
+
+ return result;
+ }
+ catch (OperationCanceledException)
+ {
+ foreach (TimedCameraImage image
+ in imagesByIndex.Values)
+ {
+ image.Image?.Dispose();
+ }
+
+ log.Debug(
+ $"Send images preview cancelled: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"taskId={taskId}");
+
+ throw;
+ }
+ catch (Exception exc)
+ {
+ foreach (TimedCameraImage image
+ in imagesByIndex.Values)
+ {
+ image.Image?.Dispose();
+ }
+
+ log.Error(
+ $"Send images preview failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"taskId={taskId}, " +
+ $"error={exc.Message}",
+ exc);
+
+ UiBridge.Bridge.OnImage(
+ cameraIdx,
+ null);
+
+ throw;
+ }
+ finally
+ {
+ if (stream != null &&
+ reader != null)
+ {
+ try
+ {
+ await TryCloseCameraAsync(
+ stream,
+ reader)
+ .ConfigureAwait(false);
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Send preview cleanup failed: " +
+ $"cameraIdx={cameraIdx}, " +
+ $"error={exc.Message}");
+ }
+ }
+
+ try
+ {
+ stream?.Dispose();
+ }
+ catch
+ {
+ }
+
+ try
+ {
+ client?.Close();
+ client?.Dispose();
+ }
+ catch
+ {
+ }
+
+ if (lockAcquired)
+ {
+ cameraOperationLock.Release();
+ }
+ }
+ }
+
+ private static int CalculateSendTimeout(
+ int count,
+ int delayMs)
+ {
+ /*
+ * Medzi count obrázkami je count - 1 intervalov.
+ * Pridáme 15 sekúnd rezervu na capture,
+ * Base64 a sieťový prenos.
+ */
+ long captureDuration =
+ (long)Math.Max(0, count - 1) *
+ delayMs;
+
+ long timeout =
+ captureDuration + 15000L;
+
+ return timeout > int.MaxValue
+ ? int.MaxValue
+ : (int)timeout;
+ }
+
+ private static Image DecodeBase64Image( string pictureBase64)
+ {
+ if (string.IsNullOrWhiteSpace( pictureBase64))
+ {
+ return null;
+ }
+
+ try
+ {
+ byte[] imageBytes = Convert.FromBase64String( pictureBase64);
+
+ using (var stream = new MemoryStream(imageBytes))
+ using (Image decoded = Image.FromStream( stream, useEmbeddedColorManagement: false, validateImageData: true))
+ {
+ /*
+ * Bitmap odpojí výsledok od MemoryStream.
+ */
+ return new Bitmap(decoded);
+ }
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ private static bool PayloadContainsImage( string payload)
+ {
+ if (string.IsNullOrWhiteSpace(payload))
+ {
+ return false;
+ }
+
+ return payload.IndexOf( "\"pictureBase64\"", StringComparison.OrdinalIgnoreCase) >= 0;
+ }
+
+ private static DateTimeOffset? ParseFrameTime( string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return null;
+ }
+
+ DateTimeOffset parsed;
+
+ if (DateTimeOffset.TryParse(
+ value,
+ System.Globalization.CultureInfo.InvariantCulture,
+ System.Globalization.DateTimeStyles.RoundtripKind,
+ out parsed))
+ {
+ return parsed;
+ }
+
+ return null;
+ }
+
+ private static void TryLogSendSummary( string payload, int cameraIdx)
+ {
+ try
+ {
+ SendSummaryPayload summary = JsonConvert.DeserializeObject(payload);
+
+ if (summary == null)
+ {
+ return;
+ }
+
+ log.Debug( $"Send summary received: cameraIdx={cameraIdx}, picCount={summary.PictureCount}, " +
+ $"delay={summary.Delay}, timeStamp={summary.TimeStamp}");
+ }
+ catch (Exception exc)
+ {
+ log.Debug( $"Payload is not a send summary: cameraIdx={cameraIdx}, error={exc.Message}");
+ }
+ }
diff --git a/TBF/Rig/Network/Camera/CJMS11/CameraLineReader.cs b/TBF/Rig/Network/Camera/CJMS11/CameraLineReader.cs
new file mode 100644
index 000000000..da5fd2919
--- /dev/null
+++ b/TBF/Rig/Network/Camera/CJMS11/CameraLineReader.cs
@@ -0,0 +1,154 @@
+using System;
+using System.IO;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace TBF.Rig.Network.Camera.CJMS11
+{
+ internal sealed class CameraLineReader
+ {
+ private readonly Stream stream;
+ private readonly byte[] receiveBuffer;
+
+ private int bufferStart;
+ private int bufferEnd;
+
+ public CameraLineReader(
+ Stream stream,
+ int bufferSize = 64 * 1024)
+ {
+ if (stream == null)
+ throw new ArgumentNullException(nameof(stream));
+
+ if (!stream.CanRead)
+ throw new ArgumentException(
+ "Stream must be readable.",
+ nameof(stream));
+
+ if (bufferSize <= 0)
+ throw new ArgumentOutOfRangeException(
+ nameof(bufferSize));
+
+ this.stream = stream;
+ receiveBuffer = new byte[bufferSize];
+ }
+
+ public async Task ReadLineAsync(
+ int timeoutMs,
+ CancellationToken cancellationToken)
+ {
+ if (timeoutMs <= 0)
+ throw new ArgumentOutOfRangeException(
+ nameof(timeoutMs));
+
+ using (var lineBuffer = new MemoryStream())
+ {
+ while (true)
+ {
+ int newLineIndex = FindNewLine();
+
+ if (newLineIndex >= 0)
+ {
+ int count = newLineIndex - bufferStart;
+
+ if (count > 0)
+ {
+ lineBuffer.Write(
+ receiveBuffer,
+ bufferStart,
+ count);
+ }
+
+ bufferStart = newLineIndex + 1;
+
+ return ConvertLineToString(lineBuffer);
+ }
+
+ if (bufferStart < bufferEnd)
+ {
+ lineBuffer.Write(
+ receiveBuffer,
+ bufferStart,
+ bufferEnd - bufferStart);
+ }
+
+ bufferStart = 0;
+ bufferEnd = 0;
+
+ int read = await ReadChunkAsync(
+ timeoutMs,
+ cancellationToken)
+ .ConfigureAwait(false);
+
+ if (read == 0)
+ {
+ throw new IOException(
+ "Camera connection was closed.");
+ }
+
+ bufferStart = 0;
+ bufferEnd = read;
+ }
+ }
+ }
+
+ private int FindNewLine()
+ {
+ for (int i = bufferStart; i < bufferEnd; i++)
+ {
+ if (receiveBuffer[i] == (byte)'\n')
+ return i;
+ }
+
+ return -1;
+ }
+
+ private async Task ReadChunkAsync(
+ int timeoutMs,
+ CancellationToken cancellationToken)
+ {
+ using (var timeoutCts =
+ CancellationTokenSource.CreateLinkedTokenSource(
+ cancellationToken))
+ {
+ timeoutCts.CancelAfter(timeoutMs);
+
+ try
+ {
+ return await stream.ReadAsync(
+ receiveBuffer,
+ 0,
+ receiveBuffer.Length,
+ timeoutCts.Token)
+ .ConfigureAwait(false);
+ }
+ catch (OperationCanceledException)
+ when (!cancellationToken.IsCancellationRequested)
+ {
+ throw new TimeoutException(
+ $"Camera read timeout after {timeoutMs} ms.");
+ }
+ }
+ }
+
+ private static string ConvertLineToString(
+ MemoryStream lineBuffer)
+ {
+ int length = checked((int)lineBuffer.Length);
+
+ if (length == 0)
+ return string.Empty;
+
+ byte[] data = lineBuffer.GetBuffer();
+
+ if (data[length - 1] == (byte)'\r')
+ length--;
+
+ return Encoding.ASCII.GetString(
+ data,
+ 0,
+ length);
+ }
+ }
+}
\ No newline at end of file
diff --git a/TBF/Rig/Network/Camera/CJMS11/GrabImagesOp.cs b/TBF/Rig/Network/Camera/CJMS11/GrabImagesOp.cs
index e6f71ab5d..af7048168 100644
--- a/TBF/Rig/Network/Camera/CJMS11/GrabImagesOp.cs
+++ b/TBF/Rig/Network/Camera/CJMS11/GrabImagesOp.cs
@@ -1,198 +1,1123 @@
///
/// Copyright (c) 2017 Sensus Slovensko a.s.
///
+
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Drawing;
-using log4net;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
using Common;
using Config.Entities;
+using log4net;
+using TBF.Rig.Network.Camera.CJMS11.POJO;
using TBF.Rig.Network.Telnet;
-using System.IO;
-using System.Threading.Tasks;
-using System.Windows.Forms;
namespace TBF.Rig.Network.Camera.CJMS11
{
public class GrabImagesOp : IOperation
{
- /// TODO: Implement support for grabbing multiple images, now imgFileNames.Lenght should be 1
-
private static readonly ILog log = LogManager.GetLogger(typeof(GrabImagesOp));
- public override string ToString() { return string.Format("GrabImageOp()"); }
- readonly Camera camera;
-
- readonly string[] imgFileNames;
- readonly bool blackAndWhite;
- readonly bool lowResolution;
- readonly ImageRotation imageRotation;
-
- string command;
- bool grabImageCommandSent;
- string response;
- bool grabPassed;
- bool grabFailed;
- bool transferringGrabbedImage;
-
- Image grabedImage;
- Dictionary grabedImages = new Dictionary();
-
-
- ///
- /// Events: Event.None or Event.Error
- ///
- /// CLP1611.Camera reference
- public GrabImagesOp(Camera camera, string[] imgFileNames, bool blackAndWhite, bool lowResolution, ImageRotation imageRotation)
+ private enum GrabOperationMode
{
- /// TODO: Implement support for grabbing multiple images, now imgFileNames.Lenght should be 1
-
+ None,
+ SingleImage,
+ SendImages
+ }
+
+
+ private readonly Camera camera;
+ private readonly string[] imgFileNames;
+ private readonly bool blackAndWhite;
+ private readonly bool lowResolution;
+ private readonly ImageRotation imageRotation;
+
+ private readonly object imageSync = new object();
+
+ private bool grabImageCommandSent;
+ private bool transferringGrabbedImage;
+
+ private GrabOperationMode operationMode;
+
+ private Image grabedImage;
+
+ private readonly Dictionary grabedImages = new Dictionary();
+
+ private Task grabImageTask;
+ private Task> sendImagesTask;
+ private Task saveImageTask;
+
+ private IReadOnlyList timedCameraImages;
+ private readonly List savedFileNames = new List();
+
+ public override string ToString() { return "GrabImageOp()"; }
+
+ public GrabImagesOp(
+ Camera camera,
+ string[] imgFileNames,
+ bool blackAndWhite,
+ bool lowResolution,
+ ImageRotation imageRotation)
+ {
+ if (camera == null)
+ {
+ throw new ArgumentNullException(nameof(camera));
+ }
+
this.camera = camera;
- //this.telnet = camera.Telnet;
this.imgFileNames = imgFileNames;
this.blackAndWhite = blackAndWhite;
this.lowResolution = lowResolution;
this.imageRotation = imageRotation;
- grabImageCommandSent = false;
- transferringGrabbedImage = false;
-
- /// image incomming event
- if (camera.DebugLevel == DebugMode.Normal || camera.DebugLevel == DebugMode.DetectedOn)
- {
- Camera.ImageCameraHandler += ImageReceived;
- }
- //TODO BUMI improve by simulate image
- Camera.ImageCameraHandler += ImageReceived;
-
- /// inmages incomming event rotation
- if (camera.DebugLevel == DebugMode.Normal || camera.DebugLevel == DebugMode.DetectedOn)
- {
- Camera.ImagesCameraHandler += ImagesReceived;
- }
- //TODO BUMI improve by simulate image
- Camera.ImagesCameraHandler += ImagesReceived;
- }
-
- void PromptReceived(object sndr, PromptReceivedJMSEventArgs a)
- {
- response = a.Response;
- }
-
- void ImageReceived(object sndr, PromptReceivedImageEventArgs a)
- {
- if(a.idxCamera != camera.CameraIdx) return;
- grabedImage = a.image;
- grabPassed = true;
+ SubscribeEvents();
}
- void ImagesReceived(object sndr, PromptReceivedImagesEventArgs a)
+
+
+ private void SubscribeEvents()
{
- if(a.idxCamera != camera.CameraIdx) return;
- grabedImage = a.image; //upgraded image common
- grabedImages[a.idxImage] = a.image; // stored image from sent to list of images
- grabPassed = true;
+ Camera.ImageCameraHandler -= ImageReceived;
+ Camera.ImageCameraHandler += ImageReceived;
+
+ Camera.ImagesCameraHandler -= ImagesReceived;
+ Camera.ImagesCameraHandler += ImagesReceived;
}
+ private void ImageReceived(
+ object sender,
+ PromptReceivedImageEventArgs args)
+ {
+ if (args == null || args.idxCamera != camera.CameraIdx || args.image == null)
+ {
+ return;
+ }
+
+ /*
+ * Tento obrázok používame iba pre kompatibilitu
+ * s existujúcim eventovým mechanizmom.
+ *
+ * Hlavným zdrojom výsledku je Task.
+ */
+ lock (imageSync)
+ {
+ grabedImage = args.image;
+ }
+ }
+
+ private void ImagesReceived( object sender, PromptReceivedImagesEventArgs args)
+ {
+ if (args == null || args.idxCamera != camera.CameraIdx || args.image == null)
+ {
+ return;
+ }
+
+ /*
+ * Náhľadové obrázky z eventu nebudeme ukladať
+ * na disk. Originálne obrázky dostaneme vo
+ * výsledku sendImagesTask.
+ */
+ lock (imageSync)
+ {
+ grabedImage = args.image;
+ grabedImages[args.idxImage] = args.image;
+ }
+ }
public void Start()
{
+ SubscribeEvents();
+
grabImageCommandSent = false;
transferringGrabbedImage = false;
- grabPassed = false;
- grabedImage = null;
- grabedImages.Clear();
- if ((imgFileNames != null) && (imgFileNames.Length > 0) && File.Exists(imgFileNames[0]))
- {
- ///
- /// An image specified, (1) delete previous image, (2) check if this is a simulation
- ///
- File.Delete(imgFileNames[0]);
+ operationMode = GrabOperationMode.None;
- /* if (camera.CameraCfg.DebugLevel == DebugMode.Simulate || camera.CameraCfg.DebugLevel == DebugMode.DetectedOff)
- {
- ///
- /// Camera is in simulation mode => create a simulated image
- ///
- File.Copy(string.Format("{0}\\Pictures\\sample.jpg", Program.ExecutableDir), imgFileNames[0]);
- }*/
- }
+ grabImageTask = null;
+ sendImagesTask = null;
+ saveImageTask = null;
+
+ timedCameraImages = null;
+
+ lock (imageSync)
+ {
+ grabedImage = null;
+ grabedImages.Clear();
+ }
+
+ savedFileNames.Clear();
+
+ DeletePreviousOutputFiles();
}
+
public Event Run()
{
- if ((imgFileNames == null) || (imgFileNames.Length < 1) || (imgFileNames[0] == null))
+ if (!HasValidOutputFileName())
{
- ///
- /// No images to be grabbed => Done
- ///
- return Event.GrabPassed;
+ log.Warn(
+ $"No output image file configured: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabPassed;
}
- /*else if (camera.CameraCfg.DebugLevel == DebugMode.Simulate ||
- camera.CameraCfg.DebugLevel == DebugMode.DetectedOff)
- {
- ///
- /// Camera is in simulation mode => create a simulated image and complete
- ///
- return Event.GrabPassed;
- }*/
- else if (camera.IsGrabImageListenerThreadAlive)
- {
- return Event.CameraBusy;
- }
- else if (!grabImageCommandSent)
+
+ /*
+ * 1. Spustenie príslušnej operácie.
+ */
+ if (!grabImageCommandSent)
{
- ///
- /// Normal operation, no command sent yet => (1) wait until telnet state = Inactive, (2) send a command
- ///
- camera.StartGrabImageListener();
- grabImageCommandSent = true;
+ return StartGrabOperation();
+ }
+
+ /*
+ * 2. Spracovanie podľa režimu.
+ */
+ switch (operationMode)
+ {
+ case GrabOperationMode.SingleImage:
+ return RunSingleImageMode();
+
+ case GrabOperationMode.SendImages:
+ return RunSendImagesMode();
+
+ default:
+ log.Error(
+ $"Grab operation mode was not selected: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+ }
+
+ private Event StartGrabOperation()
+ {
+ grabImageCommandSent = true;
+
+ try
+ {
+ int requestedImageCount =
+ GetRequestedImageCount();
+
+ if (requestedImageCount <= 1)
+ {
+ operationMode =
+ GrabOperationMode.SingleImage;
+
+ log.Debug(
+ $"Starting single asynchronous grab: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ grabImageTask =
+ camera.StartGrabImageListenerAsync(
+ retryUntilValidImage: true,
+ maxAttempts: 5,
+ retryDelayMs: 200);
+ }
+ else
+ {
+ operationMode =
+ GrabOperationMode.SendImages;
+
+ int delayMs =
+ GetRequestedDelayMs();
+
+ string taskId =
+ CreateSendTaskId();
+
+ log.Debug(
+ $"Starting send images operation: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"count={requestedImageCount}, " +
+ $"delayMs={delayMs}, " +
+ $"taskId={taskId}");
+
+ sendImagesTask =
+ camera.StartSendImagesPreviewAsync(
+ count: requestedImageCount,
+ delayMs: delayMs,
+ taskId: taskId);
+ }
+
return Event.CameraBusy;
}
- else if (grabPassed)
+ catch (Exception exc)
{
- ///
- /// Normal operation, grab passed => transfer/transferring the image
-
-
- if (transferringGrabbedImage)
- {
- /// Grab passed and image transfer is in progress
- return Event.GrabPassed;
- }
- else if (camera.IsSaveImageListenerThreadAlive)
- {
- /// Wait until the previous image transfer completes
- return Event.CameraBusy;
- }
- else //if (0 == camera.DownloadFile(blackAndWhite ? "grabbed.jpg" : "grabbed.bmp", imgFileNames[0]))
- {
- camera.StartSaveImageToFileListener(grabedImage, imgFileNames[0]);
- /// File transfer successfully started
- transferringGrabbedImage = true;
- return Event.GrabPassed;
- }
- }
- else
- {
- ///
- /// Normal operation, grab failed => there in no image to transfer
- ///
+ log.Error(
+ $"Cannot start image operation: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"mode={operationMode}, " +
+ $"error={exc.Message}",
+ exc);
+
+ FinishOperation();
+
return Event.GrabFailed;
}
-
}
+ private Event RunSingleImageMode()
+ {
+ if (grabImageTask == null)
+ {
+ log.Error(
+ $"Single grab task was not created: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (!grabImageTask.IsCompleted)
+ {
+ return Event.CameraBusy;
+ }
+
+ if (grabImageTask.IsCanceled)
+ {
+ log.Warn(
+ $"Single grab task was cancelled: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (grabImageTask.IsFaulted)
+ {
+ log.Error(
+ $"Single grab task failed: " +
+ $"cameraIdx={camera.CameraIdx}",
+ grabImageTask.Exception?.Flatten());
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (!transferringGrabbedImage)
+ {
+ Image imageToSave;
+
+ try
+ {
+ imageToSave =
+ grabImageTask
+ .GetAwaiter()
+ .GetResult();
+ }
+ catch (Exception exc)
+ {
+ log.Error(
+ $"Cannot obtain grabbed image: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"error={exc.Message}",
+ exc);
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (imageToSave == null)
+ {
+ log.Error(
+ $"Single grab completed without image: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ lock (imageSync)
+ {
+ grabedImage = imageToSave;
+ }
+
+ string outputFileName =
+ imgFileNames[0];
+
+ try
+ {
+ saveImageTask =
+ camera.StartSaveImageToFileAsync(
+ imageToSave,
+ outputFileName);
+
+ savedFileNames.Clear();
+ savedFileNames.Add(
+ outputFileName);
+
+ transferringGrabbedImage = true;
+ }
+ catch (Exception exc)
+ {
+ log.Error(
+ $"Cannot start single image save: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"file={outputFileName}, " +
+ $"error={exc.Message}",
+ exc);
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ return Event.CameraBusy;
+ }
+
+ return CheckSaveTaskAndFinish();
+ }
+
+
+
+ private Event RunSendImagesMode()
+ {
+ if (sendImagesTask == null)
+ {
+ log.Error(
+ $"Send images task was not created: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (!sendImagesTask.IsCompleted)
+ {
+ return Event.CameraBusy;
+ }
+
+ if (sendImagesTask.IsCanceled)
+ {
+ log.Warn(
+ $"Send images task was cancelled: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (sendImagesTask.IsFaulted)
+ {
+ log.Error(
+ $"Send images task failed: " +
+ $"cameraIdx={camera.CameraIdx}",
+ sendImagesTask.Exception?.Flatten());
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (!transferringGrabbedImage)
+ {
+ try
+ {
+ timedCameraImages =
+ sendImagesTask
+ .GetAwaiter()
+ .GetResult();
+ }
+ catch (Exception exc)
+ {
+ log.Error(
+ $"Cannot obtain send image results: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"error={exc.Message}",
+ exc);
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (timedCameraImages == null ||
+ timedCameraImages.Count == 0)
+ {
+ log.Error(
+ $"Send operation returned no images: " +
+ $"cameraIdx={camera.CameraIdx}");
+
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ int requestedCount =
+ GetRequestedImageCount();
+
+ if (timedCameraImages.Count !=
+ requestedCount)
+ {
+ log.Error(
+ $"Send operation returned unexpected image count: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"requested={requestedCount}, " +
+ $"received={timedCameraImages.Count}");
+
+ DisposeTimedImages();
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ IReadOnlyList
+ orderedImages =
+ timedCameraImages
+ .OrderBy(image => image.Index)
+ .ToList();
+
+ try
+ {
+ /*
+ * Camera.StartSaveImageToFileAsync používa
+ * jeden interný save task, preto viac
+ * obrázkov uložíme sekvenčne v jednom
+ * samostatnom tasku.
+ */
+ saveImageTask =
+ Task.Run(
+ () => SaveTimedImages(
+ orderedImages));
+
+ transferringGrabbedImage = true;
+ }
+ catch (Exception exc)
+ {
+ log.Error(
+ $"Cannot start send images save task: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"error={exc.Message}",
+ exc);
+
+ DisposeTimedImages();
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ return Event.CameraBusy;
+ }
+
+ return CheckSaveTaskAndFinish();
+ }
+
+ private void SaveTimedImages( IReadOnlyList images)
+ {
+ if (images == null)
+ {
+ throw new ArgumentNullException(nameof(images));
+ }
+
+ if (images.Count == 0)
+ {
+ throw new ArgumentException( "No timed camera images were provided.", nameof(images));
+ }
+
+ if (!HasValidOutputFileName())
+ {
+ throw new InvalidOperationException( "No base output image file name is configured.");
+ }
+
+ savedFileNames.Clear();
+
+ IReadOnlyList orderedImages =
+ images
+ .Where(image => image != null)
+ .OrderBy(image => image.Index)
+ .ToList();
+
+ if (orderedImages.Count != images.Count)
+ {
+ throw new InvalidOperationException( $"One or more timed camera images are null. cameraIdx={camera.CameraIdx}, " +
+ $"expected={images.Count}, valid={orderedImages.Count}");
+ }
+
+ log.Debug( $"Starting timed images save: cameraIdx={camera.CameraIdx}, imagesCount={orderedImages.Count}, " +
+ $"baseFile='{imgFileNames[0]}'");
+
+ foreach (TimedCameraImage timedImage in orderedImages)
+ {
+ if (timedImage.Image == null)
+ {
+ throw new InvalidOperationException( $"Timed camera image contains no image data: " +
+ $"cameraIdx={camera.CameraIdx}, imageIndex={timedImage.Index}, frameTime={timedImage.FrameTime:O}");
+ }
+
+ /*
+ * Každý obrázok uložíme pod unikátnym názvom
+ * obsahujúcim index obrázka a časovú značku.
+ */
+ string timedFileName = CreateTimedImageFileName( timedImage, orderedImages.Count);
+
+ log.Debug( $"Saving timed camera image: cameraIdx={camera.CameraIdx}, imageIndex={timedImage.Index}, " +
+ $"frameTime={timedImage.FrameTime:O}, file='{timedFileName}'");
+
+ camera.SaveImageToFile(
+ timedImage.Image,
+ timedFileName);
+
+ savedFileNames.Add(
+ timedFileName);
+
+ log.Debug( $"Timed camera image saved successfully: cameraIdx={camera.CameraIdx}, " +
+ $"imageIndex={timedImage.Index}, file='{timedFileName}'");
+
+ /*
+ * Prvý obrázok uložíme ešte raz pod pôvodným názvom.
+ *
+ * Tento súbor používa existujúci dialóg cez
+ * startImages[] alebo endImages[].
+ *
+ * Napríklad:
+ * TestAdvance-1-start.bmp
+ */
+ if (timedImage.Index == 1)
+ {
+ string compatibilityFileName =
+ imgFileNames[0];
+
+ log.Debug($"Saving first timed image under compatibility name: cameraIdx={camera.CameraIdx}, " +
+ $"imageIndex={timedImage.Index}, frameTime={timedImage.FrameTime:O}, file='{compatibilityFileName}'");
+
+ camera.SaveImageToFile(timedImage.Image, compatibilityFileName);
+ savedFileNames.Add(compatibilityFileName);
+
+ log.Debug($"First timed image saved under compatibility name: cameraIdx={camera.CameraIdx}, " +
+ $"imageIndex={timedImage.Index}, file='{compatibilityFileName}'");
+ }
+ }
+
+ log.Debug(
+ $"Timed images save completed: cameraIdx={camera.CameraIdx}, receivedImages={orderedImages.Count}, " +
+ $"savedFiles={savedFileNames.Count}");
+ }
+
+ private Event CheckSaveTaskAndFinish()
+ {
+ if (saveImageTask == null)
+ {
+ log.Error( $"Save image task was not created: cameraIdx={camera.CameraIdx}, mode={operationMode}");
+ FinishOperation();
+ return Event.GrabFailed;
+ }
+
+ if (!saveImageTask.IsCompleted)
+ {
+ return Event.CameraBusy;
+ }
+
+ if (saveImageTask.IsCanceled)
+ {
+ log.Warn( $"Save image task was cancelled: cameraIdx={camera.CameraIdx}, mode={operationMode}");
+
+ DisposeOperationImages();
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ if (saveImageTask.IsFaulted)
+ {
+ log.Error( $"Save image task failed: cameraIdx={camera.CameraIdx}, mode={operationMode}",
+ saveImageTask.Exception?.Flatten());
+
+ DisposeOperationImages();
+ FinishOperation();
+
+ return Event.GrabFailed;
+ }
+
+ bool allFilesSaved = VerifySavedFiles();
+
+ if (allFilesSaved)
+ {
+ log.Debug( $"Image operation completed successfully: cameraIdx={camera.CameraIdx}, " +
+ $"mode={operationMode}, savedFiles={savedFileNames.Count}");
+ }
+ else
+ {
+ log.Error( $"One or more image files were not saved: cameraIdx={camera.CameraIdx}, mode={operationMode}");
+ }
+
+ DisposeOperationImages();
+ FinishOperation();
+
+ return allFilesSaved
+ ? Event.GrabPassed
+ : Event.GrabFailed;
+ }
+
+ private bool VerifySavedFiles()
+ {
+ if (savedFileNames.Count == 0)
+ {
+ return false;
+ }
+
+ foreach (string fileName
+ in savedFileNames)
+ {
+ try
+ {
+ if (string.IsNullOrWhiteSpace(fileName) ||
+ !File.Exists(fileName))
+ {
+ return false;
+ }
+
+ var fileInfo =
+ new FileInfo(fileName);
+
+ if (fileInfo.Length <= 0)
+ {
+ return false;
+ }
+ }
+ catch (Exception exc)
+ {
+ log.Error(
+ $"Cannot verify saved image: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"file={fileName}, " +
+ $"error={exc.Message}",
+ exc);
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private string CreateTimedImageFileName(
+ TimedCameraImage timedImage,
+ int totalImageCount)
+ {
+ if (timedImage == null)
+ {
+ throw new ArgumentNullException(nameof(timedImage));
+ }
+
+ if (!HasValidOutputFileName())
+ {
+ throw new InvalidOperationException(
+ "No base output image file name is configured.");
+ }
+
+ int imagePosition = timedImage.Index;
+
+ if (imagePosition <= 0)
+ {
+ throw new InvalidOperationException(
+ $"Invalid image position: {imagePosition}.");
+ }
+
+ // Prvý obrázok musí zostať pod pôvodným názvom,
+ // pretože tento názov používa startImages/endImages.
+ if (imagePosition == 1)
+ {
+ return imgFileNames[0];
+ }
+
+ string configuredFileName = imgFileNames[0];
+
+ string directory =
+ Path.GetDirectoryName(configuredFileName);
+
+ string baseName =
+ Path.GetFileNameWithoutExtension(configuredFileName);
+
+ string extension =
+ Path.GetExtension(configuredFileName);
+
+ if (string.IsNullOrWhiteSpace(extension))
+ {
+ extension = ".png";
+ }
+
+ DateTime timestampUtc =
+ timedImage.FrameTime.HasValue
+ ? timedImage.FrameTime.Value.UtcDateTime
+ : DateTime.UtcNow;
+
+ string timestampText =
+ timestampUtc.ToString(
+ "yyyyMMdd_HHmmss_fff",
+ CultureInfo.InvariantCulture);
+
+ int digits = Math.Max(
+ 2,
+ totalImageCount.ToString(
+ CultureInfo.InvariantCulture).Length);
+
+ string indexText =
+ imagePosition.ToString(
+ "D" + digits,
+ CultureInfo.InvariantCulture);
+
+ string newFileName =
+ $"{baseName}_img{indexText}_{timestampText}{extension}";
+
+ return string.IsNullOrWhiteSpace(directory)
+ ? newFileName
+ : Path.Combine(directory, newFileName);
+ }
+
+ private string GetConfiguredFileName(
+ int zeroBasedIndex)
+ {
+ if (imgFileNames != null &&
+ zeroBasedIndex >= 0 &&
+ zeroBasedIndex < imgFileNames.Length &&
+ !string.IsNullOrWhiteSpace(
+ imgFileNames[zeroBasedIndex]))
+ {
+ return imgFileNames[zeroBasedIndex];
+ }
+
+ /*
+ * Ak nie je pripravený názov pre každý obrázok,
+ * použijeme prvý názov ako základ.
+ */
+ return imgFileNames[0];
+ }
+
+ private int GetRequestedImageCount()
+ {
+ var roi = camera.CamRoi;
+
+ if (roi == null)
+ {
+ return 1;
+ }
+
+ return Math.Max(1, roi.RoiPicCount);
+ }
+
+ private int GetRequestedDelayMs()
+ {
+ const int MinDelayMs = 500;
+
+ var roi = camera.CamRoi;
+
+ if (roi == null)
+ {
+ return MinDelayMs;
+ }
+
+ int configuredDelay = roi.RoiDeltaTimeMs;
+
+ if (configuredDelay < MinDelayMs)
+ {
+ log.Warn( $"Configured ROI delay {configuredDelay} ms is below minimum. Using {MinDelayMs} ms instead.");
+ }
+
+ return Math.Max(MinDelayMs, configuredDelay);
+ }
+
+ private string CreateSendTaskId()
+ {
+ /*
+ * Timestamp + kamera + krátka časť GUID.
+ * ID je čitateľné a zároveň odolné voči
+ * kolíziám pri rýchlom opakovaní.
+ */
+ string timestamp = DateTime.UtcNow.ToString( "yyyyMMddHHmmssfff", CultureInfo.InvariantCulture);
+
+ string uniquePart = Guid.NewGuid() .ToString("N") .Substring(0, 8);
+
+ return $"{timestamp}_cam{camera.CameraIdx}_" + uniquePart;
+ }
+
+ private bool HasValidOutputFileName()
+ {
+ return
+ imgFileNames != null &&
+ imgFileNames.Length > 0 &&
+ !string.IsNullOrWhiteSpace(
+ imgFileNames[0]);
+ }
+
+
+
+
+
+
+
+
public void Stop()
{
- //if (camera.CameraCfg.DebugLevel == DebugMode.Simulate) return;
-
- if (camera.IsGrabImageListenerThreadAlive)
+ try
{
- camera.SetStopGrabImageListenerFlag();
+ switch (operationMode)
+ {
+ case GrabOperationMode.SingleImage:
+ camera.CancelGrabImage();
+ break;
+
+ case GrabOperationMode.SendImages:
+ camera.CancelSendImagesPreview();
+ break;
+ }
+ }
+ catch (Exception exc)
+ {
+ log.Warn( $"Cancel image operation failed: cameraIdx={camera.CameraIdx}, mode={operationMode}, " +
+ $"error={exc.Message}");
+ }
+ finally
+ {
+ FinishOperation();
}
}
+
+ private void FinishOperation()
+ {
+ UnsubscribeEvents();
+ }
+
+ private void UnsubscribeEvents()
+ {
+ Camera.ImageCameraHandler -= ImageReceived;
+ Camera.ImagesCameraHandler -= ImagesReceived;
+ }
+
+ private static string AppendTimestampToFileName(
+ string originalFileName,
+ DateTime timestamp)
+ {
+ if (string.IsNullOrWhiteSpace(originalFileName))
+ {
+ throw new ArgumentException(
+ "File name is required.",
+ nameof(originalFileName));
+ }
+
+ string directory =
+ Path.GetDirectoryName(originalFileName);
+
+ string fileNameWithoutExtension =
+ Path.GetFileNameWithoutExtension(originalFileName);
+
+ string extension =
+ Path.GetExtension(originalFileName);
+
+ string timestampText =
+ timestamp
+ .ToUniversalTime()
+ .ToString(
+ "yyyyMMdd_HHmmss_fff",
+ System.Globalization.CultureInfo.InvariantCulture);
+
+ string newFileName =
+ $"{fileNameWithoutExtension}_{timestampText}{extension}";
+
+ return string.IsNullOrWhiteSpace(directory)
+ ? newFileName
+ : Path.Combine(directory, newFileName);
+ }
+
+
+ private void DisposeOperationImages()
+ {
+ if (operationMode ==
+ GrabOperationMode.SendImages)
+ {
+ DisposeTimedImages();
+ return;
+ }
+
+ Image imageToDispose = null;
+
+ lock (imageSync)
+ {
+ imageToDispose = grabedImage;
+ grabedImage = null;
+ }
+
+ try
+ {
+ imageToDispose?.Dispose();
+ }
+ catch
+ {
+ }
+ }
+
+ private void DisposeTimedImages()
+ {
+ if (timedCameraImages == null)
+ {
+ return;
+ }
+
+ foreach (TimedCameraImage timedImage
+ in timedCameraImages)
+ {
+ try
+ {
+ timedImage?.Image?.Dispose();
+ }
+ catch
+ {
+ }
+ }
+
+ timedCameraImages = null;
+ }
+
+ private void DeletePreviousOutputFiles()
+ {
+ if (!HasValidOutputFileName())
+ {
+ return;
+ }
+
+ var filesToDelete = new HashSet(
+ StringComparer.OrdinalIgnoreCase);
+
+ foreach (string configuredFileName in imgFileNames)
+ {
+ if (string.IsNullOrWhiteSpace(configuredFileName))
+ {
+ continue;
+ }
+
+ string fullConfiguredFileName;
+
+ try
+ {
+ fullConfiguredFileName =
+ Path.GetFullPath(configuredFileName);
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Invalid configured image file name: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"file='{configuredFileName}', " +
+ $"error={exc.Message}");
+
+ continue;
+ }
+
+ string directory =
+ Path.GetDirectoryName(fullConfiguredFileName);
+
+ string baseName =
+ Path.GetFileNameWithoutExtension(
+ fullConfiguredFileName);
+
+ string extension =
+ Path.GetExtension(
+ fullConfiguredFileName);
+
+ if (string.IsNullOrWhiteSpace(directory) ||
+ string.IsNullOrWhiteSpace(baseName))
+ {
+ continue;
+ }
+
+ if (!Directory.Exists(directory))
+ {
+ log.Debug(
+ $"Image output directory does not exist; " +
+ $"nothing to delete: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"directory='{directory}'");
+
+ continue;
+ }
+
+ /*
+ * Pôvodný kompatibilný súbor:
+ *
+ * TestAdvance-1-start.bmp
+ */
+ filesToDelete.Add(
+ fullConfiguredFileName);
+
+ /*
+ * Časované súbory:
+ *
+ * TestAdvance-1-start_img01_20260715_120000_100.bmp
+ * TestAdvance-1-start_img02_20260715_120000_600.bmp
+ *
+ * Časovú značku neanalyzujeme.
+ * Hľadáme podľa stabilného prefixu názvu.
+ */
+ string searchPattern =
+ $"{baseName}_img*{extension}";
+
+ try
+ {
+ foreach (string foundFile in
+ Directory.GetFiles(
+ directory,
+ searchPattern,
+ SearchOption.TopDirectoryOnly))
+ {
+ filesToDelete.Add(
+ Path.GetFullPath(foundFile));
+ }
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Cannot search previous timed images: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"directory='{directory}', " +
+ $"pattern='{searchPattern}', " +
+ $"error={exc.Message}");
+ }
+ }
+
+ log.Debug(
+ $"Previous image files found for deletion: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"count={filesToDelete.Count}");
+
+ foreach (string fileName in filesToDelete)
+ {
+ try
+ {
+ if (!File.Exists(fileName))
+ {
+ continue;
+ }
+
+ File.Delete(fileName);
+
+ log.Debug(
+ $"Previous image file deleted: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"file='{fileName}'");
+ }
+ catch (Exception exc)
+ {
+ log.Warn(
+ $"Cannot delete previous image file: " +
+ $"cameraIdx={camera.CameraIdx}, " +
+ $"file='{fileName}', " +
+ $"error={exc.Message}");
+ }
+ }
+ }
+
}
-}
+}
\ No newline at end of file
diff --git a/TBF/Rig/Network/Camera/CJMS11/JmsMessage.cs b/TBF/Rig/Network/Camera/CJMS11/JmsMessage.cs
index 6bccf0ad7..678c2775f 100644
--- a/TBF/Rig/Network/Camera/CJMS11/JmsMessage.cs
+++ b/TBF/Rig/Network/Camera/CJMS11/JmsMessage.cs
@@ -1,3 +1,4 @@
+using System;
using TBF.Rig.Network.Camera.CJMS11.POJO;
namespace TBF.Rig.Network.Camera.CJMS11
@@ -11,6 +12,7 @@ namespace TBF.Rig.Network.Camera.CJMS11
private string orig_status;
private string orig_command;
private string orig_payload;
+ private DateTime timeStamp;
public POJO.MessageStatus Status
{
@@ -35,6 +37,12 @@ namespace TBF.Rig.Network.Camera.CJMS11
public string OrigCommand => orig_command;
public string OrigPayload => orig_payload;
+
+ public DateTime TimeStamp
+ {
+ get => timeStamp;
+ set => timeStamp = value;
+ }
public JmsMessage(string status, string command, string payload)
{
diff --git a/TBF/Rig/Network/Camera/CJMS11/JmsPacket.cs b/TBF/Rig/Network/Camera/CJMS11/JmsPacket.cs
index 2cfccee07..e40c748f9 100644
--- a/TBF/Rig/Network/Camera/CJMS11/JmsPacket.cs
+++ b/TBF/Rig/Network/Camera/CJMS11/JmsPacket.cs
@@ -1,6 +1,7 @@
using System;
using System.Text.RegularExpressions;
using log4net;
+using Newtonsoft.Json;
using TBF.Rig.Network.Camera.CJMS11.POJO;
namespace TBF.Rig.Network.Camera.CJMS11
@@ -44,6 +45,16 @@ namespace TBF.Rig.Network.Camera.CJMS11
if (message.Length < 1) return false;
this.jmsMessage = JmsMessageFromString(message);
+
+ try
+ {
+ CameraResponse response =
+ JsonConvert.DeserializeObject(jmsMessage.Payload);
+ jmsMessage.TimeStamp = response.timeStamp;
+ }catch(Exception e)
+ {
+ log.Debug("Error parsing message timestamp: " + e.Message);
+ }
return true;
}
@@ -70,23 +81,39 @@ namespace TBF.Rig.Network.Camera.CJMS11
return null;
}
- public static ParsedImage ImageParser(string payloadImage)
+ public static ParsedImage ImageParser(
+ string payloadImage)
{
- // Equivalent regex pattern
- var imagePattern = new Regex(@"IMAGE:([A-Z0-9_]+):\s*(.*?)\s*~IMAGE_END", RegexOptions.Singleline);
+ const string prefix = "IMAGE:";
+ const string endMarker = "~IMAGE_END";
- var match = imagePattern.Match(payloadImage);
- if (match.Success)
- {
- string encoding = match.Groups[1].Value;
- string imageData = match.Groups[2].Value;
+ int prefixIndex = payloadImage.IndexOf( prefix, StringComparison.Ordinal);
+
+ if (prefixIndex < 0)
+ throw new ArgumentException( "IMAGE prefix was not found.");
- return new ParsedImage(ImageTypeEnum.GetCommandM(encoding), imageData);
- }
- else
- {
- throw new ArgumentException($"Payload does not match expected image format: {payloadImage}");
- }
+ int encodingStart =
+ prefixIndex + prefix.Length;
+
+ int encodingEnd =
+ payloadImage.IndexOf(
+ ':',
+ encodingStart);
+
+ if (encodingEnd < 0)
+ throw new ArgumentException(
+ "Image encoding separator was not found.");
+
+ int dataStart = encodingEnd + 1;
+
+ int dataEnd = payloadImage.IndexOf( endMarker, dataStart, StringComparison.Ordinal);
+
+ if (dataEnd < 0)
+ throw new ArgumentException( "IMAGE_END marker was not found.");
+
+ string encoding = payloadImage .Substring( encodingStart, encodingEnd - encodingStart) .Trim();
+ string imageData = payloadImage.Substring( dataStart,dataEnd - dataStart).Trim();
+ return new ParsedImage( ImageTypeEnum.GetCommandM(encoding), imageData);
}
public override string ToString()
diff --git a/TBF/Rig/Network/Camera/CJMS11/POJO/CameraResponse.cs b/TBF/Rig/Network/Camera/CJMS11/POJO/CameraResponse.cs
new file mode 100644
index 000000000..fc07458c3
--- /dev/null
+++ b/TBF/Rig/Network/Camera/CJMS11/POJO/CameraResponse.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace TBF.Rig.Network.Camera.CJMS11.POJO
+{
+ public class CameraResponse
+ {
+ public string message { get; set; }
+
+ public DateTime timeStamp { get; set; }
+
+ }
+}
\ No newline at end of file
diff --git a/TBF/Rig/Network/Camera/CJMS11/POJO/SendImagePayload.cs b/TBF/Rig/Network/Camera/CJMS11/POJO/SendImagePayload.cs
new file mode 100644
index 000000000..c691d2667
--- /dev/null
+++ b/TBF/Rig/Network/Camera/CJMS11/POJO/SendImagePayload.cs
@@ -0,0 +1,37 @@
+using Newtonsoft.Json;
+
+namespace TBF.Rig.Network.Camera.CJMS11.POJO
+{
+ public class SendImagePayload
+ {
+ [JsonProperty("frameGap")]
+ public int FrameGap { get; set; }
+
+ [JsonProperty("frameTime")]
+ public string FrameTime { get; set; }
+
+ [JsonProperty("frameTimeMillis")]
+ public long FrameTimeMillis { get; set; }
+
+ [JsonProperty("pictureBase64")]
+ public string PictureBase64 { get; set; }
+
+ [JsonProperty("picturesComplete")]
+ public int PicturesComplete { get; set; }
+
+ [JsonProperty("status")]
+ public string Status { get; set; }
+
+ [JsonProperty("taskId")]
+ public string TaskId { get; set; }
+
+ [JsonProperty("taskPath")]
+ public string TaskPath { get; set; }
+
+ [JsonProperty("taskTime")]
+ public string TaskTime { get; set; }
+
+ [JsonProperty("workerId")]
+ public int WorkerId { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/TBF/Rig/Network/Camera/CJMS11/POJO/SendImagesRequest.cs b/TBF/Rig/Network/Camera/CJMS11/POJO/SendImagesRequest.cs
new file mode 100644
index 000000000..c460d23bf
--- /dev/null
+++ b/TBF/Rig/Network/Camera/CJMS11/POJO/SendImagesRequest.cs
@@ -0,0 +1,16 @@
+using Newtonsoft.Json;
+
+namespace TBF.Rig.Network.Camera.CJMS11.POJO
+{
+ public class SendImagesRequest
+ {
+ [JsonProperty("count")]
+ public int Count { get; set; }
+
+ [JsonProperty("delay")]
+ public int Delay { get; set; }
+
+ [JsonProperty("taskId")]
+ public string TaskId { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/TBF/Rig/Network/Camera/CJMS11/POJO/SendSummaryPayload.cs b/TBF/Rig/Network/Camera/CJMS11/POJO/SendSummaryPayload.cs
new file mode 100644
index 000000000..47cdd0927
--- /dev/null
+++ b/TBF/Rig/Network/Camera/CJMS11/POJO/SendSummaryPayload.cs
@@ -0,0 +1,16 @@
+using Newtonsoft.Json;
+
+namespace TBF.Rig.Network.Camera.CJMS11.POJO
+{
+ public class SendSummaryPayload
+ {
+ [JsonProperty("delay")]
+ public int Delay { get; set; }
+
+ [JsonProperty("pic_count")]
+ public int PictureCount { get; set; }
+
+ [JsonProperty("timeStamp")]
+ public string TimeStamp { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/TBF/Rig/Network/Camera/CJMS11/POJO/TimedCameraImage.cs b/TBF/Rig/Network/Camera/CJMS11/POJO/TimedCameraImage.cs
new file mode 100644
index 000000000..35529d7a1
--- /dev/null
+++ b/TBF/Rig/Network/Camera/CJMS11/POJO/TimedCameraImage.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Drawing;
+
+namespace TBF.Rig.Network.Camera.CJMS11.POJO
+{
+ public class TimedCameraImage
+ {
+ public int Index { get; set; }
+
+ public string TaskId { get; set; }
+
+ public DateTimeOffset? FrameTime { get; set; }
+
+ public long FrameTimeMillis { get; set; }
+
+ public int FrameGap { get; set; }
+
+ public Image Image { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs
index 6de7a9062..9cfe9965a 100644
--- a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs
+++ b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs
@@ -20,17 +20,36 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0];
public override XmlSerializer GetSerializer() { return Serializer; }
- public double PulsesPerLtr; /// [l^-1]
-
- public override void InitializeAll()
- {
- PulsesPerLtr = 1.0;
- }
+ ///PulsePerMeter [l^-1]
+ public double PulsesPerLtr;
+ ///
+ /// delta time gap for send parameter
+ ///
+ /// delta time for send parameter 500ms is minimum
+ public int RoiDeltaTimeMs;
+
+ ///
+ /// count of picture for send > 1 / grabImage == 0|1 parameter - switch method
+ ///
+ /// count of picture for send > 1 / grabImage == 0|1 parameter - switch method
+ public int RoiPicCount;
string[] paramNames = new string[]
{
Strings.PulsesPerLtr,
+ Strings.PictureCouts,
+ Strings.DelaySendImage,
};
+
+
+
+ public override void InitializeAll()
+ {
+ PulsesPerLtr = 1.0;
+ RoiPicCount = 1; //default value 1 => grab Image
+ RoiDeltaTimeMs = 500; //delta time for send parameter 500ms is minimum
+ }
+
public override string ParamName(int i) { return paramNames[i]; }
public override int ParamsCount() { return paramNames.Length; }
@@ -39,6 +58,8 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11
switch (i)
{
case 0: return PulsesPerLtr.ToString();
+ case 1: return RoiPicCount.ToString();
+ case 2: return RoiDeltaTimeMs.ToString();
default: return string.Empty;
}
}
@@ -49,6 +70,8 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11
switch (i)
{
case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None;
+ case 1: RoiPicCount = Int32.Parse(strValue); return CfgUpdateFlags.None;
+ case 2: RoiDeltaTimeMs = Int32.Parse(strValue); return CfgUpdateFlags.None;
default: return CfgUpdateFlags.None;
}
}
@@ -59,11 +82,26 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11
message = string.Empty;
double dummy;
+ int dummyInt;
switch (i)
{
case 0:
if (Utils.TryParseUDouble(strValue, out dummy)) return true;
break;
+ case 1:
+ if (!Int32.TryParse(strValue, out dummyInt) || (dummyInt < 0 || dummyInt > 50))
+ {
+ message = ParamName(i) + " is invalid. Param must be between 0 and 50!";
+ return false;
+ }
+ return true;
+ case 2:
+ if (!Int32.TryParse(strValue, out dummyInt) || (dummyInt < 500 || dummyInt < 5500))
+ {
+ message = ParamName(i) + " is invalid. Param must be between 500 and 5500!";
+ return false;
+ }
+ return true;
default:
message = "Invalid index";
return false;
@@ -76,6 +114,8 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11
void CopyContentTo(ProcedureParams prms)
{
prms.PulsesPerLtr = this.PulsesPerLtr;
+ prms.RoiDeltaTimeMs = this.RoiDeltaTimeMs;
+ prms.RoiPicCount = this.RoiPicCount;
}
public IParamsProvider Clone()
diff --git a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs
index 6c29ec345..c28c43730 100644
--- a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs
+++ b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs
@@ -3,6 +3,7 @@
///
using System;
using System.Collections.Generic;
+using System.IO;
using System.Text;
using log4net;
using Common;
@@ -41,6 +42,8 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11
get { return roiCfg.ProcParams.PulsesPerLtr; }
set { roiCfg.ProcParams.PulsesPerLtr = value; }
}
+ public int RoiDeltaTimeMs { get { return roiCfg.ProcParams.RoiDeltaTimeMs; } }
+ public int RoiPicCount { get { return roiCfg.ProcParams.RoiPicCount; } }
public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } }
public string QuantityUnits { get; set; }
@@ -123,26 +126,65 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11
return GrabImageOp(imageFileName, roiCfg.BlackAndWhite, roiCfg.LowResolution, roiCfg.ImageRotation);
}
- public IOperation GrabImageOp(string imageFileName,
- bool blackAndWhite, bool lowResolution, ImageRotation imageRotation)
+ // Roi.cs
+ public IOperation GrabImageOp(
+ string imageFileName,
+ bool blackAndWhite,
+ bool lowResolution,
+ ImageRotation imageRotation)
{
- if (NetCamera != null)
+ if (NetCamera == null)
{
- ///TODO BUMI - implementing grabing multiple images
- /// 1. Create a list of image file names
- string[] imageNames = new string[roiCfg.ImageOpacity.Count];
- for (int i = 0; i < imageNames.Length; i++)
- {
- imageNames[i] = imageFileName + string.Format("{0}_{1}",imageNames.Length, i);
- }
- /// 2. implement count of images to grab
- /// 3. implement grabing multiple images
-
- /// TODO: Implement support for sharing one camera by multiple ROI-s
- return NetCamera.GrabImagesOp(new string[] { imageFileName }, blackAndWhite, lowResolution, imageRotation);
- }
- else
return null;
+ }
+
+ int imageCount = Math.Max(1, RoiPicCount);
+
+ string[] imageNames = CreateImageFileNames(
+ imageFileName,
+ imageCount);
+
+ return NetCamera.GrabImagesOp(
+ imageNames,
+ blackAndWhite,
+ lowResolution,
+ imageRotation);
+ }
+
+ private static string[] CreateImageFileNames(
+ string originalFileName,
+ int imageCount)
+ {
+ if (imageCount <= 1)
+ {
+ return new[] { originalFileName };
+ }
+
+ string directory = Path.GetDirectoryName(originalFileName);
+ string baseName = Path.GetFileNameWithoutExtension(originalFileName);
+ string extension = Path.GetExtension(originalFileName);
+ string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss_fff");
+
+ var result = new string[imageCount];
+
+ // Prvý obrázok zostáva kompatibilný s dialógom.
+ result[0] = originalFileName;
+
+ for (int i = 1; i < imageCount; i++)
+ {
+ string fileName = string.Format(
+ "{0}_{1}_{2:D2}{3}",
+ baseName,
+ timestamp,
+ i + 1,
+ extension);
+
+ result[i] = string.IsNullOrEmpty(directory)
+ ? fileName
+ : Path.Combine(directory, fileName);
+ }
+
+ return result;
}
public IValve GetValve()
diff --git a/TBF/Rig/Network/Telnet/EventArgsClasses.cs b/TBF/Rig/Network/Telnet/EventArgsClasses.cs
index 8d156e092..4a1f82aee 100644
--- a/TBF/Rig/Network/Telnet/EventArgsClasses.cs
+++ b/TBF/Rig/Network/Telnet/EventArgsClasses.cs
@@ -94,17 +94,24 @@ namespace TBF.Rig.Network.Telnet
public class PromptReceivedImagesEventArgs : EventArgs
{
- public Image image; /// server image.
- public int idxCamera; /// camera index.
- public int idxImage; /// image index.
- public int imageCounts; /// number of images.
-
- public PromptReceivedImagesEventArgs(int idxCamera, Image image, int idxImage, int imageCounts)
+ public int idxCamera;
+ public int idxImage;
+ public int imageCount;
+ public Image image;
+ public DateTimeOffset? frameTime;
+
+ public PromptReceivedImagesEventArgs(
+ int idxCamera,
+ int idxImage,
+ int imageCount,
+ Image image,
+ DateTimeOffset? frameTime)
{
- this.image = image;
this.idxCamera = idxCamera;
this.idxImage = idxImage;
- this.imageCounts = imageCounts;
+ this.imageCount = imageCount;
+ this.image = image;
+ this.frameTime = frameTime;
}
}
diff --git a/TBF/Rig/Sequences/iPerlCommunicationSeq.cs b/TBF/Rig/Sequences/iPerlCommunicationSeq.cs
index 497628ab8..012ff19ee 100644
--- a/TBF/Rig/Sequences/iPerlCommunicationSeq.cs
+++ b/TBF/Rig/Sequences/iPerlCommunicationSeq.cs
@@ -366,7 +366,7 @@ namespace TBF.Rig.Sequences
Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, method, test, testParams });
//------------------------------------------------
- Bridge.OnActivity(this, Strings.iPerl_Communication_in_progress);
+ Bridge.OnActivity(this, Strings.Meter_Communication_in_progress);
//------------------------------------------------
bool stopPressed = false; /// true when STOP button pressed
diff --git a/TBF/Rig/TestMethods/FlyingStartMassCollection/Single/Component.cs b/TBF/Rig/TestMethods/FlyingStartMassCollection/Single/Component.cs
index 097f9eeab..5c438d9e6 100644
--- a/TBF/Rig/TestMethods/FlyingStartMassCollection/Single/Component.cs
+++ b/TBF/Rig/TestMethods/FlyingStartMassCollection/Single/Component.cs
@@ -48,6 +48,16 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection.Single
}
else
{
+
+ if (DebugLevel == DebugMode.Simulate &&
+ test.Name.ToLower().Contains("q3")
+ )
+ {
+ //Q3 Test - calibration data
+ return new FlyingStartMassCollectionSeq().Execute(test, repetNr, isLastRepetition,
+ testMethodCfg.TestParams.DelayedStart, null, null, DebugLevel);
+ }
+
/// DebugLevel == DebugMode.Simulate
(new FlyingStartMassCollectionSeq()).MakeSimulatedTrivial(test, repetNr, test.Part);
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, Progress.Completed));
diff --git a/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs b/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs
index ccc2efebe..4192cd75c 100644
--- a/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs
+++ b/TBF/Rig/TestMethods/StandingStartMassCollectionAdvanceCollect/StandingStartMassCollectionAdvanceCollectSeq.cs
@@ -150,9 +150,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvanceCollect
(rr as Rig.RegisterReaders.StandingStartStop.RegisterReader).EndWMState = dataEntryCmpnt.WMEndState(i);
(rr as Rig.RegisterReaders.StandingStartStop.RegisterReader).BeginWMState = dataEntryCmpnt.WMStartState(i);
}
-
-
-
+
if (rr is Rig.Network.Camera.RoiForFixedStart.Roi)
{
(rr as Rig.Network.Camera.RoiForFixedStart.Roi).EndWMState = dataEntryCmpnt.WMEndState(i);
@@ -167,6 +165,16 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollectionAdvanceCollect
dataEntryCmpnt.WMStartState(i);
log.DebugFormat(" StandingStartMassCollectionAdvanceSeq.cs - BeginWMState [{0}], EndWMState [{1}] -> RoiForFixedStartKeyence.Roi",dataEntryCmpnt.WMStartState(i),dataEntryCmpnt.WMEndState(i));
}
+
+ //New camera CJMS11 - supplier Java Microservices, s.r.o
+ if (rr is Rig.Network.Camera.RoiForFixedStartCJMS11.Roi)
+ {
+ (rr as Rig.Network.Camera.RoiForFixedStartCJMS11.Roi).EndWMState =
+ dataEntryCmpnt.WMEndState(i);
+ (rr as Rig.Network.Camera.RoiForFixedStartCJMS11.Roi).BeginWMState =
+ dataEntryCmpnt.WMStartState(i);
+ log.DebugFormat(" StandingStartMassCollectionAdvanceSeq.cs - BeginWMState [{0}], EndWMState [{1}] -> RoiForFixedStartCJMS11.Roi",dataEntryCmpnt.WMStartState(i),dataEntryCmpnt.WMEndState(i));
+ }
}
}
diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj
index 8e4c09a81..a6e3bcf01 100644
--- a/TBF/TBF.csproj
+++ b/TBF/TBF.csproj
@@ -1038,11 +1038,13 @@
CameraCfgCtrl.cs
+
+
@@ -1050,6 +1052,10 @@
+
+
+
+
Form
diff --git a/TBF/UiBridge/Bridge.cs b/TBF/UiBridge/Bridge.cs
index 79b0dad1d..226422de1 100644
--- a/TBF/UiBridge/Bridge.cs
+++ b/TBF/UiBridge/Bridge.cs
@@ -3,6 +3,7 @@
///
using System;
using System.Collections.Generic;
+using System.Threading.Tasks;
using log4net;
using NHibernate;
using Common;
@@ -229,7 +230,26 @@ namespace TBF.UiBridge
public static void OnCameraUICmd(object sender, CameraUICmdEventArgs data)
{
if (CameraUICmdHandler == null) return;
- try { CameraUICmdHandler(sender, data); }
+ try
+ {
+ log.DebugFormat("CameraUICmdHandler: {0}", data.CameraUICmd);
+ foreach (EventHandler handler in CameraUICmdHandler.GetInvocationList())
+ {
+ var localHandler = handler;
+
+ Task.Run(() =>
+ {
+ try
+ {
+ localHandler(sender, data);
+ }
+ catch (Exception e)
+ {
+ log.Error("CameraUICmdHandler(...) failed", e);
+ }
+ });
+ }
+ }
catch (Exception e) { log.Error("CameraUICmdHandler(...) failed", e); }
}
public static event EventHandler CameraUICmdHandler;
diff --git a/TBFTests/Rig/Network/Camera/CJMS11/CameraTest.cs b/TBFTests/Rig/Network/Camera/CJMS11/CameraTest.cs
index ea1334a75..10f9a7860 100644
--- a/TBFTests/Rig/Network/Camera/CJMS11/CameraTest.cs
+++ b/TBFTests/Rig/Network/Camera/CJMS11/CameraTest.cs
@@ -2,10 +2,13 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.Threading.Tasks;
+using Common;
using JetBrains.Annotations;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TBF.Rig.Generic;
using TBF.Rig.Network.Camera.CJMS11;
+using TBF.Rig.Network.Camera.RoiForFixedStartCJMS11;
+using TBF.Rig.Network.Camera.RoiForFixedStartCJMS11.common;
using Factory = TBF.Rig.Network.Camera.CJMS11.Factory;
@@ -17,25 +20,41 @@ namespace TBFTests.Rig.Network.Camera.CJMS11
public class CameraTest
{
private static string ipCamera1 = "192.168.0.170";
- private static string ipCamera2 = "192.168.0.169";
+ private static string ipCamera2 = "192.168.0.129";
public string IPCamera1 { get { return ipCamera1; } }
public string IPCamera2 { get { return ipCamera2; } }
+ private RoiCfg CreateTestRoiCfg()
+ {
+ var factory = new TBF.Rig.Network.Camera.RoiForFixedStartCJMS11.Factory();
+
+ var roi = new RoiCfg("TestRoi", factory);
+
+ roi.BlackAndWhite = false;
+ roi.LowResolution = true;
+ roi.ImageRotation = ImageRotation.None;
+ roi.ImageFrame = Frame.StandardFrame();
+
+ return roi;
+ }
+
[TestMethod]
public void Initialize()
{
- TBF.Rig.Network.Camera.CJMS11.Camera camera = GetCamera( IPCamera1);
+ TBF.Rig.Network.Camera.CJMS11.Camera camera = GetCamera(IPCamera1);
+ camera.RoiConfiguration = CreateTestRoiCfg();
camera.Initialize();
TBF.Rig.Network.Camera.CJMS11.Camera camera2 = GetCamera( IPCamera2);
+ camera2.RoiConfiguration = CreateTestRoiCfg();
camera2.Initialize();
- TBF.Rig.Network.Camera.CJMS11.Camera camera11 = GetCamera( IPCamera1);
- camera11.Initialize();
-
- TBF.Rig.Network.Camera.CJMS11.Camera camera12 = GetCamera( IPCamera2);
- camera12.Initialize();
+ // TBF.Rig.Network.Camera.CJMS11.Camera camera11 = GetCamera( IPCamera1);
+ // camera11.Initialize();
+ //
+ // TBF.Rig.Network.Camera.CJMS11.Camera camera12 = GetCamera( IPCamera2);
+ // camera12.Initialize();
}
@@ -57,25 +76,25 @@ namespace TBFTests.Rig.Network.Camera.CJMS11
camera.Initialize();
});
- var task3 = Task.Run(() =>
- {
- var camera = GetCamera(IPCamera2);
- camera.Initialize();
- });
-
- var task4 = Task.Run(() =>
- {
- var camera = GetCamera(IPCamera1);
- camera.Initialize();
- });
+ // var task3 = Task.Run(() =>
+ // {
+ // var camera = GetCamera(IPCamera2);
+ // camera.Initialize();
+ // });
+ //
+ // var task4 = Task.Run(() =>
+ // {
+ // var camera = GetCamera(IPCamera1);
+ // camera.Initialize();
+ // });
- Task.WaitAll(task1, task2, task3, task4); // blocks until both finish
+ Task.WaitAll(task1, task2/*, task3, task4*/); // blocks until both finish
// Optionally, add assertions or diagnostics
Assert.IsTrue(task1.IsCompleted);
Assert.IsTrue(task2.IsCompleted);
- Assert.IsTrue(task3.IsCompleted);
- Assert.IsTrue(task4.IsCompleted);
+ // Assert.IsTrue(task3.IsCompleted);
+ // Assert.IsTrue(task4.IsCompleted);
}
@@ -112,7 +131,7 @@ namespace TBFTests.Rig.Network.Camera.CJMS11
var camera = GetCamera(IPCamera1);
- Task saveImageTask = Task.Run(() => camera.SaveImageListener());
+ Task saveImageTask = Task.Run(() => camera.SaveImageListenerAsynch());
var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(3));
var completedAnswerTask = Task.WhenAny(saveImageTask, timeoutAnswerTask).Result;
if (completedAnswerTask == timeoutAnswerTask)
@@ -129,35 +148,35 @@ namespace TBFTests.Rig.Network.Camera.CJMS11
camera.Initialize();
});
- var task3 = Task.Run(() =>
- {
- var camera = GetCamera(IPCamera2);
-
- Task saveImageTask = Task.Run(() => camera.SaveImageListener());
- var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(3));
- var completedAnswerTask = Task.WhenAny(saveImageTask, timeoutAnswerTask).Result;
- if (completedAnswerTask == timeoutAnswerTask)
- {
- Assert.Fail();
- }
+ // var task3 = Task.Run(() =>
+ // {
+ // var camera = GetCamera(IPCamera2);
+ //
+ // Task saveImageTask = Task.Run(() => camera.SaveImageListenerAsynch());
+ // var timeoutAnswerTask = Task.Delay(TimeSpan.FromSeconds(3));
+ // var completedAnswerTask = Task.WhenAny(saveImageTask, timeoutAnswerTask).Result;
+ // if (completedAnswerTask == timeoutAnswerTask)
+ // {
+ // Assert.Fail();
+ // }
+ //
+ // //TODO BUMI enable check image
+ // //Assert.IsTrue(saveImageTask.Result != null);
+ // });
+ //
+ // var task4 = Task.Run(() =>
+ // {
+ // var camera = GetCamera(IPCamera1);
+ // camera.Initialize();
+ // });
- //TODO BUMI enable check image
- //Assert.IsTrue(saveImageTask.Result != null);
- });
-
- var task4 = Task.Run(() =>
- {
- var camera = GetCamera(IPCamera1);
- camera.Initialize();
- });
-
- await Task.WhenAll(task1, task2,task3, task4); // blocks until both finish
+ await Task.WhenAll(task1, task2/*,task3, task4*/); // blocks until both finish
// Optionally, add assertions or diagnostics
Assert.IsTrue(task1.IsCompleted);
Assert.IsTrue(task2.IsCompleted);
- Assert.IsTrue(task3.IsCompleted);
- Assert.IsTrue(task4.IsCompleted);
+ // Assert.IsTrue(task3.IsCompleted);
+ // Assert.IsTrue(task4.IsCompleted);
}