For digital output, program uses use keyboard keys 0-3 as a signal to change the state of an I/O line on FirstPortC. In the digital update routine the program reads the digital output port and use an exclusive OR function (XOR) to flip the state. To continuously monitor the key input the program uses a loop and to read the input data it uses timer interrupt routine that fires off every 50mS.
'import statements help reduce line length and typing
Imports MccDaq
Imports MccDaq.ChannelType
Imports MccDaq.Range
Imports MccDaq.ScanOptions
Imports MccDaq.DigitalPortType
Imports MccDaq.FunctionType
Imports MccDaq.ErrorInfo.ErrorCode
Imports MccDaq.MccService
Imports System.Convert
Imports System.Threading.Thread
Imports System.Timers
Imports System.IO
Module Module1
Const BLOCKSIZE As Integer = 100 'samples per channel
Const CHANNELCOUNT As Integer = 4
Const SAMPLERATE As Integer = 100 'desired sample rate
Const BUFFERSIZE As Integer = CHANNELCOUNT * BLOCKSIZE ' size of the buffer
Const HALFBUFFER As Integer = BUFFERSIZE / 2 'size of half buffer
Const TOTAL As Integer = SAMPLERATE * CHANNELCOUNT * 60 * 2 '2 minutes
'AInScan running options
Dim theOptions As MccDaq.ScanOptions = Continuous + Background + ConvertData
Dim CurrentCount As Integer = 0 'indicates total samples taken
Dim CurrentIndex As Integer = 0 'points to the last scan read
Dim Status As Short = 0
Dim theDevice As MccBoard 'device object
Dim buffer As IntPtr
Dim ret As ErrorInfo
Dim ReadLower As Boolean = True 'semaphore flag that prevents duplicate buffer reads
'text file name and path. Use ASC extension if using DASYLab software to read the file.
Dim Path As String = "C:\Users\Public\Documents\theDataFile.asc"
Dim fStream As StreamWriter
Dim ChanArray(CHANNELCOUNT) As Short ' array to hold channel queue information
Dim ChanTypeArray(CHANNELCOUNT) As MccDaq.ChannelType ' array to hold channel type information
Dim GainArray(CHANNELCOUNT) As MccDaq.Range ' array to hold gain queue information
Dim ChanText(CHANNELCOUNT) As String
Dim ChanScale(CHANNELCOUNT) As Single
Sub Main()
Dim atimer As Timer
Dim ret As MccDaq.ErrorInfo
Dim bNum As Integer
Dim str As String = "USB-1616HS"
bNum = GetBoardNum(str)
If bNum = -1 Then
Console.WriteLine("No {0} detected!", str)
WaitForKey()
End
End If
'load the arrays with values
ChanArray(0) = 0
ChanTypeArray(0) = Analog
GainArray(0) = Bip10Volts
ChanText(0) = "In0 [V]" + vbTab
ChanScale(0) = Convert.ToSingle(10.0 / 32768) 'volts per bit for the +/- 10 volt range
ChanArray(1) = 1
ChanTypeArray(1) = Analog
GainArray(1) = Bip10Volts
ChanText(1) = "In1 [V]" + vbTab
ChanScale(1) = Convert.ToSingle(10.0 / 32768) 'volts per bit for the +/- 10 volt range
ChanArray(2) = 3
ChanTypeArray(2) = Analog
GainArray(2) = Bip10Volts
ChanText(2) = "In1 [V]" + vbTab
ChanScale(2) = Convert.ToSingle(10.0 / 32768) 'volts per bit for the +/- 10 volt range
ChanArray(3) = FirstPortA
ChanTypeArray(3) = Digital16
GainArray(3) = NotUsed
ChanText(3) = "FirstPortA [dec]"
ChanScale(3) = 1
theDevice = New MccBoard(bNum) 'get the devices' programming object
'set digital port C for output
ret = theDevice.DConfigPort(FirstPortC, MccDaq.DigitalPortDirection.DigitalOut)
If ret.Value <> MccDaq.ErrorInfo.ErrorCode.NoErrors Then
Stop
End If
'let's start with all 8 bits low
Dim PortVal As UShort = 0
ret = theDevice.DOut(FirstPortC, PortVal)
If ret.Value <> MccDaq.ErrorInfo.ErrorCode.NoErrors Then
Stop
End If
buffer = MccService.WinBufAllocEx(BUFFERSIZE)
atimer = New Timer
atimer.AutoReset = True
atimer.Interval = 50
AddHandler atimer.Elapsed, AddressOf TimerEvent
Console.WriteLine("This program reads channel 1,2,3 & FirstPortA as a 16 bit word." + vbCrLf)
Console.WriteLine("The program will stream the data continously to:")
Console.WriteLine("{0}{1}", Path, vbCrLf)
Console.WriteLine("While doing this the digital output lines on Port C can be changed as follows:" + vbCrLf)
Console.WriteLine("Keys 0 - 3 toggles the state of D0-D3 on FirstPortC." + vbCrLf)
Console.WriteLine("Press <SPACE> to clear all...<ESC> exit program" + vbCrLf)
WaitForKey()
ret = theDevice.DaqInScan(ChanArray, ChanTypeArray, GainArray, CHANNELCOUNT, SAMPLERATE, 0, BUFFERSIZE, buffer, theOptions)
If ret.Value <> MccDaq.ErrorInfo.ErrorCode.NoErrors Then Stop
'create a text file to hold the data
fStream = New StreamWriter(Path)
CreateFileHeader()
'Timer routines checks/reads data every 50mS
atimer.Start()
'''''''''''''''''''' MAIN LOOP ''''''''''''''''''''''''''
Dim cki As ConsoleKeyInfo = New ConsoleKeyInfo
Do
If Console.KeyAvailable = True Then
cki = Console.ReadKey()
'call function to update digital outputs
UpdateFirstPortC(cki)
End If
Loop Until ((cki.Key = ConsoleKey.Escape) Or (CurrentCount > TOTAL))
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
atimer.Stop()
WaitForKey()
theDevice.StopBackground(AiFunction)
fStream.Close()
End Sub
Sub TimerEvent(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
ret = theDevice.GetStatus(Status, CurrentCount, CurrentIndex, MccDaq.FunctionType.DaqiFunction)
If ret.Value <> MccDaq.ErrorInfo.ErrorCode.NoErrors Then Stop
'ping pong between low half and upper half
If ((CurrentIndex >= HALFBUFFER) And (ReadLower = True)) Then
'read the lower half and set Upper flag to zero so that next read is upper half
Dim theArray(BUFFERSIZE) As UShort
ret = MccDaq.MccService.WinBufToArray(buffer, theArray, 0, HALFBUFFER)
If ret.Value <> MccDaq.ErrorInfo.ErrorCode.NoErrors Then Stop
ReadLower = False
DisplayData(theArray, HALFBUFFER \ CHANNELCOUNT)
ElseIf ((CurrentIndex < HALFBUFFER) And (ReadLower = False)) Then
'read the upper half and set Upper flag to one so that next read is lower half
Dim theArray(BUFFERSIZE) As UShort
ret = MccDaq.MccService.WinBufToArray(buffer, theArray, HALFBUFFER, HALFBUFFER)
If ret.Value <> MccDaq.ErrorInfo.ErrorCode.NoErrors Then Stop
ReadLower = True
DisplayData(theArray, HALFBUFFER \ CHANNELCOUNT)
End If
End Sub
Sub UpdateFirstPortC(ByVal cki As ConsoleKeyInfo)
'Function used to change level on individual FirstPortC lines
Dim PortVal As UShort
Dim ret As ErrorInfo = New ErrorInfo
Select Case cki.Key
Case ConsoleKey.D0
ret = theDevice.DIn(FirstPortC, PortVal)
PortVal = PortVal Xor 1
ret = theDevice.DOut(DigitalPortType.FirstPortC, PortVal)
Case ConsoleKey.D1
ret = theDevice.DIn(FirstPortC, PortVal)
PortVal = PortVal Xor 2
ret = theDevice.DOut(DigitalPortType.FirstPortC, PortVal)
Case ConsoleKey.D2
ret = theDevice.DIn(FirstPortC, PortVal)
PortVal = PortVal Xor 4
ret = theDevice.DOut(DigitalPortType.FirstPortC, PortVal)
Case ConsoleKey.D3
ret = theDevice.DIn(FirstPortC, PortVal)
PortVal = PortVal Xor 8
ret = theDevice.DOut(DigitalPortType.FirstPortC, PortVal)
Case ConsoleKey.Spacebar
ret = theDevice.DOut(DigitalPortType.FirstPortC, 0)
End Select
If ret.Value <> MccDaq.ErrorInfo.ErrorCode.NoErrors Then Stop
End Sub