184 lines
7.0 KiB
C#
184 lines
7.0 KiB
C#
///
|
|
/// Copyright (c) 2017-2022 Sensus Slovensko a.s.
|
|
///
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Common;
|
|
|
|
namespace Config
|
|
{
|
|
public static class Utils
|
|
{
|
|
/// <summary>
|
|
/// Extract and return a DB server from a MySQL connection string.
|
|
/// </summary>
|
|
public static string GetDBServer(string connectionString)
|
|
{
|
|
return GetFromConnectionString(connectionString, new string[] { "SERVER=" });
|
|
}
|
|
|
|
/// <summary>
|
|
/// Extract and return a DB name from a MySQL connection string.
|
|
/// </summary>
|
|
public static string GetDBName(string connectionString)
|
|
{
|
|
return GetFromConnectionString(connectionString, new string[] { "DATABASE=" });
|
|
}
|
|
|
|
/// <summary>
|
|
/// Extract and return a username from a MySQL connection string
|
|
/// </summary>
|
|
public static string GetDBUser(string connectionString)
|
|
{
|
|
return GetFromConnectionString(connectionString, new string[] { "USER=", "UID=" });
|
|
}
|
|
|
|
/// <summary>
|
|
/// Extract and return a password from a MySQL connection string
|
|
/// </summary>
|
|
public static string GetDBPassword(string connectionString)
|
|
{
|
|
return GetFromConnectionString(connectionString, new string[] { "PASSWORD=", "PWD=" });
|
|
}
|
|
|
|
/// <summary>
|
|
/// Extract and return an element of a MySQL connection string
|
|
/// (a host, a database, a user name or a password).
|
|
/// Return an empty string on any error.
|
|
/// </summary>
|
|
public static string GetFromConnectionString(string connectionString, string[] patterns)
|
|
{
|
|
foreach (var pattern in patterns)
|
|
{
|
|
int startIx = connectionString.IndexOf(pattern);
|
|
if (startIx >= 0)
|
|
{
|
|
/// pattern found, extract the subsequent element
|
|
startIx += pattern.Length;
|
|
int endIx = connectionString.IndexOf(';', startIx);
|
|
return (endIx > 0) ? connectionString.Substring(startIx, endIx - startIx) : string.Empty;
|
|
}
|
|
}
|
|
|
|
/// pattern NOT found
|
|
return string.Empty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get either Q1 or Qmin flow for a given Qn and metrological class
|
|
/// </summary>
|
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
|
/// <returns>Q1 or Qmin flow in m3/h</returns>
|
|
public static double GetQ1Qmin(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
|
|
{
|
|
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
|
|
|
|
int metroClassRatio;
|
|
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
|
|
{
|
|
return Qn / (double)metroClassRatio;
|
|
}
|
|
else
|
|
{
|
|
if (medium == Medium.HotWater)
|
|
{
|
|
switch (metroClass)
|
|
{
|
|
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
|
|
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.04 * Qn);
|
|
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.02 * Qn);
|
|
case "D": return (Qn < 15) ? (0.01 * Qn) : Qdflt;
|
|
default: break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (metroClass)
|
|
{
|
|
case "A": return (Qn < 15) ? (0.04 * Qn) : (0.08 * Qn);
|
|
case "B": return (Qn < 15) ? (0.02 * Qn) : (0.03 * Qn);
|
|
case "C": return (Qn < 15) ? (0.01 * Qn) : (0.006 * Qn);
|
|
default: break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return Qdflt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get either Q2 or Qt flow for a given Qn and metrological class
|
|
/// </summary>
|
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
|
/// <returns>Q2 or Qt flow in m3/h</returns>
|
|
public static double GetQ2Qt(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
|
|
{
|
|
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
|
|
|
|
int metroClassRatio;
|
|
if ((metroClass[0] == 'R') && int.TryParse(metroClass.Substring(1), out metroClassRatio) && (metroClassRatio > 0))
|
|
{
|
|
return 1.6 * Qn / (double)metroClassRatio;
|
|
}
|
|
|
|
if (medium == Medium.HotWater)
|
|
{
|
|
switch (metroClass)
|
|
{
|
|
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.2 * Qn);
|
|
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.15 * Qn);
|
|
case "C": return (Qn < 15) ? (0.06 * Qn) : (0.1 * Qn);
|
|
case "D": return (Qn < 15) ? (0.015 * Qn) : Qdflt;
|
|
default: break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (metroClass)
|
|
{
|
|
case "A": return (Qn < 15) ? (0.1 * Qn) : (0.3 * Qn);
|
|
case "B": return (Qn < 15) ? (0.08 * Qn) : (0.2 * Qn);
|
|
case "C": return (Qn < 15) ? (0.015 * Qn) : (0.015 * Qn);
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
return Qdflt;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get either Q4 or Qmax flow for a given Qn and metrological class
|
|
/// </summary>
|
|
/// <param name="Qn">Nominal flow in m3/h</param>
|
|
/// <param name="metroClass">Metrological class ("A" ,"B", "C" or "R#")</param>
|
|
/// <param name="medium">NotSpecified, ColdWater or HotWater</param>
|
|
/// <param name="Qdflt">Default flow when metrologic does not match pattern</param>
|
|
/// <returns>Q4 or Qmax flow in m3/h</returns>
|
|
public static double GetQ4Qmax(double Qn, string metroClass, Medium medium = Medium.ColdWater, double Qdflt = 0)
|
|
{
|
|
if (string.IsNullOrEmpty(metroClass)) return Qdflt;
|
|
|
|
switch (metroClass[0])
|
|
{
|
|
case 'A':
|
|
case 'B':
|
|
case 'C':
|
|
case 'D':
|
|
return 2 * Qn;
|
|
case 'R':
|
|
return 1.25 * Qn;
|
|
default:
|
|
return Qdflt;
|
|
}
|
|
}
|
|
}
|
|
}
|