コード例 #1
0
        private uint DeviceLParam()
        {
            UInt32 lParam = MultiClampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel);

            // Pack the above two into an UInt32
            return(lParam);
        }
コード例 #2
0
        public void ShouldDetermineUnitExponent()
        {
            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_A), Is.EqualTo(1));
            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_mA), Is.EqualTo(-3));
            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_uA), Is.EqualTo(-6));
            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_nA), Is.EqualTo(-9));
            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_pA), Is.EqualTo(-12));


            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_V), Is.EqualTo(1));
            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_mV), Is.EqualTo(-3));
            Assert.That(MultiClampInterop.ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits.V_uV), Is.EqualTo(-6));
        }
コード例 #3
0
        void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                if (disposing)
                {
                    //Handle manage object disposal

                    // This object will be cleaned up by the Dispose method.
                    // Therefore, you should call GC.SupressFinalize to
                    // take this object off the finalization queue
                    // and prevent finalization code for this object
                    // from executing a second time.
                    GC.SuppressFinalize(this);
                }

                UInt32 lParam = MultiClampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel); // Pack the above two into an UInt32
                int    result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MultiClampInterop.MCTG_CLOSE_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam);

                // Note disposing has been done.
                _disposed = true;
            }
        }
コード例 #4
0
 private static int ExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits scaleFactorUnits)
 {
     switch (scaleFactorUnits)
     {
         case MultiClampInterop.ScaleFactorUnits.V_V:
             return 0;
         case MultiClampInterop.ScaleFactorUnits.V_mV:
             return -3;
         case MultiClampInterop.ScaleFactorUnits.V_uV:
             return -6;
         case MultiClampInterop.ScaleFactorUnits.V_A:
             return 0;
         case MultiClampInterop.ScaleFactorUnits.V_mA:
             return -3;
         case MultiClampInterop.ScaleFactorUnits.V_uA:
             return -6;
         case MultiClampInterop.ScaleFactorUnits.V_nA:
             return -9;
         case MultiClampInterop.ScaleFactorUnits.V_pA:
             return -12;
         default:
             throw new ArgumentOutOfRangeException("scaleFactorUnits");
     }
 }
コード例 #5
0
 private static int DesiredUnitsExponentForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits scaleFactorUnits)
 {
     switch (scaleFactorUnits)
     {
         case MultiClampInterop.ScaleFactorUnits.V_V:
         case MultiClampInterop.ScaleFactorUnits.V_mV:
         case MultiClampInterop.ScaleFactorUnits.V_uV:
             return MEMBRANE_VOLTAGE_INPUT_EXPONENT;
         case MultiClampInterop.ScaleFactorUnits.V_A:
         case MultiClampInterop.ScaleFactorUnits.V_mA:
         case MultiClampInterop.ScaleFactorUnits.V_uA:
         case MultiClampInterop.ScaleFactorUnits.V_nA:
         case MultiClampInterop.ScaleFactorUnits.V_pA:
             return MEMBRANE_CURRENT_INPUT_EXPONENT;
         default:
             throw new ArgumentOutOfRangeException("scaleFactorUnits");
     }
 }
