diff --git a/DataStreamInterface/IDataStreamMeter.cs b/DataStreamInterface/IDataStreamMeter.cs
index 922af4ec4..e4868b009 100644
--- a/DataStreamInterface/IDataStreamMeter.cs
+++ b/DataStreamInterface/IDataStreamMeter.cs
@@ -7,49 +7,77 @@ namespace DataStreamInterface
{
public interface IDataStreamMeter
{
+ ///
+ /// Returns count of water meters supported by the data stream component
+ ///
+ /// Water meters count
+ int GetMetersCount();
+
///
/// Get state of the connected data stream meter
///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
/// Current state of the meter
+ /// Current extra parameter of the meter
/// true when successful
- bool GetState(out int state, out string parameter);
+ bool GetState(int meterIx, out int state, out string parameter);
///
/// Set state of the connected data stream meter
///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
/// Required state of the meter
+ /// Required extra parameter of the meter
/// true when successful
- bool SetState(int state, string parameter);
+ bool SetState(int meterIx, int state, string parameter);
+
+ bool SetStateAll(int state, string parameter);
///
/// Establish connection with a data stream meter
///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
/// Connection parameters
/// Meter ID (e.g. serial number)
/// true when successful
- bool OpenConnection(string connectionParameters, out string meterId);
-
- ///
- /// Closes connection with the data stream meter
- ///
- /// true when successful
- bool CloseConnection();
+ bool OpenConnection(int meterIx, string connectionParameters, out string meterId);
///
/// Stars saving measurement results into internal data structures of the component.
/// Each data frame obtains a unique ID.
/// The very first data fraim obrains ID = 0.
///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
/// true when successful
- bool StartMeasurement();
+ bool StartMeasurement(int meterIx);
+
+ bool StartMeasurementAll();
///
/// Stops saving measurement results into internal data structures of the component.
/// Updates ID of the last date frame received from the meter.
///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
/// Number of stored date frames
/// true when successful
- bool StopMeasurement(out Int64 storedFramesCount);
+ bool StopMeasurement(int meterIx, out Int64 storedFramesCount);
+
+ bool StopMeasurementAll(out Int64[] storedFramesCounts);
+
+ ///
+ /// Closes connection with the data stream meter
+ ///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
+ /// true when successful
+ bool CloseConnection(int meterIx);
+
+ bool CloseConnectionAll();
+
+ ///
+ /// This function is called when TBF program is shutting down.
+ ///
+ /// true when successful
+ bool Shutdown();
///------------------------------------------------
/// Units of time, volume and optional quantities
@@ -94,17 +122,19 @@ namespace DataStreamInterface
///
/// Retuns 'count' data frames starting with data frame with ID = 'id'
///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
/// First frame ID
/// Frames count
/// Selected data frames
- DataFrame[] GetFrames(Int64 id, int count);
+ DataFrame[] GetFrames(int meterIx, Int64 id, int count);
///
/// Returns ID of the data frame where time equals or exceeds the specified time.
/// When time of the first frame (ID=0) is larger then specified time, function returns 0.
///
+ /// Index of the meter in range 0 .. (GetMetersCount() - 1)
/// Time
/// ID of the data frame at or after the pecified time
- Int64 GetID(double time);
+ Int64 GetID(int meterIx, double time);
}
}
diff --git a/DataStreamInterfaceTest/DemoMainWnd.Designer.cs b/DataStreamInterfaceTest/DemoMainWnd.Designer.cs
index f87a15e46..21db23d47 100644
--- a/DataStreamInterfaceTest/DemoMainWnd.Designer.cs
+++ b/DataStreamInterfaceTest/DemoMainWnd.Designer.cs
@@ -49,8 +49,8 @@
this.logsTextBox = new System.Windows.Forms.TextBox();
this.dataTabControl = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
- this.tabPage2 = new System.Windows.Forms.TabPage();
this.framesListView = new System.Windows.Forms.ListView();
+ this.tabPage2 = new System.Windows.Forms.TabPage();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
@@ -304,16 +304,6 @@
this.tabPage1.Text = "Transferred frames";
this.tabPage1.UseVisualStyleBackColor = true;
//
- // tabPage2
- //
- this.tabPage2.Location = new System.Drawing.Point(4, 22);
- this.tabPage2.Name = "tabPage2";
- this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
- this.tabPage2.Size = new System.Drawing.Size(664, 331);
- this.tabPage2.TabIndex = 1;
- this.tabPage2.Text = "Graph";
- this.tabPage2.UseVisualStyleBackColor = true;
- //
// framesListView
//
this.framesListView.Dock = System.Windows.Forms.DockStyle.Fill;
@@ -325,6 +315,16 @@
this.framesListView.UseCompatibleStateImageBehavior = false;
this.framesListView.View = System.Windows.Forms.View.Details;
//
+ // tabPage2
+ //
+ this.tabPage2.Location = new System.Drawing.Point(4, 22);
+ this.tabPage2.Name = "tabPage2";
+ this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
+ this.tabPage2.Size = new System.Drawing.Size(664, 331);
+ this.tabPage2.TabIndex = 1;
+ this.tabPage2.Text = "Graph";
+ this.tabPage2.UseVisualStyleBackColor = true;
+ //
// DemoMainWnd
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -333,6 +333,7 @@
this.Controls.Add(this.splitContainer1);
this.Name = "DemoMainWnd";
this.Text = "Datastream interface test";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DemoMainWnd_FormClosing);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
diff --git a/DataStreamInterfaceTest/DemoMainWnd.cs b/DataStreamInterfaceTest/DemoMainWnd.cs
index af1252f38..87567a7c8 100644
--- a/DataStreamInterfaceTest/DemoMainWnd.cs
+++ b/DataStreamInterfaceTest/DemoMainWnd.cs
@@ -127,7 +127,7 @@ namespace DataStreamInterfaceTest
else
{
string meterId;
- if (dataStreamMeter.OpenConnection("no connection parameters", out meterId))
+ if (dataStreamMeter.OpenConnection(0, "no connection parameters", out meterId))
{
activityLog.Print(string.Format("Connection established, meter ID is {0}", meterId));
}
@@ -144,7 +144,7 @@ namespace DataStreamInterfaceTest
ShowNoMeterInterfaceMessage();
else
{
- if (dataStreamMeter.CloseConnection())
+ if (dataStreamMeter.CloseConnection(0))
{
framesListView.Items.Clear();
activityLog.Print("Connection closed");
@@ -156,6 +156,14 @@ namespace DataStreamInterfaceTest
}
}
+ private void DemoMainWnd_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (dataStreamMeter == null)
+ {
+ dataStreamMeter.Shutdown();
+ }
+ }
+
private void getStateButton_Click(object sender, EventArgs e)
{
if (dataStreamMeter == null)
@@ -164,7 +172,7 @@ namespace DataStreamInterfaceTest
{
int state;
string parameter;
- if (dataStreamMeter.GetState(out state, out parameter))
+ if (dataStreamMeter.GetState(0, out state, out parameter))
{
activityLog.Print(string.Format("Water meter state is {0} / {1}", state, parameter));
}
@@ -184,7 +192,7 @@ namespace DataStreamInterfaceTest
GetStateDlg dlg = new GetStateDlg();
if (dlg.ShowDialog() == DialogResult.OK)
{
- if (dataStreamMeter.SetState(dlg.State, dlg.Parameter))
+ if (dataStreamMeter.SetState(0, dlg.State, dlg.Parameter))
{
activityLog.Print(string.Format("Water meter state set to {0} / {1}", dlg.State, dlg.Parameter));
}
@@ -202,7 +210,7 @@ namespace DataStreamInterfaceTest
ShowNoMeterInterfaceMessage();
else
{
- if (dataStreamMeter.StartMeasurement())
+ if (dataStreamMeter.StartMeasurement(0))
{
framesListView.Items.Clear();
activityLog.Print(string.Format("Measurement started"));
@@ -220,7 +228,7 @@ namespace DataStreamInterfaceTest
ShowNoMeterInterfaceMessage();
else
{
- if (dataStreamMeter.StopMeasurement(out storedFramesCount))
+ if (dataStreamMeter.StopMeasurement(0, out storedFramesCount))
{
framesListView.Items.Clear();
activityLog.Print(string.Format("Measurement sopped, {0} frames acquired", storedFramesCount));
@@ -240,7 +248,7 @@ namespace DataStreamInterfaceTest
{
GetFrameBoundariesDlg dlg = new GetFrameBoundariesDlg("Enter frames range boundaries", 0, storedFramesCount - 1);
if (dlg.ShowDialog() != DialogResult.OK) return;
- DataFrame[] frames = dataStreamMeter.GetFrames(dlg.From, Convert.ToInt32(dlg.To - dlg.From + 1));
+ DataFrame[] frames = dataStreamMeter.GetFrames(0, dlg.From, Convert.ToInt32(dlg.To - dlg.From + 1));
{
foreach (var frame in frames)
{
@@ -259,7 +267,7 @@ namespace DataStreamInterfaceTest
GetDblValueDlg dlg = new GetDblValueDlg("Enter time in seconds");
if (dlg.ShowDialog() == DialogResult.OK)
{
- Int64 id = dataStreamMeter.GetID(dlg.DblValue);
+ Int64 id = dataStreamMeter.GetID(0, dlg.DblValue);
activityLog.Print(string.Format("GetID({0}) returned {1}", dlg.DblValue, id));
}
}
diff --git a/DataStreamMeter/MeterSimulation.cs b/DataStreamMeter/MeterSimulation.cs
index 81b023bde..823fe5602 100644
--- a/DataStreamMeter/MeterSimulation.cs
+++ b/DataStreamMeter/MeterSimulation.cs
@@ -83,7 +83,13 @@ namespace DataStreamMeter
return Unit.None;
}
- public bool OpenConnection(string connectionParameters, out string meterID)
+
+ public int GetMetersCount()
+ {
+ return 1;
+ }
+
+ public bool OpenConnection(int meterIx, string connectionParameters, out string meterID)
{
lock (stateChangeAndTimerTickLock)
{
@@ -107,7 +113,7 @@ namespace DataStreamMeter
return true;
}
- public bool CloseConnection()
+ public bool CloseConnection(int meterIx)
{
bool closeModelessDlg = false;
@@ -129,20 +135,35 @@ namespace DataStreamMeter
return true;
}
- public bool GetState(out int state, out string parameter)
+ public bool CloseConnectionAll()
+ {
+ return CloseConnection(0);
+ }
+
+ public bool Shutdown()
+ {
+ return true;
+ }
+
+ public bool GetState(int meterIx, out int state, out string parameter)
{
state = (int)this.State;
parameter = this.connectionParameters;
return true;
}
- public bool SetState(int state, string parameter)
+ public bool SetState(int meterIx, int state, string parameter)
{
/// It's not allowed to change the satate in this demo
return false;
}
- public bool StartMeasurement()
+ public bool SetStateAll(int state, string parameter)
+ {
+ return SetState(0, state, parameter);
+ }
+
+ public bool StartMeasurement(int meterIx = 0)
{
lock (stateChangeAndTimerTickLock)
{
@@ -161,7 +182,12 @@ namespace DataStreamMeter
}
}
- public bool StopMeasurement(out Int64 storedFramesCount)
+ public bool StartMeasurementAll()
+ {
+ return StartMeasurement(0);
+ }
+
+ public bool StopMeasurement(int meterIx, out Int64 storedFramesCount)
{
lock (stateChangeAndTimerTickLock)
{
@@ -196,6 +222,12 @@ namespace DataStreamMeter
}
}
+ public bool StopMeasurementAll(out Int64[] storedFramesCount)
+ {
+ storedFramesCount = new Int64[1];
+ return StopMeasurement(0, out storedFramesCount[0]);
+ }
+
public void TimerTick(double flow_m3ph)
{
lock (stateChangeAndTimerTickLock)
@@ -259,7 +291,7 @@ namespace DataStreamMeter
/// First frame ID
/// Frames count
/// Selected data frames
- public DataFrame[] GetFrames(Int64 startID, int count)
+ public DataFrame[] GetFrames(int meterIx, Int64 startID, int count)
{
DataFrame[] frames = new DataFrame[count];
@@ -284,7 +316,7 @@ namespace DataStreamMeter
///
/// Time
/// ID of the data frame at or after the pecified time
- public Int64 GetID(double time)
+ public Int64 GetID(int meterIx, double time)
{
if (storedSamplesCount == 0) return -1;