modDP5_Protocol Source Code

Option Explicit 

Public strCommStatus As String 
Public Declare Function timeGetTime Lib "winmm.dll" () As Long  'timeGetTimeVB
Public Packet_Received As Boolean 
Public PacketIn(24648) As Byte ' largest possible IN packet
Public PIN As Packet_In 
Public UDP_offset As Integer 
Public USB_Default_Timeout As Boolean 

Public USBDeviceTest As Boolean 

Public Enum TRANSMIT_PACKET_TYPE 
     'REQUEST_PACKETS_TO_DP5
    XMTPT_SEND_STATUS 
    XMTPT_SEND_SPECTRUM 
    XMTPT_SEND_CLEAR_SPECTRUM 
    XMTPT_SEND_SPECTRUM_STATUS 
    XMTPT_SEND_CLEAR_SPECTRUM_STATUS 
    XMTPT_BUFFER_SPECTRUM 
    XMTPT_BUFFER_CLEAR_SPECTRUM 
    XMTPT_SEND_BUFFER 
    XMTPT_SEND_DP4_STYLE_STATUS 
    XMTPT_SEND_PX4_CONFIG 
    XMTPT_SEND_SCOPE_DATA 
    XMTPT_SEND_512_BYTE_MISC_DATA 
    XMTPT_SEND_SCOPE_DATA_REARM 
    XMTPT_SEND_ETHERNET_SETTINGS 
    XMTPT_SEND_DIAGNOSTIC_DATA 
    XMTPT_SEND_NETFINDER_PACKET 
    XMTPT_SEND_HARDWARE_DESCRIPTION 
    XMTPT_SEND_SCA 
    XMTPT_LATCH_SEND_SCA 
    XMTPT_LATCH_CLEAR_SEND_SCA 
    XMTPT_SEND_ROI_OR_FIXED_BLOCK 
    XMTPT_PX4_STYLE_CONFIG_PACKET 
    XMTPT_SEND_CONFIG_PACKET_EX 
    XMTPT_SEND_CONFIG_PACKET_TO_HW 
    XMTPT_READ_CONFIG_PACKET 
    XMTPT_FULL_READ_CONFIG_PACKET 
    XMTPT_ERASE_FPGA_IMAGE 
    XMTPT_UPLOAD_PACKET_FPGA 
    XMTPT_REINITIALIZE_FPGA 
    XMTPT_ERASE_UC_IMAGE_0 
    XMTPT_ERASE_UC_IMAGE_1 
    XMTPT_ERASE_UC_IMAGE_2 
    XMTPT_UPLOAD_PACKET_UC 
    XMTPT_SWITCH_TO_UC_IMAGE_0 
    XMTPT_SWITCH_TO_UC_IMAGE_1 
    XMTPT_SWITCH_TO_UC_IMAGE_2 
    XMTPT_UC_FPGA_CHECKSUMS 

    'VENDOR_REQUESTS_TO_DP5
    XMTPT_CLEAR_SPECTRUM_BUFFER 
    XMTPT_ENABLE_MCA_MCS 
    XMTPT_DISABLE_MCA_MCS 
    XMTPT_ARM_DIGITAL_OSCILLOSCOPE 
    XMTPT_AUTOSET_INPUT_OFFSET 
    XMTPT_AUTOSET_FAST_THRESHOLD 
    XMTPT_READ_IO3_0 
    XMTPT_WRITE_IO3_0 
    XMTPT_WRITE_512_BYTE_MISC_DATA 
    XMTPT_SET_DCAL 
    XMTPT_SET_PZ_CORRECTION_UC_TEMP_CAL_PZ 
    XMTPT_SET_PZ_CORRECTION_UC_TEMP_CAL_UC 
    XMTPT_SET_BOOT_FLAGS 
    XMTPT_SET_HV_DP4_EMULATION 
    XMTPT_SET_TEC_DP4_EMULATION 
    XMTPT_SET_INPUT_OFFSET_DP4_EMULATION 
    XMTPT_SET_ADC_CAL_GAIN_OFFSET 
    XMTPT_SET_SPECTRUM_OFFSET 
    XMTPT_REQ_SCOPE_DATA_MISC_DATA_SCA_PACKETS 
    XMTPT_SET_SERIAL_NUMBER 
    XMTPT_CLEAR_GP_COUNTER 
    XMTPT_SWITCH_SUPPLIES 
    
    XMTPT_SEND_TEST_PACKET 
End Enum  'TRANSMIT_PACKET_TYPE

