DataStreamInterface: (1) supports multiple meters, (2) Shutdown() added

This commit is contained in:
Milan Hanajik 2020-09-23 08:58:01 +02:00
parent 3ac90ee622
commit fa03c09f09
4 changed files with 111 additions and 40 deletions

View File

@ -7,49 +7,77 @@ namespace DataStreamInterface
{ {
public interface IDataStreamMeter public interface IDataStreamMeter
{ {
/// <summary>
/// Returns count of water meters supported by the data stream component
/// </summary>
/// <returns>Water meters count</returns>
int GetMetersCount();
/// <summary> /// <summary>
/// Get state of the connected data stream meter /// Get state of the connected data stream meter
/// </summary> /// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <param name="state">Current state of the meter</param> /// <param name="state">Current state of the meter</param>
/// <param name="parameter">Current extra parameter of the meter</param>
/// <returns>true when successful</returns> /// <returns>true when successful</returns>
bool GetState(out int state, out string parameter); bool GetState(int meterIx, out int state, out string parameter);
/// <summary> /// <summary>
/// Set state of the connected data stream meter /// Set state of the connected data stream meter
/// </summary> /// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <param name="state">Required state of the meter</param> /// <param name="state">Required state of the meter</param>
/// <param name="parameter">Required extra parameter of the meter</param>
/// <returns>true when successful</returns> /// <returns>true when successful</returns>
bool SetState(int state, string parameter); bool SetState(int meterIx, int state, string parameter);
bool SetStateAll(int state, string parameter);
/// <summary> /// <summary>
/// Establish connection with a data stream meter /// Establish connection with a data stream meter
/// </summary> /// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <param name="connectionParameters">Connection parameters</param> /// <param name="connectionParameters">Connection parameters</param>
/// <param name="meterId">Meter ID (e.g. serial number)</param> /// <param name="meterId">Meter ID (e.g. serial number)</param>
/// <returns>true when successful</returns> /// <returns>true when successful</returns>
bool OpenConnection(string connectionParameters, out string meterId); bool OpenConnection(int meterIx, string connectionParameters, out string meterId);
/// <summary>
/// Closes connection with the data stream meter
/// </summary>
/// <returns>true when successful</returns>
bool CloseConnection();
/// <summary> /// <summary>
/// Stars saving measurement results into internal data structures of the component. /// Stars saving measurement results into internal data structures of the component.
/// Each data frame obtains a unique ID. /// Each data frame obtains a unique ID.
/// The very first data fraim obrains ID = 0. /// The very first data fraim obrains ID = 0.
/// </summary> /// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <returns>true when successful</returns> /// <returns>true when successful</returns>
bool StartMeasurement(); bool StartMeasurement(int meterIx);
bool StartMeasurementAll();
/// <summary> /// <summary>
/// Stops saving measurement results into internal data structures of the component. /// Stops saving measurement results into internal data structures of the component.
/// Updates ID of the last date frame received from the meter. /// Updates ID of the last date frame received from the meter.
/// </summary> /// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <param name="storedFramesCount">Number of stored date frames</param> /// <param name="storedFramesCount">Number of stored date frames</param>
/// <returns>true when successful</returns> /// <returns>true when successful</returns>
bool StopMeasurement(out Int64 storedFramesCount); bool StopMeasurement(int meterIx, out Int64 storedFramesCount);
bool StopMeasurementAll(out Int64[] storedFramesCounts);
/// <summary>
/// Closes connection with the data stream meter
/// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <returns>true when successful</returns>
bool CloseConnection(int meterIx);
bool CloseConnectionAll();
/// <summary>
/// This function is called when TBF program is shutting down.
/// </summary>
/// <returns>true when successful</returns>
bool Shutdown();
///------------------------------------------------ ///------------------------------------------------
/// Units of time, volume and optional quantities /// Units of time, volume and optional quantities
@ -94,17 +122,19 @@ namespace DataStreamInterface
/// <summary> /// <summary>
/// Retuns 'count' data frames starting with data frame with ID = 'id' /// Retuns 'count' data frames starting with data frame with ID = 'id'
/// </summary> /// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <param name="id">First frame ID</param> /// <param name="id">First frame ID</param>
/// <param name="count">Frames count</param> /// <param name="count">Frames count</param>
/// <returns>Selected data frames</returns> /// <returns>Selected data frames</returns>
DataFrame[] GetFrames(Int64 id, int count); DataFrame[] GetFrames(int meterIx, Int64 id, int count);
/// <summary> /// <summary>
/// Returns ID of the data frame where time equals or exceeds the specified time. /// 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. /// When time of the first frame (ID=0) is larger then specified time, function returns 0.
/// </summary> /// </summary>
/// <param name="meterIx">Index of the meter in range 0 .. (GetMetersCount() - 1)</param>
/// <param name="time">Time</param> /// <param name="time">Time</param>
/// <returns>ID of the data frame at or after the pecified time</returns> /// <returns>ID of the data frame at or after the pecified time</returns>
Int64 GetID(double time); Int64 GetID(int meterIx, double time);
} }
} }

View File

