コード例 #1
0
        public void PreloadSamples(StreamType channelType, ushort channelNumber, IList <short> samples)
        {
            ITCMM.ITCChannelDataEx[] channelData = new ITCMM.ITCChannelDataEx[1];

            channelData[0].ChannelType   = (ushort)channelType;
            channelData[0].ChannelNumber = channelNumber;
            channelData[0].Value         = (short)samples.Count;

            channelData[0].Command = ITCMM.PRELOAD_FIFO_COMMAND_EX;


            IntPtr samplesPtr = Marshal.AllocHGlobal(samples.Count * sizeof(short));

            try
            {
                Marshal.Copy(samples.ToArray(), 0, samplesPtr, samples.Count);
                channelData[0].DataPointer = samplesPtr;

                uint err = ItcmmCall(() => ITCMM.ITC_ReadWriteFIFO(DevicePtr, 1, channelData));
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    throw new HekaDAQException("Unable to push data", err);
                }
            }
            finally
            {
                Marshal.FreeHGlobal(samplesPtr);
            }
        }
コード例 #2
0
        public static IEnumerable <HekaDAQController> AvailableControllers()
        {
            var result = new List <HekaDAQController>();

            for (uint deviceType = 0; deviceType < ITCMM.MAX_DEVICE_TYPE_NUMBER; deviceType++)
            {
                if (deviceType == ITCMM.ITC00_ID)
                {
                    continue;
                }

                uint numDevices = 0;
                uint err        = ITCMM.ITC_Devices(deviceType, ref numDevices);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    throw new HekaDAQException("Unable to find devices", err);
                }

                for (uint deviceNumber = 0; deviceNumber < numDevices; deviceNumber++)
                {
                    result.Add(new HekaDAQController(deviceType, deviceNumber));
                }
            }

            return(result);
        }
コード例 #3
0
        public IInputData ReadStreamAsyncIO(HekaDAQInputStream stream)
        {
            lock (this)
            {
                var channelData = new ITCMM.ITCChannelDataEx[]
                {
                    new ITCMM.ITCChannelDataEx
                    {
                        ChannelNumber = stream.ChannelNumber,
                        ChannelType   = (ushort)stream.ChannelType
                    }
                };

                uint err = ItcmmCall(() => ITCMM.ITC_AsyncIO(DevicePtr, 1, channelData));
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    throw new HekaDAQException("Unable to read AsyncIO", err);
                }

                var inData =
                    new InputData(
                        new List <IMeasurement> {
                    new Measurement(channelData[0].Value, HekaDAQInputStream.DAQCountUnits)
                },
                        new Measurement(0, "Hz"),
                        DateTimeOffset.Now)
                    .DataWithStreamConfiguration(stream, stream.Configuration);

                return(inData.DataWithUnits(stream.MeasurementConversionTarget));
            }
        }
コード例 #4
0
        public void StopHardware()
        {
            uint err = ItcmmCall(() => ITCMM.ITC_Stop(DevicePtr, IntPtr.Zero));

            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to stop device", err);
            }
        }
コード例 #5
0
        public void CloseDevice()
        {
            uint err = ItcmmCall(() => ITCMM.ITC_CloseDevice(DevicePtr));

            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to close device", err);
            }

            _cts.Cancel();
        }
コード例 #6
0
        public void DeviceDetection()
        {
            uint numDevices = 0;

            uint result = ITCMM.ITC_Devices(ITCMM.USB18_ID, ref numDevices);

            Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                            result,
                            ErrorDescription.ErrorString(result));
            Assert.GreaterOrEqual(numDevices, 1, "We should find at least one ITC18 device.");
        }
コード例 #7
0
        public ITCMM.ITCChannelInfo ChannelInfo(StreamType channelType, ushort channelNumber)
        {
            ITCMM.ITCChannelInfo[] info = new ITCMM.ITCChannelInfo[1];
            info[0] = new ITCMM.ITCChannelInfo()
            {
                ChannelNumber = channelNumber, ChannelType = (uint)channelType
            };

            uint err = ItcmmCall(() => ITCMM.ITC_GetChannels(DevicePtr, 1, info));

            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to retrieve channel info struct.", err);
            }

            return(info[0]);
        }
