modShaping Source Code

Option Explicit 
'=========================================================
'==== Shaping ============================================
'=========================================================

Public Const MAXPEAKINGTIMES = 26 
Public Const MAXPEAKINGTIMES_20MHZ = MAXPEAKINGTIMES - 2 
Public Const MAXPEAKINGTIMES_80MHZ = MAXPEAKINGTIMES 
Public b80MHzModeCfg As Boolean 
Public b80MHzModeCfg_old As Boolean 

' 0. read config values (from file or hw)
' 1. default is 20MHz FPGA Clock (CLCK=fpga clock),(fpga clock MODE=b80MHzModeCfg)
' 2. FPGA Clock is read BEFORE peaking time is set (TPEA=peaking time)
' 3. if no CLCK found or is AUTO then default fpga clock MODE is 20MHz (b80MHzModeCfg=false)
' 4. if the CLCK is set to 80 then fpga clock MODE is 80MHz (b80MHzModeCfg=true)
' 5. b80MHzModeCfg MUST be determined BEFORE peaking/flattop combobox values are generated
' 6. for CLCK=AUTO and TPEA>=5Us then b80MHzModeCfg=false(20mhz)
' 7. for CLCK=AUTO and TPEA<5Us then b80MHzModeCfg=true(80mhz)
' 8. if CLCK=20 or CLCK=80 then b80MHzModeCfg=false(20mhz) or b80MHzModeCfg=true(80mhz)
' 9. set peaking time combo using b80MHzModeCfg
'10. search for closest peaking value index, update (hidden text value)
'11. calculate flattop combo values using
'12. search for closet flattop, update (hidden text value)