コード例 #6
0
        private static Measurement ConvertVClampInput(IMeasurement sample, MultiClampInterop.MulticlampData deviceParams)
        {
            switch (deviceParams.ScaledOutputSignal)
            {

                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_PRI_VC_GLDR_I_MEMB:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_SEC_VC_GLDR_I_MEMB:

                    CheckScaleFactorUnits(deviceParams, new[] {
                            MultiClampInterop.ScaleFactorUnits.V_A,
                            MultiClampInterop.ScaleFactorUnits.V_mA,
                            MultiClampInterop.ScaleFactorUnits.V_nA,
                            MultiClampInterop.ScaleFactorUnits.V_uA,
                            MultiClampInterop.ScaleFactorUnits.V_pA
                        });
                    break;

                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_PRI_VC_GLDR_V_CMD_SUMMED:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_PRI_VC_GLDR_V_CMD_MEMB:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_PRI_VC_GLDR_V_CMD_MEMBx100:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_PRI_VC_GLDR_V_CMD_EXT:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_SEC_VC_GLDR_V_CMD_MEMBx10:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_SEC_VC_GLDR_V_CMD_SUMMED:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_SEC_VC_GLDR_V_CMD_MEMBx100:
                case MultiClampInterop.SignalIdentifier.AXMCD_OUT_SEC_VC_GLDR_V_CMD_EXT:
                    CheckScaleFactorUnits(deviceParams, new[] {
                            MultiClampInterop.ScaleFactorUnits.V_mV,
                            MultiClampInterop.ScaleFactorUnits.V_uV,
                            MultiClampInterop.ScaleFactorUnits.V_V
                        });
                    break;
                default:
                    log.ErrorFormat("MultiClamp scaled output signal is not a valid VClamp mode: {0}", deviceParams.ScaledOutputSignal);
                    throw new ArgumentOutOfRangeException();
            }

            return ConvertInputMeasurement(sample, deviceParams);
        }
コード例 #7
0
        private static Measurement ConvertInputMeasurement(IMeasurement sample, MultiClampInterop.MulticlampData deviceParams)
        {
            var desiredUnitsMultiplier = (decimal) Math.Pow(10,
                                                            (ExponentForScaleFactorUnits(deviceParams.ScaleFactorUnits) -
                                                             DesiredUnitsExponentForScaleFactorUnits(
                                                                 deviceParams.ScaleFactorUnits))
                                                       );

            return
                new Measurement(
                    (sample.QuantityInBaseUnit/(decimal) deviceParams.ScaleFactor/(decimal) deviceParams.Alpha)*
                    desiredUnitsMultiplier,
                    DesiredUnitsExponentForScaleFactorUnits(deviceParams.ScaleFactorUnits),
                    UnitsForScaleFactorUnits(deviceParams.ScaleFactorUnits));
        }
コード例 #8
0
 private static void CheckScaleFactorUnits(MultiClampInterop.MulticlampData deviceParams, MultiClampInterop.ScaleFactorUnits[] allowedScaleFactorUnits)
 {
     if (!allowedScaleFactorUnits.Contains(deviceParams.ScaleFactorUnits))
         throw new MultiClampDeviceException(deviceParams.ScaleFactorUnits + " is not an allowed unit conversion for scaled output mode.");
 }
コード例 #9
0
 private void OnParametersChanged(MultiClampInterop.MulticlampData data)
 {
     lock (_eventLock)
     {
         var temp = ParametersChanged;
         if (temp != null)
         {
             temp(this, new MultiClampParametersChangedArgs(Clock, data));
         }
     }
 }
コード例 #10
0
 private void OnParametersChanged(MultiClampInterop.MulticlampData data)
 {
     lock (_eventLock)
     {
         if (ParametersChanged != null)
         {
             ParametersChanged(this, new MultiClampParametersChangedArgs(Clock, data));
         }
     }
 }