コード例 #8
0
        public void CanReadITCClock()
        {
            HekkaDevice device;

            uint err = ITCMM.ITC_OpenDevice(ITCMM.USB18_ID, 0, ITCMM.SMART_MODE, out device);

            Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                            err,
                            ErrorDescription.ErrorString(err)
                            );

            try
            {
                //ITCMM.HWFunction sHWFunction = new ITCMM.HWFunction();

                err = ITCMM.ITC_InitDevice(device, IntPtr.Zero); //ref sHWFunction);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );

                double t1;
                err = ITCMM.ITC_GetTime(device, out t1);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );

                double t2 = t1;
                err = ITCMM.ITC_GetTime(device, out t2);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );

                Assert.Greater(t2, t1);
            }
            finally
            {
                err = ITCMM.ITC_CloseDevice(device);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );
            }
        }
コード例 #9
0
        public int AvailableSamples(StreamType channelType, ushort channelNumber)
        {
            ItcmmCall(() => ITCMM.ITC_UpdateNow(DevicePtr, System.IntPtr.Zero));

            ITCMM.ITCChannelDataEx[] channelData = new ITCMM.ITCChannelDataEx[1];

            channelData[0].ChannelType   = (ushort)channelType;
            channelData[0].ChannelNumber = channelNumber;

            uint err = ItcmmCall(() => ITCMM.ITC_GetDataAvailable(DevicePtr, 1, channelData));

            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to get available FIFO points", err);
            }

            return(channelData[0].Value);
        }
コード例 #10
0
        public void StartHardware(bool waitForTrigger)
        {
            var startInfo = new ITCMM.ITCStartInfo
            {
                ExternalTrigger = (uint)(waitForTrigger ? 1 : 0),
                OutputEnable    = 1,
                StopOnOverflow  = 1,
                StopOnUnderrun  = 1,
                ResetFIFOs      = 1,
            };
            //TODO test waitForTrigger set

            uint err = ItcmmCall(() => ITCMM.ITC_Start(DevicePtr, ref startInfo));

            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to start device", err);
            }
        }
コード例 #11
0
        public int MaxAvailableSamples(StreamType channelType, ushort channelNumber)
        {
            ITCMM.ITCChannelDataEx info = new ITCMM.ITCChannelDataEx();

            info.ChannelType   = (ushort)channelType;
            info.ChannelNumber = channelNumber;

            var infoArr = new ITCMM.ITCChannelDataEx[1];

            infoArr[0] = info;
            uint err = ItcmmCall(() => ITCMM.ITC_GetFIFOInformation(DevicePtr, 1, infoArr));

            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to get FIFO information", err);
            }

            info = infoArr[0];

            return(info.Value);
        }
コード例 #12
0
        internal static IHekaDevice OpenDevice(uint deviceType, uint deviceNumber, out ITCMM.GlobalDeviceInfo deviceInfo)
        {
            IntPtr dev;
            uint   err = ITCMM.ITC_OpenDevice(deviceType, deviceNumber, ITCMM.SMART_MODE, out dev);

            if (err != ITCMM.ACQ_SUCCESS)
            {
                log.Error("Unable to open ITC device");
                throw new HekaDAQException("Unable to get device handle", err);
            }

            //ITCMM.HWFunction sHWFunction = new ITCMM.HWFunction();
            err = ITCMM.ITC_InitDevice(dev, IntPtr.Zero); //ref sHWFunction);
            //ITC_SetSoftKey

            // Configure device
            ITCMM.ITCPublicConfig config = new ITCMM.ITCPublicConfig();
            config.OutputEnable = 1;
            config.ControlLight = 1;

            err = ITCMM.ITC_ConfigDevice(dev, ref config);
            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to configure device", err);
            }

            deviceInfo = new ITCMM.GlobalDeviceInfo();
            err        = ITCMM.ITC_GetDeviceInfo(dev, ref deviceInfo);
            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Unable to get device info", err);
            }
            return(new QueuedHekaHardwareDevice(dev,
                                                deviceInfo.NumberOfADCs + deviceInfo.NumberOfDIs +
                                                deviceInfo.NumberOfAUXIs,
                                                deviceInfo.NumberOfDACs + deviceInfo.NumberOfDOs +
                                                deviceInfo.NumberOfAUXOs
                                                ));
        }
