public void SetDacChannelDataValueA(ChannelAddress channelAddress, ushort value)
        {
            if (channelAddress < ChannelAddress.Dac0 || channelAddress > ChannelAddress.Dac39)
            {
                throw new ArgumentOutOfRangeException(nameof(channelAddress));
            }
            using (_lockFactory.GetLock(LockType.CommandLock))
            {
                var val = _evalBoard.DeviceState.Precision == DacPrecision.SixteenBit
                    ? value
                    : (ushort)(value & (ushort)BasicMasks.HighFourteenBits);

                if (_evalBoard.DeviceState.UseRegisterCache &&
                    val == _evalBoard.DeviceState.X1ARegisters[channelAddress.ToChannelNumber()])
                {
                    return;
                }
                var controlRegisterBits = _readbackControlRegisterCommand.ReadbackControlRegister() &
                                          ControlRegisterBits.WritableBits;
                controlRegisterBits &=
                    ~ControlRegisterBits
                    .InputRegisterSelect;     //set control register bit F2 =0 to select register X1A for input
                _writeControlRegisterCommand.WriteControlRegister(controlRegisterBits);

                _sendSPICommand.SendSPI((uint)SerialInterfaceModeBits.WriteToDACInputDataRegisterX |
                                        (uint)(((byte)channelAddress & (byte)BasicMasks.SixBits) << 16) |
                                        val);
                _evalBoard.DeviceState.X1ARegisters[channelAddress.ToChannelNumber()] = val;
            }
        }
 public ushort ReadbackX1BRegister(ChannelAddress channelAddress)
 {
     using (_lockFactory.GetLock(LockType.CommandLock))
     {
         if (channelAddress < ChannelAddress.Dac0 || channelAddress > ChannelAddress.Dac39)
         {
             throw new ArgumentOutOfRangeException(nameof(channelAddress));
         }
         if (_evalBoard.DeviceState.UseRegisterCache &&
             _evalBoard.DeviceState.X1BRegisters[channelAddress.ToChannelNumber()].HasValue)
         {
             var deviceStateX1BRegister = _evalBoard.DeviceState.X1BRegisters[channelAddress.ToChannelNumber()];
             if (deviceStateX1BRegister != null)
             {
                 return(deviceStateX1BRegister.Value);
             }
         }
         _sendSpecialFunctionCommand.SendSpecialFunction(SpecialFunctionCode.SelectRegisterForReadback,
                                                         (ushort)((ushort)AddressCodesForDataReadback.X1BRegister |
                                                                  (ushort)(((byte)channelAddress & (byte)BasicMasks.SixBits) << 7)));
         var val = _readSPICommand.ReadSPI();
         if (_evalBoard.DeviceState.Precision == DacPrecision.FourteenBit)
         {
             val &= (ushort)BasicMasks.HighFourteenBits;
         }
         _evalBoard.DeviceState.X1BRegisters[channelAddress.ToChannelNumber()] = val;
         return(val);
     }
 }
        public void SetDacChannelGain(ChannelAddress channelAddress, ushort value)
        {
            if (channelAddress < ChannelAddress.Dac0 || channelAddress > ChannelAddress.Dac39)
            {
                throw new ArgumentOutOfRangeException(nameof(channelAddress));
            }

            var val = _evalBoard.DeviceState.Precision == DacPrecision.SixteenBit
                ? value
                : (ushort)(value & (ushort)BasicMasks.HighFourteenBits);

            if (!_evalBoard.DeviceState.UseRegisterCache ||
                val != _evalBoard.DeviceState.MRegisters[channelAddress.ToChannelNumber()])
            {
                using (_lockFactory.GetLock(LockType.CommandLock))
                {
                    _setCLRPinLowCommand.SetCLRPinLow();
                    _sendSPICommand.SendSPI((uint)SerialInterfaceModeBits.WriteToDACGainRegisterM |
                                            (uint)(((byte)channelAddress & (byte)BasicMasks.SixBits) << 16) |
                                            val);
                    _evalBoard.DeviceState.MRegisters[channelAddress.ToChannelNumber()] = val;
                    _setCLRPinHighCommand.SetCLRPinHigh();
                }
            }
        }