Public Enum PID1_TYPE 
    PID1_REQ_STATUS = &H1 
    PID1_REQ_SPECTRUM = &H2 
    PID1_REQ_SCOPE_MISC = &H3 
    PID1_REQ_SCA = &H4 
    PID1_REQ_CONFIG = &H20 
    PID1_REQ_FPGA_UC = &H30 
    PID1_RCV_STATUS = &H80 
    PID1_RCV_SPECTRUM = &H81 
    PID1_RCV_SCOPE_MISC = &H82 
    PID1_RCV_SCA = &H83 
    PID1_VENDOR_REQ = &HF0 
    PID1_ACK = &HFF 
End Enum  'PID1_TYPE

Public Enum PID2_REQ_STATUS_TYPE 
    PID2_SEND_DP4_STYLE_STATUS = &H1 
End Enum  'PID2_REQ_STATUS_TYPE

Public Enum PID2_REQ_SPECTRUM_TYPE 
    ' REQUEST_PACKETS_TO_DP5
    PID2_SEND_SPECTRUM = &H1 
    PID2_SEND_CLEAR_SPECTRUM = &H2 
    PID2_SEND_SPECTRUM_STATUS = &H3 
    PID2_SEND_CLEAR_SPECTRUM_STATUS = &H4 
    'PID2_BUFFER_SPECTRUM
    'PID2_BUFFER_CLEAR_SPECTRUM
    'PID2_SEND_BUFFER
    'PID2_SEND_CONFIG
End Enum  'PID2_REQ_SPECTRUM_TYPE

Public Enum PID2_REQ_SCOPE_MISC_TYPE 
    PID2_SEND_SCOPE_DATA = &H1 
    PID2_SEND_512_BYTE_MISC_DATA = &H2 
    PID2_SEND_SCOPE_DATA_REARM = &H3 
    PID2_SEND_ETHERNET_SETTINGS = &H4 
    PID2_SEND_DIAGNOSTIC_DATA = &H5 
    PID2_SEND_HARDWARE_DESCRIPTION = &H6 
    PID2_SEND_NETFINDER_READBACK = &H7 
End Enum  'PID2_REQ_SCOPE_MISC_TYPE

Public Enum PID2_REQ_SCA_TYPE 
    PID2_SEND_SCA = &H1 
    PID2_LATCH_SEND_SCA = &H2 
    PID2_LATCH_CLEAR_SEND_SCA = &H3 
End Enum  'PID2_REQ_SCA_TYPE

Public Enum PID2_REQ_CONFIG_TYPE 
    PID2_PX4_STYLE_CONFIG_PACKET = &H1 
    PID2_TEXT_CONFIG_PACKET = &H2 
    PID2_CONFIG_READBACK_PACKET = &H3 
End Enum  'PID2_SEND_CONFIG_TYPE

Public Enum PID2_REQ_FPGA_UC_TYPE 
    PID2_ERASE_FPGA_IMAGE = &H1 
    PID2_UPLOAD_PACKET_FPGA = &H2 
    PID2_REINITIALIZE_FPGA = &H3 
    PID2_ERASE_UC_IMAGE_0 = &H4 
    PID2_ERASE_UC_IMAGE_1 = &H5 
    PID2_ERASE_UC_IMAGE_2 = &H6 
    PID2_UPLOAD_PACKET_UC = &H7 
    PID2_SWITCH_TO_UC_IMAGE_0 = &H8 
    PID2_SWITCH_TO_UC_IMAGE_1 = &H9 
    PID2_SWITCH_TO_UC_IMAGE_2 = &HA 
    'PID2_UC_FPGA_CHECKSUMS
End Enum  'PID2_REQ_FPGA_UC_TYPE

