示例#1
0
        /// <summary>
        /// Convert from one Measurement to another. This takes care of finding
        /// a ConvertProc out of the converters dictionary and applies it; throws
        /// an Exception if the (incoming.BaseUnit -> outgoingUnits) converter
        /// function cannot be found.
        /// </summary>
        /// <param name="from">The Measurement to convert</param>
        /// <param name="to">The units of measure to convert to</param>
        /// <returns>Converted Measurement</returns>
        public static IMeasurement Convert(IMeasurement from, string to)
        {
            // Identity transformation always works. We do handle
            // differences in exponent

            if (_SIUnits.BaseUnit(to) == from.BaseUnit)
            {
                if (_SIUnits.Exponent(to) == from.Exponent)
                {
                    return(from);
                }

                var toExp   = _SIUnits.Exponent(to);
                var expDiff = from.Exponent - toExp;
                return(new Measurement(from.Quantity * (decimal)Math.Pow(10, expDiff), toExp, _SIUnits.BaseUnit(to)));
            }

            // Can we find a converter for these two units? Use TryGetValue()
            // to avoid the KeyNotFoundException that gets thrown using the
            // traditional [] lookup--we want to throw our own exception.
            //
            ConvertProc converter = null;

            if (converters.TryGetValue(new Tuple <string, string>(from.BaseUnit, to), out converter))
            {
                return(converter(from));
            }

            // I dunno what the hell you're trying to convert
            //
            throw new Exception(
                      String.Format(
                          "Unrecognized Measurement conversion: {0} to {1}",
                          from.BaseUnit, to));
        }
示例#2
0
        public void InputDataConversion()
        {
            IDictionary <string, object> config = new Dictionary <string, object>(2);

            config["param1"] = 10;
            config["param2"] = 1;

            IMeasurement srate = new Measurement(1000, "Hz");


            IInputData data = new InputData(this.Data,
                                            srate,
                                            DateTimeOffset.Now,
                                            new PipelineNodeConfiguration(IOData.STREAM_CONFIGURATION_NAME, new Dictionary <string, object>()))
                              .DataWithExternalDeviceConfiguration(devFake, new Dictionary <string, object>());


            Converters.Clear();
            ConvertProc fooConversion = (m) => new Measurement(m.QuantityInBaseUnit * 10, 1, "foo");

            Converters.Register("V", "foo", fooConversion);

            IInputData expected = new InputData(data,
                                                data.Data.Select(m => new Measurement(m.QuantityInBaseUnit * 10, 1, "foo")).ToList());

            Assert.NotNull(expected.NodeConfigurationWithName(IOData.STREAM_CONFIGURATION_NAME));
            IInputData actual = data.DataWithUnits("foo");

            Assert.AreEqual(expected.Data, actual.Data);
            Assert.That(actual.NodeConfigurationWithName(IOData.EXTERNAL_DEVICE_CONFIGURATION_NAME),
                        Is.EqualTo(expected.NodeConfigurationWithName(IOData.EXTERNAL_DEVICE_CONFIGURATION_NAME)));
            Assert.That(actual.NodeConfigurationWithName(IOData.STREAM_CONFIGURATION_NAME),
                        Is.EqualTo(expected.NodeConfigurationWithName(IOData.STREAM_CONFIGURATION_NAME)));
            Assert.AreEqual(expected.InputTime, actual.InputTime);
        }
示例#3
0
        /// <summary>
        /// Register a ConvertProc routine as the code to use when converting
        /// a Measurement from the "from" units to the "to" units
        /// </summary>
        /// <param name="from">The unit type converting from</param>
        /// <param name="to">The unit type to conver to</param>
        /// <param name="proc">The code to do the conversion</param>
        public static void Register(string from, string to, ConvertProc proc)
        {
            // Overwrite on duplication
            ConvertProc obj;

            if (converters.TryGetValue(new Tuple <string, string>(from, to), out obj))
            {
                converters.Remove(new Tuple <string, string>(from, to));
            }

            converters.Add(new Tuple <string, string>(from, to), proc);
        }
示例#4
0
        public void InputDataConversionViaProc()
        {
            IDictionary <string, object> config = new Dictionary <string, object>(2);

            config["param1"] = 10;
            config["param2"] = 1;

            IMeasurement srate = new Measurement(1000, "Hz");


            IOutputData outData = new OutputData(this.Data,
                                                 srate, false)
                                  .DataWithExternalDeviceConfiguration(devFake, new Dictionary <string, object>())
                                  .DataWithStreamConfiguration(streamFake, new Dictionary <string, object>());

            outData.OutputTime = DateTimeOffset.Now;

            Converters.Clear();
            ConvertProc fooConversion = (m) => new Measurement(m.QuantityInBaseUnit * 10, 1, "foo");

            Converters.Register("V", "foo", fooConversion);

            IOutputData expected = new OutputData(outData,
                                                  outData.Data.Select(m => new Measurement(m.QuantityInBaseUnit * 10, 1, "foo")).ToList())
            {
                OutputTime = outData.OutputTime
            };


            IOutputData actual = outData.DataWithConversion((m) => new Measurement(m.QuantityInBaseUnit * 10, 1, "foo"));

            Assert.AreEqual(expected.Data, actual.Data);
            Assert.AreEqual(expected.NodeConfigurationWithName(IOData.EXTERNAL_DEVICE_CONFIGURATION_NAME),
                            actual.NodeConfigurationWithName(IOData.EXTERNAL_DEVICE_CONFIGURATION_NAME));
            Assert.AreEqual(expected.NodeConfigurationWithName(IOData.STREAM_CONFIGURATION_NAME),
                            actual.NodeConfigurationWithName(IOData.STREAM_CONFIGURATION_NAME));
            Assert.AreEqual(expected.OutputTime, actual.OutputTime);
        }