Exemplo n.º 4
0
 public void ShouldThrowExceptionIfArgumentsAreOutOfRange(
     [Values((int)(ChannelAddress.Dac0 - 1), (int)(ChannelAddress.Dac39 + 1))] ChannelAddress channelAddress,
     [Values((int)(DacChannelDataSource.DataValueA - 1), (int)(DacChannelDataSource.DataValueB + 1))]
     DacChannelDataSource dacChannelDataSource)
 {
     Assert.Throws <ArgumentOutOfRangeException>(
         () => WhenSetDacChannelDataSourceInternal(channelAddress, dacChannelDataSource));
 }
Exemplo n.º 5
0
 private void GivenCRegisterBits(ChannelAddress channelAddress, ushort cRegisterValue)
 {
     Mock.Get(_fakeRb)
     .Setup(x => x.ReadbackCRegister(channelAddress))
     .Returns((ushort)(cRegisterValue & (_deviceState.Precision == DacPrecision.SixteenBit
                                ? (ushort)BasicMasks.SixteenBits
                                : (ushort)BasicMasks.HighFourteenBits)));
 }
 public void ShouldSetDacChannelDataSource
 (
     [Range((int)ChannelAddress.Dac0, (int)ChannelAddress.Dac39)] ChannelAddress channelAddress,
     [Values] DacChannelDataSource dacChannelDataSource
 )
 {
     WhenSetDacChannelDataSource(channelAddress, dacChannelDataSource);
     ThenCallShouldBeDelegatedToSetDacChannelDataSourceInternalCommand(channelAddress, dacChannelDataSource);
 }
Exemplo n.º 7
0
 public void ShouldUpdateCorrectABSelectRegister(
     ChannelAddress channelAddress,
     DacChannelDataSource dacChannelDataSource,
     int registerNum
     )
 {
     WhenSetDacChannelDataSourceInternal(channelAddress, dacChannelDataSource);
     ThenABSelectRegisterUpdatedShouldBe(registerNum);
 }
Exemplo n.º 8
0
 public void ShouldReturnCorrectDacChannelDataSource(
     int abSelectRegisterNumber,
     uint?abSelectRegisterValue,
     ChannelAddress dacChannelAddress,
     DacChannelDataSource expectedDacChannelDataSource)
 {
     GivenABSelectRegisterValue(abSelectRegisterNumber, (ABSelectRegisterBits?)abSelectRegisterValue);
     WhenGetDacChannelDataSource(dacChannelAddress);
     ThenDacChannelDataSourceShouldBe(expectedDacChannelDataSource);
 }
 public void ShouldSetDacChannelDataSourceAllChannelsInSameGroup(
     ChannelAddress channelAddress,
     DacChannelDataSource dacChannelDataSource,
     byte specialFunctionCode,
     ushort data
     )
 {
     WhenSetDacChannelDataSource(channelAddress, dacChannelDataSource);
     ThenSendSpecialFunctionCommandShouldBeCalled((SpecialFunctionCode)specialFunctionCode, data);
 }
 private static uint DataForSPI(DacPrecision dacPrecision, ChannelAddress channelAddress, ushort dacChannelGain)
 {
     return
         ((uint)SerialInterfaceModeBits.WriteToDACGainRegisterM
          | (uint)(((byte)channelAddress & (byte)BasicMasks.SixBits) << 16)
          | (dacChannelGain &
             (dacPrecision == DacPrecision.SixteenBit
                ? (uint)BasicMasks.SixteenBits
                : (uint)BasicMasks.HighFourteenBits)));
 }
 public void ShouldThrowExceptionIfArgumentsAreOutOfRange(
     [Values((int)(ChannelAddress.AllGroupsAllChannels - 1), (int)(ChannelAddress.Group1Through4Channel7 + 1))]
     ChannelAddress channelAddress,
     [Values((int)(ChannelAddress.AllGroupsAllChannels - 1), (int)(ChannelAddress.Group1Through4Channel7 + 1),
             6, 7)] DacChannelDataSource dacChannelDataSource
     )
 {
     Assert.Throws <ArgumentOutOfRangeException>(
         () => WhenSetDacChannelDataSource(channelAddress, dacChannelDataSource));
 }
