2016-04-29 05:40:34 +00:00
///
/// Copyright (c) 2013-2016 Sensus Metering Systems
///
using System ;
using System.Collections.Generic ;
using Results.Entities ;
namespace Results
{
public class WMeterRsltItemSpec
{
///
/// Public fields
///
public readonly int Uid ;
public readonly string Name ; /// Name-s of all items must be unique
public string Header ; /// Specifies the header to be printed at the top of the table
public string TestID ; /// Specifies the test
public Config . Unit Units ; /// Specifies units for the output
public string Format ; /// Specifies format for the output
public string Precision ; /// Specifies precision for the output
public int Width ; /// Specifies the number of characters of the output, 0 = automatic
public Config . Entities . Alignment Alignment ; /// Specifies alignment for the output
public WMeterRsltItemSpec Clone ( )
{
WMeterRsltItemSpec item2 = new WMeterRsltItemSpec ( Uid , Name , printDlgt ) ;
item2 . Header = Header ;
item2 . TestID = TestID ;
item2 . Units = Units ;
item2 . Format = Format ;
item2 . Precision = Precision ;
item2 . Width = Width ;
item2 . Alignment = Alignment ;
return item2 ;
}
///
/// Function to pick a MeterTestResult field and convert it into a string
///
public delegate string PrintDlgt ( WaterMeter waterMeterResult , string testID , Config . Unit units , string format , string precision ) ;
private readonly PrintDlgt printDlgt ;
/// <summary> Safe wrapper which replaces null-s by empty strings </summary>
public string Print ( WaterMeter waterMeterResult )
{
string str = printDlgt ( waterMeterResult , TestID , Units , Format , Precision ) ;
if ( str = = null ) str = string . Empty ;
if ( ! string . IsNullOrEmpty ( Format ) )
{
str = string . Format ( Format , str ) ;
}
int len = str . Length ;
if ( Width = = 0 | | len > = Width )
{
return str ;
}
else if ( Alignment = = Config . Entities . Alignment . Left )
{
return str + new string ( ' ' , Width - len ) ;
}
else if ( Alignment = = Config . Entities . Alignment . Right )
{
return new string ( ' ' , Width - len ) + str ;
}
else // Alignment.Center or Alignment.Justified
{
int nrSpaces = Width - len ;
return new string ( ' ' , nrSpaces / 2 ) + str + new string ( ' ' , nrSpaces - ( nrSpaces / 2 ) ) ;
}
}
///
/// Public constructor
///
public WMeterRsltItemSpec ( int uid , string name , PrintDlgt printDlgt )
{
Uid = uid ;
Name = name ;
this . printDlgt = printDlgt ;
}
/// Static list of all available items
public static readonly IList < WMeterRsltItemSpec > AllItems ;
/// Static constructor that initializes the list of all items
static WMeterRsltItemSpec ( )
{
AllItems = new List < WMeterRsltItemSpec > ( ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 0 , "String" , ( w , t , u , f , p ) = > f ) ) ;
/// Common
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 1 , "Test name" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : w . GetTestRslt ( t ) . Name ( ) ) ) ;
2016-04-29 05:40:34 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 2 , "Procedure name" , ( w , t , u , f , p ) = > w . ProcedureName ( ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 3 , "Batch number" , ( w , t , u , f , p ) = > w . BatchNr ( ) . ToString ( ) ) ) ;
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 4 , "Test method" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : w . GetTestRslt ( t ) . Method ( ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 5 , "Density" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : w . GetTestRslt ( t ) . DensityOut . ToString ( string . IsNullOrEmpty ( p ) ? "F1" : p ) ) ) ; /// [kg/m3]
2016-04-29 05:40:34 +00:00
/// Target values
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 6 , "Q from" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : w . GetTestRslt ( t ) . Qfrom ( ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 7 , "Q to" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : w . GetTestRslt ( t ) . Qto ( ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 8 , "Test volume" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . TargetVolume ( ) ) . ToString ( string . IsNullOrEmpty ( p ) ? "F1" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 9 , "Error limit Lo" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . ErrLimLo ( ) ) . ToString ( string . IsNullOrEmpty ( p ) ? "F1" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 10 , "Error limit Hi" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . ErrLimHi ( ) ) . ToString ( string . IsNullOrEmpty ( p ) ? "F1" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 11 , "Uncertainty" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : w . GetTestRslt ( t ) . Uncertainty ( ) . ToString ( string . IsNullOrEmpty ( p ) ? "F2" : p ) ) ) ;
2016-04-29 05:40:34 +00:00
/// Test results
2016-05-02 08:19:26 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 12 , "Test start date/time" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : ( string . IsNullOrEmpty ( p ) ? w . GetTestRslt ( t ) . StartTime . ToShortTimeString ( )
: w . GetTestRslt ( t ) . StartTime . ToString ( p ) ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 13 , "Test end date/time" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : ( string . IsNullOrEmpty ( p ) ? w . GetTestRslt ( t ) . EndTime . ToShortTimeString ( )
: w . GetTestRslt ( t ) . EndTime . ToString ( p ) ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 14 , "Test time" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : w . GetTestRslt ( t ) . TestTime . ToString ( string . IsNullOrEmpty ( p ) ? "F2" : p ) ) ) ;
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 15 , "Flow" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Utils . DoubleToStr ( Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . FlowVolume ) , 4 ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 16 , "T in" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . TempInAvrg ) . ToString ( string . IsNullOrEmpty ( p ) ? "F2" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 17 , "T out" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . TempOutAvrg ) . ToString ( string . IsNullOrEmpty ( p ) ? "F2" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 18 , "T div" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . TempDivAvrg ) . ToString ( string . IsNullOrEmpty ( p ) ? "F2" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 19 , "P up" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . PressUpAvrg ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 20 , "P up start" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . PressUpStart ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 21 , "P up end" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . PressUpEnd ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 22 , "P down" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . PressDownAvrg ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 23 , "P down start" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . PressDownStart ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 24 , "P down end" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . PressDownEnd ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 25 , "Reference error" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . ErrorMaster ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 26 , "Ambient temperature" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . AmbientTempAve ) . ToString ( string . IsNullOrEmpty ( p ) ? "F1" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 27 , "Ambient pressure" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . AmbientPressAve ) . ToString ( string . IsNullOrEmpty ( p ) ? "F0" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 28 , "Ambient humidity" , ( w , t , u , f , p ) = > ( w . GetTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetTestRslt ( t ) . AmbientHumiAve ) . ToString ( string . IsNullOrEmpty ( p ) ? "F1" : p ) ) ) ;
2016-04-29 05:40:34 +00:00
/// Single and combined meter results
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 29 , "Volume" , ( w , t , u , f , p ) = > ( w . GetMeterTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetMeterTestRslt ( t ) . VolumeMeter ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 30 , "Reference volume" , ( w , t , u , f , p ) = > ( w . GetMeterTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetMeterTestRslt ( t ) . VolumeRef ) . ToString ( string . IsNullOrEmpty ( p ) ? "F3" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 31 , "Error" , ( w , t , u , f , p ) = > ( w . GetMeterTestRslt ( t ) = = null ) ? "" : Config . Units . ConvertTo ( u , w . GetMeterTestRslt ( t ) . Error ) . ToString ( string . IsNullOrEmpty ( p ) ? "F2" : p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 32 , "Passed" , ( w , t , u , f , p ) = > ( w . GetMeterTestRslt ( t ) = = null ) ? "" : w . GetMeterTestRslt ( t ) . PassedColorStr ( ) ) ) ;
2016-04-29 05:40:34 +00:00
/// Water meter info
AllItems . Add ( new WMeterRsltItemSpec ( 33 , "Watermeter type" , ( w , t , u , f , p ) = > w . WaterMeterData . ProductName ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 34 , "Producer" , ( w , t , u , f , p ) = > w . WaterMeterData . Producer ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 35 , "Metrological class" , ( w , t , u , f , p ) = > w . WaterMeterData . MetrologicalClass ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 36 , "Approval info" , ( w , t , u , f , p ) = > w . WaterMeterData . ApprovalInfo ) ) ;
2016-05-02 10:55:17 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 36 , "Certificate" , ( w , t , u , f , p ) = > w . WaterMeterData . Certificate ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 35 , "Temperature class" , ( w , t , u , f , p ) = > w . WaterMeterData . MetrologicalClass ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 37 , "Q4_Qmax" , ( w , t , u , f , p ) = > string . IsNullOrEmpty ( p ) ? Config . Units . ConvertTo ( u , w . WaterMeterData . Q4_Qmax ) . ToString ( )
2016-04-29 05:40:34 +00:00
: Config . Units . ConvertTo ( u , w . WaterMeterData . Q4_Qmax ) . ToString ( p ) ) ) ;
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 38 , "Q3_Qn" , ( w , t , u , f , p ) = > string . IsNullOrEmpty ( p ) ? Config . Units . ConvertTo ( u , w . WaterMeterData . Q3_Qn ) . ToString ( )
: Config . Units . ConvertTo ( u , w . WaterMeterData . Q3_Qn ) . ToString ( p ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 39 , "Q2_Qt" , ( w , t , u , f , p ) = > string . IsNullOrEmpty ( p ) ? Config . Units . ConvertTo ( u , w . WaterMeterData . Q2_Qt ) . ToString ( )
2016-04-29 05:40:34 +00:00
: Config . Units . ConvertTo ( u , w . WaterMeterData . Q2_Qt ) . ToString ( p ) ) ) ;
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 40 , "Q1_Qmin" , ( w , t , u , f , p ) = > string . IsNullOrEmpty ( p ) ? Config . Units . ConvertTo ( u , w . WaterMeterData . Q1_Qmin ) . ToString ( )
2016-04-29 05:40:34 +00:00
: Config . Units . ConvertTo ( u , w . WaterMeterData . Q1_Qmin ) . ToString ( p ) ) ) ;
/// Water meters results
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 41 , "Serial Nr" , ( w , t , u , f , p ) = > w . SerialNr ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 42 , "Purchase order" , ( w , t , u , f , p ) = > w . PurchaseOrder ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 43 , "Year of production" , ( w , t , u , f , p ) = > w . YearOfProduction . ToString ( ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 44 , "WM Position" , ( w , t , u , f , p ) = > w . WMPosition . ToString ( ) ) ) ;
2016-04-29 05:40:34 +00:00
/// Water meters results (single)
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 45 , "End state" , ( w , t , u , f , p ) = > w . EndState ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 46 , "Pulses" , ( w , t , u , f , p ) = > ( w . GetMeterTestRslt ( t ) = = null ) ? "" : w . GetMeterTestRslt ( t ) . PulsesMeter . ToString ( ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 47 , "Pulses/liter" , ( w , t , u , f , p ) = > ( w . GetMeterTestRslt ( t ) = = null ) ? "" : ( string . IsNullOrEmpty ( p ) ? w . GetMeterTestRslt ( t ) . PulsesPerLiter . ToString ( )
: w . GetMeterTestRslt ( t ) . PulsesPerLiter . ToString ( p ) ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 48 , "Reference pulses" , ( w , t , u , f , p ) = > ( w . GetMeterTestRslt ( t ) = = null ) ? "" : w . GetMeterTestRslt ( t ) . PulsesMaster . ToString ( ) ) ) ;
2016-04-29 05:40:34 +00:00
/// Batch info
2016-05-01 08:04:05 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 49 , "Batch number" , ( w , t , u , f , p ) = > w . Batch . BatchNr . ToString ( ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 50 , "Test bench ID" , ( w , t , u , f , p ) = > w . Batch . TestBenchId . ToString ( ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 51 , "Program version" , ( w , t , u , f , p ) = > w . Batch . ProgramVersion ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 52 , "User name" , ( w , t , u , f , p ) = > w . Batch . UserName ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 53 , "User nr." , ( w , t , u , f , p ) = > w . Batch . UserNumber . ToString ( ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 54 , "Procedure name" , ( w , t , u , f , p ) = > w . Batch . ProcedureName ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 55 , "Watermeters" , ( w , t , u , f , p ) = > w . Batch . WatermetersStr ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 56 , "Protocol title" , ( w , t , u , f , p ) = > w . Batch . ProtocolTitle ) ) ;
2016-05-02 08:19:26 +00:00
AllItems . Add ( new WMeterRsltItemSpec ( 57 , "Batch start date/time" , ( w , t , u , f , p ) = > ( string . IsNullOrEmpty ( p ) ? w . Batch . StartTime . ToShortDateString ( )
: w . Batch . StartTime . ToString ( p ) ) ) ) ;
AllItems . Add ( new WMeterRsltItemSpec ( 58 , "Batch end date/time" , ( w , t , u , f , p ) = > ( string . IsNullOrEmpty ( p ) ? w . Batch . EndTime . ToShortDateString ( )
: w . Batch . EndTime . ToString ( p ) ) ) ) ;
2016-04-29 05:40:34 +00:00
}
/// <summary>
/// Converts a list of 'Output item specifications' to a string array
/// </summary>
/// <param name="items"></param>
/// <returns></returns>
public static string [ ] ToStrArray ( IList < WMeterRsltItemSpec > items )
{
int count = ( items ! = null ) ? items . Count : 0 ;
string [ ] result = new string [ count ] ;
for ( int i = 0 ; i < count ; i + + )
{
result [ i ] = string . Format ( "{0}~{1}~{2}~{3}~{4}~{5}~{6}~{7}" ,
items [ i ] . Uid ,
items [ i ] . Header ,
items [ i ] . TestID ,
items [ i ] . Units ,
items [ i ] . Format ,
items [ i ] . Precision ,
items [ i ] . Width ,
items [ i ] . Alignment ) ;
}
return result ;
}
/// <summary>
/// Converts a string array to a list of 'Output item specifications'
/// </summary>
/// <param name="strArray"></param>
/// <returns></returns>
public static IList < WMeterRsltItemSpec > FromStrArray ( string [ ] strArray )
{
IList < WMeterRsltItemSpec > result = new List < WMeterRsltItemSpec > ( ) ;
if ( strArray ! = null )
{
for ( int i = 0 ; i < strArray . Length ; i + + )
{
string [ ] field = strArray [ i ] . Split ( new char [ ] { '~' } ) ;
try
{
WMeterRsltItemSpec item = GetItem ( int . Parse ( field [ 0 ] ) ) ;
item . Header = field [ 1 ] ;
item . TestID = field [ 2 ] ;
item . Units = 0 ;
for ( Config . Unit u = 0 ; u < Config . Unit . Count ; u + + ) if ( u . ToString ( ) . Equals ( field [ 3 ] ) ) { item . Units = u ; break ; }
item . Format = field [ 4 ] ;
item . Precision = field [ 5 ] ;
item . Width = int . Parse ( field [ 6 ] ) ;
item . Alignment = 0 ;
for ( Config . Entities . Alignment a = 0 ; a < Config . Entities . Alignment . Count ; a + + ) if ( a . ToString ( ) . Equals ( field [ 7 ] ) ) { item . Alignment = a ; break ; }
result . Add ( item ) ;
}
catch
{
WMeterRsltItemSpec item = GetItem ( 0 ) ;
item . Format = string . Format ( "Parse error: {0}" , strArray [ i ] ) ;
result . Add ( item ) ;
}
}
}
return result ;
}
private static WMeterRsltItemSpec GetItem ( int uid )
{
foreach ( var item in AllItems )
{
if ( item . Uid = = uid ) return item . Clone ( ) ;
}
return null ;
}
}
}