/// /// Copyright (c) 2020 Sensus Slovensko a.s. /// using System; namespace DataStreamInterface { public enum Unit { None, pulse, degree, /// Volume ml, /// 1 ml = 0.001 l l, /// * 1 liter dm3, /// 1 dm3 = 1 l USgal, /// 1 US gallon = 3.78541178 l UKgal, /// 1 imperial gallon = 4.54609 l cf, /// 1 cubic foot = 28.316846592 l m3, /// 1 m3 = 1000 l /// Flow lph, /// 1 l/h = 0.001 m3/h lpm, /// 1 l/m = 60 l/h = 0.06 m3/h m3ph, /// * 1 m3/h lps, /// 1 liter/s = 3.6 m3/h USgalps, /// 1 US gallon per second = 13.627482408 m3/h m3pm, /// 1 m3/m = 60 m3/h cfs, /// 1 cubic foot per second = 101.9406477312 m3/h /// Mass g, /// 0.001 kg lb, /// 0.45359237 kg kg, /// * 1 kilogram t, /// 1000 kg /// Time ms, /// 1 ms = 0.001 s s, /// * 1 second = 1 s min, /// 1 min = 60 s hour, /// 1 hour = 60 min = 3600 s /// Temperature C, /// * degree Celsius (°C) F, /// degree Fahrenheit K, /// degree Kelvin /// Pressure Pa, /// 1 Pa = 0.01 hPa hPa, /// 1 hPa = 100 Pa mbar, /// 1 mbar = 1 hPa = 100 Pa kPa, /// 1 kPa = 10 HPa inHg, /// 1 inHg = 33.864 hPa psi, /// 1 psi = 0.0689475729 bar bar, /// * 1 Bar = 1000 mbar = 0.1 MPa = 100000 Pa MPa, /// 1 MPa = 10000 hPa /// Humidity RPct, /// * 1 R% /// Relative error Promile, /// 1 promile = 0.1 % Pct, /// * 1 % /// Length mm, /// * 1 millimeter cm, /// 1 cm = 10 mm inch, /// 1 inch = 25.4 mm dm, /// 1 dm = 100 mm foot, /// 1 foot = 304.8 mm yard, /// 1 yard = 914.4 mm m, /// 1 m = 1000 mm /// Density kgpm3, /// * 1 kg/m3 = 0.001 kg/l kgpl, /// 1 kg/l = 1000 kg/m3 /// Energy J, /// * 1 Joul kJ, /// 1 kJ = 1000 J MJ, /// 1 MJ = 1000000 J Wh, /// 1 Wh = 3600 J kWh, /// 1 kWh = 3600000 J MWh, /// 1 MWh = 3600000000 J /// Electrical conductivity uSpcm, /// * 1 uS/cm mSpm, /// 1 mS/m = 10 uS/cm /// Meter coefficient - volume ppl, /// * 1 pulse/l ppdm3, /// 1 pulse/dm3 degpl, /// 1 degree/l degpdm3, /// 1 degree/dm3 lpp, /// 1 l/pulse dm3pp, /// 1 dm3/pulse lpdeg, /// 1 l/degree dm3pdeg, /// 1 dm3/degree /// Meter coefficient - energy ppkWh, /// * 1 pulse/kWh kWhpp, /// 1 kWh/pulse } public enum Quantity { /// Quantities with units and conversions (double -> double) Volume, Flow, Mass, Time, Temperature, Pressure, Humidity, Error, Length, Density, Energy, Pulses, PulsePerLtr, PulsePerKWh, Conductivity, /// Quantities without units and conversions Number, String, Boolean, DateTime, Enumerated, } public static class Units { public static bool IsDefaultUnit(Unit unit) { return unit == Unit.l || unit == Unit.m3ph || unit == Unit.kg || unit == Unit.s || unit == Unit.C || unit == Unit.bar || unit == Unit.RPct || unit == Unit.Pct || unit == Unit.mm || unit == Unit.kgpm3 || unit == Unit.J || unit == Unit.uSpcm || unit == Unit.ppl || unit == Unit.ppkWh; } public static Quantity GetQuantity(Unit units) { switch (units) { case Unit.pulse: case Unit.degree: return Quantity.Pulses; case Unit.ml: case Unit.l: case Unit.dm3: case Unit.USgal: case Unit.UKgal: case Unit.cf: case Unit.m3: return Quantity.Volume; case Unit.lph: case Unit.lpm: case Unit.m3ph: case Unit.lps: case Unit.USgalps: case Unit.m3pm: case Unit.cfs: return Quantity.Flow; case Unit.g: case Unit.lb: case Unit.kg: case Unit.t: return Quantity.Mass; case Unit.ms: case Unit.s: case Unit.min: case Unit.hour: return Quantity.Time; case Unit.C: case Unit.F: case Unit.K: return Quantity.Temperature; case Unit.Pa: case Unit.hPa: case Unit.mbar: case Unit.kPa: case Unit.inHg: case Unit.psi: case Unit.bar: case Unit.MPa: return Quantity.Pressure; case Unit.RPct: return Quantity.Humidity; case Unit.Promile: case Unit.Pct: return Quantity.Error; case Unit.mm: case Unit.cm: case Unit.inch: case Unit.dm: case Unit.foot: case Unit.yard: case Unit.m: return Quantity.Length; case Unit.kgpm3: case Unit.kgpl: return Quantity.Density; case Unit.J: case Unit.kJ: case Unit.MJ: case Unit.Wh: case Unit.kWh: case Unit.MWh: return Quantity.Energy; case Unit.uSpcm: case Unit.mSpm: return Quantity.Conductivity; case Unit.ppl: case Unit.ppdm3: case Unit.degpl: case Unit.degpdm3: case Unit.lpp: case Unit.dm3pp: case Unit.lpdeg: case Unit.dm3pdeg: return Quantity.PulsePerLtr; case Unit.ppkWh: case Unit.kWhpp: return Quantity.PulsePerKWh; default: return Quantity.Number; } } public static double ConvertTo(Unit units, double v) { switch (units) { /// Volume: internal representation in l case Unit.ml: return 1000 * v; /// 1 l = 1000 ml case Unit.USgal: return 0.26417205 * v; /// 1 gal(US) = 3.78541178 l case Unit.UKgal: return 0.21996925 * v; /// 1 gal(UK) = 4.54609 l case Unit.cf: return 0.0353146667215 * v; /// 1 cubic foot = 28.316846592 l case Unit.m3: return 0.001 * v; /// 1 m3 = 1000 l /// Flow: internal representation in m3/h case Unit.lph: return 1000 * v; /// 1 l/h case Unit.lpm: return v / 0.06; /// 1 l/m case Unit.lps: return v / 3.6; /// 1 l/s case Unit.USgalps: return 0.733811257326 * v; /// 1 US gallon per second case Unit.m3pm: return v / 60; /// 1 m3/m case Unit.cfs: return 0.009809629644858 * v; /// 1 cubic foot per second /// Mass: internal representation in kg case Unit.g: return 1000 * v; /// 1 g = 0.001 kg case Unit.lb: return 2.2046226 * v; /// 1 lb = 0.45359237 kg case Unit.t: return 0.001 * v; /// 1 t = 1000 kg /// Time or duration: internal representation in seconds [s] case Unit.ms: return 1000 * v; case Unit.min: return v / 60; case Unit.hour: return v / 3600; /// Temperature: internal representation in °C case Unit.F: return 1.8 * v + 32; /// degree Fahrenheit case Unit.K: return v + 273.15; /// degree Kelvin /// Pressure: internal representation in bar = 0.1 MPa case Unit.Pa: return 100000 * v; case Unit.hPa: return 1000 * v; /// 1 hPa = 100 Pa case Unit.mbar: return 1000 * v; /// 1 mbar = 1 hPa = 100 Pa case Unit.kPa: return 100 * v; /// 1 kPa = 10 HPa case Unit.inHg: return 29.53 * v; /// 1 inHg = case Unit.psi: return 14.5037738 * v; /// 1 psi = case Unit.MPa: return 0.1 * v; /// 1 MPa = 10000 hPa /// Relative error: internal representation in % case Unit.Promile: return 10 * v; /// 1 promile = 0.1 % /// Diameter, length: internal representation in mm case Unit.cm: return 0.1 * v; /// 1 cm = 10 mm case Unit.inch: return v / 25.4; /// 1 inch = 25.4 mm case Unit.dm: return 0.01 * v; /// 1 dm = 100 mm case Unit.foot: return v / 304.8; /// 1 foot = 304.8 mm case Unit.yard: return v / 914.4; /// 1 yard = 914,4 mm case Unit.m: return 0.001 * v; /// 1 m = 1000 mm /// Density: internal representation in kg/m3 case Unit.kgpl: return 0.001 * v; /// Energy, internal representation in Joul case Unit.kJ: return 0.001 * v; /// 1 kJ = 1000 J case Unit.MJ: return 0.000001 * v; /// 1 kJ = 1000000 J case Unit.Wh: return v / 3600.0; /// 1 Wh = 3600 J case Unit.kWh: return v / 3600000.0; /// 1 kWh = 3600000 J case Unit.MWh: return v / 3600000000.0; /// 1 MWh = 3600000000 J /// Electrical conductivity case Unit.mSpm: return 0.1 * v; /// Invert pulses case Unit.kWhpp: case Unit.lpp: case Unit.dm3pp: case Unit.lpdeg: case Unit.dm3pdeg: return (v <= float.Epsilon) ? 0 : 1/v; default: return v; /// Do not convert } } public static double ConvertFrom(Unit units, double v) { switch (units) { /// Volume: internal representation in l case Unit.ml: return 0.001 * v; /// 0.001 l case Unit.USgal: return 3.78541178 * v; /// 1 gal(US) = 3.78541178 l case Unit.UKgal: return 4.54609 * v; /// 1 gal(UK) = 4.54609 l case Unit.cf: return 28.316846592 * v; /// 1 cubic foot = 28.316846592 l case Unit.m3: return 1000 * v; /// 1000 l /// Flow: internal representation in m3/h case Unit.lph: return 0.001 * v; /// 1 l/h case Unit.lpm: return 0.06 * v; /// 1 l/m case Unit.lps: return 3.6 * v; /// 1 l/s case Unit.USgalps: return 13.627482408 * v; /// 1 US gallon per second case Unit.m3pm: return 60 * v; /// 1 m3/m case Unit.cfs: return 101.9406477312 * v; /// 1 cubic foot per second /// Mass: internal representation in kg case Unit.g: return 0.001 * v; /// 1 g = 0.001 kg case Unit.lb: return 0.45359237 * v; /// 1 lb = 0.45359237 kg case Unit.t: return 1000 * v; /// 1 t = 1000 kg /// Time or duration: internal representation in seconds [s] case Unit.ms: return 0.001 * v; case Unit.min: return 60 * v; case Unit.hour: return 3600 * v; /// Temperature: internal representation in °C case Unit.F: return 5 * (v - 32) / 9; /// degree Fahrenheit case Unit.K: return v - 273.15; /// degree Kelvin /// Pressure: internal representation in bar = 0.1 MPa case Unit.Pa: return 0.00001 * v; /// 1 hPa = 100 Pa case Unit.hPa: return 0.001 * v; /// 1 hPa = 100 Pa case Unit.mbar: return 0.001 * v; /// 1 mbar = 1 hPa = 100 Pa case Unit.kPa: return 0.01 * v; /// 1 kPa = 10 HPa case Unit.inHg: return 0.033864 * v; /// 1 inHg = 33.864 hPa case Unit.psi: return 0.0689475729 * v; /// 1 psi = 0.0689475729 bar case Unit.MPa: return 10 * v; /// 1 MPa = 10000 hPa /// Relative error: internal representation in % case Unit.Promile: return 0.1 * v; /// 1 promile = 0.1 % /// Diameter, length: internal representation in mm case Unit.cm: return 10 * v; /// 1 cm = 10 mm case Unit.inch: return 25.4 * v; /// 1 inch = 25.4 mm case Unit.dm: return 100 * v; /// 1 dm = 100 mm case Unit.foot: return 304.8 * v; /// 1 foot = 304.8 mm case Unit.yard: return 914.4 * v; /// 1 yard = 914,4 mm case Unit.m: return 1000 * v; /// 1 m = 1000 mm /// Density: internal representation in kg/m3 case Unit.kgpl: return 1000 * v; /// Energy, internal representation in Joul case Unit.kJ: return 1000 * v; /// 1 kJ = 1000 J case Unit.MJ: return 1000000 * v; /// 1 kJ = 1000000 J case Unit.Wh: return 3600 * v; /// 1 Wh = 3600 J case Unit.kWh: return 3600000 * v; /// 1 kWh = 3600000 J case Unit.MWh: return 3600000000 * v; /// 1 kWh = 3600000000 J /// Electrical conductivity case Unit.mSpm: return 10 * v; /// Invert case Unit.kWhpp: case Unit.lpp: case Unit.dm3pp: case Unit.lpdeg: case Unit.dm3pdeg: return (v <= float.Epsilon) ? 0 : 1/v; default: return v; /// Do not convert } } } }