コード例 #11
0
        public static Measurement ConvertOutput(IMeasurement sample, MultiClampInterop.MulticlampData deviceParams)
        {
            switch (deviceParams.OperatingMode)
            {
                //Output cmd in Volts
                case MultiClampInterop.OperatingMode.VClamp:

                    if (string.Compare(sample.BaseUnit, "V", false) != 0) //output
                    {
                        throw new ArgumentException("Sample units must be in Volts.", "sample.BaseUnit");
                    }

                    if (deviceParams.ExternalCommandSensitivityUnits != MultiClampInterop.ExternalCommandSensitivityUnits.V_V)
                    {
                        throw new MultiClampDeviceException("External command units are not V/V as expected for current deivce mode.");
                    }

                    break;
                //Output cmd in amps
                case MultiClampInterop.OperatingMode.IClamp:
                    if (deviceParams.ExternalCommandSensitivityUnits != MultiClampInterop.ExternalCommandSensitivityUnits.A_V)
                    {
                        log.ErrorFormat("External Command Sensitivity Units " + deviceParams.ExternalCommandSensitivityUnits + " do not match expected (" + MultiClampInterop.ExternalCommandSensitivityUnits.A_V + ")");
                        throw new MultiClampDeviceException("External command units " + deviceParams.ExternalCommandSensitivityUnits + " are not A/V as expected for current deivce mode.");
                    }

                    if (string.Compare(sample.BaseUnit, "A", false) != 0) //output
                    {
                        throw new ArgumentException("Sample units must be in Amps.", "sample.BaseUnit");
                    }

                    break;

                case MultiClampInterop.OperatingMode.I0:
                    if (! (deviceParams.ExternalCommandSensitivityUnits == MultiClampInterop.ExternalCommandSensitivityUnits.A_V ||
                        deviceParams.ExternalCommandSensitivityUnits == MultiClampInterop.ExternalCommandSensitivityUnits.OFF))
                    {
                        log.ErrorFormat("External Command Sensitivity Units " + deviceParams.ExternalCommandSensitivityUnits + " do not match expected (" + MultiClampInterop.ExternalCommandSensitivityUnits.A_V + ")");
                        throw new MultiClampDeviceException("External command units " + deviceParams.ExternalCommandSensitivityUnits + " are not A/V as expected for current deivce mode.");
                    }

                    if (string.Compare(sample.BaseUnit, "A", false) != 0) //output
                    {
                        throw new ArgumentException("Sample units must be in Amps.", "sample.BaseUnit");
                    }

                    break;

                default:
                    throw new ArgumentOutOfRangeException();

            }

            return deviceParams.OperatingMode == MultiClampInterop.OperatingMode.I0 ?
                new Measurement(0, "V") :
                new Measurement(sample.QuantityInBaseUnit / (decimal)deviceParams.ExternalCommandSensitivity, sample.Exponent, "V");
        }
コード例 #12
0
 public static Measurement ConvertInput(IMeasurement sample, MultiClampInterop.MulticlampData deviceParams)
 {
     switch (deviceParams.OperatingMode)
     {
         case MultiClampInterop.OperatingMode.VClamp:
             return ConvertVClampInput(sample, deviceParams);
         case MultiClampInterop.OperatingMode.IClamp:
         case MultiClampInterop.OperatingMode.I0:
             return ConvertIClampInput(sample, deviceParams);
         default:
             throw new ArgumentOutOfRangeException();
     }
 }
コード例 #13
0
        private void BackgroundTest(MultiClampInterop.OperatingMode operatingMode,
            string units,
            MultiClampInterop.ExternalCommandSensitivityUnits extSensUnits)
        {
            var c = new Controller();
            var mc = new FakeMulticlampCommander();

            var bg = new Measurement(2, -3, units);

            var background = new Dictionary<MultiClampInterop.OperatingMode, IMeasurement>() { { operatingMode, bg } };
            var mcd = new MultiClampDevice(mc, c, background);
            mcd.BindStream(new DAQOutputStream(UNUSED_NAME));

            var data = new MultiClampInterop.MulticlampData()
                           {
                               OperatingMode = operatingMode,
                               ExternalCommandSensitivity = 2.5,
                               ExternalCommandSensitivityUnits = extSensUnits
                           };

            mc.FireParametersChanged(DateTimeOffset.Now, data);

            var expected = operatingMode == MultiClampInterop.OperatingMode.I0 ?
                new Measurement(0, "V") :
                new Measurement(bg.QuantityInBaseUnit / (decimal)data.ExternalCommandSensitivity, bg.Exponent, "V");

            mc.FireParametersChanged(DateTimeOffset.Now.Subtract(TimeSpan.FromHours(1)), data);

            var actual = mcd.OutputBackground;

            Assert.That(actual, Is.EqualTo(expected));
        }
コード例 #14
0
 public void FireParametersChanged(DateTimeOffset time, MultiClampInterop.MulticlampData data)
 {
     var clock = new FakeClock(time);
     var args = new MultiClampParametersChangedArgs(clock, data);
     ParametersChanged(this, args);
 }
