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;