コード例 #13
0
        public void ConfigureChannels(IEnumerable <HekaDAQStream> streams)
        {
            uint err = ItcmmCall(() => ITCMM.ITC_ResetChannels(DevicePtr));

            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Channel Reset", err);
            }

            var infoList = streams
                           .Select((s) => s.ChannelInfo);

            err = ItcmmCall(() => ITCMM.ITC_SetChannels(DevicePtr, (uint)infoList.Count(), infoList.ToArray()));
            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Set Channels", err);
            }

            err = ItcmmCall(() => ITCMM.ITC_UpdateChannels(DevicePtr));
            if (err != ITCMM.ACQ_SUCCESS)
            {
                throw new HekaDAQException("Update Channels", err);
            }
        }
コード例 #14
0
        public void OpenDevice()
        {
            HekkaDevice device = HekkaDevice.Zero;

            uint err = ITCMM.ITC_OpenDevice(ITCMM.USB18_ID, 0, ITCMM.SMART_MODE, out device);

            try
            {
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );

                Assert.NotNull(device);
            }
            finally
            {
                err = ITCMM.ITC_CloseDevice(device);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );
            }
        }
コード例 #15
0
        private void WriteAsyncIO(HekaDAQOutputStream stream, IMeasurement streamValue)
        {
            lock (this)
            {
                var channelData = new[]
                {
                    new ITCMM.ITCChannelDataEx
                    {
                        ChannelNumber = stream.ChannelNumber,
                        ChannelType   = (ushort)stream.ChannelType,
                        Value         =
                            (short)
                            Converters.Convert(streamValue, HekaDAQOutputStream.DAQCountUnits)
                            .QuantityInBaseUnit
                    }
                };

                uint err = ItcmmCall(() => ITCMM.ITC_AsyncIO(DevicePtr, 1, channelData));
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    throw new HekaDAQException("Unable to write AsyncIO", err);
                }
            }
        }
コード例 #16
0
        public void AsyncIORoundTrip()
        {
            HekkaDevice device = HekkaDevice.Zero;

            uint err = ITCMM.ITC_OpenDevice(ITCMM.USB18_ID, 0, ITCMM.SMART_MODE, out device);

            Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                            err,
                            ErrorDescription.ErrorString(err)
                            );

            try
            {
                err = ITCMM.ITC_InitDevice(device, IntPtr.Zero); //ref sHWFunction);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );


                uint expectedValue = 8000;

                var channelData = new ITCMM.ITCChannelDataEx[] {
                    new ITCMM.ITCChannelDataEx {
                        ChannelNumber = 0,
                        ChannelType   = ITCMM.OUTPUT_GROUP,
                        Value         = (short)expectedValue
                    }
                };

                err = ITCMM.ITC_AsyncIO(device, 1, channelData);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    throw new HekaDAQException("Unable to write AsyncIO", err);
                }

                channelData = new ITCMM.ITCChannelDataEx[] {
                    new ITCMM.ITCChannelDataEx {
                        ChannelNumber = 0,
                        ChannelType   = ITCMM.INPUT_GROUP,
                        Value         = (short)expectedValue
                    }
                };

                err = ITCMM.ITC_AsyncIO(device, 1, channelData);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    throw new HekaDAQException("Unable to write AsyncIO", err);
                }

                var actualValue = channelData[0].Value;

                Assert.That(actualValue, Is.InRange(expectedValue - 50, expectedValue + 50));
            }
            finally
            {
                err = ITCMM.ITC_CloseDevice(device);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );
            }
        }