Exemplo n.º 12
0
 public void ShouldSendSPI(
     [Values(DacPrecision.SixteenBit, DacPrecision.FourteenBit)] DacPrecision dacPrecision,
     [Range((int)ChannelAddress.Dac0, (int)ChannelAddress.Dac39)] ChannelAddress channelAddress,
     [Values(ushort.MinValue, 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8, 1 << 9, 1 << 10,
             1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, ushort.MaxValue)] int dacChannelDataValueA)
 {
     GivenDACPrecision(dacPrecision);
     WhenSetDacChannelDataValueA(channelAddress, (ushort)dacChannelDataValueA);
     ThenSPICommandIsSent(DataForSPI(dacPrecision, channelAddress, (ushort)dacChannelDataValueA));
 }
 public ushort GetDacChannelDataValueB(ChannelAddress channelAddress)
 {
     using (_lockFactory.GetLock(LockType.CommandLock))
     {
         if (channelAddress >= ChannelAddress.Dac0 && channelAddress <= ChannelAddress.Dac39)
         {
             return(_readbackX1BRegisterCommand.ReadbackX1BRegister(channelAddress));
         }
         throw new ArgumentOutOfRangeException(nameof(channelAddress));
     }
 }
Exemplo n.º 14
0
 public void ShouldClearInputRegisterSelectBit(
     [Values((byte)ControlRegisterBits.InputRegisterSelect, (byte)ControlRegisterBits.WritableBits,
             byte.MaxValue, byte.MinValue)] byte controlRegisterBits,
     [Range((int)ChannelAddress.Dac0, (int)ChannelAddress.Dac39)] ChannelAddress channelAddress,
     [Values(ushort.MinValue, 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8, 1 << 9, 1 << 10,
             1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, ushort.MaxValue)] int dacChannelDataValueA)
 {
     GivenControlRegisterBits((ControlRegisterBits)controlRegisterBits);
     WhenSetDacChannelDataValueA(channelAddress, (ushort)dacChannelDataValueA);
     ThenInputRegisterSelectBitInControlRegisterBitsIsCleared();
 }
Exemplo n.º 15
0
 public void ShouldApplyExistingABSelectRegisterValuesWhenComputingNewValuesForSingleChannel(
     int registerNum,
     byte existingABSelectRegisterBits,
     ChannelAddress channelAddress,
     DacChannelDataSource dacChannelDataSource,
     byte newABSelectRegisterBits
     )
 {
     GivenExistingABSelectRegisterValues(registerNum, (ABSelectRegisterBits)existingABSelectRegisterBits);
     WhenSetDacChannelDataSourceInternal(channelAddress, dacChannelDataSource);
     ThenNewABSelectRegisterBitsShouldBe((ABSelectRegisterBits)newABSelectRegisterBits);
 }
Exemplo n.º 16
0
 public void ShouldUpdateABSelectRegisterCacheInDeviceState(
     int registerNum,
     byte existingABSelectRegisterBits,
     ChannelAddress channelAddress,
     DacChannelDataSource dacChannelDataSource,
     byte newABSelectRegisterBits
     )
 {
     GivenExistingABSelectRegisterValues(registerNum, (ABSelectRegisterBits)existingABSelectRegisterBits);
     WhenSetDacChannelDataSourceInternal(channelAddress, dacChannelDataSource);
     ThenABSelectRegisterCacheInDeviceStateShouldBe(registerNum, (ABSelectRegisterBits)newABSelectRegisterBits);
 }
Exemplo n.º 17
0
        private void ThenTheValueShouldBeReadFromTheDevice(ChannelAddress channelAddress)
        {
            Mock.Get(_fakeSendSpecialFunctionCommand)
            .Verify(x => x.SendSpecialFunction(
                        SpecialFunctionCode.SelectRegisterForReadback,
                        It.Is <ushort>(y => y == (ushort)((ushort)AddressCodesForDataReadback.MRegister
                                                          |
                                                          (ushort)(((byte)channelAddress &
                                                                    (byte)BasicMasks.SixBits) << 7))))
                    , Times.Once);

            Mock.Get(_fakeReadSPICommand)
            .Verify(x => x.ReadSPI(), Times.Once);
        }