@ -49,8 +49,8 @@
this.logsTextBox = new System.Windows.Forms.TextBox(); this.logsTextBox = new System.Windows.Forms.TextBox();
this.dataTabControl = new System.Windows.Forms.TabControl(); this.dataTabControl = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage(); this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.framesListView = new System.Windows.Forms.ListView(); this.framesListView = new System.Windows.Forms.ListView();
this.tabPage2 = new System.Windows.Forms.TabPage();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout();
@ -304,16 +304,6 @@
this.tabPage1.Text = "Transferred frames"; this.tabPage1.Text = "Transferred frames";
this.tabPage1.UseVisualStyleBackColor = true; 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 // framesListView
// //
this.framesListView.Dock = System.Windows.Forms.DockStyle.Fill; this.framesListView.Dock = System.Windows.Forms.DockStyle.Fill;
@ -325,6 +315,16 @@
this.framesListView.UseCompatibleStateImageBehavior = false; this.framesListView.UseCompatibleStateImageBehavior = false;
this.framesListView.View = System.Windows.Forms.View.Details; 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 // DemoMainWnd
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -333,6 +333,7 @@
this.Controls.Add(this.splitContainer1); this.Controls.Add(this.splitContainer1);
this.Name = "DemoMainWnd"; this.Name = "DemoMainWnd";
this.Text = "Datastream interface test"; this.Text = "Datastream interface test";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DemoMainWnd_FormClosing);
this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout(); this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false); this.splitContainer1.Panel2.ResumeLayout(false);

View File

@ -127,7 +127,7 @@ namespace DataStreamInterfaceTest
else else
{ {
string meterId; 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)); activityLog.Print(string.Format("Connection established, meter ID is {0}", meterId));
} }
@ -144,7 +144,7 @@ namespace DataStreamInterfaceTest
ShowNoMeterInterfaceMessage(); ShowNoMeterInterfaceMessage();
else else
{ {
if (dataStreamMeter.CloseConnection()) if (dataStreamMeter.CloseConnection(0))
{ {
framesListView.Items.Clear(); framesListView.Items.Clear();
activityLog.Print("Connection closed"); 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) private void getStateButton_Click(object sender, EventArgs e)
{ {
if (dataStreamMeter == null) if (dataStreamMeter == null)
@ -164,7 +172,7 @@ namespace DataStreamInterfaceTest
{ {
int state; int state;
string parameter; 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)); activityLog.Print(string.Format("Water meter state is {0} / {1}", state, parameter));
} }
@ -184,7 +192,7 @@ namespace DataStreamInterfaceTest
GetStateDlg dlg = new GetStateDlg(); GetStateDlg dlg = new GetStateDlg();
if (dlg.ShowDialog() == DialogResult.OK) 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)); activityLog.Print(string.Format("Water meter state set to {0} / {1}", dlg.State, dlg.Parameter));
} }
@ -202,7 +210,7 @@ namespace DataStreamInterfaceTest
ShowNoMeterInterfaceMessage(); ShowNoMeterInterfaceMessage();
else else
{ {
if (dataStreamMeter.StartMeasurement()) if (dataStreamMeter.StartMeasurement(0))
{ {
framesListView.Items.Clear(); framesListView.Items.Clear();
activityLog.Print(string.Format("Measurement started")); activityLog.Print(string.Format("Measurement started"));
@ -220,7 +228,7 @@ namespace DataStreamInterfaceTest
ShowNoMeterInterfaceMessage(); ShowNoMeterInterfaceMessage();
else else
{ {
if (dataStreamMeter.StopMeasurement(out storedFramesCount)) if (dataStreamMeter.StopMeasurement(0, out storedFramesCount))
{ {
framesListView.Items.Clear(); framesListView.Items.Clear();
activityLog.Print(string.Format("Measurement sopped, {0} frames acquired", storedFramesCount)); 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); GetFrameBoundariesDlg dlg = new GetFrameBoundariesDlg("Enter frames range boundaries", 0, storedFramesCount - 1);
if (dlg.ShowDialog() != DialogResult.OK) return; 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) foreach (var frame in frames)
{ {
@ -259,7 +267,7 @@ namespace DataStreamInterfaceTest
GetDblValueDlg dlg = new GetDblValueDlg("Enter time in seconds"); GetDblValueDlg dlg = new GetDblValueDlg("Enter time in seconds");
if (dlg.ShowDialog() == DialogResult.OK) 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)); activityLog.Print(string.Format("GetID({0}) returned {1}", dlg.DblValue, id));
} }
} }

View File

@ -83,7 +83,13 @@ namespace DataStreamMeter
return Unit.None; 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) lock (stateChangeAndTimerTickLock)
{ {
@ -107,7 +113,7 @@ namespace DataStreamMeter
return true; return true;
} }
public bool CloseConnection() public bool CloseConnection(int meterIx)
{ {
bool closeModelessDlg = false; bool closeModelessDlg = false;
@ -129,20 +135,35 @@ namespace DataStreamMeter
return true; 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; state = (int)this.State;
parameter = this.connectionParameters; parameter = this.connectionParameters;
return true; 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 /// It's not allowed to change the satate in this demo
return false; 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) 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) 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) public void TimerTick(double flow_m3ph)
{ {
lock (stateChangeAndTimerTickLock) lock (stateChangeAndTimerTickLock)
@ -259,7 +291,7 @@ namespace DataStreamMeter
/// <param name="id">First frame ID</param> /// <param name="id">First frame ID</param>
/// <param name="count">Frames count</param> /// <param name="count">Frames count</param>
/// <returns>Selected data frames</returns> /// <returns>Selected data frames</returns>
public DataFrame[] GetFrames(Int64 startID, int count) public DataFrame[] GetFrames(int meterIx, Int64 startID, int count)
{ {
DataFrame[] frames = new DataFrame[count]; DataFrame[] frames = new DataFrame[count];
@ -284,7 +316,7 @@ namespace DataStreamMeter
/// </summary> /// </summary>
/// <param name="time">Time</param> /// <param name="time">Time</param>
/// <returns>ID of the data frame at or after the pecified time</returns> /// <returns>ID of the data frame at or after the pecified time</returns>
public Int64 GetID(double time) public Int64 GetID(int meterIx, double time)
{ {
if (storedSamplesCount == 0) return -1; if (storedSamplesCount == 0) return -1;