コード例 #15
0
        private static IDictionary<string, object> MergeDeviceParametersIntoConfiguration(IDictionary<string, object> config,
            MultiClampInterop.MulticlampData deviceParameters)
        {
            var result = config == null ?
                new Dictionary<string, object>() :
                new Dictionary<string, object>(config);

            result["Alpha"] = deviceParameters.Alpha;
            result["AppVersion"] = deviceParameters.AppVersion;
            result["DSPVersion"] = deviceParameters.DSPVersion;
            result["ExternalCommandSensitivity"] = deviceParameters.ExternalCommandSensitivity;
            result["ExternalCommandSensitivityUnits"] = deviceParameters.ExternalCommandSensitivityUnits.ToString();
            result["FirmwareVersion"] = deviceParameters.FirmwareVersion;
            result["HardwareType"] = deviceParameters.HardwareType.ToString();
            result["LPFCutoff"] = deviceParameters.LPFCutoff;
            result["MembraneCapacitance"] = deviceParameters.MembraneCapacitance;
            result["OperatingMode"] = deviceParameters.OperatingMode.ToString();
            result["RawOutputSignal"] = deviceParameters.RawOutputSignal.ToString();
            result["RawScaleFactor"] = deviceParameters.RawScaleFactor;
            result["RawScaleFactorUnits"] = deviceParameters.RawScaleFactorUnits.ToString();
            result["ScaledOutputSignal"] = deviceParameters.ScaledOutputSignal.ToString();
            result["ScaleFactor"] = deviceParameters.ScaleFactor;
            result["ScaleFactorUnits"] = deviceParameters.ScaleFactorUnits.ToString();
            result["SecondaryAlpha"] = deviceParameters.SecondaryAlpha;
            result["SecondaryLPFCutoff"] = deviceParameters.SecondaryLPFCutoff;
            result["SerialNumber"] = deviceParameters.SerialNumber;

            return result;
        }
コード例 #16
0
 /// <summary>
 /// Gets the device's background for a particular mode.
 /// </summary>
 /// <param name="operatingMode">Device operating mode</param>
 /// <returns>Background Measurement for the given mode.</returns>
 public IMeasurement BackgroudForMode(MultiClampInterop.OperatingMode operatingMode)
 {
     return Backgrounds[operatingMode];
 }
コード例 #17
0
        private static string UnitsForScaleFactorUnits(MultiClampInterop.ScaleFactorUnits scaleFactorUnits)
        {
            switch (scaleFactorUnits)
            {
                case MultiClampInterop.ScaleFactorUnits.V_V:
                case MultiClampInterop.ScaleFactorUnits.V_mV:
                case MultiClampInterop.ScaleFactorUnits.V_uV:
                    return "V";

                case MultiClampInterop.ScaleFactorUnits.V_A:
                case MultiClampInterop.ScaleFactorUnits.V_mA:
                case MultiClampInterop.ScaleFactorUnits.V_uA:
                case MultiClampInterop.ScaleFactorUnits.V_nA:
                case MultiClampInterop.ScaleFactorUnits.V_pA:
                    return "A";
                default:
                    throw new ArgumentOutOfRangeException("scaleFactorUnits");
            }
        }
コード例 #18
0
 /// <summary>
 /// Sets the device background for a particular operating mode.
 /// </summary>
 /// <param name="operatingMode">Device operating mode</param>
 /// <param name="background">Desired background</param>
 public void SetBackgroundForMode(MultiClampInterop.OperatingMode operatingMode, IMeasurement background)
 {
     Backgrounds[operatingMode] = background;
 }
コード例 #19
0
 public MultiClampParametersChangedArgs(IClock clock, MultiClampInterop.MulticlampData data)
     : base(clock)
 {
     this.Data = data;
 }