'the fpga clock speed determines the multiplier for calulating the combobox peaking times
'the fpga clock speed can (and should) be read from the hardware if connected
'GetFPGAClockMode is needed when no dpp device is attached and a configuration is being generated
Public Function GetFPGAClockMode(strCLCK As String, strTPEA As StringAs Boolean 
    Dim is80MHz As Boolean 
    Dim dblPeaking As Double 
    Dim dblCLCK As Double 
    Dim isAuto As Boolean 
    Dim inRange As Boolean 
    
    isAuto = CBool("AUTO" = strCLCK)            'true=the clock is not known
    dblPeaking = CDbl(Val(strTPEA))
    dblCLCK = CDbl(Val(strCLCK))
    is80MHz = False                             'default=20MHz FPGA Clock mode
    If (isAuto) Then                            'use TPEA to determine fpga clock
        If (dblPeaking < 5#) Then               'dblPeaking is uS, TPEA<5Us=fpga 80MHz mode
            is80MHz = True    'fpga clock MODE=80MHz
        End If 
    Else 
        If (dblCLCK = 80) Then                  'clock setting
            is80MHz = True    'fpga clock MODE=
        End If 
    End If 
''''    'the clock should be set, test the clock to verify it matches TPEA
''''    inRange = False
''''    If (isAuto) Then                        'if auto, the clock was already set by TPEA
''''        inRange = True
''''    Else
''''        If (is80MHz) Then                       'TPEA 80MHz Range (0.050-25.600)
''''            If (dblPeaking >= 0.05) And (dblPeaking <= 25.6) Then
''''                inRange = True
''''            End If
''''        Else                                    'TPEA 20MHz Range (0.800-102.400)
''''            If (dblPeaking >= 0.8) And (dblPeaking <= 102.4) Then
''''                inRange = True
''''            End If
''''        End If
''''    End If
    GetFPGAClockMode = is80MHz 
End Function 

' 9. set peaking time combo using b80MHzModeCfg
'10. search for closest peaking value index, update (hidden text value)
'11. calculate flattop combo values using
'12. search for closet flattop, update (hidden text value)

'Private Sub cmdFlattopSearch_Click()
'    txtFlattopFound = "0.000"
'    SetShapingIndex cboFlatTop, txtFlattopSearch
'    If (cboFlatTop.ListIndex <> LB_ERR) Then
'        txtFlattopFound = cboFlatTop.List(cboFlatTop.ListIndex)
'    End If
'End Sub
'
'Private Sub cmdPeakingSearch_Click()
'    txtPeakingFound = "0.000"
'    SetShapingIndex cboRise, txtPeakingSearch
'    If (cboRise.ListIndex <> LB_ERR) Then
'        txtPeakingFound = cboRise.List(cboRise.ListIndex)
'    End If
'End Sub

Public Sub cboRiseUpdate(cboRise As ComboBox, cboFlatTop As ComboBox, is80MHz As Boolean)
    Dim Decimation As Integer 
    Dim idxFlattop As Integer 
    Dim idx As Integer 
    Dim strVal As String 

    If (cboRise.ListCount > 0) Then 
        Decimation = SetRiseAndAvg(cboRise.ListIndex, is80MHz)
    End If 
    'idxFlattop = cboFlatTop.ListIndex
    If (idxFlattop < 0) Then idxFlattop = 0 
    GetFlattopValues cboFlatTop, Decimation, idxFlattop, is80MHz 
    strVal = "" 
    If (cboFlatTop.ListCount > 0) Then 
        For idx = 0 To (cboFlatTop.ListCount - 1)
            strVal = strVal & cboFlatTop.List(idx) & vbNewLine 
        Next 
        'txtFlattop = strVal
    End If 
End Sub 

Public Sub LoadPeakingValues(cboRise As ComboBox, cboFlatTop As ComboBox, is80MHz As Boolean)
    Dim Decimation As Integer 
    Dim idx As Integer 
    Dim strVal As String 

    SetComboRiseValues cboRise, is80MHz 
    strVal = "" 
    If (cboRise.ListCount > 0) Then 
        For idx = 0 To (cboRise.ListCount - 1)
            strVal = strVal & cboRise.List(idx) & vbNewLine 
        Next 
        'txtRise = strVal
        cboRise.ListIndex = 0 
    End If 
    Decimation = SetRiseAndAvg(cboRise.ListIndex, is80MHz)
    GetFlattopValues cboFlatTop, Decimation, 0, is80MHz 
    strVal = "" 
    If (cboFlatTop.ListCount > 0) Then 
        For idx = 0 To (cboFlatTop.ListCount - 1)
            strVal = strVal & cboFlatTop.List(idx) & vbNewLine 
        Next 
        'txtFlattop = strVal
        cboRise.ListIndex = 0 
    End If 
End Sub 

Public Sub SetShapingIndex(cboShaping As ComboBox, strShapingIn As String)
    Dim ListIndex As Long 
    Dim strShaping As String 
    Dim idxShaping As Long 
    Dim dblShapingIn As Double 
    Dim dblShapingMin As Double 
    Dim dblShapingMax As Double 
    
    If (cboShaping.ListCount < 2) Then Exit Sub             'Shaping value error
    ListIndex = LB_ERR 
    dblShapingIn = CDbl(Val(strShapingIn))                      'test min
    strShaping = Format(dblShapingIn, "0.000")                 'format like cbo values
    ListIndex = FindCboIdxExact(cboShaping, strShaping)     'search for exact value
    If (ListIndex = LB_ERR) Then 
        ListIndex = FindCboIdx(cboShaping, strShaping)      'search for similar value
    End If 
    If (ListIndex = LB_ERR) Then        'find closet value by comparison
        dblShapingMin = CDbl(Val(cboShaping.List(0)))                           'Shaping min
        dblShapingMax = CDbl(Val(cboShaping.List(cboShaping.ListCount - 1)))    'Shaping max
        If (dblShapingIn <= dblShapingMin) Then        'test min
            ListIndex = 0 
        ElseIf (dblShapingIn >= dblShapingMax) Then    'test max
            ListIndex = cboShaping.ListCount - 1 
        Else                                    'test in range
            For idxShaping = 0 To cboShaping.ListCount - 2 
                dblShapingMin = CDbl(Val(cboShaping.List(idxShaping)))         'Shaping range min
                dblShapingMax = CDbl(Val(cboShaping.List(idxShaping + 1)))     'Shaping range max
                If ((dblShapingIn >= dblShapingMin) And (dblShapingIn <= dblShapingMax)) Then 
                    ListIndex = idxShaping 
                    Exit For 
                End If 
            Next 
        End If 
    End If 
    If ((ListIndex > LB_ERR) And (ListIndex < cboShaping.ListCount)) Then 
        cboShaping.ListIndex = ListIndex 
    End If 
End Sub 

Public Sub GetFlattopValues(cboFlatTop As ComboBox, DecimationIn As Integer, FlatTop As Integer, is80MHz As Boolean)
    Dim idxFlattop As Integer 
    Dim dblPeakingMult As Double 
    Dim Decimation As Integer 
    
    If (is80MHz) Then 
        dblPeakingMult = 0.25 
    Else 
        dblPeakingMult = 1# 
    End If 
    
    Decimation = DecimationIn - 1 ' adjust to use px4 algorithm
    cboFlatTop.Clear 
    For idxFlattop = 1 To 8 
        cboFlatTop.AddItem Trim(Format(CDbl(idxFlattop) * 0.05 * (2# ^ Decimation) * dblPeakingMult, "0.000") + "uS")
    Next 
    For idxFlattop = 9 To 62 
        If ((idxFlattop Mod 4) = 0) Then 
            cboFlatTop.AddItem Trim(Format(CDbl(idxFlattop) * 0.05 * (2# ^ Decimation) * dblPeakingMult, "0.000") + "uS")
        End If 
    Next 
    cboFlatTop.AddItem Trim(Format(CDbl(63#) * 0.05 * (2# ^ Decimation) * dblPeakingMult, "0.000") + "uS")
    cboFlatTop.ListIndex = FlatTop 
End Sub 

Public Sub SetComboRiseValues(cboRise As ComboBox, is80MHz As Boolean)
    Dim idxRise As Integer 
    Dim Decimation As Integer 
    Dim dblPeakingMult As Double 
    
    cboRise.Clear 
    If (is80MHz) Then 
        dblPeakingMult = 0.25 
        cboRise.AddItem Format((CDbl(1) * 0.2 * dblPeakingMult), "0.000") + "uS" 
        cboRise.AddItem Format((CDbl(2) * 0.2 * dblPeakingMult), "0.000") + "uS" 
    Else 
        dblPeakingMult = 1# 
    End If 
    
    For idxRise = 1 To 8 
        cboRise.AddItem Format((CDbl(idxRise) * 0.8 * dblPeakingMult), "0.000") + "uS" 
    Next 
    For Decimation = 1 To 4 
        For idxRise = 5 To 8 
            cboRise.AddItem Format((CDbl(idxRise) * 0.8 * (2# ^ Decimation) * dblPeakingMult), "0.000") + "uS" 
        Next 
    Next 
End Sub 

Public Function CheckRangeCDbl(TestVal As Single, MinVal As Single, MaxVal As Single)
    CheckRangeCDbl = CBool((TestVal >= MinVal) And (TestVal <= MaxVal))
End Function 

Private Function GetRiseTextValue(RiseIndex As Long, is80MHz As Boolean, isRiseAveCalc As BooleanAs String 
    Dim idxRiseText As Long 
    Dim idxAve As Long 
    Dim idxX As Long 
    Dim RiseTextArray(MAXPEAKINGTIMES - 1) As String 
    Dim strMsg As String 
    Dim dblPeakingMult As Double 
    
    If (isRiseAveCalc) Then 
        dblPeakingMult = 1#     'always use 20mhz values for riseave calcs
    ElseIf (is80MHz) Then 
        dblPeakingMult = 0.25 
    Else 
        dblPeakingMult = 1# 
    End If 
    
    strMsg = "" 
    If ((RiseIndex < 0) Or (RiseIndex >= MAXPEAKINGTIMES)) Then Exit Function 
    idxRiseText = -1 
    If (is80MHz) Then 
        For idxX = 1 To 2 
            idxRiseText = idxRiseText + 1 
            If (isRiseAveCalc) Then     'create valid 20mhz values for 80mhz rise ave
                RiseTextArray(idxRiseText) = CStr(CDbl(1) * 0.8 * dblPeakingMult) + "uS" 
            Else                        'create real 80mhz values
                RiseTextArray(idxRiseText) = CStr(CDbl(idxX) * 0.2 * dblPeakingMult) + "uS" 
            End If 
            strMsg = strMsg & RiseTextArray(idxRiseText) & vbNewLine 
        Next idxX 
    End If 
    For idxX = 1 To 8 
        idxRiseText = idxRiseText + 1 
        RiseTextArray(idxRiseText) = CStr(CDbl(idxX) * 0.8 * dblPeakingMult) + "uS" 
        strMsg = strMsg & RiseTextArray(idxRiseText) & vbNewLine 
    Next idxX 
    For idxAve = 1 To 4 
        strMsg = "" 
        For idxX = 5 To 8 
            idxRiseText = idxRiseText + 1 
            RiseTextArray(idxRiseText) = CStr(CDbl(idxX) * 0.8 * (2# ^ idxAve) * dblPeakingMult) + "uS" 
            strMsg = strMsg & RiseTextArray(idxRiseText) & vbNewLine 
        Next idxX 
    Next idxAve 
    If (Not is80MHz) Then       'fill array with valid values
        For idxX = 1 To 2 
            idxRiseText = idxRiseText + 1 
            RiseTextArray(idxRiseText) = CStr(CDbl(8) * 0.8 * (2# ^ 4) * dblPeakingMult) + "uS" 
            strMsg = strMsg & RiseTextArray(idxRiseText) & vbNewLine 
        Next 
    End If 
    GetRiseTextValue = RiseTextArray(RiseIndex)
End Function 

'Sets Rise and Avg global values from stored combobox index
'FlatTop = FlatTop combobox control index value
Public Function SetRiseAndAvg(RiseIndex As Long, is80MHz As BooleanAs Integer 
    Dim strRiseText As String 
    Dim SngRiseVal As Single 
    Dim Rise As Integer 
    Dim Avg As Integer 
    
    If ((RiseIndex < 0) Or (RiseIndex >= MAXPEAKINGTIMES)) Then Exit Function 
    strRiseText = GetRiseTextValue(RiseIndex, is80MHz, True)    'uses value 20mhz only
    SngRiseVal = CDbl(Val(strRiseText))
    If CheckRangeCDbl(SngRiseVal, 0, 6.4) Then 
        Rise = SngRiseVal / 0.8 
        Avg = 1 
    ElseIf CheckRangeCDbl(SngRiseVal, 8, 12.8) Then 
        Rise = SngRiseVal / 1.6 
        Avg = 2 
    ElseIf CheckRangeCDbl(SngRiseVal, 16, 25.6) Then 
        Rise = SngRiseVal / 3.2 
        Avg = 3 
    ElseIf CheckRangeCDbl(SngRiseVal, 32, 51.2) Then 
        Rise = SngRiseVal / 6.4 
        Avg = 4 
    ElseIf CheckRangeCDbl(SngRiseVal, 64, 102.4) Then 
        Rise = SngRiseVal / 12.8 
        Avg = 5 
    End If 
    SetRiseAndAvg = Avg 
End Function 




'=========================================================
'==== Shaping ============================================
'=========================================================