Option Explicit
Public Const SCA_SECTION = "DP5 SCA Configuration"
Public Const CFG_SECTION = "DP5 Configuration File"
Public Type scaRegister
Index As Variant
Low As Variant
High As Variant
OutPut As Variant
End Type
Public Type scaSetup
strIniFilename As String
Channels As Variant
HaveChannels As Boolean
Index As Variant
HaveIndex As Boolean
PulseWidth As Variant
sca(15) As scaRegister
End Type
Public sca As scaSetup
Public Function SplitData(strData As String, ByRef varValue As Variant, strDefault As Variant) As Boolean
Dim lSep As Long
Dim strChan As String
lSep = InStr(strData, ";")
If (lSep > 0) Then 'file has setting, separate comments from data, if any
varValue = Trim(Left(strData, lSep - 1))
SplitData = True
Else
varValue = strDefault
SplitData = False
End If
End Function
Public Function varValueToIndex(varData As Variant) As Long
Dim strCase As String
strCase = UCase(CStr(varData))
Select Case strCase
Case "OFF"
varValueToIndex = 0
Case "HI"
varValueToIndex = 1
Case "LOW"
varValueToIndex = 2
Case "256"
varValueToIndex = 0
Case "512"
varValueToIndex = 1
Case "1024"
varValueToIndex = 2
Case "2048"
varValueToIndex = 3
Case "4096"
varValueToIndex = 4
Case "8192"
varValueToIndex = 5
Case "100"
varValueToIndex = 0
Case "1000"
varValueToIndex = 1
Case "1"
varValueToIndex = 0
Case "2"
varValueToIndex = 1
Case "3"
varValueToIndex = 2
Case "4"
varValueToIndex = 3
Case "5"
varValueToIndex = 4
Case "6"
varValueToIndex = 5
Case "7"
varValueToIndex = 6
Case "8"
varValueToIndex = 7
Case "HIGH"
varValueToIndex = 1
Case "HIG"
varValueToIndex = 1
Case "LO"
varValueToIndex = 2
Case Else
varValueToIndex = 0
End Select
End Function
'these must be in the correct order, old sca settings will be deleted and new appended to end
Public Sub SaveSCASetupINI(sca As scaSetup)
Dim strData As String
Dim Index As Long
If (Not sca.HaveChannels) Then
strData = CStr(sca.Channels) & ";"
SaveToIniEx sca.strIniFilename, CFG_SECTION, "MCAC", strData
End If
Index = Val(sca.Index)
Call DeleteIniSettingEx(sca.strIniFilename, CFG_SECTION, "SCAI")
Call DeleteIniSettingEx(sca.strIniFilename, CFG_SECTION, "SCAO")
Call DeleteIniSettingEx(sca.strIniFilename, CFG_SECTION, "SCAL")
Call DeleteIniSettingEx(sca.strIniFilename, CFG_SECTION, "SCAH")
Call DeleteIniSettingEx(sca.strIniFilename, CFG_SECTION, "SCAW")
strData = CStr(sca.PulseWidth) & ";"
SaveToIniEx sca.strIniFilename, CFG_SECTION, "SCAW", strData
End Sub
Public Sub SaveSCASettingsINI(sca As scaSetup, Index As Long)
Dim strIdx As String
Dim strData As String
strIdx = CStr(Index)
strData = CStr(sca.sca(Index - 1).OutPut) & ";"
SaveToIniEx sca.strIniFilename, SCA_SECTION, "SCAO" & strIdx, strData
strData = CStr(sca.sca(Index - 1).Low) & ";"
SaveToIniEx sca.strIniFilename, SCA_SECTION, "SCAL" & strIdx, strData
strData = CStr(sca.sca(Index - 1).High) & ";"
SaveToIniEx sca.strIniFilename, SCA_SECTION, "SCAH" & strIdx, strData
End Sub
Public Sub GetSCASetupINI(sca As scaSetup)
Dim lSep As Long
Dim strValue As String
Dim strComment As String
Dim strData As String
Dim Index As Long
strData = GetFromIniEx(sca.strIniFilename, CFG_SECTION, "MCAC", "1024")
sca.HaveChannels = SplitData(strData, sca.Channels, "1024")
strData = GetFromIniEx(sca.strIniFilename, CFG_SECTION, "SCAW", "100")
Call SplitData(strData, sca.PulseWidth, "100")
strData = GetFromIniEx(sca.strIniFilename, CFG_SECTION, "SCAI", "1")
sca.HaveIndex = SplitData(strData, sca.Index, "1")
If (sca.HaveIndex) Then 'update sca from latest config data
Index = Val(sca.Index)
strData = GetFromIniEx(sca.strIniFilename, CFG_SECTION, "SCAO", strData)
Call SplitData(strData, sca.sca(Index - 1).OutPut, "OFF")
strData = GetFromIniEx(sca.strIniFilename, CFG_SECTION, "SCAL", strData)
Call SplitData(strData, sca.sca(Index - 1).Low, "1")
strData = GetFromIniEx(sca.strIniFilename, CFG_SECTION, "SCAH", strData)
Call SplitData(strData, sca.sca(Index - 1).High, "1024")
End If
End Sub
Public Sub GetSCASettingsINI(sca As scaSetup, Index As Long)
Dim lSep As Long
Dim strValue As String
Dim strComment As String
Dim strIdx As String
Dim strData As String
strIdx = CStr(Index)
sca.sca(Index - 1).Index = strIdx 'for future use
'skip updating data that was updated from the configuration settings
If (sca.HaveIndex And (Val(sca.Index) = Index)) Then Exit Sub
strData = GetFromIniEx(sca.strIniFilename, SCA_SECTION, "SCAO" & strIdx, strData)
Call SplitData(strData, sca.sca(Index - 1).OutPut, "OFF")
strData = GetFromIniEx(sca.strIniFilename, SCA_SECTION, "SCAL" & strIdx, strData)
Call SplitData(strData, sca.sca(Index - 1).Low, "1")
strData = GetFromIniEx(sca.strIniFilename, SCA_SECTION, "SCAH" & strIdx, strData)
Call SplitData(strData, sca.sca(Index - 1).High, "1024")
End Sub
' 1234567
'expecting data format strCMD=strData; (CMD1=?;)
Public Sub ReadSCASetting(ByRef sca As scaSetup, strSCAInfo As String)
Dim strCmd As String
Dim strData As String
Dim lSep As Long
Dim lTerm As Long
lSep = InStr(strSCAInfo, "=")
lTerm = InStr(strSCAInfo, ";")
If (lSep <> 5) Then Exit Sub
If (lTerm < 7) Then Exit Sub
strCmd = UCase(Left(strSCAInfo, 4))
strData = UCase(Mid(strSCAInfo, 6, lTerm - 6))
Select Case strCmd
Case "MCAC"
sca.Channels = strData
Case "SCAW"
sca.PulseWidth = strData
Case "SCAI"
sca.Index = strData
sca.HaveIndex = True
sca.sca(Val(sca.Index) - 1).Index = strData
Case "SCAL"
If (Val(sca.Index) > 0) Then sca.sca(Val(sca.Index) - 1).Low = strData
Case "SCAH"
If (Val(sca.Index) > 0) Then sca.sca(Val(sca.Index) - 1).High = strData
Case "SCAO"
If (Val(sca.Index) > 0) Then sca.sca(Val(sca.Index) - 1).OutPut = strData
Case Else
'unknown data error
End Select
End Sub
'reads dpp command string removes and returns byref next dpp config command
'functions returns true if command found, false otherwise
Public Function GetNextCMD(ByRef strCMDList As String, ByRef strCmd As String) As Boolean
Dim strCMDs As String
Dim strCMDOut As String
Dim lNextCMD As Long
GetNextCMD = False
If (Len(strCMDList) < 7) Then Exit Function '1234=6;8
lNextCMD = InStr(strCMDList, ";")
If (lNextCMD < 7) Then Exit Function '1234=6;8
strCmd = UCase(Left(strCMDList, lNextCMD))
strCMDList = Mid(strCMDList, lNextCMD + 1)
GetNextCMD = True
End Function
Public Sub SCACfgParser(ByRef sca As scaSetup, strSCASettings As String)
Dim strCMDList As String
Dim strCmd As String
Dim idxCMDs As Long
Dim CMDMax As Long
Dim bHaveCMD As Boolean
If (Len(strSCASettings) < 7) Then Exit Sub
strCMDList = strSCASettings
strCmd = ""
CMDMax = CLng(Len(strSCASettings) \ 7) + 1 'loop the max number of times
For idxCMDs = 0 To CMDMax
bHaveCMD = GetNextCMD(strCMDList, strCmd)
If (bHaveCMD) Then
ReadSCASetting sca, strCmd
Else
Exit For
End If
Next
End Sub
Public Function SCAString(strCmd As String, strData As String, Optional bDppMsg As Boolean)
Dim str As String
str = UCase(strCmd)
str = str & "="
str = str & UCase(strData) & ";"
If (Not bDppMsg) Then
str = str & vbNewLine
End If
SCAString = str
End Function
'these must be in the correct order, old sca settings will be delected and new appended to end
Public Function SCASetupString(sca As scaSetup, Optional bDppMsg As Boolean = True)
Dim strData As String
Dim Index As Long
Dim strSCAsus As String
Dim str As String
strSCAsus = ""
If (Not sca.HaveChannels) Then
str = SCAString("MCAC", CStr(sca.Channels), bDppMsg)
strSCAsus = strSCAsus & str
End If
strData = CStr(sca.PulseWidth)
str = SCAString("SCAW", strData, bDppMsg)
strSCAsus = strSCAsus & str
SCASetupString = strSCAsus
End Function
Public Function SCASettingsString(sca As scaSetup, Index As Long, Optional bDppMsg As Boolean = True)
Dim strIdx As String
Dim strData As String
Dim strSCAsets As String
Dim str As String
strIdx = CStr(Index)
strData = CStr(sca.sca(Index - 1).Index)
str = SCAString("SCAI", strData, bDppMsg)
strSCAsets = strSCAsets & str
strData = CStr(sca.sca(Index - 1).OutPut)
str = SCAString("SCAO", strData, bDppMsg)
strSCAsets = strSCAsets & str
strData = CStr(sca.sca(Index - 1).Low)
str = SCAString("SCAL", strData, bDppMsg)
strSCAsets = strSCAsets & str
strData = CStr(sca.sca(Index - 1).High)
str = SCAString("SCAH", strData, bDppMsg)
strSCAsets = strSCAsets & str
SCASettingsString = strSCAsets
End Function
Public Function SCAStringALL(sca As scaSetup, Optional bDppMsg As Boolean = True)
Dim idxSCA As Long
Dim strSCA As String
strSCA = SCASetupString(sca, bDppMsg)
For idxSCA = 1 To 8
strSCA = strSCA & SCASettingsString(sca, idxSCA, bDppMsg)
Next
SCAStringALL = strSCA
End Function
Public Function SCAStringALLDisplay(sca As scaSetup)
Dim idxSCA As Long
Dim strSCA As String
Dim bDppMsg As Boolean
bDppMsg = True
strSCA = SCASetupString(sca, bDppMsg)
For idxSCA = 1 To 8
strSCA = strSCA & vbNewLine
strSCA = strSCA & SCASettingsString(sca, idxSCA, bDppMsg)
Next
SCAStringALLDisplay = strSCA
End Function
Public Sub InitSCA()
Dim idxSCA As Long
sca.strIniFilename = ""
sca.HaveChannels = False
sca.Channels = "1024"
sca.Index = 1
sca.PulseWidth = "100"
For idxSCA = 0 To 15
sca.sca(idxSCA).Low = 1
sca.sca(idxSCA).High = sca.Channels
If (idxSCA < 8) Then
sca.sca(idxSCA).OutPut = "OFF"
End If
Next
End Sub