コード例 #20
0
        private static IMeasurement ConvertIClampInput(IMeasurement sample, MultiClampInterop.MulticlampData deviceParams)
        {
            if (deviceParams.HardwareType == MultiClampInterop.HardwareType.MCTG_HW_TYPE_MC700A)
            {
                switch (deviceParams.ScaledOutputSignal700A)
                {
                    case MultiClampInterop.SignalIdentifier700A.MCTG_OUT_MUX_I_CMD_SUMMED:
                    case MultiClampInterop.SignalIdentifier700A.MCTG_OUT_MUX_V_CMD_SUMMED:
                        CheckScaleFactorUnits(deviceParams, new[]
                            {
                                MultiClampInterop.ScaleFactorUnits.V_A,
                                MultiClampInterop.ScaleFactorUnits.V_mA,
                                MultiClampInterop.ScaleFactorUnits.V_nA,
                                MultiClampInterop.ScaleFactorUnits.V_uA,
                                MultiClampInterop.ScaleFactorUnits.V_pA
                            });
                        break;
                    case MultiClampInterop.SignalIdentifier700A.MCTG_OUT_MUX_I_CMD_EXT:
                    case MultiClampInterop.SignalIdentifier700A.MCTG_OUT_MUX_V_CMD_EXT:
                    case MultiClampInterop.SignalIdentifier700A.MCTG_OUT_MUX_V_MEMBRANE:
                    case MultiClampInterop.SignalIdentifier700A.MCTG_OUT_MUX_V_MEMBRANEx100:
                        CheckScaleFactorUnits(deviceParams, new[]
                            {
                                MultiClampInterop.ScaleFactorUnits.V_mV,
                                MultiClampInterop.ScaleFactorUnits.V_uV,
                                MultiClampInterop.ScaleFactorUnits.V_V
                            });
                        break;
                    default:
                        log.ErrorFormat("MultiClamp scaled output signal is not a valid IClamp mode: {0}",
                                        deviceParams.ScaledOutputSignal700A);
                        throw new ArgumentOutOfRangeException();
                }
            }
            else
            {
                //MultiClampInterop.SignalIdentifier.AXMCD_OUT_PRI_IC_GLDR_I_CMD_MEMB,
                //              MultiClampInterop.SignalIdentifier.AXMCD_OUT_PRI_IC_GLDR_I_CMD_SUMMED
                switch (deviceParams.ScaledOutputSignal700B)
                {
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_PRI_IC_GLDR_I_CMD_MEMB:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_PRI_IC_GLDR_I_CMD_SUMMED:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_SEC_IC_GLDR_I_CMD_MEMB:
                        CheckScaleFactorUnits(deviceParams, new[]
                            {
                                MultiClampInterop.ScaleFactorUnits.V_A,
                                MultiClampInterop.ScaleFactorUnits.V_mA,
                                MultiClampInterop.ScaleFactorUnits.V_nA,
                                MultiClampInterop.ScaleFactorUnits.V_uA,
                                MultiClampInterop.ScaleFactorUnits.V_pA
                            });
                        break;
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_PRI_IC_GLDR_MIN:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_PRI_IC_GLDR_MAX:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_PRI_IC_GLDR_V_MEMBx100:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_PRI_IC_GLDR_I_CMD_EXT:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_PRI_IC_GLDR_AUX1:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_SEC_IC_GLDR_MIN:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_SEC_IC_GLDR_MAX:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_SEC_IC_GLDR_V_MEMB:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_SEC_IC_GLDR_V_MEMBx100:
                    case MultiClampInterop.SignalIdentifier700B.AXMCD_OUT_SEC_IC_GLDR_I_CMD_EXT:
                        CheckScaleFactorUnits(deviceParams, new[]
                            {
                                MultiClampInterop.ScaleFactorUnits.V_mV,
                                MultiClampInterop.ScaleFactorUnits.V_uV,
                                MultiClampInterop.ScaleFactorUnits.V_V
                            });
                        break;
                    default:
                        log.ErrorFormat("MultiClamp scaled output signal is not a valid IClamp mode: {0}",
                                        deviceParams.ScaledOutputSignal700B);
                        throw new ArgumentOutOfRangeException();
                }
            }

            return ConvertInputMeasurement(sample, deviceParams);
        }