private uint DeviceLParam() { UInt32 lParam = MultiClampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel); // Pack the above two into an UInt32 return(lParam); }
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)); }
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; } }
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"); } }
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"); } }
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); }
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)); }
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."); }
private void OnParametersChanged(MultiClampInterop.MulticlampData data) { lock (_eventLock) { var temp = ParametersChanged; if (temp != null) { temp(this, new MultiClampParametersChangedArgs(Clock, data)); } } }
private void OnParametersChanged(MultiClampInterop.MulticlampData data) { lock (_eventLock) { if (ParametersChanged != null) { ParametersChanged(this, new MultiClampParametersChangedArgs(Clock, data)); } } }
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"); }
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(); } }
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)); }
public void FireParametersChanged(DateTimeOffset time, MultiClampInterop.MulticlampData data) { var clock = new FakeClock(time); var args = new MultiClampParametersChangedArgs(clock, data); ParametersChanged(this, args); }
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; }
/// <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]; }
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"); } }
/// <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; }
public MultiClampParametersChangedArgs(IClock clock, MultiClampInterop.MulticlampData data) : base(clock) { this.Data = data; }
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); }