From a4e62405d395486de351ca2d649df8ad3559bead Mon Sep 17 00:00:00 2001 From: Thomas Wiedebusch Date: Thu, 19 Sep 2024 15:06:41 +0200 Subject: [PATCH] MagFlux: - api 1.0.2.49 --- Common/.shared/NlogConfig.xml | 18 +-- .../MagFlux/MagFluxApi/api_doc/IMagFlux.cs | 8 +- .../MagFlux/MagFluxApi/api_doc/IMagFluxAPI.cs | 11 +- .../api_doc/IMagFluxRequestProtocol.cs | 30 ++++ .../MagFlux/MagFluxApi/magflux_api.dll | Bin 689152 -> 689664 bytes .../MagFlux/MagFluxApi/shared_code.dll | Bin 59392 -> 59392 bytes .../MagFlux/MagFluxCore/MagFluxMeter.cs | 141 +++++++++++++----- .../RequestProtocol/RequestProtocol.cs | 134 +++++++++++------ ...erRegisters.csproj.CoreCompileInputs.cache | 2 +- Common/Ui/MagFluxToolBox/FrmTest.Designer.cs | 41 +++-- Common/Ui/MagFluxToolBox/FrmTest.cs | 10 +- Common/Ui/MagFluxToolBox/FrmTest.resx | 2 +- .../MagFluxToolBox/Properties/AssemblyInfo.cs | 2 +- 13 files changed, 267 insertions(+), 132 deletions(-) diff --git a/Common/.shared/NlogConfig.xml b/Common/.shared/NlogConfig.xml index 2943dea5..454f2fee 100644 --- a/Common/.shared/NlogConfig.xml +++ b/Common/.shared/NlogConfig.xml @@ -9,15 +9,15 @@ - - - - + + + + diff --git a/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFlux.cs b/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFlux.cs index 900a6477..f336d76d 100644 --- a/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFlux.cs +++ b/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFlux.cs @@ -56,12 +56,6 @@ namespace XYLEM /// Like 9600 (default on RS485) /// Like Parity.Even (default on RS485) /// - Boolean Connect(string comport, UInt16 id, UInt32 baudRate, Parity parity); - - /// - /// Close communication connection to Meter - /// - /// true on okay or false on error - Boolean CloseConnection(); + Boolean Connect(string comport, UInt16 id, UInt32 baudRate, Parity parity); } } diff --git a/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxAPI.cs b/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxAPI.cs index b6c16d95..9b7a7e94 100644 --- a/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxAPI.cs +++ b/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxAPI.cs @@ -1,11 +1,11 @@ -using System.IO.Ports; +using System; +using System.IO.Ports; using XYLEM.Device; namespace XYLEM { public interface IMagFluxAPI { - /// /// Make communication connection to Meter /// @@ -36,5 +36,12 @@ namespace XYLEM /// Return a MagFlux device or "null" if failing connect /// if the configuration is not valid IMagFluxRequestProtocol Connect(string comport, ushort id, uint baudRate, Parity parity, string log_path = null, RUN_TYPE runAs = RUN_TYPE.Normal); + + /// + /// Close communication connection to all Meters and clean up for a fresh connection of all devices. + /// Note to continue, all devices needs initialized to be reconnected with Connect(...) + /// + /// true on okay or false on error + Boolean CloseConnections(); } } \ No newline at end of file diff --git a/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxRequestProtocol.cs b/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxRequestProtocol.cs index 0e48929e..afc8440a 100644 --- a/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxRequestProtocol.cs +++ b/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/api_doc/IMagFluxRequestProtocol.cs @@ -16,6 +16,20 @@ namespace XYLEM /// true if yes Boolean IsConnected(); + /// + /// Close communication connection to Meter + /// + /// true on okay or false on error + Boolean CloseConnection(); + + /// + /// Try reconnect communication to a Meter that already had a communication connection + /// Note: will reuse already used communication settings and CloseConnection() is not already closed before call. + /// Used for reestablished communication to Meter when fail to respond during normal operation + /// + /// true on okay or false on error + Boolean Reconnect(); + /// /// Get current device Modbus ID / Device Address /// @@ -147,6 +161,22 @@ namespace XYLEM /// true on okay or false on error Boolean GetFlowRate_lps(out Single value_out); + + /// + /// Average Electrode measurement used for Device calibration verification + /// + /// Average Electrode [mV] + /// true on okay or false on error + Boolean GetAverage_Electrode_mV(out Single value_out); + + /// + /// Standard deviation electrode measurement used for Device calibration verification + /// Note: update will only happen after x seconds, depending on filter config in device + /// + /// Average Electrode [mV] + /// true on okay or false on error + Boolean GetStdDev_Electrode_mV(out Single value_out); + /// /// !!! Warning make sure to turn off simulation, when calibration off sensor is done !!! /// ---- diff --git a/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/magflux_api.dll b/Common/Hardware/WaterMeter/MagFlux/MagFluxApi/magflux_api.dll index 647992640a9c063d7ad63364376850a97896866a..a6aa83ca949b0d18ffd1d2e56c84e02e1c43306a 100644 GIT binary patch delta 62361 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 delta 61416 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 V)bUz2IorGbHgk%57M ziNSF5>8_KW0**EkrCOVO9DAkb2xk@if4q6gl|)`f%gJnyf_P1Kr|tl%1uAA>sGXep zNLygui#-#6Y^-;j;%~M`%fZOV;L4x?B;6PcfTTMEO9KM~BLf2i z6NBF7(_JS$1;X!$*ZjE^?LMi`_qY&Wc-iJ9R}y&{%_g%w3gRt^ng0T)7O0qkp>lHS zBW(fEBkt&y$qOF&PX72vezM5pUlR>DCi6Y1^+_Tl VquJ)~PwRoy + ///// Reminder for ignore empty pipe detection + ///// + //private Boolean _lastIgnoreEmptyPipeDetection; + ///// + ///// Reminder for simulated flow + ///// + //private Boolean _lastSimulatedFlowActive; /// /// Reminder for status bits /// @@ -51,6 +59,20 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore /// private Boolean _enableRawDataLogging; + /// + /// Simulated flow activity + /// + public Boolean SimulatedFlowIsActive + { + get; set; + } + /// + /// Empty pipe ignore + /// + public Boolean IgnoreEmptyPipeDetection + { + get; set; + } /// /// to reduce the IrdA communication in test bench, preparation will be done once (when SkipPreparationForTestBench is true) /// @@ -123,6 +145,22 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore get; private set; } + /// + /// Average of the electrode in milli Volts + /// + public Single AverageElectrode_mV + { + get; private set; + } + + /// + /// Standard deviation of the electrode in milli Volts + /// + public Single StandardDeviationElectrode_mV + { + get; private set; + } + /// /// Represents Empty Pipe Detection control bits /// Bit0="EPD disabled", 1="Enabled w. Flags only", 2="EPD enabled full" @@ -300,6 +338,7 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore private readonly CancellationTokenSource _keepSessionToken = new CancellationTokenSource(); private ILogger _logger; + //private ILogger _loggerRawData; #endregion @@ -859,9 +898,21 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore { EpdControlBits = epd_cntl_bits; } - - RequestProtocol?.GetCalibrationPoints(out _); - StreamingProtocol?.SetDecodingMask(SensorSerialNo, uniqueId); + if (RequestProtocol.GetStdDev_Electrode_mV(out var u_mV)) + { + StandardDeviationElectrode_mV = u_mV; + } + if (RequestProtocol.GetAverage_Electrode_mV(out u_mV)) + { + AverageElectrode_mV = u_mV; + } + + SimulatedFlowIsActive = RequestProtocol.IsSimulatedFlowActive(); + IgnoreEmptyPipeDetection = RequestProtocol.GetIgnoreFailOnEmptyPipeOnHealthy(); + + RequestProtocol.GetCalibrationPoints(out _); + StreamingProtocol.SetDecodingMask(SensorSerialNo, uniqueId); + return IsLoggedOn; } @@ -886,7 +937,7 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore } else { - WriteLog("Wait on measurement start"); + WriteLog($"Slot:{Slot} - Wait on measurement start"); } ProcessStatus = ProcessState.WaitForMeasurement; } @@ -937,7 +988,6 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore } /// - /// public List GetAllMeasurementResults(Double? refVolume, Double? refTimeS, Boolean intermediateMeasurement = false, Int32? channel = null, MeasurementDirection dir = MeasurementDirection.TakeBoth) { @@ -1052,7 +1102,6 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore /// public void WriteCalibration(List calibrationsCmPerH) { - _logger.Info($"Slot:{Slot} - Write calibration values to MagFlux"); RequestProtocol?.SetCalibrationPoints(calibrationsCmPerH); RequestProtocol?.CloseConnection(); } @@ -1062,40 +1111,58 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore public void ReadCalibration(out List calibrationsCmPerH) { calibrationsCmPerH = null; - _logger.Info($"Slot:{Slot} - Read calibration values from MagFlux"); RequestProtocol?.GetCalibrationPoints(out calibrationsCmPerH); RequestProtocol?.CloseConnection(); } - ///// - ///// Turn on/off fixed test flow output from MagFlux - ///// Used for getting a fixed simulated flow from MagFlux - ///// - ///// - ///// true on okay or false on error - //public Boolean SetSimulatedFlowActive(Boolean testFlowOn) - //{ - // _logger.Info($"Slot:{Slot} - Set test flow"); - // return RequestProtocol.SetSimulatedFlowActive(on); - //} + /// + /// Average Electrode measurement used for Device calibration verification + /// + /// Average Electrode [mV] + /// true on okay or false on error + public Boolean GetAverage_Electrode_mV(out Single u_mV) + { + u_mV = 0; + var retVal = RequestProtocol.GetAverage_Electrode_mV(out u_mV); + AverageElectrode_mV = u_mV; + return retVal; + } - ///// - ///// Is the fixed test flow active - ///// Used for getting a fixed simulated flow from MagFlux - ///// - ///// true if ON - //public Boolean IsSimulatedFlowActive() - //{ - // _logger.Info($"Slot:{Slot} - Get test flow setting"); - // return RequestProtocol.IsSimulatedFlowActive(); - //}; + /// + /// Standard deviation electrode measurement used for Device calibration verification + /// Note: update will only happen after x seconds, depending on filter config in device + /// + /// Average Electrode [mV] + /// true on okay or false on error + public Boolean GetStdDev_Electrode_mV(out Single u_mV) + { + u_mV = 0; + //_logger.Info($"Slot:{Slot} - Read standard deviation of electrode voltage"); + var retVal = RequestProtocol.GetStdDev_Electrode_mV(out u_mV); + StandardDeviationElectrode_mV = u_mV; + return retVal; + } + + /// + /// Ignore Empty pipe flag on Healthy, because it is not yet working correct + /// Note: Not 100% secure all test is working during empty pipe, metrology board firmware may not allow running during detection of empty pipe + /// + /// + /// true on okay or false on error + public Boolean SetIgnoreFailOnEmptyPipeOnHealthy(Boolean ignoreEmptyPipeStatus) + { + //_logger.Info($"Slot:{Slot} - Set ignore empty pipe status"); + var retVal = RequestProtocol.SetIgnoreFailOnEmptyPipeOnHealthy(ignoreEmptyPipeStatus); + if (retVal) + IgnoreEmptyPipeDetection = ignoreEmptyPipeStatus; + return retVal; + } /// /// Set PCB settings and PCB calibrations to default. /// public Boolean SetPCBToDemoDefaults() { - _logger.Info($"Slot:{Slot} - Set PCB settings and PCB calibrations to default"); if (RequestProtocol == null) return false; var retVal = RequestProtocol.SetPCBToDemoDefaults(); @@ -1108,7 +1175,6 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore /// public Boolean SetMeterSizeMm(UInt16 meterSize_mm) { - _logger.Info($"Slot:{Slot} - Set meter size in mm"); if (RequestProtocol == null) return false; var retVal = RequestProtocol.SetMeterSizeMm(meterSize_mm); @@ -1121,7 +1187,6 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore /// public Boolean SetSensorSerialNo(UInt32 sensorSerialNo) { - _logger.Info($"Slot:{Slot} - Set sensor serial no."); if (RequestProtocol == null) return false; var retVal = RequestProtocol.SetSensorSerialNo(sensorSerialNo); @@ -1132,7 +1197,6 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore /// public void InitCalibration() { - _logger.Info($"Slot:{Slot} - Init calibration and set calibration values of all channels to default"); if (RequestProtocol == null) return; if (RequestProtocol.PrepareDeviceForCalibration()) @@ -1194,6 +1258,12 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore public void WriteLog(String text) { _logger.Info($"Slot:{Slot} - {text}"); + } + + /// + public void LogRawData(Boolean on) + { + _enableRawDataLogging = on; //if (_enableRawDataLogging) //{ // if (_loggerRawData == null) @@ -1202,14 +1272,7 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore // StreamingPort.GetPortName(), "", "LedRawData", "TargetLedRawDataBase", "LedRawDataBase"); // } - // _loggerRawData.Info($"{text}"); //} - } - - /// - public void LogRawData(Boolean on) - { - _enableRawDataLogging = on; if (StreamingPort is LedSerialPort port) { port.RecordStreamingRawData = _enableRawDataLogging; diff --git a/Common/Hardware/WaterMeter/MagFlux/Protocols/RequestProtocol/RequestProtocol.cs b/Common/Hardware/WaterMeter/MagFlux/Protocols/RequestProtocol/RequestProtocol.cs index 3c7562f7..d270b997 100644 --- a/Common/Hardware/WaterMeter/MagFlux/Protocols/RequestProtocol/RequestProtocol.cs +++ b/Common/Hardware/WaterMeter/MagFlux/Protocols/RequestProtocol/RequestProtocol.cs @@ -137,21 +137,21 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.RequestProtocol return retVal; } - ///// - ///// Wrapper to get the simulated flow setting - ///// - ///// - ///// - ///// - Initial - ///// - //public Boolean GetSimulatedFlowOn() - //{ - // if (_magFluxRequestProtocol == null) return false; - // var retVal = _magFluxRequestProtocol.IsSimulatedFlowActive(); - // _logger.Debug(retVal ? $"{_ident} Simulated flow active read back returns: true" : - // $"{_ident} Read back simulated flow status failed!"); - // return retVal; - //} + /// + /// Wrapper to get the simulated flow setting + /// + /// + /// + /// - Initial + /// + public Boolean IsSimulatedFlowActive() + { + if (_magFluxRequestProtocol == null) + return false; + var retVal = _magFluxRequestProtocol.IsSimulatedFlowActive(); + _logger.Debug($"{_ident} Simulated flow active read back returns: {retVal}"); + return retVal; + } ///// ///// Wrapper to set the simulated flow setting @@ -163,45 +163,48 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.RequestProtocol ///// //public Boolean SetSimulatedFlowActive(Boolean on) //{ - // if (_magFluxRequestProtocol == null) return false; + // if (_magFluxRequestProtocol == null) + // return false; // var retVal = _magFluxRequestProtocol.SetSimulatedFlowActive(on); - // _logger.Debug(retVal ? $"{_ident} Simulated flow active set to: {on}" : + // _logger.Debug(retVal ? $"{_ident} Simulated flow active set to: {on}" : // $"{_ident} Simulated flow active setup failed!"); // return retVal; //} - ///// - ///// Wrapper to get the ignore empty pipe mode status - ///// - ///// - ///// - ///// - Initial - ///// - //public Boolean GetIgnoreEmptyPipeStatus() - //{ - // if (_magFluxRequestProtocol == null) return false; - // var retVal = _magFluxRequestProtocol.IgnoreFailOnEmptyPipeOnHealthy(); - // _logger.Debug(retVal ? $"{_ident} Ignore empty pipe status read back returns: {retVal}" : - // $"{_ident} Read back empty pipe status failed!"); - // return retVal; - //} + /// + /// Wrapper to get the ignore empty pipe mode status + /// + /// + /// + /// - Initial + /// + public Boolean GetIgnoreFailOnEmptyPipeOnHealthy() + { + if (_magFluxRequestProtocol == null) + return false; + var retVal = _magFluxRequestProtocol.GetIgnoreFailOnEmptyPipeOnHealthy(); + _logger.Debug($"{_ident} Ignore empty pipe status read back returns: {retVal}"); + return retVal; + } - ///// - ///// Wrapper to set the ignore empty pipe mode - ///// - ///// true to ignore state - ///// - ///// - ///// - Initial - ///// - //public Boolean SetIgnoreEmptyPipeStatus(Boolean on) - //{ - // if (_magFluxRequestProtocol == null) return false; - // var retVal = _magFluxRequestProtocol.IgnoreFailOnEmptyPipeOnHealthy(on); - // _logger.Debug(retVal ? $"{_ident} Ignore empty pipe status adjusted to: {on}" : - // $"{_ident} Setup empty pipe status request failed!"); - // return retVal; - //} + /// + /// Wrapper to set the ignore empty pipe mode + /// + /// true to ignore state + /// + /// + /// - Initial + /// + public Boolean SetIgnoreFailOnEmptyPipeOnHealthy(Boolean on) + { + if (_magFluxRequestProtocol == null) + return false; + _magFluxRequestProtocol.SetIgnoreFailOnEmptyPipeOnHealthy(on); + var retVal = _magFluxRequestProtocol.GetIgnoreFailOnEmptyPipeOnHealthy(); + _logger.Debug(retVal == on ? $"{_ident} Ignore empty pipe status adjusted to: {on}" : + $"{_ident} Ignore empty pipe status setup failed!"); + return retVal == on; + } /// /// Wrapper to get the empty pipe bits @@ -221,6 +224,41 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.Protocols.RequestProtocol return retVal; } + /// + /// Wrapper to get the standard deviation value of the electrode in milli Volts + /// + /// + /// + /// + /// - Initial + /// + public Boolean GetStdDev_Electrode_mV(out Single u_mV) + { + u_mV = 0; + if (_magFluxRequestProtocol == null) return false; + var retVal = _magFluxRequestProtocol.GetStdDev_Electrode_mV(out u_mV); + _logger.Debug(retVal ? $"{_ident} Standard deviation of electrode: {u_mV:F6} mV" : + $"{_ident} Standard deviation of electrode request failed!"); + return retVal; + } + /// + /// Wrapper to get the standard deviation value of the electrode in milli Volts + /// + /// + /// + /// + /// - Initial + /// + public Boolean GetAverage_Electrode_mV(out Single u_mV) + { + u_mV = 0; + if (_magFluxRequestProtocol == null) return false; + var retVal = _magFluxRequestProtocol.GetAverage_Electrode_mV(out u_mV); + _logger.Debug(retVal ? $"{_ident} Average of electrode: {u_mV:F6} mV" : + $"{_ident} Average of electrode request failed!"); + return retVal; + } + /// /// Wrapper to get the board calibration value /// diff --git a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache index 8865d283..8d4994b0 100644 --- a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache +++ b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -89102b0142e574de38a9f47d370f3334e5e6c268 +8fbe991b217e7692af4817ad205b768685aa5a72 diff --git a/Common/Ui/MagFluxToolBox/FrmTest.Designer.cs b/Common/Ui/MagFluxToolBox/FrmTest.Designer.cs index adbc7bf9..daddc803 100644 --- a/Common/Ui/MagFluxToolBox/FrmTest.Designer.cs +++ b/Common/Ui/MagFluxToolBox/FrmTest.Designer.cs @@ -42,7 +42,7 @@ this.lblActualProcess = new System.Windows.Forms.Label(); this.barOverallProgressUpdate = new System.Windows.Forms.ProgressBar(); this.tmrProgressUpdate = new System.Windows.Forms.Timer(this.components); - this.dlgOpenLuFile = new System.Windows.Forms.OpenFileDialog(); + this.dlgOpenFile = new System.Windows.Forms.OpenFileDialog(); this.lblSoftwareVersion = new System.Windows.Forms.Label(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); this.label9 = new System.Windows.Forms.Label(); @@ -99,7 +99,7 @@ this.cbxStatus1 = new System.Windows.Forms.CheckBox(); this.cbxStatus0 = new System.Windows.Forms.CheckBox(); this.lblMagFluxApi = new System.Windows.Forms.Label(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.grpControl = new System.Windows.Forms.GroupBox(); this.cbxIgnoreEmptyPipeStatus = new System.Windows.Forms.CheckBox(); this.cbxSimulatedFlow = new System.Windows.Forms.CheckBox(); this.lblSharedCode = new System.Windows.Forms.Label(); @@ -111,7 +111,7 @@ this.grpCalibration.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.gridViewCalib)).BeginInit(); this.grpStatus.SuspendLayout(); - this.groupBox1.SuspendLayout(); + this.grpControl.SuspendLayout(); this.SuspendLayout(); // // grpSetup @@ -256,9 +256,9 @@ this.tmrProgressUpdate.Interval = 200; this.tmrProgressUpdate.Tick += new System.EventHandler(this.tmrProgressUpdate_Tick); // - // dlgOpenLuFile + // dlgOpenFile // - this.dlgOpenLuFile.Filter = "metrology lookup tables (*.lut)|*.lut"; + this.dlgOpenFile.Filter = "metrology lookup tables (*.lut)|*.lut"; // // lblSoftwareVersion // @@ -859,16 +859,16 @@ this.lblMagFluxApi.Text = "MagFlux API 0.0.0.00"; this.lblMagFluxApi.TextAlign = System.Drawing.ContentAlignment.TopRight; // - // groupBox1 + // grpControl // - this.groupBox1.Controls.Add(this.cbxIgnoreEmptyPipeStatus); - this.groupBox1.Controls.Add(this.cbxSimulatedFlow); - this.groupBox1.Location = new System.Drawing.Point(314, 2); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(159, 280); - this.groupBox1.TabIndex = 44; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "Detailed Status"; + this.grpControl.Controls.Add(this.cbxIgnoreEmptyPipeStatus); + this.grpControl.Controls.Add(this.cbxSimulatedFlow); + this.grpControl.Location = new System.Drawing.Point(314, 2); + this.grpControl.Name = "grpControl"; + this.grpControl.Size = new System.Drawing.Size(159, 280); + this.grpControl.TabIndex = 44; + this.grpControl.TabStop = false; + this.grpControl.Text = "Control"; // // cbxIgnoreEmptyPipeStatus // @@ -879,11 +879,11 @@ this.cbxIgnoreEmptyPipeStatus.TabIndex = 1; this.cbxIgnoreEmptyPipeStatus.Text = "Ignore Empty Pipe Status"; this.cbxIgnoreEmptyPipeStatus.UseVisualStyleBackColor = true; - this.cbxIgnoreEmptyPipeStatus.Visible = false; this.cbxIgnoreEmptyPipeStatus.CheckedChanged += new System.EventHandler(this.cbxIgnoreEmptyPipeStatus_CheckedChanged); // // cbxSimulatedFlow // + this.cbxSimulatedFlow.AutoCheck = false; this.cbxSimulatedFlow.AutoSize = true; this.cbxSimulatedFlow.Location = new System.Drawing.Point(10, 20); this.cbxSimulatedFlow.Name = "cbxSimulatedFlow"; @@ -891,7 +891,6 @@ this.cbxSimulatedFlow.TabIndex = 0; this.cbxSimulatedFlow.Text = "Simulated Flow Active"; this.cbxSimulatedFlow.UseVisualStyleBackColor = true; - this.cbxSimulatedFlow.Visible = false; this.cbxSimulatedFlow.CheckedChanged += new System.EventHandler(this.cbxSimulatedFlow_CheckedChanged); // // lblSharedCode @@ -914,7 +913,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(824, 581); this.Controls.Add(this.lblSharedCode); - this.Controls.Add(this.groupBox1); + this.Controls.Add(this.grpControl); this.Controls.Add(this.lblMagFluxApi); this.Controls.Add(this.grpStatus); this.Controls.Add(this.grpCalibration); @@ -950,8 +949,8 @@ ((System.ComponentModel.ISupportInitialize)(this.gridViewCalib)).EndInit(); this.grpStatus.ResumeLayout(false); this.grpStatus.PerformLayout(); - this.groupBox1.ResumeLayout(false); - this.groupBox1.PerformLayout(); + this.grpControl.ResumeLayout(false); + this.grpControl.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -969,7 +968,7 @@ private System.Windows.Forms.Label lblActualProcess; private System.Windows.Forms.Label lblOverall; private System.Windows.Forms.ProgressBar barSingleProgressUpdate; - private System.Windows.Forms.OpenFileDialog dlgOpenLuFile; + private System.Windows.Forms.OpenFileDialog dlgOpenFile; private System.Windows.Forms.Label lblSoftwareVersion; private System.Windows.Forms.OpenFileDialog openFileDialog1; private System.Windows.Forms.Label lblWaitingForMeterResponse; @@ -1029,7 +1028,7 @@ private System.Windows.Forms.CheckBox cbxStatus10; private System.Windows.Forms.Label lblBoardCalibration; private System.Windows.Forms.TextBox tbxBoardCalibration; - private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox grpControl; private System.Windows.Forms.CheckBox cbxIgnoreEmptyPipeStatus; private System.Windows.Forms.CheckBox cbxSimulatedFlow; private System.Windows.Forms.Label lblSharedCode; diff --git a/Common/Ui/MagFluxToolBox/FrmTest.cs b/Common/Ui/MagFluxToolBox/FrmTest.cs index 6cfc1e7e..a0f044aa 100644 --- a/Common/Ui/MagFluxToolBox/FrmTest.cs +++ b/Common/Ui/MagFluxToolBox/FrmTest.cs @@ -83,7 +83,6 @@ namespace Xylem.Common.Ui.MagFluxToolBox var cultureInfo = new CultureInfo("en-GB"); Thread.CurrentThread.CurrentUICulture = cultureInfo; Thread.CurrentThread.CurrentCulture = cultureInfo; - //_version = Assembly.GetExecutingAssembly().GetName().Version; } /// @@ -443,6 +442,10 @@ namespace Xylem.Common.Ui.MagFluxToolBox cbxStatus10.Checked = (_magFluxMeter.EpdControlBits & 0x01) == 0x01; cbxStatus11.Checked = (_magFluxMeter.EpdControlBits & 0x02) == 0x02; cbxStatus12.Checked = (_magFluxMeter.EpdControlBits & 0x04) == 0x04; + cbxIgnoreEmptyPipeStatus.Checked = _magFluxMeter.IgnoreEmptyPipeDetection; + cbxSimulatedFlow.Checked = _magFluxMeter.SimulatedFlowIsActive; + cbxSimulatedFlow.ForeColor = _magFluxMeter.SimulatedFlowIsActive ? Color.Red : SystemColors.ControlText; + CheckUpdateEnabled(); } })); @@ -632,12 +635,13 @@ namespace Xylem.Common.Ui.MagFluxToolBox private void cbxIgnoreEmptyPipeStatus_CheckedChanged(Object sender, EventArgs e) { - //_magFluxMeter?.SetIgnoreEmptyPipeStatus(cbxIgnoreEmptyPipeStatus.Checked); + var retVal = _magFluxMeter?.SetIgnoreFailOnEmptyPipeOnHealthy(cbxIgnoreEmptyPipeStatus.Checked); + cbxIgnoreEmptyPipeStatus.ForeColor = retVal == null || (Boolean) retVal == false ? Color.Red : SystemColors.ControlText; } private void cbxSimulatedFlow_CheckedChanged(Object sender, EventArgs e) { - //_magFluxMeter?.SetSimulatedFlowActive(cbxSimulatedFlow.Checked); + // _magFluxMeter?.SetSimulatedFlowActive(cbxSimulatedFlow.Checked); } private void btnInitPcb_Click(Object sender, EventArgs e) diff --git a/Common/Ui/MagFluxToolBox/FrmTest.resx b/Common/Ui/MagFluxToolBox/FrmTest.resx index 2aa2e415..319b5714 100644 --- a/Common/Ui/MagFluxToolBox/FrmTest.resx +++ b/Common/Ui/MagFluxToolBox/FrmTest.resx @@ -120,7 +120,7 @@ 274, 17 - + 144, 17 diff --git a/Common/Ui/MagFluxToolBox/Properties/AssemblyInfo.cs b/Common/Ui/MagFluxToolBox/Properties/AssemblyInfo.cs index ec58b559..3a959d95 100644 --- a/Common/Ui/MagFluxToolBox/Properties/AssemblyInfo.cs +++ b/Common/Ui/MagFluxToolBox/Properties/AssemblyInfo.cs @@ -31,4 +31,4 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.1.0.*")] +[assembly: AssemblyVersion("2.2.0.*")]