Public Enum PID2_VENDOR_REQ_TYPE 
    PID2_CLEAR_SPECTRUM_BUFFER = &H1 
    PID2_ENABLE_MCA_MCS = &H2 
    PID2_DISABLE_MCA_MCS = &H3 
    PID2_ARM_DIGITAL_OSCILLOSCOPE = &H4 
    PID2_AUTOSET_INPUT_OFFSET = &H5 
    PID2_AUTOSET_FAST_THRESHOLD = &H6 
    PID2_READ_IO3_0 = &H7 
    PID2_WRITE_IO3_0 = &H8 
    PID2_WRITE_512_BYTE_MISC_DATA = &H9 
    PID2_SET_DCAL = &HA 
    PID2_SET_PZ_CORRECTION_UC_TEMP_CAL_PZ = &HB 
    PID2_SET_PZ_CORRECTION_UC_TEMP_CAL_UC = &HC 
    PID2_SET_BOOT_FLAGS = &HD 
    'PID2_SET_HV_DP4_EMULATION
    'PID2_SET_TEC_DP4_EMULATION
    'PID2_SET_INPUT_OFFSET_DP4_EMULATION
    PID2_SET_ADC_CAL_GAIN_OFFSET = &HE 
    'PID2_SET_SPECTRUM_OFFSET
    'PID2_REQ_SCOPE_DATA_MISC_DATA_SCA_PACKETS
    PID2_SET_SERIAL_NUMBER = &HF 
    PID2_CLEAR_GP_COUNTER = &H10 
    PID2_SET_ETHERNET_SETTINGS = &H11 
    'PID2_SWITCH_SUPPLIES
    PID2_ETHERNET_ALLOW_SHAREING = &H20 
    PID2_ETHERNET_NO_SHARING = &H21 
    PID2_ETHERNET_LOCK_IP = &H22 
End Enum  'PID2_VENDOR_REQ_TYPE

Public Enum PID2_RCV_STATUS_TYPE 
    RCVPT_DP4_STYLE_STATUS = &H1 
End Enum  'PID2_RCV_STATUS_TYPE
    
Public Enum PID2_RCV_SPECTRUM_TYPE 
    RCVPT_256_CHANNEL_SPECTRUM = &H1 
    RCVPT_256_CHANNEL_SPECTRUM_STATUS = &H2 
    RCVPT_512_CHANNEL_SPECTRUM = &H3 
    RCVPT_512_CHANNEL_SPECTRUM_STATUS = &H4 
    RCVPT_1024_CHANNEL_SPECTRUM = &H5 
    RCVPT_1024_CHANNEL_SPECTRUM_STATUS = &H6 
    RCVPT_2048_CHANNEL_SPECTRUM = &H7 
    RCVPT_2048_CHANNEL_SPECTRUM_STATUS = &H8 
    RCVPT_4096_CHANNEL_SPECTRUM = &H9 
    RCVPT_4096_CHANNEL_SPECTRUM_STATUS = &HA 
    RCVPT_8192_CHANNEL_SPECTRUM = &HB 
    RCVPT_8192_CHANNEL_SPECTRUM_STATUS = &HC 
End Enum  'PID2_RCV_SPECTRUM_TYPE

Public Enum PID2_RCV_SCOPE_MISC_TYPE 
    RCVPT_SCOPE_DATA = &H1 
    RCVPT_512_BYTE_MISC_DATA = &H2 
    RCVPT_SCOPE_DATA_WITH_OVERFLOW = &H3 
    RCVPT_ETHERNET_SETTINGS = &H4 
    RCVPT_DIAGNOSTIC_DATA = &H5 
    RCVPT_HARDWARE_DESCRIPTION = &H6 
    RCVPT_CONFIG_READBACK = &H7 
    RCVPT_NETFINDER_READBACK = &H8 
End Enum  'PID2_REQ_SCOPE_MISC_TYPE

Public Enum PID2_RCV_SCA_TYPE 
    RCVPT_SCA = &H1 
End Enum  'PID2_REQ_SCA_TYPE

Public Enum PID2_ACK_TYPE  'PID1_ACK, PID2_ACK_TYPE)
    PID2_ACK_OK = &H0 
    PID2_ACK_SYNC_ERROR = &H1 
    PID2_ACK_PID_ERROR = &H2 
    PID2_ACK_LEN_ERROR = &H3 
    PID2_ACK_CHECKSUM_ERROR = &H4 
    PID2_ACK_BAD_PARAM = &H5 
    PID2_ACK_BAD_HEX_REC = &H6 
    PID2_ACK_UNRECOG = &H7 
    PID2_ACK_FPGA_ERROR = &H8 
    PID2_ACK_CP2201_NOT_FOUND = &H9 
    PID2_ACK_SCOPE_DATA_NOT_AVAIL = &HA 
    PID2_ACK_PC5_NOT_PRESENT = &HB 
    PID2_ACK_OK_ETHERNET_SHARE_REQ = &HC 
    PID2_ACK_ETHERNET_BUSY = &HD 
End Enum  'PID2_ACK_TYPE

Public Const ACK = 0 
Public Const SYNC1_ = &HF5 
Public Const SYNC2_ = &HFA 

Public Const RS232 = 0 
Public Const USB = 1 
Public Const ETHERNET = 2 