Exemplo n.º 18
0
 public void ShouldCacheX1ARegisterValues(
     [Values(DacPrecision.SixteenBit, DacPrecision.FourteenBit)] DacPrecision dacPrecision,
     [Range((int)ChannelAddress.Dac0, (int)ChannelAddress.Dac39)] ChannelAddress channelAddress,
     [Values(ushort.MinValue, 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8, 1 << 9, 1 << 10,
             1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, ushort.MaxValue)] int dacChannelDataValueA)
 {
     GivenDACPrecision(dacPrecision);
     WhenSetDacChannelDataValueA(channelAddress, (ushort)dacChannelDataValueA);
     ThenX1ARegisterValueInDeviceStateCacheIsSetTo(
         (int)channelAddress - 8,
         (ushort)(dacChannelDataValueA &
                  (dacPrecision == DacPrecision.SixteenBit
                       ? (ushort)BasicMasks.SixteenBits
                       : (ushort)BasicMasks.HighFourteenBits))
         );
 }
 public DacChannelDataSource GetDacChannelDataSource(ChannelAddress channelAddress)
 {
     using (_lockFactory.GetLock(LockType.CommandLock))
     {
         if (channelAddress < ChannelAddress.Dac0 || channelAddress > ChannelAddress.Dac39)
         {
             throw new ArgumentOutOfRangeException(nameof(channelAddress));
         }
         var channelNum = (byte)((byte)channelAddress - 8);
         var currentSourceSelections =
             _readbackABSelectRegisterCommand.ReadbackABSelectRegister(channelNum / 8);
         var channelOffset      = (byte)(channelNum % 8);
         var channelMask        = (ABSelectRegisterBits)(1 << channelOffset);
         var sourceIsDataValueB = (currentSourceSelections & channelMask) == channelMask;
         return(sourceIsDataValueB ? DacChannelDataSource.DataValueB : DacChannelDataSource.DataValueA);
     }
 }
 public void ShouldSetDacChannelDataSourceSameChannelInGroups1To4(
     ChannelAddress groupChannelAddress,
     DacChannelDataSource dacChannelDataSource,
     ChannelAddress group1ChannelAddress,
     ChannelAddress group2ChannelAddress,
     ChannelAddress group3ChannelAddress,
     ChannelAddress group4ChannelAddress
     )
 {
     WhenSetDacChannelDataSource(groupChannelAddress, dacChannelDataSource);
     ThenCallShouldBeDelegatedToSetDacChannelDataSourceInternalCommand(group1ChannelAddress,
                                                                       dacChannelDataSource);
     ThenCallShouldBeDelegatedToSetDacChannelDataSourceInternalCommand(group2ChannelAddress,
                                                                       dacChannelDataSource);
     ThenCallShouldBeDelegatedToSetDacChannelDataSourceInternalCommand(group3ChannelAddress,
                                                                       dacChannelDataSource);
     ThenCallShouldBeDelegatedToSetDacChannelDataSourceInternalCommand(group4ChannelAddress,
                                                                       dacChannelDataSource);
 }
        private static DeviceConfig WithInitialDacChannelGain(ChannelAddress channelAddress, ushort?dacChannelGain)
        {
            var deviceConfig = new DeviceConfig {
                DACChannelConfig = new DACChannelConfigurations()
            };
            var propertyInfo = deviceConfig.DACChannelConfig.GetType()
                               .GetProperty($"DAC{(int) channelAddress - 8}");

            if (propertyInfo == null)
            {
                return(deviceConfig);
            }
            propertyInfo
            .SetValue(deviceConfig.DACChannelConfig,
                      new DACChannelConfiguration
            {
                Calibration = new DACChannelCalibration {
                    Gain = dacChannelGain
                }
            }
                      );
            return(deviceConfig);
        }
        private static DeviceConfig WithInitialDacChannelDataValueB(ChannelAddress channelAddress,
                                                                    ushort?dacChannelDataValueB)
        {
            var deviceConfig = new DeviceConfig {
                DACChannelConfig = new DACChannelConfigurations()
            };
            var propertyInfo = deviceConfig.DACChannelConfig.GetType()
                               .GetProperty($"DAC{(int) channelAddress - 8}");

            if (propertyInfo == null)
            {
                return(deviceConfig);
            }
            propertyInfo
            .SetValue(deviceConfig.DACChannelConfig,
                      new DACChannelConfiguration
            {
                InitialState = new InitialDACChannelState {
                    DataValueB = dacChannelDataValueB
                }
            }
                      );
            return(deviceConfig);
        }
 internal static int ToChannelNumber(this ChannelAddress channelAddress)
 {
     return(((int)channelAddress) - 8);
 }
