diff --git a/Results/Entities/WaterMeter.cs b/Results/Entities/WaterMeter.cs
index a99cb2bc0..53af86ced 100644
--- a/Results/Entities/WaterMeter.cs
+++ b/Results/Entities/WaterMeter.cs
@@ -22,7 +22,8 @@ namespace Results.Entities
public virtual double QFall { get; set; } /// [m3/h] detected Q_fall of a composed meter
public virtual bool Passed { get; set; }
public virtual int ResultCode { get; set; }
- public virtual string Remark { get; set; }
+ public virtual string ArchivePath { get; set; }
+ public virtual string Remark { get; set; }
#if IPERL
public virtual int SerialNrEx { get; set; } /// Aux s/n for compound meters, Serial number for iPerl water meter
@@ -202,6 +203,7 @@ namespace Results.Entities
QFall = src.QFall;
Passed = src.Passed;
ResultCode = src.ResultCode;
+ ArchivePath = src.ArchivePath;
Remark = src.Remark;
#if IPERL
SerialNrEx = src.SerialNrEx;
diff --git a/Results/Mappings/WaterMeterMap.cs b/Results/Mappings/WaterMeterMap.cs
index d6c57751d..b810b1b43 100644
--- a/Results/Mappings/WaterMeterMap.cs
+++ b/Results/Mappings/WaterMeterMap.cs
@@ -22,7 +22,8 @@ namespace Results.Mappings
Map(x => x.QFall);
Map(x => x.Passed);
Map(x => x.ResultCode);
- Map(x => x.Remark)
+ Map(x => x.ArchivePath);
+ Map(x => x.Remark)
.CustomType("StringClob")
.CustomSqlType("varchar(2000)");
#if IPERL
diff --git a/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs b/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs
index db318ef0c..f102bf0c3 100644
--- a/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs
+++ b/Results/Output/Printers/Enhanced/EnhancedPrinterCfg.cs
@@ -1,4 +1,7 @@
-using System;
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
diff --git a/TestBenchFramework/BenchControl/Output/Printers/Enhanced/BasicPrintDocument.cs b/Results/Output/Printers/OnePagePerMeter/EnhancedPrintDocument.cs
similarity index 50%
rename from TestBenchFramework/BenchControl/Output/Printers/Enhanced/BasicPrintDocument.cs
rename to Results/Output/Printers/OnePagePerMeter/EnhancedPrintDocument.cs
index 39380cc6e..204c07364 100644
--- a/TestBenchFramework/BenchControl/Output/Printers/Enhanced/BasicPrintDocument.cs
+++ b/Results/Output/Printers/OnePagePerMeter/EnhancedPrintDocument.cs
@@ -7,34 +7,38 @@ using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using Config.Entities;
-using TBF.Resources;
+using Results.Resources;
-namespace TBF.BenchControl.Output.Printers.Enhanced
+namespace Results.Output.Printers.OnePagePerMeter
{
- public class BasicPrintDocument : PrintDocument
+ public class EnhancedPrintDocument : PrintDocument
{
- const string FontFamilyName = "Arial"; //"Times New Roman";
-
- const int SpacingOne = 18;
- const int SpacingOneAndHalf = (3 * SpacingOne) / 2;
+ /// Size of the printed area without margins, after taking into account 'pageOrientation'
+ readonly int printHeight;
+ readonly int printWidth;
readonly int topMargin;
readonly int bottomMargin;
readonly int leftMargin;
readonly int TitleX;
readonly int TitleY; /// Depends on the size of the header
- readonly int HdrTop; /// = TitleY + 60
- readonly int BodyTop; /// = HdrTop + 160
- /// Size of the printed area without margins, after taking into account 'pageOrientation'
- int printHeight;
- int printWidth;
+ readonly int SpacingOne;
+ readonly int SpacingOneAndHalf;
+ readonly int SpacingOne4Header;
+ readonly int SpacingOneAndHalf4Header;
+
+ int CommonTop; /// = TitleY + 60
+ int BodyTop; /// = HdrTop + 160
+ ///
+ int titleHeight;
+ int commonHeight;
///
/// Property variable for the Font the user wishes to use
///
Font font;
- Font boldFont;
+ Font headerFont;
Font titleFont;
///
@@ -42,10 +46,15 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
///
Results.Entities.Batch batch;
+ EnhancedPrinterCfg cfg;
+
///
/// Items to print
///
- readonly IList rsltItems;
+ string header;
+ IList commonItems;
+ IList testItems;
+ string footer;
///
/// Layout and status
@@ -61,33 +70,28 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
/// Constructor
///
/// Text to be printed
- public BasicPrintDocument(Results.Entities.Batch batch,
- PageOrientation pageOrientation,
- int topMargin, int bottomMargin, int leftMargin)
+ public EnhancedPrintDocument(Results.Entities.Batch batch, EnhancedPrinterCfg cfg)
{
this.batch = batch;
- DefaultPageSettings.Landscape = (pageOrientation == PageOrientation.Landscape);
+ this.cfg = cfg;
+ topMargin = cfg.TopMargin;
+ bottomMargin = cfg.BottomMargin;
+ leftMargin = cfg.LeftMargin;
- this.topMargin = topMargin;
- this.bottomMargin = bottomMargin;
- this.leftMargin = leftMargin;
+ header = string.IsNullOrEmpty(cfg.Header) ? string.Empty : cfg.Header.Replace("~", Environment.NewLine);
+ commonItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.CommonItems);
+ testItems = Results.WMeterRsltItemSpec.FromStrArray(cfg.TestItems); /// TestID info will be overwritten later on
+ footer = string.IsNullOrEmpty(cfg.Footer) ? string.Empty : cfg.Footer.Replace("~", Environment.NewLine);
- TitleX = leftMargin;
- TitleY = topMargin; /// Depends on the size of the header
- HdrTop = TitleY + 60;
- BodyTop = HdrTop + 160;
-
- if (batch.WaterMeters.Count > 0 && batch.WaterMeters[0].Compound())
- {
- rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_CombinedWM);
- }
- else
- {
- rsltItems = Results.ItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Printer_SingleWM);
- }
+ /// Initialize fonts
+ titleFont = new Font(cfg.TitFntFml, cfg.TitFntSz, (FontStyle)cfg.TitFntSty);
+ headerFont = new Font(cfg.HdrFntFml, cfg.HdrFntSz, (FontStyle)cfg.HdrFntSty);
+ font = new Font(cfg.BodyFntFml, cfg.BodyFntSz, (FontStyle)cfg.BodyFntSty);
/// Set print area size and margins (in dots using 100 dpi)
+ DefaultPageSettings.Landscape = (cfg.PageOrientation == PageOrientation.Landscape);
+ ///
if (DefaultPageSettings.Landscape)
{
printHeight = base.DefaultPageSettings.PaperSize.Width - topMargin - bottomMargin;
@@ -99,22 +103,36 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
printWidth = base.DefaultPageSettings.PaperSize.Width - leftMargin - leftMargin;
}
+ SpacingOne = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", font).Height;
+ SpacingOneAndHalf = (3 * SpacingOne) / 2;
+ SpacingOne4Header = System.Windows.Forms.TextRenderer.MeasureText("Abcgq", headerFont).Height;
+ SpacingOneAndHalf4Header = (3 * SpacingOne4Header) / 2;
+
+ /// Calculate the tests count
int testsCount = 0;
if (batch.WaterMeters.Count > 0)
{
foreach (var mtr in batch.WaterMeters[0].MeterTestRslts)
{
- if (mtr.Publish() == Config.Entities.Publish.Always) testsCount++;
+ if (mtr.Publish() == Config.Entities.Publish.Always && mtr.IsPilotRslt()) testsCount++;
}
}
- if (batch.WaterMeters.Count > 0 && batch.WaterMeters[0].Compound()) testsCount /= 3;
+ /// Prepare document outline
+ TitleX = cfg.LeftMargin;
+ TitleY = cfg.TopMargin;
- int wmSectionHeight = (testsCount + 4) * SpacingOne;
+ titleHeight = System.Windows.Forms.TextRenderer.MeasureText(header, titleFont).Height;
+ CommonTop = TitleY + titleHeight + SpacingOne4Header;
+
+ commonHeight = commonItems.Count * SpacingOne;
+ BodyTop = CommonTop + commonHeight + SpacingOne4Header;
+
+ int wmSectionHeight = (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header;
nrWMsOnFirstPage = (printHeight - BodyTop + TitleY - 2 * SpacingOne) / wmSectionHeight;
nrWMsOnNextPage = (printHeight - 2 * SpacingOne) / wmSectionHeight;
- nrWMsOnNextPage = Math.Max(nrWMsOnNextPage, 1); /// Prevent division by zero if there are too many WM tests
+ nrWMsOnNextPage = Math.Max(nrWMsOnNextPage, 1); /// Prevent division by zero if there are too many WM tests
nrPages = 1 + (batch.WaterMeters.Count - nrWMsOnFirstPage + nrWMsOnNextPage - 1) / nrWMsOnNextPage;
@@ -130,10 +148,6 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e)
{
base.OnBeginPrint(e);
-
- if (font == null) { font = new Font(FontFamilyName, 10, FontStyle.Regular); }
- if (boldFont == null) { boldFont = new Font(FontFamilyName, 10, FontStyle.Bold); }
- if (titleFont == null) { titleFont = new Font(FontFamilyName, 18, FontStyle.Bold); }
}
///
@@ -158,33 +172,24 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
if (pageNr == 1)
{
///----------
- /// Header
+ /// Title
///----------
- RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, 40);
- e.Graphics.DrawString(batch.ProtocolTitle, titleFont, Brushes.Black, printArea);
+ RectangleF printArea = new RectangleF(TitleX, TitleY, printWidth, titleHeight);
+ e.Graphics.DrawString(header, titleFont, Brushes.Black, printArea);
- string[] leftColumn = new string[]
- {
- "Batch number: ",
- "Date and time: ",
- "Procedure: ",
- Strings.User + ": ",
- "Ambient temperature: ",
- "Ambient pressure: ",
- "Ambient humidity: ",
- };
+ ///----------------
+ /// Common items
+ ///----------------
+ string[] leftColumn = new string[commonItems.Count];
+ string[] rightColumn = new string[commonItems.Count];
- string[] rightColumn = new string[]
- {
- batch.BatchNr.ToString(),
- //batch.EndTime.ToShortDateString() + " " + batch.EndTime.ToShortTimeString(),
- string.Format("{0:yyyy.MM.dd HH:mm}", batch.EndTime),
- batch.ProcedureName,
- Users.GlobalData.CurrentUser.UserName,
- batch.AmbientTempAve().ToString("F1") + " °C",
- Config.Units.ConvertTo(Config.Unit.mbar, batch.AmbientPressAve()).ToString("F0") + " mbar",
- batch.AmbientHumiAve().ToString("F0") + " %",
- };
+ int cnt = 0;
+ foreach (var v in commonItems)
+ {
+ leftColumn[cnt] = v.Caption;
+ rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty;
+ cnt++;
+ }
/// Determine max. left column width in characters
int maxLen = 0;
@@ -193,8 +198,8 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
/// Write aligned columns
for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++)
{
- PrintAt(e, leftMargin, HdrTop + SpacingOne * i, leftColumn[i]);
- PrintAt(e, 300, HdrTop + SpacingOne * i, rightColumn[i]);
+ PrintAt(e, leftMargin, CommonTop + SpacingOne * i, leftColumn[i]);
+ PrintAt(e, 300, CommonTop + SpacingOne * i, rightColumn[i]);
}
}
@@ -220,10 +225,12 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
///----------
/// Footer
///----------
- string footerText = string.Format("str. {1}/{2}", Strings.Page, pageNr++, nrPages);
- int footerWidth = (int)e.Graphics.MeasureString(footerText, font).Width;
- PrintAt(e, leftMargin + (printWidth - footerWidth) / 2, topMargin + printHeight - SpacingOne, footerText);
-
+ int footerWidth = (int)e.Graphics.MeasureString(footer, font).Width;
+ PrintAt(e, leftMargin + (printWidth - footerWidth) / 2, topMargin + printHeight - 2 * SpacingOne, footer);
+
+ string pageNrText = string.Format("{0} {1}/{2}", Strings.Page, pageNr++, nrPages);
+ int pageNrWidth = (int)e.Graphics.MeasureString(pageNrText, font).Width;
+ PrintAt(e, leftMargin + (printWidth - pageNrWidth) / 2, topMargin + printHeight - SpacingOne, pageNrText);
}
@@ -238,89 +245,61 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
Results.Entities.WaterMeter wm, int printedWMNr, int top)
{
/// Determin column widths
- float[] columnPos = new float[rsltItems.Count + 1];
+ float[] columnPos = new float[testItems.Count + 1];
columnPos[0] = (float)leftMargin;
- for (int i = 0; i < rsltItems.Count; i++)
+ for (int i = 0; i < testItems.Count; i++)
{
- float columnWidth = e.Graphics.MeasureString(rsltItems[i].ClmnHeaderText, font).Width;
+ float columnWidth = e.Graphics.MeasureString(testItems[i].Caption, headerFont).Width;
foreach (var mtr in wm.MeterTestRslts)
{
- string itemText;
+ if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always)
+ {
+ string itemText = testItems[i].Print(wm, mtr.Name());
- if (!wm.Compound())
- {
- itemText = rsltItems[i].Print(mtr);
- }
- else if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound)
- {
- Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain);
- Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundAux);
- itemText = rsltItems[i].PrintCombined(mainMtr, auxMtr, mtr);
- }
- else
- {
- continue;
- }
+ /// Strip color information
+ string[] texts = itemText.Split(new char[] { '|' });
+ if (texts.Length == 2) { itemText = texts[0]; }
- /// Strip color information
- string[] texts = itemText.Split(new char[] { '|' });
- if (texts.Length == 2) { itemText = texts[0]; }
-
- float width = e.Graphics.MeasureString(itemText, font).Width;
- if (width > columnWidth) columnWidth = width;
+ float width = e.Graphics.MeasureString(itemText, font).Width;
+ if (width > columnWidth) columnWidth = width;
+ }
}
columnPos[i + 1] = columnPos[i] + columnWidth + 20.0f;
}
int tableLeftX = (int)columnPos[0];
- int tableRightX = (int)columnPos[rsltItems.Count] - 20;
+ int tableRightX = (int)columnPos[testItems.Count] - 20;
- string wmText = string.Format("Water meter {0}", printedWMNr);
- PrintAt(e, leftMargin, top, wmText);
+ string wmText = string.Format("{0} {1}", Strings.Water_Meter, printedWMNr);
+ PrintHeaderAt(e, leftMargin, top, wmText);
if (!string.IsNullOrEmpty(wm.SerialNr))
{
- PrintAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, font).Width, top,
- string.Format(" s/n = {0}", wm.SerialNr));
+ PrintHeaderAt(e, leftMargin + (int)e.Graphics.MeasureString(wmText, headerFont).Width, top,
+ string.Format(" {0} = {1}", Strings.sn, wm.SerialNr));
}
/// Horizontal line
- int horY = top + 25;
+ int horY = top + SpacingOneAndHalf4Header;
e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY));
- for (int i = 0; i < rsltItems.Count; i++)
+ for (int i = 0; i < testItems.Count; i++)
{
- PrintAt(e, (int)columnPos[i], top + 27, rsltItems[i].ClmnHeaderText);
+ PrintHeaderAt(e, (int)columnPos[i], top + (int)(1.6 * SpacingOne4Header), testItems[i].Caption);
}
/// Horizontal line
- horY = top + 27 + SpacingOne;
+ horY = top + (int)(2.8 * SpacingOne4Header);
e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY));
int testsCount = 0;
foreach (var mtr in wm.MeterTestRslts)
{
- if (mtr.Publish() == Config.Entities.Publish.Always)
+ if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always))
{
testsCount++;
- for (int i = 0; i < rsltItems.Count; i++)
+ for (int i = 0; i < testItems.Count; i++)
{
- string itemText;
-
- if (!wm.Compound())
- {
- /// Single water meter
- itemText = rsltItems[i].Print(mtr);
- }
- else if (mtr.CompoundMeterId == (byte)CompoundMeterId.Compound)
- {
- Results.Entities.MeterTestRslt mainMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain);
- Results.Entities.MeterTestRslt auxMtr = wm.GetMeterTestRslt(mtr.Name(), CompoundMeterId.CompoundMain);
- itemText = rsltItems[i].PrintCombined(mainMtr, auxMtr, mtr);
- }
- else
- {
- continue;
- }
+ string itemText = testItems[i].Print(wm, mtr.Name());
/// Strip color information
string[] texts = itemText.Split(new char[] { '|' });
@@ -331,16 +310,16 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
/// TODO: How to print colors?
}
- PrintAt(e, (int)columnPos[i], top + 30 + SpacingOne * testsCount, itemText);
+ PrintAt(e, (int)columnPos[i], top + 2 * SpacingOne4Header + SpacingOne * testsCount, itemText);
}
}
}
/// Horizontal line
- horY = top + 30 + SpacingOne * (testsCount + 1);
+ horY = top + 2 * SpacingOneAndHalf4Header + SpacingOne * testsCount;
e.Graphics.DrawLine(new Pen(Color.Black, 2), new Point(tableLeftX, horY), new Point(tableRightX, horY));
- return (testsCount + 4) * SpacingOne;
+ return (testsCount + 1) * SpacingOne + 3 * SpacingOne4Header;
}
@@ -352,21 +331,21 @@ namespace TBF.BenchControl.Output.Printers.Enhanced
void PrintAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text)
{
- RectangleF printArea = new RectangleF(x, y, 667, SpacingOne);
+ RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne);
e.Graphics.DrawString(text, this.font, Brushes.Black, printArea);
}
- void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text)
+ void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, Point p, string text)
{
- PrintBoldAt(e, p.X, p.Y, text);
+ PrintHeaderAt(e, p.X, p.Y, text);
}
- void PrintBoldAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text)
+ void PrintHeaderAt(System.Drawing.Printing.PrintPageEventArgs e, int x, int y, string text)
{
- RectangleF printArea = new RectangleF(x, y, 667, SpacingOne);
- e.Graphics.DrawString(text, this.boldFont, Brushes.Black, printArea);
+ RectangleF printArea = new RectangleF(x, y, 2000, SpacingOne4Header);
+ e.Graphics.DrawString(text, this.headerFont, Brushes.Black, printArea);
}
}
}
diff --git a/Results/Output/Printers/OnePagePerMeter/EnhancedPrinterCfg.cs b/Results/Output/Printers/OnePagePerMeter/EnhancedPrinterCfg.cs
new file mode 100644
index 000000000..615f2d48f
--- /dev/null
+++ b/Results/Output/Printers/OnePagePerMeter/EnhancedPrinterCfg.cs
@@ -0,0 +1,33 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Results.Output.Printers.OnePagePerMeter
+{
+ public class EnhancedPrinterCfg
+ {
+ public Config.Entities.PageOrientation PageOrientation;
+ public int TopMargin;
+ public int BottomMargin;
+ public int LeftMargin;
+ public string TitFntFml;
+ public int TitFntSz;
+ public int TitFntSty;
+ public string HdrFntFml;
+ public int HdrFntSz;
+ public int HdrFntSty;
+ public string BodyFntFml;
+ public int BodyFntSz;
+ public int BodyFntSty;
+ public bool SupressPrinting; /// Bypass printing when true
+ public System.Globalization.CultureInfo CultureInfo;
+ public string[] CommonItems;
+ public string[] TestItems;
+ public string Header; /// =Title
+ public string Footer;
+ }
+}
diff --git a/Results/Properties/AssemblyInfo.cs b/Results/Properties/AssemblyInfo.cs
index 244067f7a..c40cc5538 100644
--- a/Results/Properties/AssemblyInfo.cs
+++ b/Results/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@ 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.14.611.0")]
-[assembly: AssemblyFileVersion("2.14.611.0")]
+[assembly: AssemblyVersion("2.14.619.0")]
+[assembly: AssemblyFileVersion("2.14.619.0")]
diff --git a/Results/Results.csproj b/Results/Results.csproj
index 7af9f30a7..9cabccef7 100644
--- a/Results/Results.csproj
+++ b/Results/Results.csproj
@@ -107,6 +107,10 @@
Component
+
+ Component
+
+
@@ -133,9 +137,9 @@
-
+
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs
new file mode 100644
index 000000000..bb95aee50
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Archiver.cs
@@ -0,0 +1,173 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Threading;
+using log4net;
+using Config.Entities;
+using TBF.BenchControl;
+using TBF.Resources;
+
+namespace TBF.BenchControl.Output.FileWriters.ImageArchiver
+{
+ public class Archiver : ComponentBase, IOperation, GenericDevices.IResultsWriter
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(Archiver));
+ public override string ToString() { return string.Format("Output.FileWriters.Basic({0})", Cfg.ToString(1)); }
+
+ readonly ArchiverCfg writerCfg;
+
+ Results.Entities.Batch batch;
+
+ bool abort; /// Set to 'true' by Stop() operation to abort writing to the file
+
+
+ public Archiver() {}
+
+ public Archiver(Generic.IComponentCfg cfg)
+ : base(cfg)
+ {
+ writerCfg = cfg as ArchiverCfg;
+ log.Debug(this.ToString());
+ }
+
+
+ ///
+ /// Returns a file name derived from a DateTime structure.
+ /// Creates directories on this path as a side effect.
+ ///
+ /// Date and time
+ /// File name
+ string GetArchivePath(string destinationPath, DateTime time, int wmPosition, string wmSN)
+ {
+ string directory = destinationPath; /// Ends with "\\";
+
+ switch (writerCfg.YearFolders)
+ {
+ case YearFolders.FourDigit:
+ directory = string.Format("{0}{1}\\", directory, time.Year.ToString("D4"));
+ break;
+ case YearFolders.TwoDigit:
+ directory = string.Format("{0}{1}\\", directory, (time.Year % 100).ToString("D2"));
+ break;
+ }
+
+ switch (writerCfg.MonthFolders)
+ {
+ case MonthFolders.Name:
+ {
+ string monthStr;
+ switch (time.Month)
+ {
+ default:
+ case 1: monthStr = "January"; break;
+ case 2: monthStr = "February"; break;
+ case 3: monthStr = "March"; break;
+ case 4: monthStr = "April"; break;
+ case 5: monthStr = "May"; break;
+ case 6: monthStr = "June"; break;
+ case 7: monthStr = "July"; break;
+ case 8: monthStr = "August"; break;
+ case 9: monthStr = "September"; break;
+ case 10: monthStr = "October"; break;
+ case 11: monthStr = "November"; break;
+ case 12: monthStr = "December"; break;
+ }
+ directory = string.Format("{0}{1}\\", directory, monthStr);
+ break;
+ }
+ case MonthFolders.Digit:
+ directory = string.Format("{0}{1}\\", directory, time.Month.ToString());
+ break;
+ case MonthFolders.TwoDigit:
+ directory = string.Format("{0}{1}\\", directory, time.Month.ToString("D2"));
+ break;
+ }
+
+ switch (writerCfg.DayFolders)
+ {
+ case DayFolders.Digit:
+ directory = string.Format("{0}{1}\\", directory, time.Day.ToString());
+ break;
+ case DayFolders.TwoDigit:
+ directory = string.Format("{0}{1}\\", directory, time.Day.ToString("D2"));
+ break;
+ }
+
+ Directory.CreateDirectory(directory);
+
+ try
+ {
+ if (string.IsNullOrEmpty(writerCfg.ArchiveFormat)) throw new Exception();
+ return directory + string.Format(writerCfg.ArchiveFormat, time, wmPosition, wmSN);
+ }
+ catch
+ {
+ return string.Format("{0}{1:yyMMdd-HHmm}-{2}", directory, time, wmPosition);
+ }
+ }
+
+ ///
+ /// Writes the test cycle results into a file
+ /// Events:
+ /// Event.ResultsWritten
+ /// Event.Busy
+ ///
+ /// Results to write into a file
+ /// Reference to the operation
+ public IOperation WriteResultsOp(Results.Entities.Batch batch)
+ {
+ this.batch = batch;
+ return this;
+ }
+
+ /// Start this operation
+ public void Start()
+ {
+ MoveFilesToArchive(batch, writerCfg.DestinationPath);
+ MoveFilesToArchive(batch, writerCfg.DestinationPath2);
+ }
+
+ /// Run this operation
+ /// Event.ResultsWritten
+ public Event Run()
+ {
+ return Event.ResultsWritten;
+ }
+
+ /// Stop this operation
+ public void Stop()
+ {
+ }
+
+
+ void MoveFilesToArchive(Results.Entities.Batch batch, string destination)
+ {
+ if (batch == null || batch.WaterMeters == null || batch.WaterMeters.Count <= 0) return;
+
+ if (!string.IsNullOrEmpty(writerCfg.DestinationPath))
+ {
+ foreach (var wm in batch.WaterMeters)
+ {
+ if (wm != null && (!writerCfg.SaveGoodOnly || wm.Passed))
+ {
+ string srcFolder = Path.Combine(Program.ImagesDir, batch.BatchNr.ToString(), wm.WMPosition.ToString());
+
+ try
+ {
+ /// TODO: Copy files when files are on different disks.
+ Directory.Move(srcFolder, GetArchivePath(writerCfg.DestinationPath, batch.EndTime, wm.WMPosition, wm.SerialNr));
+ }
+ catch
+ {
+ log.ErrorFormat("Failed to move archive files from {0}", srcFolder);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs
new file mode 100644
index 000000000..ca7652779
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfg.cs
@@ -0,0 +1,64 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml.Serialization;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.FileWriters.ImageArchiver
+{
+ public class ArchiverCfg : ComponentCfgBase, Generic.IComponentCfg
+ {
+ public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ArchiverCfg) })[0];
+ protected override XmlSerializer GetSerializer() { return Serializer; }
+
+ public IComponentCfgCtrl GetControl() { return new ArchiverCfgCtrl(); }
+
+ public string DestinationPath; /// Directory path into which the results will be saved
+ public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved
+ public YearFolders YearFolders;
+ public MonthFolders MonthFolders;
+ public DayFolders DayFolders;
+ public string ArchiveFormat;
+ public bool SaveGoodOnly;
+
+ [XmlIgnore]
+ public Config.Entities.MetersKind MetersKind;
+
+ /// Private parameterless constructor invoked by all other (public) constructors
+ ArchiverCfg()
+ {
+ }
+
+ public ArchiverCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind)
+ : this()
+ {
+ Name = name;
+ Factory = factory;
+ MetersKind = metersKind;
+
+ ParentName = string.Empty;
+ DestinationPath = Program.HomeDir + "Results\\";
+ DestinationPath2 = string.Empty;
+ YearFolders = YearFolders.FourDigit;
+ MonthFolders = MonthFolders.Digit;
+ DayFolders = DayFolders.Digit;
+ ArchiveFormat = "{0:yyyyMMdd}";
+ SaveGoodOnly = false;
+ }
+
+ public string ToString(int i)
+ {
+ return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, ArchiveFmt={5}, GoodOnly={6}",
+ Name,
+ DestinationPath,
+ YearFolders,
+ MonthFolders,
+ DayFolders,
+ ArchiveFormat,
+ SaveGoodOnly);
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs
new file mode 100644
index 000000000..7c0b7167f
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.cs
@@ -0,0 +1,175 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Windows.Forms;
+using log4net;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.FileWriters.ImageArchiver
+{
+ public partial class ArchiverCfgCtrl : UserControl, IComponentCfgCtrl
+ {
+ static readonly ILog log = LogManager.GetLogger(typeof(ArchiverCfgCtrl));
+
+ public bool ShowMore { get { return false; } }
+
+ public bool Compound;
+
+ ArchiverCfg config;
+ public IComponentCfg Config
+ {
+ get { return config as IComponentCfg; }
+ set
+ {
+ config = value as ArchiverCfg;
+ Redraw();
+ }
+ }
+
+ string[] selectedItems;
+
+ public ArchiverCfgCtrl()
+ {
+ InitializeComponent();
+ }
+
+ private void WriterCfgCtrl_Load(object sender, EventArgs e)
+ {
+ for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString());
+ for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString());
+ for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString());
+
+ Redraw();
+ }
+
+ public void Closing()
+ {
+ }
+
+ void Redraw()
+ {
+ if (config == null) return; /// Control was not loaded, settings were not changed
+ classNameLabel.Text = config.Factory.ClassName;
+ nameTextBox.Text = config.Name;
+ destinationTextBox.Text = config.DestinationPath;
+ destination2TextBox.Text = config.DestinationPath2;
+ yearFoldersComboBox.Text = config.YearFolders.ToString();
+ monthFoldersComboBox.Text = config.MonthFolders.ToString();
+ dayFoldersComboBox.Text = config.DayFolders.ToString();
+ archiveFmtTextBox.Text = config.ArchiveFormat;
+ goodOnlyCheckBox.Checked = config.SaveGoodOnly;
+ }
+
+ public void Unlock()
+ {
+ nameTextBox.Enabled = true;
+ destinationTextBox.Enabled = true;
+ destinationButton.Enabled = true;
+ destination2TextBox.Enabled = true;
+ destination2Button.Enabled = true;
+ yearFoldersComboBox.Enabled = true;
+ monthFoldersComboBox.Enabled = true;
+ dayFoldersComboBox.Enabled = true;
+ archiveFmtTextBox.Enabled = true;
+ goodOnlyCheckBox.Enabled = true;
+ }
+
+ public CfgUpdateFlags VerifyCfg(ref string message)
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid year folders selection";
+ }
+
+ if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid month folders selection";
+ }
+
+ if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid day folder selection";
+ }
+
+ return flags;
+ }
+
+ public CfgUpdateFlags UpdateCfg()
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
+
+ if (config.Name != nameTextBox.Text) { config.Name = nameTextBox.Text; flags = CfgUpdateFlags.RestartRqrd; }
+
+ if (config.DestinationPath != destinationTextBox.Text)
+ {
+ config.DestinationPath = destinationTextBox.Text;
+ if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\";
+ flags = CfgUpdateFlags.RestartRqrd;
+ }
+
+ if (config.DestinationPath2 != destination2TextBox.Text)
+ {
+ config.DestinationPath2 = destination2TextBox.Text;
+ if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\";
+ flags = CfgUpdateFlags.RestartRqrd;
+ }
+
+ for (YearFolders i = 0; i < YearFolders.Count; i++)
+ {
+ if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i))
+ {
+ config.YearFolders = i;
+ flags = CfgUpdateFlags.RestartRqrd;
+ break;
+ }
+ }
+
+ for (MonthFolders i = 0; i < MonthFolders.Count; i++)
+ {
+ if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i))
+ {
+ config.MonthFolders = i;
+ flags = CfgUpdateFlags.RestartRqrd;
+ break;
+ }
+ }
+
+ for (DayFolders i = 0; i < DayFolders.Count; i++)
+ {
+ if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i))
+ {
+ config.DayFolders = i;
+ flags = CfgUpdateFlags.RestartRqrd;
+ break;
+ }
+ }
+
+ if (config.ArchiveFormat != archiveFmtTextBox.Text)
+ {
+ config.ArchiveFormat = archiveFmtTextBox.Text;
+ flags = CfgUpdateFlags.RestartRqrd;
+ }
+
+ if (config.SaveGoodOnly != goodOnlyCheckBox.Checked)
+ {
+ config.SaveGoodOnly = goodOnlyCheckBox.Checked;
+ flags = CfgUpdateFlags.RestartRqrd;
+ }
+
+ return flags;
+ }
+
+ private void destinationButton_Click(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs
new file mode 100644
index 000000000..b8af7328e
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.designer.cs
@@ -0,0 +1,267 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+namespace TBF.BenchControl.Output.FileWriters.ImageArchiver
+{
+ partial class ArchiverCfgCtrl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.nameTextBox = new System.Windows.Forms.TextBox();
+ this.nameLabel = new System.Windows.Forms.Label();
+ this.classNameLabel = new System.Windows.Forms.Label();
+ this.destinationTextBox = new System.Windows.Forms.TextBox();
+ this.destinationLabel = new System.Windows.Forms.Label();
+ this.destinationButton = new System.Windows.Forms.Button();
+ this.yearFoldersLabel = new System.Windows.Forms.Label();
+ this.monthFoldersLabel = new System.Windows.Forms.Label();
+ this.dayFoldersLabel = new System.Windows.Forms.Label();
+ this.yearFoldersComboBox = new System.Windows.Forms.ComboBox();
+ this.monthFoldersComboBox = new System.Windows.Forms.ComboBox();
+ this.dayFoldersComboBox = new System.Windows.Forms.ComboBox();
+ this.destination2Button = new System.Windows.Forms.Button();
+ this.destination2TextBox = new System.Windows.Forms.TextBox();
+ this.destination2Label = new System.Windows.Forms.Label();
+ this.archiveFmtTextBox = new System.Windows.Forms.TextBox();
+ this.archiveFmtLabel = new System.Windows.Forms.Label();
+ this.goodOnlyCheckBox = new System.Windows.Forms.CheckBox();
+ this.SuspendLayout();
+ //
+ // nameTextBox
+ //
+ this.nameTextBox.Enabled = false;
+ this.nameTextBox.Location = new System.Drawing.Point(108, 31);
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.Size = new System.Drawing.Size(146, 20);
+ this.nameTextBox.TabIndex = 2;
+ //
+ // nameLabel
+ //
+ this.nameLabel.AutoSize = true;
+ this.nameLabel.Location = new System.Drawing.Point(17, 34);
+ this.nameLabel.Name = "nameLabel";
+ this.nameLabel.Size = new System.Drawing.Size(35, 13);
+ this.nameLabel.TabIndex = 1;
+ this.nameLabel.Text = "Name";
+ //
+ // classNameLabel
+ //
+ this.classNameLabel.AutoSize = true;
+ this.classNameLabel.Location = new System.Drawing.Point(105, 9);
+ this.classNameLabel.Name = "classNameLabel";
+ this.classNameLabel.Size = new System.Drawing.Size(83, 13);
+ this.classNameLabel.TabIndex = 0;
+ this.classNameLabel.Text = "ComonentName";
+ //
+ // destinationTextBox
+ //
+ this.destinationTextBox.Enabled = false;
+ this.destinationTextBox.Location = new System.Drawing.Point(108, 54);
+ this.destinationTextBox.Name = "destinationTextBox";
+ this.destinationTextBox.Size = new System.Drawing.Size(202, 20);
+ this.destinationTextBox.TabIndex = 4;
+ //
+ // destinationLabel
+ //
+ this.destinationLabel.AutoSize = true;
+ this.destinationLabel.Location = new System.Drawing.Point(17, 57);
+ this.destinationLabel.Name = "destinationLabel";
+ this.destinationLabel.Size = new System.Drawing.Size(60, 13);
+ this.destinationLabel.TabIndex = 3;
+ this.destinationLabel.Text = "Destination";
+ //
+ // destinationButton
+ //
+ this.destinationButton.Enabled = false;
+ this.destinationButton.Location = new System.Drawing.Point(316, 53);
+ this.destinationButton.Name = "destinationButton";
+ this.destinationButton.Size = new System.Drawing.Size(30, 20);
+ this.destinationButton.TabIndex = 16;
+ this.destinationButton.Text = "...";
+ this.destinationButton.UseVisualStyleBackColor = true;
+ this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click);
+ //
+ // yearFoldersLabel
+ //
+ this.yearFoldersLabel.AutoSize = true;
+ this.yearFoldersLabel.Location = new System.Drawing.Point(17, 103);
+ this.yearFoldersLabel.Name = "yearFoldersLabel";
+ this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13);
+ this.yearFoldersLabel.TabIndex = 7;
+ this.yearFoldersLabel.Text = "Year folders";
+ //
+ // monthFoldersLabel
+ //
+ this.monthFoldersLabel.AutoSize = true;
+ this.monthFoldersLabel.Location = new System.Drawing.Point(17, 127);
+ this.monthFoldersLabel.Name = "monthFoldersLabel";
+ this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13);
+ this.monthFoldersLabel.TabIndex = 9;
+ this.monthFoldersLabel.Text = "Month folders";
+ //
+ // dayFoldersLabel
+ //
+ this.dayFoldersLabel.AutoSize = true;
+ this.dayFoldersLabel.Location = new System.Drawing.Point(17, 151);
+ this.dayFoldersLabel.Name = "dayFoldersLabel";
+ this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13);
+ this.dayFoldersLabel.TabIndex = 11;
+ this.dayFoldersLabel.Text = "Day folders";
+ //
+ // yearFoldersComboBox
+ //
+ this.yearFoldersComboBox.Enabled = false;
+ this.yearFoldersComboBox.FormattingEnabled = true;
+ this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 100);
+ this.yearFoldersComboBox.Name = "yearFoldersComboBox";
+ this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21);
+ this.yearFoldersComboBox.TabIndex = 8;
+ //
+ // monthFoldersComboBox
+ //
+ this.monthFoldersComboBox.Enabled = false;
+ this.monthFoldersComboBox.FormattingEnabled = true;
+ this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 124);
+ this.monthFoldersComboBox.Name = "monthFoldersComboBox";
+ this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21);
+ this.monthFoldersComboBox.TabIndex = 10;
+ //
+ // dayFoldersComboBox
+ //
+ this.dayFoldersComboBox.Enabled = false;
+ this.dayFoldersComboBox.FormattingEnabled = true;
+ this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 148);
+ this.dayFoldersComboBox.Name = "dayFoldersComboBox";
+ this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21);
+ this.dayFoldersComboBox.TabIndex = 12;
+ //
+ // destination2Button
+ //
+ this.destination2Button.Enabled = false;
+ this.destination2Button.Location = new System.Drawing.Point(316, 78);
+ this.destination2Button.Name = "destination2Button";
+ this.destination2Button.Size = new System.Drawing.Size(30, 20);
+ this.destination2Button.TabIndex = 17;
+ this.destination2Button.Text = "...";
+ this.destination2Button.UseVisualStyleBackColor = true;
+ //
+ // destination2TextBox
+ //
+ this.destination2TextBox.Enabled = false;
+ this.destination2TextBox.Location = new System.Drawing.Point(108, 77);
+ this.destination2TextBox.Name = "destination2TextBox";
+ this.destination2TextBox.Size = new System.Drawing.Size(202, 20);
+ this.destination2TextBox.TabIndex = 6;
+ //
+ // destination2Label
+ //
+ this.destination2Label.AutoSize = true;
+ this.destination2Label.Location = new System.Drawing.Point(17, 80);
+ this.destination2Label.Name = "destination2Label";
+ this.destination2Label.Size = new System.Drawing.Size(69, 13);
+ this.destination2Label.TabIndex = 5;
+ this.destination2Label.Text = "Destination 2";
+ //
+ // archiveFmtTextBox
+ //
+ this.archiveFmtTextBox.Enabled = false;
+ this.archiveFmtTextBox.Location = new System.Drawing.Point(108, 172);
+ this.archiveFmtTextBox.Name = "archiveFmtTextBox";
+ this.archiveFmtTextBox.Size = new System.Drawing.Size(202, 20);
+ this.archiveFmtTextBox.TabIndex = 14;
+ //
+ // archiveFmtLabel
+ //
+ this.archiveFmtLabel.AutoSize = true;
+ this.archiveFmtLabel.Location = new System.Drawing.Point(17, 175);
+ this.archiveFmtLabel.Name = "archiveFmtLabel";
+ this.archiveFmtLabel.Size = new System.Drawing.Size(75, 13);
+ this.archiveFmtLabel.TabIndex = 13;
+ this.archiveFmtLabel.Text = "Archive format";
+ //
+ // goodOnlyCheckBox
+ //
+ this.goodOnlyCheckBox.AutoSize = true;
+ this.goodOnlyCheckBox.Location = new System.Drawing.Point(108, 200);
+ this.goodOnlyCheckBox.Name = "goodOnlyCheckBox";
+ this.goodOnlyCheckBox.Size = new System.Drawing.Size(74, 17);
+ this.goodOnlyCheckBox.TabIndex = 15;
+ this.goodOnlyCheckBox.Text = "Good only";
+ this.goodOnlyCheckBox.UseVisualStyleBackColor = true;
+ //
+ // ArchiverCfgCtrl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.goodOnlyCheckBox);
+ this.Controls.Add(this.archiveFmtTextBox);
+ this.Controls.Add(this.archiveFmtLabel);
+ this.Controls.Add(this.destination2Button);
+ this.Controls.Add(this.destination2TextBox);
+ this.Controls.Add(this.destination2Label);
+ this.Controls.Add(this.dayFoldersComboBox);
+ this.Controls.Add(this.monthFoldersComboBox);
+ this.Controls.Add(this.yearFoldersComboBox);
+ this.Controls.Add(this.dayFoldersLabel);
+ this.Controls.Add(this.monthFoldersLabel);
+ this.Controls.Add(this.yearFoldersLabel);
+ this.Controls.Add(this.destinationButton);
+ this.Controls.Add(this.destinationTextBox);
+ this.Controls.Add(this.destinationLabel);
+ this.Controls.Add(this.nameTextBox);
+ this.Controls.Add(this.nameLabel);
+ this.Controls.Add(this.classNameLabel);
+ this.Name = "ArchiverCfgCtrl";
+ this.Size = new System.Drawing.Size(384, 282);
+ this.Load += new System.EventHandler(this.WriterCfgCtrl_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox nameTextBox;
+ private System.Windows.Forms.Label nameLabel;
+ private System.Windows.Forms.Label classNameLabel;
+ private System.Windows.Forms.TextBox destinationTextBox;
+ private System.Windows.Forms.Label destinationLabel;
+ private System.Windows.Forms.Button destinationButton;
+ private System.Windows.Forms.Label yearFoldersLabel;
+ private System.Windows.Forms.Label monthFoldersLabel;
+ private System.Windows.Forms.Label dayFoldersLabel;
+ private System.Windows.Forms.ComboBox yearFoldersComboBox;
+ private System.Windows.Forms.ComboBox monthFoldersComboBox;
+ private System.Windows.Forms.ComboBox dayFoldersComboBox;
+ private System.Windows.Forms.Button destination2Button;
+ private System.Windows.Forms.TextBox destination2TextBox;
+ private System.Windows.Forms.Label destination2Label;
+ private System.Windows.Forms.TextBox archiveFmtTextBox;
+ private System.Windows.Forms.Label archiveFmtLabel;
+ private System.Windows.Forms.CheckBox goodOnlyCheckBox;
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/ArchiverCfgCtrl.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs
new file mode 100644
index 000000000..140c9a616
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/ImageArchiver/Factory.cs
@@ -0,0 +1,29 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.FileWriters.ImageArchiver
+{
+ public class Factory : IComponentFactory
+ {
+ public string ClassName { get { return this.GetType().Namespace.Substring(17); } }
+
+ public void ResetStaticProperties() { Archiver.ResetStaticProperties(); }
+
+ public IComponent DummyComponent() { return new Archiver(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Archiver(cfg); }
+
+ public IComponentCfg DefaultConfig() { return new ArchiverCfg("FileWriter.ImageArchiver", this, Config.Entities.MetersKind.Single); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(ArchiverCfg.Serializer, component, this);
+ (cfg as ArchiverCfg).MetersKind = Config.Entities.MetersKind.Single;
+ return cfg;
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs
new file mode 100644
index 000000000..82cddb639
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryCompound.cs
@@ -0,0 +1,29 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter
+{
+ public class FactoryCompound : IComponentFactory
+ {
+ public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } }
+
+ public void ResetStaticProperties() { Writer.ResetStaticProperties(); }
+
+ public IComponent DummyComponent() { return new Writer(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); }
+
+ public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.Compound", this, Config.Entities.MetersKind.Combined); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this);
+ (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Combined;
+ return cfg;
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs
new file mode 100644
index 000000000..cb34e76aa
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactoryHeatMeters.cs
@@ -0,0 +1,29 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter
+{
+ public class FactoryHeatMeters : IComponentFactory
+ {
+ public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } }
+
+ public void ResetStaticProperties() { Writer.ResetStaticProperties(); }
+
+ public IComponent DummyComponent() { return new Writer(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); }
+
+ public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this);
+ (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.HeatMeter;
+ return cfg;
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs
new file mode 100644
index 000000000..44555504e
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/FactorySingle.cs
@@ -0,0 +1,29 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter
+{
+ public class FactorySingle : IComponentFactory
+ {
+ public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } }
+
+ public void ResetStaticProperties() { Writer.ResetStaticProperties(); }
+
+ public IComponent DummyComponent() { return new Writer(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Writer(cfg); }
+
+ public IComponentCfg DefaultConfig() { return new WriterCfg("FileWriter.OneFilePerMeter.Single", this, Config.Entities.MetersKind.Single); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ IComponentCfg cfg = ComponentCfgBase.CreateFromDbEntity(WriterCfg.Serializer, component, this);
+ (cfg as WriterCfg).MetersKind = Config.Entities.MetersKind.Single;
+ return cfg;
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs
new file mode 100644
index 000000000..513718dbc
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/Writer.cs
@@ -0,0 +1,439 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Threading;
+using log4net;
+using TBF.Resources;
+
+namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter
+{
+ public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(Writer));
+ public override string ToString() { return string.Format("Output.FileWriters.Enhanced({0})", Cfg.ToString(1)); }
+
+ readonly WriterCfg writerCfg;
+
+ string separatorStr;
+
+ ///
+ /// Items to print
+ ///
+ string header;
+ IList commonItems;
+ IList testItems;
+ string footer;
+
+ Results.Entities.Batch batch;
+
+ bool abort; /// Set to 'true' by Stop() operation to abort writing to files
+
+
+ public Writer() {}
+
+ public Writer(Generic.IComponentCfg cfg)
+ : base(cfg)
+ {
+ writerCfg = cfg as WriterCfg;
+ ApplyConfig();
+ log.Debug(this.ToString());
+ }
+
+
+ void ApplyConfig()
+ {
+ switch (writerCfg.Separator)
+ {
+ default:
+ case Separator.None: separatorStr = string.Empty; break;
+ case Separator.Space: separatorStr = " "; break;
+ case Separator.Tabulator: separatorStr = "\t"; break;
+ case Separator.Comma: separatorStr = ","; break;
+ case Separator.Semicolon: separatorStr = ";"; break;
+ }
+
+ header = string.IsNullOrEmpty(writerCfg.Header) ? string.Empty : writerCfg.Header.Replace("~", Environment.NewLine);
+ commonItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.CommonItems);
+ testItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); /// TestID info will be overwritten later on
+ footer = string.IsNullOrEmpty(writerCfg.Footer) ? string.Empty : writerCfg.Footer.Replace("~", Environment.NewLine);
+ }
+
+
+ #region Configuration Change Handling
+
+ public static void OnCfgChange(object sender, CfgChangeArgs args)
+ {
+ if (CfgChangeHandler == null) return;
+ try { CfgChangeHandler(sender, args); }
+ catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); }
+ }
+
+ public static event EventHandler CfgChangeHandler;
+
+ public override void StartChangeHandler()
+ {
+ CfgChangeHandler += delegate(object sender, CfgChangeArgs args)
+ {
+ WriterCfg newCfg = args.Cfg as WriterCfg;
+ if (newCfg != null && newCfg.Name.Equals(Name))
+ {
+ if (args.Command == CfgChangeCmd.CfgChange)
+ {
+ writerCfg.DestinationPath = newCfg.DestinationPath;
+ writerCfg.DestinationPath2 = newCfg.DestinationPath2;
+ writerCfg.YearFolders = newCfg.YearFolders;
+ writerCfg.MonthFolders = newCfg.MonthFolders;
+ writerCfg.DayFolders = newCfg.DayFolders;
+ writerCfg.FileNameFormat = newCfg.FileNameFormat;
+ writerCfg.Culture = newCfg.Culture;
+ writerCfg.Separator = newCfg.Separator;
+ writerCfg.EliminateSpaces = newCfg.EliminateSpaces;
+ writerCfg.CommonItems = newCfg.CommonItems;
+ writerCfg.SelectedItems = newCfg.SelectedItems;
+ writerCfg.Header = newCfg.Header;
+ writerCfg.Footer = newCfg.Footer;
+
+ ApplyConfig();
+ }
+ }
+ };
+ }
+
+ #endregion Configuration Change Handling
+
+
+ ///
+ /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces
+ ///
+ /// Input string
+ /// Output string
+ string ElSpaces(string item)
+ {
+ if (writerCfg.EliminateSpaces)
+ return item.Replace(" ", string.Empty);
+ else
+ return item;
+ }
+
+
+ ///
+ /// Returns a file name derived from a DateTime structure.
+ /// Creates directories on this path as a side effect.
+ ///
+ /// Date and time
+ /// File name
+ string GetFilename(string destinationPath, DateTime time)
+ {
+ string directory = destinationPath; /// Ends with "\\";
+
+ switch (writerCfg.YearFolders)
+ {
+ case YearFolders.FourDigit:
+ directory = string.Format("{0}{1:yyyy}\\", directory, time);
+ break;
+ case YearFolders.TwoDigit:
+ directory = string.Format("{0}{1:yy}\\", directory, time);
+ break;
+ }
+
+ switch (writerCfg.MonthFolders)
+ {
+ case MonthFolders.Name:
+ {
+ string monthStr;
+ switch (time.Month)
+ {
+ default:
+ case 1: monthStr = "January"; break;
+ case 2: monthStr = "February"; break;
+ case 3: monthStr = "March"; break;
+ case 4: monthStr = "April"; break;
+ case 5: monthStr = "May"; break;
+ case 6: monthStr = "June"; break;
+ case 7: monthStr = "July"; break;
+ case 8: monthStr = "August"; break;
+ case 9: monthStr = "September"; break;
+ case 10: monthStr = "October"; break;
+ case 11: monthStr = "November"; break;
+ case 12: monthStr = "December"; break;
+ }
+ directory = string.Format("{0}{1}\\", directory, monthStr);
+ break;
+ }
+ case MonthFolders.Digit:
+ directory = string.Format("{0}{1}\\", directory, time.Month.ToString());
+ break;
+ case MonthFolders.TwoDigit:
+ directory = string.Format("{0}{1:MM}\\", directory, time);
+ break;
+ }
+
+ switch (writerCfg.DayFolders)
+ {
+ case DayFolders.Digit:
+ directory = string.Format("{0}{1}\\", directory, time.Day.ToString());
+ break;
+ case DayFolders.TwoDigit:
+ directory = string.Format("{0}{1:dd}\\", directory, time);
+ break;
+ }
+
+ Directory.CreateDirectory(directory);
+
+ try
+ {
+ if (string.IsNullOrEmpty(writerCfg.FileNameFormat)) throw new Exception();
+ return directory + string.Format(writerCfg.FileNameFormat, time);
+ }
+ catch
+ {
+ return string.Format("{0}{1:yyMMdd-HHmm}.txt", directory, time);
+ }
+ }
+
+
+ ///
+ /// Writes the test cycle results into a file
+ /// Events:
+ /// Event.ResultsWritten
+ /// Event.Busy
+ ///
+ /// Results to write into a file
+ /// Reference to the operation
+ public IOperation WriteResultsOp(Results.Entities.Batch batch)
+ {
+ this.batch = batch;
+ return this;
+ }
+
+ /// Start this operation
+ public void Start()
+ {
+ CultureInfo oriCulture = Thread.CurrentThread.CurrentCulture;
+
+ try { Thread.CurrentThread.CurrentCulture = new CultureInfo(writerCfg.Culture.ToString()); }
+ catch { }
+
+ WriteRslts(batch, writerCfg.DestinationPath);
+ WriteRslts(batch, writerCfg.DestinationPath2);
+
+ Thread.CurrentThread.CurrentCulture = oriCulture;
+ }
+
+ /// Run this operation
+ /// Event.ResultsWritten
+ public Event Run()
+ {
+ return Event.ResultsWritten;
+ }
+
+ /// Stop this operation
+ public void Stop()
+ {
+ }
+
+
+ void WriteRslts(Results.Entities.Batch batch, string destination)
+ {
+ StreamWriter writer = StreamWriter.Null;
+ if (!string.IsNullOrEmpty(destination))
+ {
+ try
+ {
+ writer = File.AppendText(GetFilename(destination, batch.EndTime));
+ }
+ catch
+ {
+ }
+ }
+
+ WriteRsltsEx(batch, writer);
+ writer.Close();
+ }
+
+
+ void WriteRsltsEx(Results.Entities.Batch batch, StreamWriter wrtr)
+ {
+ ///----------
+ /// Header
+ ///----------
+ if (!string.IsNullOrEmpty(writerCfg.Header)) wrtr.Write(header);
+ wrtr.WriteLine(batch.ProtocolTitle);
+ wrtr.WriteLine(string.Empty);
+
+ ///----------------
+ /// Common items
+ ///----------------
+ string[] leftColumn = new string[commonItems.Count];
+ string[] rightColumn = new string[commonItems.Count];
+
+ int cnt = 0;
+ foreach (var v in commonItems)
+ {
+ leftColumn[cnt] = v.Caption;
+ rightColumn[cnt] = (batch.WaterMeters.Count > 0) ? v.Print(batch.WaterMeters[0]) : string.Empty;
+ cnt++;
+ }
+
+ /// Determine max. left column width in characters
+ int maxLen = 0;
+ foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length;
+
+ /// Write aligned columns
+ for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++)
+ {
+ if (abort) return;
+
+ wrtr.Write(leftColumn[i]);
+ wrtr.Write(new string(' ', maxLen - leftColumn[i].Length + 3));
+ wrtr.WriteLine(rightColumn[i]);
+ }
+
+ ///--------
+ /// Body
+ ///--------
+ foreach (var wm in batch.WaterMeters)
+ {
+ WriteWM(wrtr, wm);
+ if (abort) return;
+ }
+
+ ///----------
+ /// Footer
+ ///----------
+ if (!string.IsNullOrEmpty(writerCfg.Footer)) wrtr.Write(footer);
+ }
+
+ ///
+ /// Write one water meter results
+ ///
+ /// Water meter number (0-based)
+ void WriteWM(StreamWriter wr, Results.Entities.WaterMeter wm)
+ {
+ wr.WriteLine(string.Empty);
+
+ /// Write water meter number and s/n
+#if BADGER_MALA_TRAT || BADGER_STREDNA_TRAT || BADGER_VELKA_TRAT
+ wr.Write(string.Format("Water meter {0} s/n: {1}", wm.WMPosition, wm.SerialNr));
+#else
+ wr.Write(string.Format(Strings.Water_Meter_nr, wm.WMPosition));
+ if (!wm.Compound())
+ {
+ if (!string.IsNullOrEmpty(wm.SerialNr))
+ {
+ wr.Write(string.Format(", {0} {1}", Strings.SerialNr, wm.SerialNr));
+ }
+ }
+ else
+ {
+ if (!string.IsNullOrEmpty(wm.SerialNr))
+ {
+ wr.Write(string.Format(", {0} {1}", Strings.Main_WM_SerialNr, wm.SerialNr));
+ }
+ if (!string.IsNullOrEmpty(wm.SerialNrAux))
+ {
+ wr.Write(string.Format(", {0} {1}", Strings.Aux_WM_SerialNr, wm.SerialNrAux));
+ }
+ }
+#endif
+ wr.WriteLine(string.Empty);
+
+ /// Determine column widths
+ int[] columnWidths = new int[testItems.Count];
+ int totalWidth = 0;
+ for (int i = 0; i < testItems.Count; i++)
+ {
+ if (abort) return;
+
+ columnWidths[i] = ElSpaces(testItems[i].Caption).Length;
+ foreach (var mtr in wm.MeterTestRslts)
+ {
+ if ((mtr != null) && (mtr.Publish() == Config.Entities.Publish.Always))
+ {
+ string itemText = testItems[i].Print(wm, mtr.Name());
+
+ /// Strip color information
+ string[] texts = itemText.Split(new char[] { '|' });
+ if (texts.Length == 2) { itemText = texts[0]; }
+
+ int len = ElSpaces(itemText).Length;
+ if (len > columnWidths[i]) columnWidths[i] = len;
+ }
+ }
+ totalWidth += columnWidths[i];
+ }
+ totalWidth += 3 * (testItems.Count - 1);
+ if (totalWidth < 0) totalWidth = 0;
+
+ string horizontalLine = new String('-', totalWidth);
+
+ wr.WriteLine(horizontalLine); /// Horizontal line above the header
+
+ /// Write column headers
+ for (int i = 0; i < testItems.Count; i++)
+ {
+ if (abort) return;
+
+ string caption = ElSpaces(testItems[i].Caption);
+ wr.Write(caption);
+
+ if (i < testItems.Count - 1)
+ {
+ if (!writerCfg.EliminateSpaces)
+ {
+ wr.Write(new string(' ', columnWidths[i] - testItems[i].Caption.Length + 3));
+ }
+ wr.Write(separatorStr);
+ }
+ else
+ {
+ wr.WriteLine(string.Empty);
+ }
+ }
+
+ wr.WriteLine(horizontalLine); /// Horizontal line between the header and the body
+
+ /// Write table data
+ foreach (var mtr in wm.MeterTestRslts)
+ {
+ if (abort) return;
+
+ if (mtr != null && mtr.IsPilotRslt() && mtr.Publish() == Config.Entities.Publish.Always)
+ {
+ for (int i = 0; i < testItems.Count; i++)
+ {
+ /// Fetch the item
+ string itemText = testItems[i].Print(wm, mtr.Name());
+
+ /// Strip color information
+ string[] texts = itemText.Split(new char[] { '|' });
+ if (texts.Length == 2) { itemText = texts[0]; }
+
+ /// Print the item
+ string itemText2 = ElSpaces(itemText);
+ wr.Write(itemText2);
+
+ if (i < testItems.Count - 1)
+ {
+ if (!writerCfg.EliminateSpaces)
+ {
+ wr.Write(new string(' ', columnWidths[i] - itemText.Length + 3));
+ }
+ wr.Write(separatorStr);
+ }
+ else
+ {
+ wr.WriteLine(string.Empty);
+ }
+ }
+ }
+ }
+
+ wr.WriteLine(horizontalLine); /// Horizontal line below the body
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs
new file mode 100644
index 000000000..c2ec31d51
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfg.cs
@@ -0,0 +1,71 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System.Xml.Serialization;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter
+{
+ public class WriterCfg : ComponentCfgBase, Generic.IComponentCfg
+ {
+ public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(WriterCfg) })[0];
+ protected override XmlSerializer GetSerializer() { return Serializer; }
+
+ public IComponentCfgCtrl GetControl() { return new WriterCfgCtrl(); }
+
+ public string DestinationPath; /// Directory path into which the results will be saved
+ public string DestinationPath2; /// Directory path into which the 2nd copy of results will be saved
+ public YearFolders YearFolders;
+ public MonthFolders MonthFolders;
+ public DayFolders DayFolders;
+ public string FileNameFormat;
+ public Culture Culture;
+ public Separator Separator;
+ public bool EliminateSpaces;
+ public string[] CommonItems;
+ public string[] SelectedItems;
+ public string Header;
+ public string Footer;
+
+ [XmlIgnore]
+ public Config.Entities.MetersKind MetersKind;
+
+ /// Private parameterless constructor invoked by all other (public) constructors
+ WriterCfg()
+ {
+ }
+
+ public WriterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind)
+ : this()
+ {
+ Name = name;
+ Factory = factory;
+ MetersKind = metersKind;
+
+ ParentName = string.Empty;
+ DestinationPath = Program.HomeDir + "Results\\";
+ DestinationPath2 = string.Empty;
+ YearFolders = YearFolders.FourDigit;
+ MonthFolders = MonthFolders.Digit;
+ DayFolders = DayFolders.Digit;
+ FileNameFormat = "{0:yyMMdd-HHmm}.txt";
+ Separator = Separator.None;
+ EliminateSpaces = false;
+ Header = string.Empty;
+ Footer = string.Empty;
+ }
+
+ public string ToString(int i)
+ {
+ return string.Format("Name={0}, Path={1}, Y={2}, M={3}, D={4}, FNameFmt={5}, Separator={6}, EliminateSpaces={7}",
+ Name,
+ DestinationPath,
+ YearFolders,
+ MonthFolders,
+ DayFolders,
+ FileNameFormat,
+ Separator,
+ EliminateSpaces);
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs
new file mode 100644
index 000000000..e5d76f0f2
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.cs
@@ -0,0 +1,338 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using log4net;
+using TBF.BenchControl.Generic;
+using TBF.Resources;
+
+namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter
+{
+ public partial class WriterCfgCtrl : UserControl, IComponentCfgCtrl
+ {
+ static readonly ILog log = LogManager.GetLogger(typeof(WriterCfgCtrl));
+
+ public bool ShowMore { get { return false; } }
+
+ WriterCfg config;
+ public IComponentCfg Config
+ {
+ get { return config as IComponentCfg; }
+ set
+ {
+ config = value as WriterCfg;
+ Redraw();
+ }
+ }
+
+ string header;
+ string[] commonItems;
+ string[] testItems;
+ string footer;
+
+ public WriterCfgCtrl()
+ {
+ InitializeComponent();
+ Localize();
+ }
+
+ private void WriterCfgCtrl_Load(object sender, EventArgs e)
+ {
+ for (YearFolders s = 0; s < YearFolders.Count; s++) yearFoldersComboBox.Items.Add(s.ToString());
+ for (MonthFolders s = 0; s < MonthFolders.Count; s++) monthFoldersComboBox.Items.Add(s.ToString());
+ for (DayFolders s = 0; s < DayFolders.Count; s++) dayFoldersComboBox.Items.Add(s.ToString());
+ for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString());
+ for (Separator s = 0; s < Separator.Count; s++) separatorComboBox.Items.Add(s.ToString());
+
+ header = config.Header;
+ commonItems = config.CommonItems;
+ testItems = config.SelectedItems;
+ footer = config.Footer;
+
+ Redraw();
+ }
+
+ void Localize()
+ {
+ nameLabel.Text = Strings.Name;
+ destinationLabel.Text = "Destination";
+ destination2Label.Text = "Destination" + " 2";
+ yearFoldersLabel.Text = "Year folders";
+ monthFoldersLabel.Text = "Month folders";
+ dayFoldersLabel.Text = "Day folders";
+ fileNameFmtLabel.Text = "File name format";
+ cultureLabel.Text = "Culture";
+ separatorLabel.Text = "Separator";
+ eliminateSpacesCheckBox.Text = "No spaces";
+ headerButton.Text = Strings.Header;
+ commonItemsButton.Text = "Common items";
+ testItemsButton.Text = "Test items";
+ footerButton.Text = Strings.Footer;
+ }
+
+ public void Closing()
+ {
+ }
+
+ void Redraw()
+ {
+ if (config == null) return; /// Control was not loaded, settings were not changed
+ classNameLabel.Text = config.Factory.ClassName;
+ nameTextBox.Text = config.Name;
+ destinationTextBox.Text = config.DestinationPath;
+ destination2TextBox.Text = config.DestinationPath2;
+ yearFoldersComboBox.Text = config.YearFolders.ToString();
+ monthFoldersComboBox.Text = config.MonthFolders.ToString();
+ dayFoldersComboBox.Text = config.DayFolders.ToString();
+ fileNameFmtTextBox.Text = config.FileNameFormat;
+ cultureComboBox.Text = config.Culture.ToString();
+ separatorComboBox.Text = config.Separator.ToString();
+ eliminateSpacesCheckBox.Checked = config.EliminateSpaces;
+ }
+
+ public void Unlock()
+ {
+ nameTextBox.Enabled = true;
+ destinationTextBox.Enabled = true;
+ destinationButton.Enabled = true;
+ destination2TextBox.Enabled = true;
+ destination2Button.Enabled = true;
+ yearFoldersComboBox.Enabled = true;
+ monthFoldersComboBox.Enabled = true;
+ dayFoldersComboBox.Enabled = true;
+ fileNameFmtTextBox.Enabled = true;
+ cultureComboBox.Enabled = true;
+ separatorComboBox.Enabled = true;
+ eliminateSpacesCheckBox.Enabled = true;
+ headerButton.Enabled = true;
+ commonItemsButton.Enabled = true;
+ testItemsButton.Enabled = true;
+ footerButton.Enabled = true;
+ }
+
+ public CfgUpdateFlags VerifyCfg(ref string message)
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ if (!yearFoldersComboBox.Items.Contains(yearFoldersComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid year folders selection";
+ }
+
+ if (!monthFoldersComboBox.Items.Contains(monthFoldersComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid month folders selection";
+ }
+
+ if (!dayFoldersComboBox.Items.Contains(dayFoldersComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid day folder selection";
+ }
+
+ if (!cultureComboBox.Items.Contains(cultureComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid culture";
+ }
+
+ if (!separatorComboBox.Items.Contains(separatorComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid separator";
+ }
+ return flags;
+ }
+
+ public CfgUpdateFlags UpdateCfg()
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
+
+ if (config.Name != nameTextBox.Text)
+ {
+ config.Name = nameTextBox.Text;
+ flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.DestinationPath != destinationTextBox.Text)
+ {
+ config.DestinationPath = destinationTextBox.Text;
+ if (!config.DestinationPath.EndsWith("\\")) config.DestinationPath += "\\";
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.DestinationPath2 != destination2TextBox.Text)
+ {
+ config.DestinationPath2 = destination2TextBox.Text;
+ if (!config.DestinationPath2.EndsWith("\\")) config.DestinationPath2 += "\\";
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ for (YearFolders i = 0; i < YearFolders.Count; i++)
+ {
+ if (i.ToString().Equals(yearFoldersComboBox.Text) && (config.YearFolders != i))
+ {
+ config.YearFolders = i;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ break;
+ }
+ }
+
+ for (MonthFolders i = 0; i < MonthFolders.Count; i++)
+ {
+ if (i.ToString().Equals(monthFoldersComboBox.Text) && (config.MonthFolders != i))
+ {
+ config.MonthFolders = i;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ break;
+ }
+ }
+
+ for (DayFolders i = 0; i < DayFolders.Count; i++)
+ {
+ if (i.ToString().Equals(dayFoldersComboBox.Text) && (config.DayFolders != i))
+ {
+ config.DayFolders = i;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ break;
+ }
+ }
+
+ if (config.FileNameFormat != fileNameFmtTextBox.Text)
+ {
+ config.FileNameFormat = fileNameFmtTextBox.Text;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ for (Culture i = 0; i < Culture.Count; i++)
+ {
+ if (i.ToString().Equals(cultureComboBox.Text) && (config.Culture != i))
+ {
+ config.Culture = i;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ break;
+ }
+ }
+
+ for (Separator i = 0; i < Separator.Count; i++)
+ {
+ if (i.ToString().Equals(separatorComboBox.Text) && (config.Separator != i))
+ {
+ config.Separator = i;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ break;
+ }
+ }
+
+ if (config.EliminateSpaces != eliminateSpacesCheckBox.Checked)
+ {
+ config.EliminateSpaces = eliminateSpacesCheckBox.Checked;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.CommonItems != commonItems)
+ {
+ config.CommonItems = commonItems;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.SelectedItems != testItems)
+ {
+ config.SelectedItems = testItems;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.Header != header)
+ {
+ config.Header = header;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.Footer != footer)
+ {
+ config.Footer = footer;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0)
+ {
+ Writer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config));
+ }
+
+ return flags;
+ }
+
+ private void destinationButton_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ private void headerButton_Click(object sender, EventArgs e)
+ {
+ HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine));
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ header = dlg.EditedText.Replace(Environment.NewLine, "~");
+ }
+ }
+
+ private void commonItemsButton_Click(object sender, EventArgs e)
+ {
+ Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg()
+ {
+ MetersKind = config.MetersKind,
+ SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems),
+ };
+
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems);
+ }
+ }
+
+ private void testItemsButton_Click(object sender, EventArgs e)
+ {
+ Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true)
+ {
+ MetersKind = config.MetersKind,
+ SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems),
+ };
+
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems);
+ }
+ }
+
+ private void footerButton_Click(object sender, EventArgs e)
+ {
+ HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine));
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ footer = dlg.EditedText.Replace(Environment.NewLine, "~");
+ }
+ }
+
+ #region Configuration Change Handling
+
+ public static void OnCmdResponse(object sender, CmdResponseArgs args)
+ {
+ if (CmdResponseHandler == null) return;
+ try { CmdResponseHandler(sender, args); }
+ catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); }
+ }
+
+ public static event EventHandler CmdResponseHandler;
+
+ public void StartResponseHandler() { }
+ public void StopResponseHandler() { }
+
+ #endregion Configuration Change Handling
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs
new file mode 100644
index 000000000..fffe5291a
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.designer.cs
@@ -0,0 +1,371 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+namespace TBF.BenchControl.Output.FileWriters.OneFilePerMeter
+{
+ partial class WriterCfgCtrl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.nameTextBox = new System.Windows.Forms.TextBox();
+ this.nameLabel = new System.Windows.Forms.Label();
+ this.classNameLabel = new System.Windows.Forms.Label();
+ this.destinationTextBox = new System.Windows.Forms.TextBox();
+ this.destinationLabel = new System.Windows.Forms.Label();
+ this.destinationButton = new System.Windows.Forms.Button();
+ this.separatorLabel = new System.Windows.Forms.Label();
+ this.separatorComboBox = new System.Windows.Forms.ComboBox();
+ this.testItemsButton = new System.Windows.Forms.Button();
+ this.yearFoldersLabel = new System.Windows.Forms.Label();
+ this.monthFoldersLabel = new System.Windows.Forms.Label();
+ this.dayFoldersLabel = new System.Windows.Forms.Label();
+ this.yearFoldersComboBox = new System.Windows.Forms.ComboBox();
+ this.monthFoldersComboBox = new System.Windows.Forms.ComboBox();
+ this.dayFoldersComboBox = new System.Windows.Forms.ComboBox();
+ this.destination2Button = new System.Windows.Forms.Button();
+ this.destination2TextBox = new System.Windows.Forms.TextBox();
+ this.destination2Label = new System.Windows.Forms.Label();
+ this.fileNameFmtTextBox = new System.Windows.Forms.TextBox();
+ this.fileNameFmtLabel = new System.Windows.Forms.Label();
+ this.eliminateSpacesCheckBox = new System.Windows.Forms.CheckBox();
+ this.headerButton = new System.Windows.Forms.Button();
+ this.footerButton = new System.Windows.Forms.Button();
+ this.commonItemsButton = new System.Windows.Forms.Button();
+ this.cultureComboBox = new System.Windows.Forms.ComboBox();
+ this.cultureLabel = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // nameTextBox
+ //
+ this.nameTextBox.Enabled = false;
+ this.nameTextBox.Location = new System.Drawing.Point(108, 28);
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.Size = new System.Drawing.Size(146, 20);
+ this.nameTextBox.TabIndex = 2;
+ //
+ // nameLabel
+ //
+ this.nameLabel.AutoSize = true;
+ this.nameLabel.Location = new System.Drawing.Point(17, 31);
+ this.nameLabel.Name = "nameLabel";
+ this.nameLabel.Size = new System.Drawing.Size(35, 13);
+ this.nameLabel.TabIndex = 1;
+ this.nameLabel.Text = "Name";
+ //
+ // classNameLabel
+ //
+ this.classNameLabel.AutoSize = true;
+ this.classNameLabel.Location = new System.Drawing.Point(105, 6);
+ this.classNameLabel.Name = "classNameLabel";
+ this.classNameLabel.Size = new System.Drawing.Size(83, 13);
+ this.classNameLabel.TabIndex = 0;
+ this.classNameLabel.Text = "ComonentName";
+ //
+ // destinationTextBox
+ //
+ this.destinationTextBox.Enabled = false;
+ this.destinationTextBox.Location = new System.Drawing.Point(108, 49);
+ this.destinationTextBox.Name = "destinationTextBox";
+ this.destinationTextBox.Size = new System.Drawing.Size(146, 20);
+ this.destinationTextBox.TabIndex = 4;
+ //
+ // destinationLabel
+ //
+ this.destinationLabel.AutoSize = true;
+ this.destinationLabel.Location = new System.Drawing.Point(17, 52);
+ this.destinationLabel.Name = "destinationLabel";
+ this.destinationLabel.Size = new System.Drawing.Size(60, 13);
+ this.destinationLabel.TabIndex = 3;
+ this.destinationLabel.Text = "Destination";
+ //
+ // destinationButton
+ //
+ this.destinationButton.Enabled = false;
+ this.destinationButton.Location = new System.Drawing.Point(269, 49);
+ this.destinationButton.Name = "destinationButton";
+ this.destinationButton.Size = new System.Drawing.Size(30, 20);
+ this.destinationButton.TabIndex = 5;
+ this.destinationButton.Text = "...";
+ this.destinationButton.UseVisualStyleBackColor = true;
+ this.destinationButton.Click += new System.EventHandler(this.destinationButton_Click);
+ //
+ // separatorLabel
+ //
+ this.separatorLabel.AutoSize = true;
+ this.separatorLabel.Location = new System.Drawing.Point(17, 203);
+ this.separatorLabel.Name = "separatorLabel";
+ this.separatorLabel.Size = new System.Drawing.Size(53, 13);
+ this.separatorLabel.TabIndex = 19;
+ this.separatorLabel.Text = "Separator";
+ //
+ // separatorComboBox
+ //
+ this.separatorComboBox.Enabled = false;
+ this.separatorComboBox.FormattingEnabled = true;
+ this.separatorComboBox.Location = new System.Drawing.Point(108, 200);
+ this.separatorComboBox.Name = "separatorComboBox";
+ this.separatorComboBox.Size = new System.Drawing.Size(146, 21);
+ this.separatorComboBox.TabIndex = 20;
+ //
+ // testItemsButton
+ //
+ this.testItemsButton.Enabled = false;
+ this.testItemsButton.Location = new System.Drawing.Point(108, 297);
+ this.testItemsButton.Name = "testItemsButton";
+ this.testItemsButton.Size = new System.Drawing.Size(146, 23);
+ this.testItemsButton.TabIndex = 24;
+ this.testItemsButton.Text = "Test items";
+ this.testItemsButton.UseVisualStyleBackColor = true;
+ this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click);
+ //
+ // yearFoldersLabel
+ //
+ this.yearFoldersLabel.AutoSize = true;
+ this.yearFoldersLabel.Location = new System.Drawing.Point(17, 94);
+ this.yearFoldersLabel.Name = "yearFoldersLabel";
+ this.yearFoldersLabel.Size = new System.Drawing.Size(63, 13);
+ this.yearFoldersLabel.TabIndex = 9;
+ this.yearFoldersLabel.Text = "Year folders";
+ //
+ // monthFoldersLabel
+ //
+ this.monthFoldersLabel.AutoSize = true;
+ this.monthFoldersLabel.Location = new System.Drawing.Point(17, 116);
+ this.monthFoldersLabel.Name = "monthFoldersLabel";
+ this.monthFoldersLabel.Size = new System.Drawing.Size(71, 13);
+ this.monthFoldersLabel.TabIndex = 11;
+ this.monthFoldersLabel.Text = "Month folders";
+ //
+ // dayFoldersLabel
+ //
+ this.dayFoldersLabel.AutoSize = true;
+ this.dayFoldersLabel.Location = new System.Drawing.Point(17, 138);
+ this.dayFoldersLabel.Name = "dayFoldersLabel";
+ this.dayFoldersLabel.Size = new System.Drawing.Size(60, 13);
+ this.dayFoldersLabel.TabIndex = 13;
+ this.dayFoldersLabel.Text = "Day folders";
+ //
+ // yearFoldersComboBox
+ //
+ this.yearFoldersComboBox.Enabled = false;
+ this.yearFoldersComboBox.FormattingEnabled = true;
+ this.yearFoldersComboBox.Location = new System.Drawing.Point(108, 91);
+ this.yearFoldersComboBox.Name = "yearFoldersComboBox";
+ this.yearFoldersComboBox.Size = new System.Drawing.Size(146, 21);
+ this.yearFoldersComboBox.TabIndex = 10;
+ //
+ // monthFoldersComboBox
+ //
+ this.monthFoldersComboBox.Enabled = false;
+ this.monthFoldersComboBox.FormattingEnabled = true;
+ this.monthFoldersComboBox.Location = new System.Drawing.Point(108, 113);
+ this.monthFoldersComboBox.Name = "monthFoldersComboBox";
+ this.monthFoldersComboBox.Size = new System.Drawing.Size(146, 21);
+ this.monthFoldersComboBox.TabIndex = 12;
+ //
+ // dayFoldersComboBox
+ //
+ this.dayFoldersComboBox.Enabled = false;
+ this.dayFoldersComboBox.FormattingEnabled = true;
+ this.dayFoldersComboBox.Location = new System.Drawing.Point(108, 135);
+ this.dayFoldersComboBox.Name = "dayFoldersComboBox";
+ this.dayFoldersComboBox.Size = new System.Drawing.Size(146, 21);
+ this.dayFoldersComboBox.TabIndex = 14;
+ //
+ // destination2Button
+ //
+ this.destination2Button.Enabled = false;
+ this.destination2Button.Location = new System.Drawing.Point(269, 70);
+ this.destination2Button.Name = "destination2Button";
+ this.destination2Button.Size = new System.Drawing.Size(30, 20);
+ this.destination2Button.TabIndex = 8;
+ this.destination2Button.Text = "...";
+ this.destination2Button.UseVisualStyleBackColor = true;
+ //
+ // destination2TextBox
+ //
+ this.destination2TextBox.Enabled = false;
+ this.destination2TextBox.Location = new System.Drawing.Point(108, 70);
+ this.destination2TextBox.Name = "destination2TextBox";
+ this.destination2TextBox.Size = new System.Drawing.Size(146, 20);
+ this.destination2TextBox.TabIndex = 7;
+ //
+ // destination2Label
+ //
+ this.destination2Label.AutoSize = true;
+ this.destination2Label.Location = new System.Drawing.Point(17, 73);
+ this.destination2Label.Name = "destination2Label";
+ this.destination2Label.Size = new System.Drawing.Size(69, 13);
+ this.destination2Label.TabIndex = 6;
+ this.destination2Label.Text = "Destination 2";
+ //
+ // fileNameFmtTextBox
+ //
+ this.fileNameFmtTextBox.Enabled = false;
+ this.fileNameFmtTextBox.Location = new System.Drawing.Point(108, 157);
+ this.fileNameFmtTextBox.Name = "fileNameFmtTextBox";
+ this.fileNameFmtTextBox.Size = new System.Drawing.Size(146, 20);
+ this.fileNameFmtTextBox.TabIndex = 16;
+ //
+ // fileNameFmtLabel
+ //
+ this.fileNameFmtLabel.AutoSize = true;
+ this.fileNameFmtLabel.Location = new System.Drawing.Point(17, 160);
+ this.fileNameFmtLabel.Name = "fileNameFmtLabel";
+ this.fileNameFmtLabel.Size = new System.Drawing.Size(84, 13);
+ this.fileNameFmtLabel.TabIndex = 15;
+ this.fileNameFmtLabel.Text = "File name format";
+ //
+ // eliminateSpacesCheckBox
+ //
+ this.eliminateSpacesCheckBox.AutoSize = true;
+ this.eliminateSpacesCheckBox.Location = new System.Drawing.Point(108, 227);
+ this.eliminateSpacesCheckBox.Name = "eliminateSpacesCheckBox";
+ this.eliminateSpacesCheckBox.Size = new System.Drawing.Size(77, 17);
+ this.eliminateSpacesCheckBox.TabIndex = 21;
+ this.eliminateSpacesCheckBox.Text = "No spaces";
+ this.eliminateSpacesCheckBox.UseVisualStyleBackColor = true;
+ //
+ // headerButton
+ //
+ this.headerButton.Enabled = false;
+ this.headerButton.Location = new System.Drawing.Point(108, 247);
+ this.headerButton.Name = "headerButton";
+ this.headerButton.Size = new System.Drawing.Size(146, 23);
+ this.headerButton.TabIndex = 22;
+ this.headerButton.Text = "Header";
+ this.headerButton.UseVisualStyleBackColor = true;
+ this.headerButton.Click += new System.EventHandler(this.headerButton_Click);
+ //
+ // footerButton
+ //
+ this.footerButton.Enabled = false;
+ this.footerButton.Location = new System.Drawing.Point(108, 322);
+ this.footerButton.Name = "footerButton";
+ this.footerButton.Size = new System.Drawing.Size(146, 23);
+ this.footerButton.TabIndex = 25;
+ this.footerButton.Text = "Footer";
+ this.footerButton.UseVisualStyleBackColor = true;
+ this.footerButton.Click += new System.EventHandler(this.footerButton_Click);
+ //
+ // commonItemsButton
+ //
+ this.commonItemsButton.Enabled = false;
+ this.commonItemsButton.Location = new System.Drawing.Point(108, 272);
+ this.commonItemsButton.Name = "commonItemsButton";
+ this.commonItemsButton.Size = new System.Drawing.Size(146, 23);
+ this.commonItemsButton.TabIndex = 23;
+ this.commonItemsButton.Text = "Common items";
+ this.commonItemsButton.UseVisualStyleBackColor = true;
+ this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click);
+ //
+ // cultureComboBox
+ //
+ this.cultureComboBox.Enabled = false;
+ this.cultureComboBox.FormattingEnabled = true;
+ this.cultureComboBox.Location = new System.Drawing.Point(108, 178);
+ this.cultureComboBox.Name = "cultureComboBox";
+ this.cultureComboBox.Size = new System.Drawing.Size(146, 21);
+ this.cultureComboBox.TabIndex = 18;
+ //
+ // cultureLabel
+ //
+ this.cultureLabel.AutoSize = true;
+ this.cultureLabel.Location = new System.Drawing.Point(17, 181);
+ this.cultureLabel.Name = "cultureLabel";
+ this.cultureLabel.Size = new System.Drawing.Size(42, 13);
+ this.cultureLabel.TabIndex = 17;
+ this.cultureLabel.Text = "Cullture";
+ //
+ // WriterCfgCtrl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.cultureComboBox);
+ this.Controls.Add(this.cultureLabel);
+ this.Controls.Add(this.commonItemsButton);
+ this.Controls.Add(this.footerButton);
+ this.Controls.Add(this.headerButton);
+ this.Controls.Add(this.eliminateSpacesCheckBox);
+ this.Controls.Add(this.fileNameFmtTextBox);
+ this.Controls.Add(this.fileNameFmtLabel);
+ this.Controls.Add(this.destination2Button);
+ this.Controls.Add(this.destination2TextBox);
+ this.Controls.Add(this.destination2Label);
+ this.Controls.Add(this.dayFoldersComboBox);
+ this.Controls.Add(this.monthFoldersComboBox);
+ this.Controls.Add(this.yearFoldersComboBox);
+ this.Controls.Add(this.dayFoldersLabel);
+ this.Controls.Add(this.monthFoldersLabel);
+ this.Controls.Add(this.yearFoldersLabel);
+ this.Controls.Add(this.testItemsButton);
+ this.Controls.Add(this.separatorComboBox);
+ this.Controls.Add(this.separatorLabel);
+ this.Controls.Add(this.destinationButton);
+ this.Controls.Add(this.destinationTextBox);
+ this.Controls.Add(this.destinationLabel);
+ this.Controls.Add(this.nameTextBox);
+ this.Controls.Add(this.nameLabel);
+ this.Controls.Add(this.classNameLabel);
+ this.Name = "WriterCfgCtrl";
+ this.Size = new System.Drawing.Size(400, 350);
+ this.Load += new System.EventHandler(this.WriterCfgCtrl_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox nameTextBox;
+ private System.Windows.Forms.Label nameLabel;
+ private System.Windows.Forms.Label classNameLabel;
+ private System.Windows.Forms.TextBox destinationTextBox;
+ private System.Windows.Forms.Label destinationLabel;
+ private System.Windows.Forms.Button destinationButton;
+ private System.Windows.Forms.Label separatorLabel;
+ private System.Windows.Forms.ComboBox separatorComboBox;
+ private System.Windows.Forms.Button testItemsButton;
+ private System.Windows.Forms.Label yearFoldersLabel;
+ private System.Windows.Forms.Label monthFoldersLabel;
+ private System.Windows.Forms.Label dayFoldersLabel;
+ private System.Windows.Forms.ComboBox yearFoldersComboBox;
+ private System.Windows.Forms.ComboBox monthFoldersComboBox;
+ private System.Windows.Forms.ComboBox dayFoldersComboBox;
+ private System.Windows.Forms.Button destination2Button;
+ private System.Windows.Forms.TextBox destination2TextBox;
+ private System.Windows.Forms.Label destination2Label;
+ private System.Windows.Forms.TextBox fileNameFmtTextBox;
+ private System.Windows.Forms.Label fileNameFmtLabel;
+ private System.Windows.Forms.CheckBox eliminateSpacesCheckBox;
+ private System.Windows.Forms.Button headerButton;
+ private System.Windows.Forms.Button footerButton;
+ private System.Windows.Forms.Button commonItemsButton;
+ private System.Windows.Forms.ComboBox cultureComboBox;
+ private System.Windows.Forms.Label cultureLabel;
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/FileWriters/OneFilePerMeter/WriterCfgCtrl.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryCompound.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryCompound.cs
new file mode 100644
index 000000000..6200b930e
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryCompound.cs
@@ -0,0 +1,26 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System.Collections.Generic;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.Printers.OnePagePerMeter
+{
+ public class FactoryCompound : IComponentFactory
+ {
+ public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Compound"; } }
+
+ public void ResetStaticProperties() { Printer.ResetStaticProperties(); }
+
+ public IComponent DummyComponent() { return new Printer(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); }
+
+ public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.OnePagePerMeter.Compound", this, Config.Entities.MetersKind.Combined); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this);
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryHeatMeters.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryHeatMeters.cs
new file mode 100644
index 000000000..e9abdd65f
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactoryHeatMeters.cs
@@ -0,0 +1,26 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System.Collections.Generic;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.Printers.OnePagePerMeter
+{
+ public class FactoryHeatMeters : IComponentFactory
+ {
+ public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".HeatMeters"; } }
+
+ public void ResetStaticProperties() { Printer.ResetStaticProperties(); }
+
+ public IComponent DummyComponent() { return new Printer(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); }
+
+ public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.OnePagePerMeter.HeatMeters", this, Config.Entities.MetersKind.HeatMeter); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this);
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactorySingle.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactorySingle.cs
new file mode 100644
index 000000000..f4a9451c9
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/FactorySingle.cs
@@ -0,0 +1,26 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System.Collections.Generic;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.Printers.OnePagePerMeter
+{
+ public class FactorySingle : IComponentFactory
+ {
+ public string ClassName { get { return this.GetType().Namespace.Substring(17) + ".Single"; } }
+
+ public void ResetStaticProperties() { Printer.ResetStaticProperties(); }
+
+ public IComponent DummyComponent() { return new Printer(); }
+
+ public IComponent GetComponent(IComponentCfg cfg, IList components) { return new Printer(cfg); }
+
+ public IComponentCfg DefaultConfig() { return new PrinterCfg("Printer.OnePagePerMeter.Single", this, Config.Entities.MetersKind.Single); }
+
+ public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
+ {
+ return ComponentCfgBase.CreateFromDbEntity(PrinterCfg.Serializer, component, this);
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/Printer.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/Printer.cs
new file mode 100644
index 000000000..49673bcf9
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/Printer.cs
@@ -0,0 +1,191 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Threading;
+using Results.Output.Printers.Enhanced;
+using log4net;
+
+namespace TBF.BenchControl.Output.Printers.OnePagePerMeter
+{
+ public class Printer : ComponentBase, IOperation, GenericDevices.IResultsPrinter
+ {
+ private static readonly ILog log = LogManager.GetLogger(typeof(Printer));
+ public override string ToString() { return string.Format("ResultsPrinters.Basic({0})", Cfg.ToString(1)); }
+
+ readonly PrinterCfg printerCfg;
+
+ public bool SupressPrinting { get { return printerCfg.SupressPrinting; } }
+
+ ///
+ /// Items to print
+ ///
+ string header;
+ IList commonItems;
+ IList testItems;
+ string footer;
+
+
+ Thread thread; /// Thread where results are printed
+ bool completed; /// Set to 'true' by the thread when printing results is completed
+ bool abort; /// Set to 'true' by Stop() operation to abort printing results
+
+
+ public Printer() { }
+
+
+ public Printer(Generic.IComponentCfg cfg)
+ : base(cfg)
+ {
+ printerCfg = cfg as PrinterCfg;
+ ApplyConfig();
+ log.Debug(this.ToString());
+ }
+
+
+ void ApplyConfig()
+ {
+ header = string.IsNullOrEmpty(printerCfg.Header) ? string.Empty : printerCfg.Header.Replace("~", Environment.NewLine);
+ commonItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.CommonItems);
+ testItems = Results.WMeterRsltItemSpec.FromStrArray(printerCfg.SelectedItems); /// TestID info will be overwritten later on
+ footer = string.IsNullOrEmpty(printerCfg.Footer) ? string.Empty : printerCfg.Footer.Replace("~", Environment.NewLine);
+ }
+
+
+ #region Configuration Change Handling
+
+ public static void OnCfgChange(object sender, CfgChangeArgs args)
+ {
+ if (CfgChangeHandler == null) return;
+ try { CfgChangeHandler(sender, args); }
+ catch (Exception e) { log.Error("CfgChangeHandler(...) failed", e); }
+ }
+
+ public static event EventHandler CfgChangeHandler;
+
+ public override void StartChangeHandler()
+ {
+ CfgChangeHandler += delegate(object sender, CfgChangeArgs args)
+ {
+ PrinterCfg newCfg = args.Cfg as PrinterCfg;
+ if (newCfg != null && newCfg.Name.Equals(Name))
+ {
+ if (args.Command == CfgChangeCmd.CfgChange)
+ {
+ printerCfg.PageOrientation = newCfg.PageOrientation;
+ printerCfg.TopMargin = newCfg.TopMargin;
+ printerCfg.BottomMargin = newCfg.BottomMargin;
+ printerCfg.LeftMargin = newCfg.LeftMargin;
+
+ printerCfg.TitFntFml = newCfg.TitFntFml;
+ printerCfg.TitFntSz = newCfg.TitFntSz;
+ printerCfg.TitFntSty = newCfg.TitFntSty;
+ printerCfg.HdrFntFml = newCfg.HdrFntFml;
+ printerCfg.HdrFntSz = newCfg.HdrFntSz;
+ printerCfg.HdrFntSty = newCfg.HdrFntSty;
+ printerCfg.BodyFntFml = newCfg.BodyFntFml;
+ printerCfg.BodyFntSz = newCfg.BodyFntSz;
+ printerCfg.BodyFntSty = newCfg.BodyFntSty;
+
+ printerCfg.SupressPrinting = newCfg.SupressPrinting;
+ printerCfg.Culture = newCfg.Culture;
+ printerCfg.CommonItems = newCfg.CommonItems;
+ printerCfg.SelectedItems = newCfg.SelectedItems;
+ printerCfg.Header = newCfg.Header;
+ printerCfg.Footer = newCfg.Footer;
+
+ ApplyConfig();
+ }
+ }
+ };
+ }
+
+ #endregion Configuration Change Handling
+
+
+ ///
+ /// Prints the test cycle results, Events: Event.ResultsPrinted
+ ///
+ /// Batch results to print
+ /// Reference to the operation
+ public IOperation PrintResultsOp(Results.Entities.Batch batch)
+ {
+ thread = new Thread(() =>
+ {
+ PrintResults(batch);
+ completed = true;
+ });
+
+ thread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
+ thread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
+
+ if (printerCfg.Culture > Culture.system && printerCfg.Culture < Culture.Count)
+ {
+ thread.CurrentCulture = new CultureInfo(printerCfg.Culture.ToString());
+ }
+
+ return this;
+ }
+
+ /// Start this operation
+ public void Start()
+ {
+ completed = false;
+ abort = false;
+ thread.Start();
+ }
+
+ /// Run this operation
+ /// Event.ResultsPrinted
+ public Event Run()
+ {
+ if (completed)
+ return Event.ResultsPrinted;
+ else
+ return Event.Busy;
+ }
+
+ /// Stop this operation
+ public void Stop()
+ {
+ if (!completed) abort = true;
+ }
+
+
+ void PrintResults(Results.Entities.Batch batch)
+ {
+ CultureInfo culture = Thread.CurrentThread.CurrentCulture;
+ try { culture = new System.Globalization.CultureInfo(printerCfg.Culture.ToString()); }
+ catch { }
+
+ if (batch.WaterMeters.Count > 0)
+ {
+ EnhancedPrinterCfg cfg = new EnhancedPrinterCfg {
+ PageOrientation = printerCfg.PageOrientation,
+ TopMargin = printerCfg.TopMargin,
+ BottomMargin = printerCfg.BottomMargin,
+ LeftMargin = printerCfg.LeftMargin,
+ TitFntFml = printerCfg.TitFntFml,
+ HdrFntFml = printerCfg.HdrFntFml,
+ BodyFntFml = printerCfg.BodyFntFml,
+ TitFntSz = printerCfg.TitFntSz,
+ HdrFntSz = printerCfg.HdrFntSz,
+ BodyFntSz = printerCfg.BodyFntSz,
+ TitFntSty = printerCfg.TitFntSty,
+ HdrFntSty = printerCfg.HdrFntSty,
+ BodyFntSty = printerCfg.BodyFntSty,
+ SupressPrinting = printerCfg.SupressPrinting,
+ CultureInfo = culture,
+ Header = printerCfg.Header,
+ CommonItems = printerCfg.CommonItems,
+ TestItems = printerCfg.SelectedItems,
+ Footer = printerCfg.Footer,
+ };
+
+ new Results.Output.Printers.Enhanced.EnhancedPrintDocument(batch, cfg).Print();
+ }
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfg.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfg.cs
new file mode 100644
index 000000000..130c59676
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfg.cs
@@ -0,0 +1,86 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System.Xml.Serialization;
+using Config.Entities;
+using TBF.BenchControl.Generic;
+
+namespace TBF.BenchControl.Output.Printers.OnePagePerMeter
+{
+ public class PrinterCfg : ComponentCfgBase, Generic.IComponentCfg
+ {
+ public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PrinterCfg) })[0];
+ protected override XmlSerializer GetSerializer() { return Serializer; }
+
+ public IComponentCfgCtrl GetControl() { return new PrinterCfgCtrl(); }
+
+ ///
+ /// Serialized parameters
+ ///
+ public PageOrientation PageOrientation;
+ public int TopMargin;
+ public int BottomMargin;
+ public int LeftMargin;
+ public string TitFntFml;
+ public string HdrFntFml;
+ public string BodyFntFml;
+ public int TitFntSz;
+ public int HdrFntSz;
+ public int BodyFntSz;
+ public int TitFntSty;
+ public int HdrFntSty;
+ public int BodyFntSty;
+ public bool SupressPrinting; /// Bypass printing when true
+ public Culture Culture;
+ public string[] CommonItems;
+ public string[] SelectedItems;
+ public string Header; /// =Title
+ public string Footer;
+
+ [XmlIgnore]
+ public Config.Entities.MetersKind MetersKind;
+
+ /// Private parameterless constructor invoked by all other (public) constructors
+ PrinterCfg()
+ {
+ }
+
+ public PrinterCfg(string name, IComponentFactory factory, Config.Entities.MetersKind metersKind)
+ : this()
+ {
+ Name = name;
+ Factory = factory;
+ MetersKind = metersKind;
+
+ ParentName = string.Empty;
+ PageOrientation = PageOrientation.Portrait;
+ TopMargin = 100;
+ BottomMargin = 100;
+ LeftMargin = 100;
+ TitFntFml = "Arial";
+ TitFntSz = 18;
+ TitFntSty = 1;
+ TitFntFml = "Arial";
+ TitFntSz = 10;
+ TitFntSty = 0;
+ TitFntFml = "Arial";
+ TitFntSz = 10;
+ TitFntSty = 0;
+ SupressPrinting = false;
+ Header = string.Empty;
+ Footer = string.Empty;
+ }
+
+ public string ToString(int i)
+ {
+ return string.Format("Name={0}, Orientation={1}, Margins T={2} B={3} L={4}, SupressPrinting={5}",
+ Name,
+ PageOrientation,
+ TopMargin,
+ BottomMargin,
+ LeftMargin,
+ SupressPrinting ? "yes" : "no"
+ );
+ }
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.Designer.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.Designer.cs
new file mode 100644
index 000000000..e8727f91a
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.Designer.cs
@@ -0,0 +1,458 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+namespace TBF.BenchControl.Output.Printers.OnePagePerMeter
+{
+ partial class PrinterCfgCtrl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.nameTextBox = new System.Windows.Forms.TextBox();
+ this.nameLabel = new System.Windows.Forms.Label();
+ this.classNameLabel = new System.Windows.Forms.Label();
+ this.supressPrintingCheckBox = new System.Windows.Forms.CheckBox();
+ this.orientationLabel = new System.Windows.Forms.Label();
+ this.orientationComboBox = new System.Windows.Forms.ComboBox();
+ this.topMarginTextBox = new System.Windows.Forms.TextBox();
+ this.topMarginLabel = new System.Windows.Forms.Label();
+ this.leftMarginTextBox = new System.Windows.Forms.TextBox();
+ this.bottomMarginTextBox = new System.Windows.Forms.TextBox();
+ this.cultureComboBox = new System.Windows.Forms.ComboBox();
+ this.cultureLabel = new System.Windows.Forms.Label();
+ this.commonItemsButton = new System.Windows.Forms.Button();
+ this.footerButton = new System.Windows.Forms.Button();
+ this.headerButton = new System.Windows.Forms.Button();
+ this.testItemsButton = new System.Windows.Forms.Button();
+ this.headerFontLabel = new System.Windows.Forms.Label();
+ this.titleFontLabel = new System.Windows.Forms.Label();
+ this.titleFontFamilyComboBox = new System.Windows.Forms.ComboBox();
+ this.headerFontFamilyComboBox = new System.Windows.Forms.ComboBox();
+ this.bodyFontFamilyComboBox = new System.Windows.Forms.ComboBox();
+ this.bodyFontLabel = new System.Windows.Forms.Label();
+ this.titleFontSizeTextBox = new System.Windows.Forms.TextBox();
+ this.headerFontSizeTextBox = new System.Windows.Forms.TextBox();
+ this.bodyFontSizeTextBox = new System.Windows.Forms.TextBox();
+ this.titleBoldCheckBox = new System.Windows.Forms.CheckBox();
+ this.titleItalicCheckBox = new System.Windows.Forms.CheckBox();
+ this.headerItalicCheckBox = new System.Windows.Forms.CheckBox();
+ this.headerBoldCheckBox = new System.Windows.Forms.CheckBox();
+ this.bodyItalicCheckBox = new System.Windows.Forms.CheckBox();
+ this.bodyBoldCheckBox = new System.Windows.Forms.CheckBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // nameTextBox
+ //
+ this.nameTextBox.Enabled = false;
+ this.nameTextBox.Location = new System.Drawing.Point(142, 40);
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.Size = new System.Drawing.Size(218, 20);
+ this.nameTextBox.TabIndex = 2;
+ //
+ // nameLabel
+ //
+ this.nameLabel.AutoSize = true;
+ this.nameLabel.Location = new System.Drawing.Point(16, 43);
+ this.nameLabel.Name = "nameLabel";
+ this.nameLabel.Size = new System.Drawing.Size(35, 13);
+ this.nameLabel.TabIndex = 1;
+ this.nameLabel.Text = "Name";
+ //
+ // classNameLabel
+ //
+ this.classNameLabel.AutoSize = true;
+ this.classNameLabel.Location = new System.Drawing.Point(139, 16);
+ this.classNameLabel.Name = "classNameLabel";
+ this.classNameLabel.Size = new System.Drawing.Size(83, 13);
+ this.classNameLabel.TabIndex = 0;
+ this.classNameLabel.Text = "ComonentName";
+ //
+ // supressPrintingCheckBox
+ //
+ this.supressPrintingCheckBox.AutoSize = true;
+ this.supressPrintingCheckBox.Enabled = false;
+ this.supressPrintingCheckBox.Location = new System.Drawing.Point(143, 188);
+ this.supressPrintingCheckBox.Name = "supressPrintingCheckBox";
+ this.supressPrintingCheckBox.Size = new System.Drawing.Size(101, 17);
+ this.supressPrintingCheckBox.TabIndex = 24;
+ this.supressPrintingCheckBox.Text = "Supress printing";
+ this.supressPrintingCheckBox.UseVisualStyleBackColor = true;
+ //
+ // orientationLabel
+ //
+ this.orientationLabel.AutoSize = true;
+ this.orientationLabel.Location = new System.Drawing.Point(16, 67);
+ this.orientationLabel.Name = "orientationLabel";
+ this.orientationLabel.Size = new System.Drawing.Size(84, 13);
+ this.orientationLabel.TabIndex = 3;
+ this.orientationLabel.Text = "Page orientation";
+ //
+ // orientationComboBox
+ //
+ this.orientationComboBox.Enabled = false;
+ this.orientationComboBox.FormattingEnabled = true;
+ this.orientationComboBox.Location = new System.Drawing.Point(142, 64);
+ this.orientationComboBox.Name = "orientationComboBox";
+ this.orientationComboBox.Size = new System.Drawing.Size(218, 21);
+ this.orientationComboBox.TabIndex = 4;
+ //
+ // topMarginTextBox
+ //
+ this.topMarginTextBox.Enabled = false;
+ this.topMarginTextBox.Location = new System.Drawing.Point(142, 89);
+ this.topMarginTextBox.Name = "topMarginTextBox";
+ this.topMarginTextBox.Size = new System.Drawing.Size(44, 20);
+ this.topMarginTextBox.TabIndex = 6;
+ //
+ // topMarginLabel
+ //
+ this.topMarginLabel.AutoSize = true;
+ this.topMarginLabel.Location = new System.Drawing.Point(16, 92);
+ this.topMarginLabel.Name = "topMarginLabel";
+ this.topMarginLabel.Size = new System.Drawing.Size(116, 13);
+ this.topMarginLabel.TabIndex = 5;
+ this.topMarginLabel.Text = "Top/bottom/left margin";
+ //
+ // leftMarginTextBox
+ //
+ this.leftMarginTextBox.Enabled = false;
+ this.leftMarginTextBox.Location = new System.Drawing.Point(244, 89);
+ this.leftMarginTextBox.Name = "leftMarginTextBox";
+ this.leftMarginTextBox.Size = new System.Drawing.Size(44, 20);
+ this.leftMarginTextBox.TabIndex = 8;
+ //
+ // bottomMarginTextBox
+ //
+ this.bottomMarginTextBox.Enabled = false;
+ this.bottomMarginTextBox.Location = new System.Drawing.Point(193, 89);
+ this.bottomMarginTextBox.Name = "bottomMarginTextBox";
+ this.bottomMarginTextBox.Size = new System.Drawing.Size(44, 20);
+ this.bottomMarginTextBox.TabIndex = 7;
+ //
+ // cultureComboBox
+ //
+ this.cultureComboBox.Enabled = false;
+ this.cultureComboBox.FormattingEnabled = true;
+ this.cultureComboBox.Location = new System.Drawing.Point(142, 209);
+ this.cultureComboBox.Name = "cultureComboBox";
+ this.cultureComboBox.Size = new System.Drawing.Size(218, 21);
+ this.cultureComboBox.TabIndex = 26;
+ //
+ // cultureLabel
+ //
+ this.cultureLabel.AutoSize = true;
+ this.cultureLabel.Location = new System.Drawing.Point(16, 212);
+ this.cultureLabel.Name = "cultureLabel";
+ this.cultureLabel.Size = new System.Drawing.Size(42, 13);
+ this.cultureLabel.TabIndex = 25;
+ this.cultureLabel.Text = "Cullture";
+ //
+ // commonItemsButton
+ //
+ this.commonItemsButton.Enabled = false;
+ this.commonItemsButton.Location = new System.Drawing.Point(142, 259);
+ this.commonItemsButton.Name = "commonItemsButton";
+ this.commonItemsButton.Size = new System.Drawing.Size(218, 23);
+ this.commonItemsButton.TabIndex = 28;
+ this.commonItemsButton.Text = "Common items";
+ this.commonItemsButton.UseVisualStyleBackColor = true;
+ this.commonItemsButton.Click += new System.EventHandler(this.commonItemsButton_Click);
+ //
+ // footerButton
+ //
+ this.footerButton.Enabled = false;
+ this.footerButton.Location = new System.Drawing.Point(142, 309);
+ this.footerButton.Name = "footerButton";
+ this.footerButton.Size = new System.Drawing.Size(218, 23);
+ this.footerButton.TabIndex = 30;
+ this.footerButton.Text = "Footer";
+ this.footerButton.UseVisualStyleBackColor = true;
+ this.footerButton.Click += new System.EventHandler(this.footerButton_Click);
+ //
+ // headerButton
+ //
+ this.headerButton.Enabled = false;
+ this.headerButton.Location = new System.Drawing.Point(142, 234);
+ this.headerButton.Name = "headerButton";
+ this.headerButton.Size = new System.Drawing.Size(218, 23);
+ this.headerButton.TabIndex = 27;
+ this.headerButton.Text = "Title";
+ this.headerButton.UseVisualStyleBackColor = true;
+ this.headerButton.Click += new System.EventHandler(this.headerButton_Click);
+ //
+ // testItemsButton
+ //
+ this.testItemsButton.Enabled = false;
+ this.testItemsButton.Location = new System.Drawing.Point(142, 284);
+ this.testItemsButton.Name = "testItemsButton";
+ this.testItemsButton.Size = new System.Drawing.Size(218, 23);
+ this.testItemsButton.TabIndex = 29;
+ this.testItemsButton.Text = "Test items";
+ this.testItemsButton.UseVisualStyleBackColor = true;
+ this.testItemsButton.Click += new System.EventHandler(this.testItemsButton_Click);
+ //
+ // headerFontLabel
+ //
+ this.headerFontLabel.AutoSize = true;
+ this.headerFontLabel.Location = new System.Drawing.Point(16, 140);
+ this.headerFontLabel.Name = "headerFontLabel";
+ this.headerFontLabel.Size = new System.Drawing.Size(112, 13);
+ this.headerFontLabel.TabIndex = 14;
+ this.headerFontLabel.Text = "Header font/size/style";
+ //
+ // titleFontLabel
+ //
+ this.titleFontLabel.AutoSize = true;
+ this.titleFontLabel.Location = new System.Drawing.Point(16, 116);
+ this.titleFontLabel.Name = "titleFontLabel";
+ this.titleFontLabel.Size = new System.Drawing.Size(97, 13);
+ this.titleFontLabel.TabIndex = 9;
+ this.titleFontLabel.Text = "Title font/size/style";
+ //
+ // titleFontFamilyComboBox
+ //
+ this.titleFontFamilyComboBox.Enabled = false;
+ this.titleFontFamilyComboBox.FormattingEnabled = true;
+ this.titleFontFamilyComboBox.Location = new System.Drawing.Point(142, 113);
+ this.titleFontFamilyComboBox.Name = "titleFontFamilyComboBox";
+ this.titleFontFamilyComboBox.Size = new System.Drawing.Size(110, 21);
+ this.titleFontFamilyComboBox.TabIndex = 10;
+ //
+ // headerFontFamilyComboBox
+ //
+ this.headerFontFamilyComboBox.Enabled = false;
+ this.headerFontFamilyComboBox.FormattingEnabled = true;
+ this.headerFontFamilyComboBox.Location = new System.Drawing.Point(142, 137);
+ this.headerFontFamilyComboBox.Name = "headerFontFamilyComboBox";
+ this.headerFontFamilyComboBox.Size = new System.Drawing.Size(110, 21);
+ this.headerFontFamilyComboBox.TabIndex = 15;
+ //
+ // bodyFontFamilyComboBox
+ //
+ this.bodyFontFamilyComboBox.Enabled = false;
+ this.bodyFontFamilyComboBox.FormattingEnabled = true;
+ this.bodyFontFamilyComboBox.Location = new System.Drawing.Point(142, 161);
+ this.bodyFontFamilyComboBox.Name = "bodyFontFamilyComboBox";
+ this.bodyFontFamilyComboBox.Size = new System.Drawing.Size(110, 21);
+ this.bodyFontFamilyComboBox.TabIndex = 20;
+ //
+ // bodyFontLabel
+ //
+ this.bodyFontLabel.AutoSize = true;
+ this.bodyFontLabel.Location = new System.Drawing.Point(16, 164);
+ this.bodyFontLabel.Name = "bodyFontLabel";
+ this.bodyFontLabel.Size = new System.Drawing.Size(101, 13);
+ this.bodyFontLabel.TabIndex = 19;
+ this.bodyFontLabel.Text = "Body font/size/style";
+ //
+ // titleFontSizeTextBox
+ //
+ this.titleFontSizeTextBox.Enabled = false;
+ this.titleFontSizeTextBox.Location = new System.Drawing.Point(258, 113);
+ this.titleFontSizeTextBox.Name = "titleFontSizeTextBox";
+ this.titleFontSizeTextBox.Size = new System.Drawing.Size(30, 20);
+ this.titleFontSizeTextBox.TabIndex = 11;
+ //
+ // headerFontSizeTextBox
+ //
+ this.headerFontSizeTextBox.Enabled = false;
+ this.headerFontSizeTextBox.Location = new System.Drawing.Point(258, 137);
+ this.headerFontSizeTextBox.Name = "headerFontSizeTextBox";
+ this.headerFontSizeTextBox.Size = new System.Drawing.Size(30, 20);
+ this.headerFontSizeTextBox.TabIndex = 16;
+ //
+ // bodyFontSizeTextBox
+ //
+ this.bodyFontSizeTextBox.Enabled = false;
+ this.bodyFontSizeTextBox.Location = new System.Drawing.Point(258, 161);
+ this.bodyFontSizeTextBox.Name = "bodyFontSizeTextBox";
+ this.bodyFontSizeTextBox.Size = new System.Drawing.Size(29, 20);
+ this.bodyFontSizeTextBox.TabIndex = 21;
+ //
+ // titleBoldCheckBox
+ //
+ this.titleBoldCheckBox.AutoSize = true;
+ this.titleBoldCheckBox.Enabled = false;
+ this.titleBoldCheckBox.Location = new System.Drawing.Point(306, 116);
+ this.titleBoldCheckBox.Name = "titleBoldCheckBox";
+ this.titleBoldCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.titleBoldCheckBox.TabIndex = 12;
+ this.titleBoldCheckBox.UseVisualStyleBackColor = true;
+ //
+ // titleItalicCheckBox
+ //
+ this.titleItalicCheckBox.AutoSize = true;
+ this.titleItalicCheckBox.Enabled = false;
+ this.titleItalicCheckBox.Location = new System.Drawing.Point(334, 116);
+ this.titleItalicCheckBox.Name = "titleItalicCheckBox";
+ this.titleItalicCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.titleItalicCheckBox.TabIndex = 13;
+ this.titleItalicCheckBox.UseVisualStyleBackColor = true;
+ //
+ // headerItalicCheckBox
+ //
+ this.headerItalicCheckBox.AutoSize = true;
+ this.headerItalicCheckBox.Enabled = false;
+ this.headerItalicCheckBox.Location = new System.Drawing.Point(334, 140);
+ this.headerItalicCheckBox.Name = "headerItalicCheckBox";
+ this.headerItalicCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.headerItalicCheckBox.TabIndex = 18;
+ this.headerItalicCheckBox.UseVisualStyleBackColor = true;
+ //
+ // headerBoldCheckBox
+ //
+ this.headerBoldCheckBox.AutoSize = true;
+ this.headerBoldCheckBox.Enabled = false;
+ this.headerBoldCheckBox.Location = new System.Drawing.Point(306, 140);
+ this.headerBoldCheckBox.Name = "headerBoldCheckBox";
+ this.headerBoldCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.headerBoldCheckBox.TabIndex = 17;
+ this.headerBoldCheckBox.UseVisualStyleBackColor = true;
+ //
+ // bodyItalicCheckBox
+ //
+ this.bodyItalicCheckBox.AutoSize = true;
+ this.bodyItalicCheckBox.Enabled = false;
+ this.bodyItalicCheckBox.Location = new System.Drawing.Point(334, 164);
+ this.bodyItalicCheckBox.Name = "bodyItalicCheckBox";
+ this.bodyItalicCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.bodyItalicCheckBox.TabIndex = 23;
+ this.bodyItalicCheckBox.UseVisualStyleBackColor = true;
+ //
+ // bodyBoldCheckBox
+ //
+ this.bodyBoldCheckBox.AutoSize = true;
+ this.bodyBoldCheckBox.Enabled = false;
+ this.bodyBoldCheckBox.Location = new System.Drawing.Point(306, 164);
+ this.bodyBoldCheckBox.Name = "bodyBoldCheckBox";
+ this.bodyBoldCheckBox.Size = new System.Drawing.Size(15, 14);
+ this.bodyBoldCheckBox.TabIndex = 22;
+ this.bodyBoldCheckBox.UseVisualStyleBackColor = true;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+ this.label1.Location = new System.Drawing.Point(296, 100);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(32, 13);
+ this.label1.TabIndex = 31;
+ this.label1.Text = "Bold";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+ this.label2.Location = new System.Drawing.Point(330, 100);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(24, 13);
+ this.label2.TabIndex = 32;
+ this.label2.Text = "Ital.";
+ //
+ // PrinterCfgCtrl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.bodyItalicCheckBox);
+ this.Controls.Add(this.bodyBoldCheckBox);
+ this.Controls.Add(this.headerItalicCheckBox);
+ this.Controls.Add(this.headerBoldCheckBox);
+ this.Controls.Add(this.titleItalicCheckBox);
+ this.Controls.Add(this.titleBoldCheckBox);
+ this.Controls.Add(this.bodyFontSizeTextBox);
+ this.Controls.Add(this.headerFontSizeTextBox);
+ this.Controls.Add(this.titleFontSizeTextBox);
+ this.Controls.Add(this.bodyFontFamilyComboBox);
+ this.Controls.Add(this.bodyFontLabel);
+ this.Controls.Add(this.headerFontFamilyComboBox);
+ this.Controls.Add(this.titleFontFamilyComboBox);
+ this.Controls.Add(this.cultureComboBox);
+ this.Controls.Add(this.cultureLabel);
+ this.Controls.Add(this.commonItemsButton);
+ this.Controls.Add(this.footerButton);
+ this.Controls.Add(this.headerButton);
+ this.Controls.Add(this.testItemsButton);
+ this.Controls.Add(this.bottomMarginTextBox);
+ this.Controls.Add(this.titleFontLabel);
+ this.Controls.Add(this.leftMarginTextBox);
+ this.Controls.Add(this.headerFontLabel);
+ this.Controls.Add(this.topMarginTextBox);
+ this.Controls.Add(this.topMarginLabel);
+ this.Controls.Add(this.orientationComboBox);
+ this.Controls.Add(this.orientationLabel);
+ this.Controls.Add(this.supressPrintingCheckBox);
+ this.Controls.Add(this.nameTextBox);
+ this.Controls.Add(this.nameLabel);
+ this.Controls.Add(this.classNameLabel);
+ this.Name = "PrinterCfgCtrl";
+ this.Size = new System.Drawing.Size(400, 350);
+ this.Load += new System.EventHandler(this.PrinterCfgCtrl_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox nameTextBox;
+ private System.Windows.Forms.Label nameLabel;
+ private System.Windows.Forms.Label classNameLabel;
+ private System.Windows.Forms.CheckBox supressPrintingCheckBox;
+ private System.Windows.Forms.Label orientationLabel;
+ private System.Windows.Forms.ComboBox orientationComboBox;
+ private System.Windows.Forms.TextBox topMarginTextBox;
+ private System.Windows.Forms.Label topMarginLabel;
+ private System.Windows.Forms.TextBox leftMarginTextBox;
+ private System.Windows.Forms.TextBox bottomMarginTextBox;
+ private System.Windows.Forms.ComboBox cultureComboBox;
+ private System.Windows.Forms.Label cultureLabel;
+ private System.Windows.Forms.Button commonItemsButton;
+ private System.Windows.Forms.Button footerButton;
+ private System.Windows.Forms.Button headerButton;
+ private System.Windows.Forms.Button testItemsButton;
+ private System.Windows.Forms.Label headerFontLabel;
+ private System.Windows.Forms.Label titleFontLabel;
+ private System.Windows.Forms.ComboBox titleFontFamilyComboBox;
+ private System.Windows.Forms.ComboBox headerFontFamilyComboBox;
+ private System.Windows.Forms.ComboBox bodyFontFamilyComboBox;
+ private System.Windows.Forms.Label bodyFontLabel;
+ private System.Windows.Forms.TextBox titleFontSizeTextBox;
+ private System.Windows.Forms.TextBox headerFontSizeTextBox;
+ private System.Windows.Forms.TextBox bodyFontSizeTextBox;
+ private System.Windows.Forms.CheckBox titleBoldCheckBox;
+ private System.Windows.Forms.CheckBox titleItalicCheckBox;
+ private System.Windows.Forms.CheckBox headerItalicCheckBox;
+ private System.Windows.Forms.CheckBox headerBoldCheckBox;
+ private System.Windows.Forms.CheckBox bodyItalicCheckBox;
+ private System.Windows.Forms.CheckBox bodyBoldCheckBox;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.cs b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.cs
new file mode 100644
index 000000000..7db69acfd
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.cs
@@ -0,0 +1,396 @@
+///
+/// Copyright (c) 2017 Sensus Metering Systems
+///
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using log4net;
+using Config.Entities;
+using TBF.BenchControl.Generic;
+using TBF.Resources;
+
+namespace TBF.BenchControl.Output.Printers.OnePagePerMeter
+{
+ public partial class PrinterCfgCtrl : UserControl, IComponentCfgCtrl
+ {
+ static readonly ILog log = LogManager.GetLogger(typeof(PrinterCfgCtrl));
+
+ public bool ShowMore { get { return false; } }
+
+ PrinterCfg config;
+ public IComponentCfg Config
+ {
+ get { return config as IComponentCfg; }
+ set
+ {
+ config = value as PrinterCfg;
+ Redraw();
+ }
+ }
+
+ string header;
+ string[] commonItems;
+ string[] testItems;
+ string footer;
+
+ public PrinterCfgCtrl()
+ {
+ InitializeComponent();
+ Localize();
+
+ orientationComboBox.Items.Add(PageOrientation.Portrait.ToString());
+ orientationComboBox.Items.Add(PageOrientation.Landscape.ToString());
+
+ foreach (var ff in System.Drawing.FontFamily.Families)
+ {
+ titleFontFamilyComboBox.Items.Add(ff.Name);
+ headerFontFamilyComboBox.Items.Add(ff.Name);
+ bodyFontFamilyComboBox.Items.Add(ff.Name);
+ }
+ }
+
+ private void PrinterCfgCtrl_Load(object sender, EventArgs e)
+ {
+ for (Culture s = 0; s < Culture.Count; s++) cultureComboBox.Items.Add(s.ToString());
+
+ header = config.Header;
+ commonItems = config.CommonItems;
+ testItems = config.SelectedItems;
+ footer = config.Footer;
+
+ Redraw();
+ }
+
+ void Localize()
+ {
+ nameLabel.Text = Strings.Name;
+ cultureLabel.Text = "Culture";
+ headerButton.Text = Strings.Header;
+ commonItemsButton.Text = "Common items";
+ testItemsButton.Text = "Test items";
+ footerButton.Text = Strings.Footer;
+ }
+
+ public void Closing()
+ {
+ }
+
+ PageOrientation GetOrientation(string str)
+ {
+ if (str.Equals(PageOrientation.Landscape.ToString())) return PageOrientation.Landscape;
+ if (str.Equals(PageOrientation.Portrait.ToString())) return PageOrientation.Portrait;
+ return (PageOrientation)(-1);
+ }
+
+ void Redraw()
+ {
+ if (config == null) return; /// Control was not loaded, settings were not changed
+ classNameLabel.Text = config.Factory.ClassName;
+ nameTextBox.Text = config.Name;
+ orientationComboBox.Text = config.PageOrientation.ToString();
+ topMarginTextBox.Text = config.TopMargin.ToString();
+ bottomMarginTextBox.Text = config.BottomMargin.ToString();
+ leftMarginTextBox.Text = config.LeftMargin.ToString();
+
+ titleFontFamilyComboBox.Text = config.TitFntFml;
+ titleFontSizeTextBox.Text = config.TitFntSz.ToString();
+ titleBoldCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Bold) != 0);
+ titleItalicCheckBox.Checked = ((config.TitFntSty & (int)System.Drawing.FontStyle.Italic) != 0);
+
+ headerFontFamilyComboBox.Text = config.HdrFntFml;
+ headerFontSizeTextBox.Text = config.HdrFntSz.ToString();
+ headerBoldCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Bold) != 0);
+ headerItalicCheckBox.Checked = ((config.HdrFntSty & (int)System.Drawing.FontStyle.Italic) != 0);
+
+ bodyFontFamilyComboBox.Text = config.BodyFntFml;
+ bodyFontSizeTextBox.Text = config.BodyFntSz.ToString();
+ bodyBoldCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Bold) != 0);
+ bodyItalicCheckBox.Checked = ((config.BodyFntSty & (int)System.Drawing.FontStyle.Italic) != 0);
+
+ supressPrintingCheckBox.Checked = config.SupressPrinting;
+ cultureComboBox.Text = config.Culture.ToString();
+ }
+
+ public void Unlock()
+ {
+ nameTextBox.Enabled = true;
+ orientationComboBox.Enabled = true;
+ topMarginTextBox.Enabled = true;
+ bottomMarginTextBox.Enabled = true;
+ leftMarginTextBox.Enabled = true;
+ titleFontFamilyComboBox.Enabled = true;
+ titleFontSizeTextBox.Enabled = true;
+ titleBoldCheckBox.Enabled = true;
+ titleItalicCheckBox.Enabled = true;
+ headerFontFamilyComboBox.Enabled = true;
+ headerFontSizeTextBox.Enabled = true;
+ headerBoldCheckBox.Enabled = true;
+ headerItalicCheckBox.Enabled = true;
+ bodyFontFamilyComboBox.Enabled = true;
+ bodyFontSizeTextBox.Enabled = true;
+ bodyBoldCheckBox.Enabled = true;
+ bodyItalicCheckBox.Enabled = true;
+ supressPrintingCheckBox.Enabled = true;
+ cultureComboBox.Enabled = true;
+ headerButton.Enabled = true;
+ commonItemsButton.Enabled = true;
+ testItemsButton.Enabled = true;
+ footerButton.Enabled = true;
+ }
+
+ public CfgUpdateFlags VerifyCfg(ref string message)
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ if ((int)GetOrientation(orientationComboBox.Text) < 0)
+ {
+ message += Environment.NewLine + "Invalid 'Page orientation'";
+ flags |= CfgUpdateFlags.Error;
+ }
+
+ int dummy;
+ if (!int.TryParse(topMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 500)
+ {
+ message += Environment.NewLine + "'Top margin' should be between 0 and 500";
+ flags |= CfgUpdateFlags.Error;
+ }
+
+ if (!int.TryParse(bottomMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200)
+ {
+ message += Environment.NewLine + "'Bottom margin' should be between 0 and 200";
+ flags |= CfgUpdateFlags.Error;
+ }
+
+ if (!int.TryParse(leftMarginTextBox.Text, out dummy) || dummy < 0 || dummy > 200)
+ {
+ message += Environment.NewLine + "Left margin' should be between 0 and 200";
+ flags |= CfgUpdateFlags.Error;
+ }
+
+ if (!int.TryParse(titleFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48)
+ {
+ message += Environment.NewLine + "Title font size' should be between 6 and 48";
+ flags |= CfgUpdateFlags.Error;
+ }
+
+ if (!int.TryParse(headerFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48)
+ {
+ message += Environment.NewLine + "Header font size' should be between 6 and 48";
+ flags |= CfgUpdateFlags.Error;
+ }
+
+ if (!int.TryParse(bodyFontSizeTextBox.Text, out dummy) || dummy < 6 || dummy > 48)
+ {
+ message += Environment.NewLine + "Body font size' should be between 6 and 48";
+ flags |= CfgUpdateFlags.Error;
+ }
+
+ if (!cultureComboBox.Items.Contains(cultureComboBox.Text))
+ {
+ flags |= CfgUpdateFlags.Error;
+ message += Environment.NewLine + "Invalid culture";
+ }
+
+ return flags;
+ }
+
+ public CfgUpdateFlags UpdateCfg()
+ {
+ CfgUpdateFlags flags = CfgUpdateFlags.None;
+
+ if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
+
+ if (config.Name != nameTextBox.Text)
+ {
+ config.Name = nameTextBox.Text;
+ flags |= (CfgUpdateFlags.RestartRqrd | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.PageOrientation != GetOrientation(orientationComboBox.Text))
+ {
+ config.PageOrientation = GetOrientation(orientationComboBox.Text);
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ int tmp = int.Parse(topMarginTextBox.Text);
+ if (config.TopMargin != tmp)
+ {
+ config.TopMargin = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ tmp = int.Parse(bottomMarginTextBox.Text);
+ if (config.BottomMargin != tmp)
+ {
+ config.BottomMargin = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ tmp = int.Parse(leftMarginTextBox.Text);
+ if (config.LeftMargin != tmp)
+ {
+ config.LeftMargin = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ /// Title font properties
+ if (config.TitFntFml != titleFontFamilyComboBox.Text)
+ {
+ config.TitFntFml = titleFontFamilyComboBox.Text;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+ tmp = int.Parse(titleFontSizeTextBox.Text);
+ if (config.TitFntSz != tmp)
+ {
+ config.TitFntSz = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+ tmp = (titleBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0)
+ + (titleItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0);
+ if (config.TitFntSty != tmp)
+ {
+ config.TitFntSty = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ /// Header font properties
+ if (config.HdrFntFml != headerFontFamilyComboBox.Text)
+ {
+ config.HdrFntFml = headerFontFamilyComboBox.Text;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+ tmp = int.Parse(headerFontSizeTextBox.Text);
+ if (config.HdrFntSz != tmp)
+ {
+ config.HdrFntSz = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+ tmp = (headerBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0)
+ + (headerItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0);
+ if (config.HdrFntSty != tmp)
+ {
+ config.HdrFntSty = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ /// Body font properties
+ if (config.BodyFntFml != bodyFontFamilyComboBox.Text)
+ {
+ config.BodyFntFml = bodyFontFamilyComboBox.Text;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+ tmp = int.Parse(bodyFontSizeTextBox.Text);
+ if (config.BodyFntSz != tmp)
+ {
+ config.BodyFntSz = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+ tmp = (bodyBoldCheckBox.Checked ? (int)System.Drawing.FontStyle.Bold : 0)
+ + (bodyItalicCheckBox.Checked ? (int)System.Drawing.FontStyle.Italic : 0);
+ if (config.BodyFntSty != tmp)
+ {
+ config.BodyFntSty = tmp;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.SupressPrinting != supressPrintingCheckBox.Checked)
+ {
+ config.SupressPrinting = supressPrintingCheckBox.Checked;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.CommonItems != commonItems)
+ {
+ config.CommonItems = commonItems;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.SelectedItems != testItems)
+ {
+ config.SelectedItems = testItems;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.Header != header)
+ {
+ config.Header = header;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if (config.Footer != footer)
+ {
+ config.Footer = footer;
+ flags |= (CfgUpdateFlags.InvokeCfgChange | CfgUpdateFlags.AnyChange);
+ }
+
+ if ((flags & CfgUpdateFlags.InvokeCfgChange) != 0)
+ {
+ Printer.OnCfgChange(this, new CfgChangeArgs(CfgChangeCmd.CfgChange, config));
+ }
+
+ return flags;
+ }
+
+ private void headerButton_Click(object sender, EventArgs e)
+ {
+ HeaderFooterDlg dlg = new HeaderFooterDlg(true, string.IsNullOrEmpty(header) ? string.Empty : header.Replace("~", Environment.NewLine));
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ header = dlg.EditedText.Replace(Environment.NewLine, "~");
+ }
+ }
+
+ private void commonItemsButton_Click(object sender, EventArgs e)
+ {
+ Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg()
+ {
+ MetersKind = config.MetersKind,
+ SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(commonItems),
+ };
+
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ commonItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems);
+ }
+ }
+
+ private void testItemsButton_Click(object sender, EventArgs e)
+ {
+ Results.Forms.ResultsConfigDlg dlg = new Results.Forms.ResultsConfigDlg(true)
+ {
+ MetersKind = config.MetersKind,
+ SelectedItems = Results.WMeterRsltItemSpec.FromStrArray(testItems),
+ };
+
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ testItems = Results.WMeterRsltItemSpec.ToStrArray(dlg.SelectedItems);
+ }
+ }
+
+ private void footerButton_Click(object sender, EventArgs e)
+ {
+ HeaderFooterDlg dlg = new HeaderFooterDlg(false, string.IsNullOrEmpty(footer) ? string.Empty : footer.Replace("~", Environment.NewLine));
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ footer = dlg.EditedText.Replace(Environment.NewLine, "~");
+ }
+ }
+
+ #region Configuration Change Handling
+
+ public static void OnCmdResponse(object sender, CmdResponseArgs args)
+ {
+ if (CmdResponseHandler == null) return;
+ try { CmdResponseHandler(sender, args); }
+ catch (Exception e) { log.Error("CmdResponseHandler(...) failed", e); }
+ }
+
+ public static event EventHandler CmdResponseHandler;
+
+ public void StartResponseHandler() { }
+ public void StopResponseHandler() { }
+
+ #endregion Configuration Change Handling
+ }
+}
diff --git a/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.resx b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/TestBenchFramework/BenchControl/Output/Printers/OnePagePerMeter/PrinterCfgCtrl.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/TestBenchFramework/BenchControl/TbfComponents.cs b/TestBenchFramework/BenchControl/TbfComponents.cs
index eb67d3bb3..4ec5e1b01 100644
--- a/TestBenchFramework/BenchControl/TbfComponents.cs
+++ b/TestBenchFramework/BenchControl/TbfComponents.cs
@@ -87,13 +87,20 @@ namespace TBF.BenchControl
Factories.Add(new Output.FileWriters.Enhanced.FactorySingle());
Factories.Add(new Output.FileWriters.Enhanced.FactoryCompound());
Factories.Add(new Output.FileWriters.Enhanced.FactoryHeatMeters());
+ Factories.Add(new Output.FileWriters.ImageArchiver.Factory());
+ Factories.Add(new Output.FileWriters.OneFilePerMeter.FactorySingle());
+ Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryCompound());
+ Factories.Add(new Output.FileWriters.OneFilePerMeter.FactoryHeatMeters());
Factories.Add(new Output.FileWriters.Xml.FactorySingle());
Factories.Add(new Output.FileWriters.Xml.FactoryCompound());
Factories.Add(new Output.FileWriters.Xml.FactoryHeatMeters());
Factories.Add(new Output.Printers.Enhanced.FactorySingle());
Factories.Add(new Output.Printers.Enhanced.FactoryCompound());
Factories.Add(new Output.Printers.Enhanced.FactoryHeatMeters());
- Factories.Add(new Elde.PressureMeter.PressureMeterFactory());
+ Factories.Add(new Output.Printers.OnePagePerMeter.FactorySingle());
+ Factories.Add(new Output.Printers.OnePagePerMeter.FactoryCompound());
+ Factories.Add(new Output.Printers.OnePagePerMeter.FactoryHeatMeters());
+ Factories.Add(new Elde.PressureMeter.PressureMeterFactory());
Factories.Add(new Elde.PressureMeterInternal.PressureMeterFactory());
Factories.Add(new Elde.Pump.PumpFactory());
Factories.Add(new Danfoss.VLT2800.PumpFactory());
diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj
index acfeeb820..dc49cfb6e 100644
--- a/TestBenchFramework/TBF.csproj
+++ b/TestBenchFramework/TBF.csproj
@@ -659,6 +659,26 @@
WriterCfgCtrl.cs
+
+
+
+
+ UserControl
+
+
+ ArchiverCfgCtrl.cs
+
+
+
+
+
+
+
+ UserControl
+
+
+ WriterCfgCtrl.cs
+
@@ -687,6 +707,17 @@
PrinterCfgCtrl.cs
+
+
+
+
+
+
+ UserControl
+
+
+ PrinterCfgCtrl.cs
+
@@ -1988,6 +2019,12 @@
WriterCfgCtrl.cs
+
+ ArchiverCfgCtrl.cs
+
+
+ WriterCfgCtrl.cs
+
WriterCfgCtrl.cs
@@ -1997,6 +2034,9 @@
PrinterCfgCtrl.cs
+
+ PrinterCfgCtrl.cs
+
PrinterCfgCtrl.cs