Public Const ETHERNET_TIMEOUT = 1000   ' default timeout of 1000mS
Public Const INTERNET_TIMEOUT = 3000   ' 3 seconds if DP5 is on different subnet than this PC
Public Const RS232_TIMEOUT = 2500      ' default timeout of 2500mS (8K spectrum ~2.2s)
Public Const USB_TIMEOUT = 500         ' default timeout of 500mS

Public Const ETHERNET_KEEPALIVE = 1500 ' send a keep-alive after 1.5s of interface inactivity
Public Const Retries = 2   ' total of 3 attempts

Public OutStr As String 
Public InPacketType As Integer 
Public PlotColor As Long 
Public Scope(0 To 2047) As Byte  ' make this a structure, with scope info?
Public ScopeOverFlow As Boolean 
Public MiscData(512) As Byte 
Public CommError As Boolean 

Public Type Packet_In 
    PID1 As Byte 
    PID2 As Byte 
    LEN As Integer  ' signed, but data payload always less than 32768
    STATUS As Byte 
    DATA(32768) As Byte 
    CheckSum As Long 
End Type 

Public BufferOUT(520) As Byte 

Public Type Packet_Out 
    PID1 As Byte 
    PID2 As Byte 
    LEN As Integer  ' signed, but data payload always less than 32768
    EXPECTEDRESPONSE As Byte 
    DATA(514) As Byte 
End Type 

Public Type Spec 
    DATA() As Long  ' this keeps total of static data under 64K VB limit
    Channels As Integer 
End Type 

Public Enum PX5_OPTIONS 
    PX5_OPTION_NONE = 0 
    PX5_OPTION_HPGe_HVPS = 1 
    PX5_OPTION_TEST_TEK = 4 
    PX5_OPTION_TEST_MOX = 5 
    PX5_OPTION_TEST_AMP = 6 
    PX5_OPTION_TEST_MODE_1 = 8 
    PX5_OPTION_TEST_MODE_2 = 9 
End Enum 

Public Type Stat 
    RAW(64) As Byte 
    SerialNumber As Long 
    FastCount As Double 
    SlowCount As Double 
    FPGA As Byte 
    Firmware As Byte 
    Build As Byte 
    AccumulationTime As Double 
    HV As Double 
    DET_TEMP As Double 
    DP5_TEMP As Double 
    PX4 As Boolean 
    AFAST_LOCKED As Boolean 
    MCA_EN As Boolean 
    PresetCountDone As Boolean 
    PresetRtDone As Boolean 
    PresetLtDone As Boolean 
    SUPPLIES_ON As Boolean 
    SCOPE_DR As Boolean 
    DP5_CONFIGURED As Boolean 
    GP_COUNTER As Double 
    AOFFSET_LOCKED As Boolean 
    MCS_DONE As Boolean 
    DCAL As Double 
    PZCORR As Byte  ' or single?
    UC_TEMP_OFFSET As Byte 
    AN_IN As Double 
    VREF_IN As Double 
    PC5_SerialNumber As Long 
    PC5_PRESENT As Boolean 
    PC5_HV_POL As Boolean 
    PC5_8_5V As Boolean 
    LiveTime As Double 
    RealTime As Double 
    BOOT_FLAG_LSB As Byte 
    BOOT_FLAG_MSB As Byte 
    BOOT_HV As Double 
    BOOT_TEC As Double 
    BOOT_INPOFFSET As Double    ' or long?
    ADC_GAIN_CAL As Double 
    ADC_OFFSET_CAL As Byte 
    SPECTRUM_OFFSET As Long     ' or single?
   
    b80MHzMode As Boolean 
    bFPGAAutoClock As Boolean 
    DEVICE_ID As Byte           ' 0=DP5, 1=PX5, 2=DP5G, 3=MCA8000D, 4=TB5
    strDeviceID As String 
    ReBootFlag As Boolean       ' FW6.05 and later
    DPP_options As Byte         ' 1=HPGe HVPS
    HPGe_HV_INH As Boolean 
    HPGe_HV_INH_POL As Boolean 
    TEC_Voltage As Double 
    DPP_ECO As Byte 
    AU34_2 As Boolean 
    isAscInstalled As Boolean 
    isAscEnabled As Boolean 
    bScintHas80MHzOption As Boolean 
    isDP5_RevDxGains As Boolean 
End Type 

Public STATUS As Stat 
Public SPECTRUM As Spec 