コード例 #17
0
        public void RoundTripChannelConfig()
        {
            HekkaDevice device = HekkaDevice.Zero;

            uint err = ITCMM.ITC_OpenDevice(ITCMM.USB18_ID, 0, ITCMM.SMART_MODE, out device);

            if (err != ITCMM.ACQ_SUCCESS)
            {
                Assert.Fail(ErrorDescription.ErrorString(err));
            }

            try
            {
                //ITCMM.HWFunction hwf = new ITCMM.HWFunction();

                err = ITCMM.ITC_InitDevice(device, IntPtr.Zero); //ref hwf);

                ITCMM.ITCPublicConfig config = new ITCMM.ITCPublicConfig();
                config.OutputEnable = 1;

                err = ITCMM.ITC_ConfigDevice(device, ref config);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    Assert.Fail(ErrorDescription.ErrorString(err));
                }


                Assert.NotNull(device);



                err = ITCMM.ITC_ResetChannels(device);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    Assert.Fail(ErrorDescription.ErrorString(err));
                }


                ITCMM.ITCChannelInfo[] info = new ITCMM.ITCChannelInfo[2];

                info[0].ChannelNumber = 0;
                info[0].ChannelType   = ITCMM.OUTPUT_GROUP;
                info[1].ChannelNumber = 0;
                info[1].ChannelType   = ITCMM.INPUT_GROUP;

                const double srate = 8000;
                info[0].SamplingRate = srate;
                info[1].SamplingRate = srate;


                err = ITCMM.ITC_SetChannels(device, 2, info);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    Assert.Fail(ErrorDescription.ErrorString(err));
                }

                err = ITCMM.ITC_UpdateChannels(device);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    Assert.Fail(ErrorDescription.ErrorString(err));
                }


                ITCMM.ITCChannelInfo[] actual = new ITCMM.ITCChannelInfo[2];
                actual[0].ChannelType   = info[0].ChannelType;
                actual[0].ChannelNumber = info[0].ChannelNumber;
                actual[1].ChannelType   = info[1].ChannelType;
                actual[1].ChannelNumber = info[1].ChannelNumber;


                err = ITCMM.ITC_GetChannels(device, 2, actual);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    Assert.Fail(ErrorDescription.ErrorString(err));
                }


                Assert.AreEqual(info[0].SamplingRate, actual[0].SamplingRate);
                Assert.AreEqual(info[1].SamplingRate, actual[1].SamplingRate);
            }
            finally
            {
                err = ITCMM.ITC_CloseDevice(device);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );
            }
        }
コード例 #18
0
        public void ReadAvailableSamples()
        {
            HekkaDevice device = HekkaDevice.Zero;

            uint err = ITCMM.ITC_OpenDevice(ITCMM.USB18_ID, 0, ITCMM.SMART_MODE, out device);

            if (err != ITCMM.ACQ_SUCCESS)
            {
                Assert.Fail(ErrorDescription.ErrorString(err));
            }

            try
            {
                //ITCMM.HWFunction hwf = new ITCMM.HWFunction();

                err = ITCMM.ITC_InitDevice(device, IntPtr.Zero); // ref hwf);

                ITCMM.ITCPublicConfig config = new ITCMM.ITCPublicConfig();
                config.OutputEnable = 1;

                err = ITCMM.ITC_ConfigDevice(device, ref config);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    Assert.Fail(ErrorDescription.ErrorString(err));
                }


                Assert.NotNull(device);

                ITCMM.ITCChannelInfo channelInfo = new ITCMM.ITCChannelInfo();
                channelInfo.ChannelType   = ITCMM.H2D;
                channelInfo.ChannelNumber = 0;
                channelInfo.SamplingRate  = 1000.0;
                Assert.AreEqual(System.IntPtr.Zero, channelInfo.FIFOPointer);

                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                ITCMM.ITC_SetChannels(device, 1, new ITCMM.ITCChannelInfo[] { channelInfo })
                                );

                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                (int)ITCMM.ITC_UpdateChannels(device)
                                );

                ITCMM.ITCChannelDataEx info = new ITCMM.ITCChannelDataEx();

                info.ChannelType   = ITCMM.H2D;
                info.ChannelNumber = 0;

                ITCMM.ITCChannelDataEx[] arr = new ITCMM.ITCChannelDataEx[] { info };
                err = ITCMM.ITC_GetDataAvailable(device, 1, arr);
                if (err != ITCMM.ACQ_SUCCESS)
                {
                    Assert.Fail(ErrorDescription.ErrorString(err));
                }

                info = arr[0];

                Assert.That(info.Value, Is.GreaterThanOrEqualTo(0));
            }
            finally
            {
                err = ITCMM.ITC_CloseDevice(device);
                Assert.AreEqual(ITCMM.ACQ_SUCCESS,
                                err,
                                ErrorDescription.ErrorString(err)
                                );
            }
        }