Exemplo n.º 24
0
 private void WhenReadbackMRegister(ChannelAddress channelAddress)
 {
     _resultOfReadback = _readbackMRegisterCommand.ReadbackMRegister(channelAddress);
 }
Exemplo n.º 25
0
 private void WhenGetDacChannelOffset(ChannelAddress channelAddress)
 {
     _dacChannelOffset = _getDacChannelOffsetCommand.GetDacChannelOffset(channelAddress);
 }
Exemplo n.º 26
0
 public void ShouldThrowExceptionIfChannelNumberIsOutOfRange(
     [Values((int)(ChannelAddress.Dac0 - 1), (int)(ChannelAddress.Dac39 + 1))] ChannelAddress channelAddress)
 {
     Assert.Throws <ArgumentOutOfRangeException>(() => WhenGetDacChannelOffset(channelAddress));
 }
Exemplo n.º 27
0
 private void ThenTheValueReadShouldBeCached(ChannelAddress channelAddress)
 {
     _deviceState.MRegisters[channelAddress.ToChannelNumber()].Should().Be(_resultOfReadback);
 }
Exemplo n.º 28
0
 public void ShouldThrowExceptionIfChannelAddressIsOutOfRange(
     [Values(ChannelAddress.Dac0 - 1, ChannelAddress.Dac39 + 1)] ChannelAddress channelAddress)
 {
     Assert.Throws <ArgumentOutOfRangeException>(() => WhenReadbackMRegister(channelAddress));
 }
Exemplo n.º 29
0
        private float Vout(ChannelAddress dacChannel)
        {
            var dacChannelDataSource = rdoDataValueA.Checked
                ? DacChannelDataSource.DataValueA
                : DacChannelDataSource.DataValueB;

            var parsed = ushort.TryParse(txtDataValueA.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                         out ushort dataValueA);

            if (!parsed)
            {
                return(0);
            }
            parsed = ushort.TryParse(txtDataValueB.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                     out ushort dataValueB);
            if (!parsed)
            {
                return(0);
            }

            var dacChannelDataValue = dacChannelDataSource == DacChannelDataSource.DataValueA
                ? dataValueA
                : dataValueB;

            parsed = ushort.TryParse(txtDACChannelOffset.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                     out ushort dacChannelOffsetValue);
            if (!parsed)
            {
                return(0);
            }
            parsed = ushort.TryParse(txtDACChannelGain.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                     out ushort dacChannelGainValue);
            if (!parsed)
            {
                return(0);
            }

            ushort offsetDACValue;
            float  vRef;

            if (dacChannel >= ChannelAddress.Group0Channel0 && dacChannel <= ChannelAddress.Group0Channel7)
            {
                parsed = ushort.TryParse(txtOffsetDAC0.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                         out offsetDACValue);
                if (!parsed)
                {
                    return(0);
                }
                parsed = float.TryParse(txtVREF0.Text, out vRef);
                if (!parsed)
                {
                    return(0);
                }
            }
            else if (dacChannel >= ChannelAddress.Group1Channel0 && dacChannel <= ChannelAddress.Group4Channel7)
            {
                parsed = ushort.TryParse(txtOffsetDAC1.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                         out offsetDACValue);
                if (!parsed)
                {
                    return(0);
                }
                parsed = float.TryParse(txtVREF1.Text, out vRef);
                if (!parsed)
                {
                    return(0);
                }
            }

            else
            {
                parsed = ushort.TryParse(txtOffsetDAC0.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
                                         out offsetDACValue);
                if (!parsed)
                {
                    return(0);
                }
                parsed = float.TryParse(txtVREF0.Text, out vRef);
                if (!parsed)
                {
                    return(0);
                }
            }
            return(Vout(dacChannelDataValue, dacChannelOffsetValue, dacChannelGainValue, offsetDACValue, vRef));
        }
Exemplo n.º 30
0
 private void GivenMRegisterValueExistsInDeviceStateRegisterCache(ChannelAddress channelAddress, ushort?value)
 {
     _deviceState.MRegisters[channelAddress.ToChannelNumber()] = value;
 }