Public Function timeGetTimeVB() As Double 
    Dim lRawTime As Long 
    Dim dblTemp As Double 

    lRawTime = timeGetTime()    'timeGetTimeVB
    If (lRawTime < 0) Then      'convert to unsigned integer
        dblTemp = (CDbl(lRawTime) + 1#) + 4294967295# 
    Else 
        dblTemp = lRawTime 
    End If 
    timeGetTimeVB = dblTemp 
End Function 

Public Function msTimeExpired(curStartTimeMS As Currency, curDelayTimeMS As CurrencyAs Boolean 
    Dim curNewTime As Currency 
    curNewTime = timeGetTimeVB()
    If curStartTimeMS < 0 Then curStartTimeMS = curStartTimeMS + CCur(2 ^ 32)
    If ((curNewTime < 0) Or (curNewTime < curStartTimeMS)) Then 
        curNewTime = curNewTime + CCur(2 ^ 32)
    End If 
    msTimeExpired = CBool(curNewTime >= (curStartTimeMS + curDelayTimeMS))
End Function 

Public Function msTimeStart() As Currency 
    Dim curNewTime As Currency 
    msTimeStart = timeGetTimeVB()
End Function 

Public Function msTimeDiff(curStartTime As CurrencyAs Currency 
    Dim curNewTime As Currency 
    curNewTime = timeGetTimeVB()
    If (curNewTime < curStartTime) Then 
        curStartTime = curStartTime 
        curNewTime = curNewTime + (2 ^ 32)
        msTimeDiff = curNewTime - curStartTime 
    Else 
        msTimeDiff = curNewTime - curStartTime 
    End If 
End Function 

Public Function msDelay(MSec As LongAs Boolean 
    Dim curStart As Currency 
    Dim TimeExpired As Boolean 
    Dim i As Long 
    TimeExpired = False 
    curStart = msTimeStart()
    Do 
        DoEvents 
        TimeExpired = msTimeExpired(curStart, CCur(MSec))
    Loop While (Not TimeExpired)
    msDelay = TimeExpired 
End Function 

Public Function SendPacketUSB(DppWinUSB As WinUsbDevice, ByRef Buffer() As ByteByRef PacketIn() As ByteAs Boolean 
    Dim bytesWritten As Long, bytesRead As Long 
    Dim success As Boolean 
    Dim strLog As String 
    Dim i As Long 
    Dim PLen As Long 
    
    If ((Buffer(2) = PID1_REQ_SCOPE_MISC) And Buffer(3) = PID2_SEND_DIAGNOSTIC_DATA) Then 
        ' Request Diagnostic Packet delay 'USB_DiagDataDelayMS
        Call SetPipePolicy1(DppWinUSB, CByte(DppWinUSB.bulkInPipe), CInt(PIPE_POLICY_TYPE.PIPE_TRANSFER_TIMEOUT), USB_DiagDataDelayMS)
        USB_Default_Timeout = False     ' flag that non-default timeout is in use
    Else 
        If USB_Default_Timeout = False Then  ' change pipetimeout to default if it isn't already set that way
            Call SetPipePolicy1(DppWinUSB, CByte(DppWinUSB.bulkInPipe), CInt(PIPE_POLICY_TYPE.PIPE_TRANSFER_TIMEOUT), USB_TIMEOUT)
            USB_Default_Timeout = True     ' flag that default timeout is in use
        End If 
    End If 

    PLen = (Buffer(4) * 256) + Buffer(5) + 7 

    ACK_Received = False 
    Packet_Received = False ' a response packet is always expected
    PIN.STATUS = &HFF   ' packet invalid - will be overwritten soon by response/ACK packet

    success = WinUsb_WritePipe(DppWinUSB.winUsbHandle, CByte(DppWinUSB.bulkOutPipe), Buffer(0), PLen + 1, bytesWritten, 0&)
    success = VbBool(success)
    
    If (success) Then 
        success = WinUsb_ReadPipe(DppWinUSB.winUsbHandle, CByte(DppWinUSB.bulkInPipe), PacketIn(0), 32767, bytesRead, 0&)
        strLog = strLog & "USB Req sent: PID1=" & str(Buffer(2)) & ", PID2=" & str(Buffer(3)) & ": OK" & vbCrLf,
        success = VbBool(success)
        If (success) Then 
            strLog = strLog & "USB Response: PID1=" & str(PacketIn(2)) & ", PID2=" & str(PacketIn(3)) & ": OK (read " & str(bytesRead) & ")" & vbCrLf,
            SendPacketUSB = True 
        Else 
            strLog = strLog & "USB Response: FAIL (read " & str(bytesRead) & ")" & vbCrLf)
            SendPacketUSB = False 
        End If 
    Else 
       strLog = strLog & "USB Req sent: FAIL" & vbCrLf 
       SendPacketUSB = False 
    End If 
End Function