Attribute VB_Name = "modSendCommand" Option Explicit Public Const DP4_PX4_OLD_CFG_SIZE = 64 Public Whitespace As String Public Function DP5_CMD(ByRef Buffer() As Byte, XmtCmd As TRANSMIT_PACKET_TYPE) As Boolean Dim bCmdFound As Boolean Dim iFileNum As Integer Dim D As String Dim bt As Byte Dim idxData As Integer Dim idxMiscData As Integer Dim POUT As Packet_Out Dim lLen As Long Dim cstrCfg As String Dim strTemp As String bCmdFound = True POUT.LEN = 0 Select Case XmtCmd ''REQUEST_PACKETS_TO_DP5 Case XMTPT_SEND_STATUS POUT.PID1 = PID1_REQ_STATUS POUT.PID2 = PID2_SEND_DP4_STYLE_STATUS 'Case XMTPT_SEND_SPECTRUM 'Case XMTPT_SEND_CLEAR_SPECTRUM Case XMTPT_SEND_SPECTRUM_STATUS POUT.PID1 = PID1_REQ_SPECTRUM POUT.PID2 = PID2_SEND_SPECTRUM_STATUS ' send spectrum & status Case XMTPT_SEND_CLEAR_SPECTRUM_STATUS POUT.PID1 = PID1_REQ_SPECTRUM POUT.PID2 = PID2_SEND_CLEAR_SPECTRUM_STATUS ' send & clear spectrum & status 'Case XMTPT_BUFFER_SPECTRUM 'Case XMTPT_BUFFER_CLEAR_SPECTRUM 'Case XMTPT_SEND_BUFFER 'Case XMTPT_SEND_DP4_STYLE_STATUS 'Case XMTPT_SEND_CONFIG Case XMTPT_SEND_SCOPE_DATA POUT.PID1 = PID1_REQ_SCOPE_MISC POUT.PID2 = PID2_SEND_SCOPE_DATA Case XMTPT_SEND_512_BYTE_MISC_DATA POUT.PID1 = PID1_REQ_SCOPE_MISC POUT.PID2 = PID2_SEND_512_BYTE_MISC_DATA ' request misc data 'Case XMTPT_SEND_SCOPE_DATA_REARM 'Case XMTPT_SEND_ETHERNET_SETTINGS Case XMTPT_SEND_DIAGNOSTIC_DATA POUT.PID1 = PID1_REQ_SCOPE_MISC POUT.PID2 = PID2_SEND_DIAGNOSTIC_DATA ' Request Diagnostic Packet POUT.LEN = 0 Case XMTPT_SEND_NETFINDER_PACKET POUT.PID1 = PID1_REQ_SCOPE_MISC POUT.PID2 = PID2_SEND_NETFINDER_READBACK ' Request NetFinder Packet POUT.LEN = 0 'Case XMTPT_SEND_HARDWARE_DESCRIPTION 'Case XMTPT_SEND_SCA 'Case XMTPT_LATCH_SEND_SCA 'Case XMTPT_LATCH_CLEAR_SEND_SCA 'Case XMTPT_SEND_ROI_OR_FIXED_BLOCK Case XMTPT_PX4_STYLE_CONFIG_PACKET iFileNum = FreeFile Open App.Path & "\RAW.CFG" For Input As #iFileNum For bt = 0 To 63 Input #iFileNum, D$ POUT.DATA(bt) = Val("&H" + D$) Next Close #iFileNum POUT.PID1 = PID1_REQ_CONFIG POUT.PID2 = PID2_PX4_STYLE_CONFIG_PACKET ' PX4-style config packet POUT.LEN = DP4_PX4_OLD_CFG_SIZE ''''' Case XMTPT_SEND_CONFIG_PACKET_TO_HW ''''' Do ''''' Line Input #iFileNum, S$ ''''' S$ = StrConv(S$, vbUpperCase) ' convert line to upper case ''''' If (Left(S$, 1) >= "A") And (Left(S$, 1) <= "Z") And (InStr(S$, ";") > 0) Then ' for command, first character on line has to be uppercase alpha and ends with ';' ''''' S$ = Left(S$, InStr(S$, ";")) ''''' For X = 1 To Len(S$) ''''' If InStr(1, Whitespace$, Mid$(S$, X, 1)) = 0 Then ''''' D$ = D$ + Mid$(S$, X, 1) ' add character to command string if not whitespace ''''' End If ''''' Next X ''''' End If ''''' Loop While Not EOF(1) ''''' For idxData = 1 To Len(D$) ''''' POUT.DATA(idxData - 1) = Asc(Mid(D$, idxData, 1)) ''''' Next idxData ''''' Close #iFileNum ''''' POUT.PID1 = PID1_REQ_CONFIG ''''' POUT.PID2 = PID2_TEXT_CONFIG_PACKET ' text config packet ''''' POUT.LEN = Len(D$) '''''' End If Case XMTPT_SEND_CONFIG_PACKET_TO_HW cstrCfg = "" cstrCfg = s.HwCfgDP5Out If (s.profile.SendCoarseFineGain) Then cstrCfg = RemoveCmd("GAIN", cstrCfg) Else cstrCfg = RemoveCmd("GAIA", cstrCfg) cstrCfg = RemoveCmd("GAIF", cstrCfg) End If cstrCfg = RemoveCmdByDeviceType(cstrCfg, STATUS.PC5_PRESENT, STATUS.DEVICE_ID, STATUS.isDP5_RevDxGains, STATUS.DPP_ECO) '''''==== remove whitespace ==================================================== ''''lLen = Len(cstrCfg) ''''strTemp = cstrCfg ''''cstrCfg = "" ''''If (lLen > 0) Then '''' For idxData = 1 To lLen '''' If InStr(1, Whitespace, Mid(strTemp, idxData, 1)) = 0 Then '''' cstrCfg = cstrCfg & Mid(strTemp, idxData, 1) 'append non-whitespace chars '''' End If '''' Next ''''End If '''''==== remove whitespace ==================================================== lLen = Len(cstrCfg) If (lLen > 0) Then For idxData = 1 To lLen POUT.DATA(idxData - 1) = Asc(Mid(cstrCfg, idxData, 1)) Next End If POUT.PID1 = PID1_REQ_CONFIG POUT.PID2 = PID2_TEXT_CONFIG_PACKET ' text config packet POUT.LEN = lLen Case XMTPT_SEND_CONFIG_PACKET_EX ' bypass any filters cstrCfg = "" cstrCfg = s.HwCfgDP5Out lLen = Len(cstrCfg) If (lLen > 0) Then For idxData = 1 To lLen POUT.DATA(idxData - 1) = Asc(Mid(cstrCfg, idxData, 1)) Next End If POUT.PID1 = PID1_REQ_CONFIG POUT.PID2 = PID2_TEXT_CONFIG_PACKET ' text config packet POUT.LEN = lLen Case XMTPT_READ_CONFIG_PACKET cstrCfg = "" cstrCfg = s.HwRdBkDP5Out lLen = Len(cstrCfg) If (lLen > 0) Then For idxData = 1 To lLen POUT.DATA(idxData - 1) = Asc(Mid(cstrCfg, idxData, 1)) Next End If POUT.PID1 = PID1_REQ_CONFIG POUT.PID2 = PID2_CONFIG_READBACK_PACKET ' read config packet POUT.LEN = lLen Case XMTPT_FULL_READ_CONFIG_PACKET cstrCfg = "" cstrCfg = CreateFullReadBackCmd() lLen = Len(cstrCfg) If (lLen > 0) Then For idxData = 1 To lLen POUT.DATA(idxData - 1) = Asc(Mid(cstrCfg, idxData, 1)) Next End If POUT.PID1 = PID1_REQ_CONFIG POUT.PID2 = PID2_CONFIG_READBACK_PACKET ' read config packet POUT.LEN = lLen Case XMTPT_ERASE_FPGA_IMAGE POUT.PID1 = PID1_REQ_FPGA_UC POUT.PID2 = PID2_ERASE_FPGA_IMAGE POUT.LEN = 2 POUT.DATA(0) = &H12 POUT.DATA(1) = &H34 'Case XMTPT_UPLOAD_PACKET_FPGA 'Case XMTPT_REINITIALIZE_FPGA 'Case XMTPT_ERASE_UC_IMAGE_0 Case XMTPT_ERASE_UC_IMAGE_1 POUT.PID1 = PID1_REQ_FPGA_UC POUT.PID2 = PID2_ERASE_UC_IMAGE_1 ' erase image #1 (sector 5) POUT.LEN = 2 POUT.DATA(0) = &H12 POUT.DATA(1) = &H34 'Case XMTPT_ERASE_UC_IMAGE_2 'Case XMTPT_UPLOAD_PACKET_UC 'Case XMTPT_SWITCH_TO_UC_IMAGE_0 Case XMTPT_SWITCH_TO_UC_IMAGE_1 POUT.PID1 = PID1_REQ_FPGA_UC POUT.PID2 = PID2_SWITCH_TO_UC_IMAGE_1 ' switch to uC image #1 POUT.LEN = 2 POUT.DATA(0) = &HA5 ' uC FLASH unlock keys POUT.DATA(1) = &HF1 'Case XMTPT_SWITCH_TO_UC_IMAGE_2 'Case XMTPT_UC_FPGA_CHECKSUMS ''VENDOR_REQUESTS_TO_DP5 'Case XMTPT_CLEAR_SPECTRUM_BUFFER Case XMTPT_ENABLE_MCA_MCS POUT.PID1 = PID1_VENDOR_REQ POUT.PID2 = PID2_ENABLE_MCA_MCS POUT.LEN = 0 Case XMTPT_DISABLE_MCA_MCS POUT.PID1 = PID1_VENDOR_REQ POUT.PID2 = PID2_DISABLE_MCA_MCS POUT.LEN = 0 Case XMTPT_ARM_DIGITAL_OSCILLOSCOPE POUT.PID1 = PID1_VENDOR_REQ POUT.PID2 = PID2_ARM_DIGITAL_OSCILLOSCOPE ' arm trigger 'Case XMTPT_AUTOSET_INPUT_OFFSET 'Case XMTPT_AUTOSET_FAST_THRESHOLD 'Case XMTPT_READ_IO3_0 'Case XMTPT_WRITE_IO3_0 'Case XMTPT_SET_DCAL 'Case XMTPT_SET_PZ_CORRECTION_UC_TEMP_CAL 'Case XMTPT_SET_PZ_CORRECTION_UC_TEMP_CAL 'Case XMTPT_SET_BOOT_FLAGS 'Case XMTPT_SET_HV_DP4_EMULATION 'Case XMTPT_SET_TEC_DP4_EMULATION 'Case XMTPT_SET_INPUT_OFFSET_DP4_EMULATION 'Case XMTPT_SET_ADC_CAL_GAIN_OFFSET 'Case XMTPT_SET_SPECTRUM_OFFSET 'Case XMTPT_REQ_SCOPE_DATA_MISC_DATA_SCA_PACKETS 'Case XMTPT_SET_SERIAL_NUMBER 'Case XMTPT_CLEAR_GP_COUNTER 'Case XMTPT_SWITCH_SUPPLIES 'Case XMTPT_SEND_TEST_PACKET Case Else bCmdFound = False End Select If bCmdFound Then If (Not POUT_Buffer(POUT, Buffer())) Then bCmdFound = False End If End If DP5_CMD = bCmdFound End Function Public Function DP5_CMD_Data(ByRef Buffer() As Byte, XmtCmd As TRANSMIT_PACKET_TYPE, DataOut As Variant) As Boolean Dim bCmdFound As Boolean Dim idxData As Integer Dim idxMiscData As Integer Dim POUT As Packet_Out Dim PktLen As Integer bCmdFound = False POUT.LEN = 0 Select Case XmtCmd Case XMTPT_WRITE_512_BYTE_MISC_DATA POUT.PID1 = PID1_VENDOR_REQ POUT.PID2 = PID2_WRITE_512_BYTE_MISC_DATA ' write misc data POUT.LEN = 512 For idxMiscData = 0 To 511 POUT.DATA(idxMiscData) = Asc(Mid(DataOut + String(512, 0), idxMiscData + 1, 1)) Next idxMiscData bCmdFound = True If (Not POUT_Buffer(POUT, Buffer())) Then bCmdFound = False End If Case XMTPT_SEND_TEST_PACKET If (Not IsMissing(DataOut)) Then PktLen = Len(DataOut) If (PktLen >= 8) Then For idxData = 0 To PktLen - 1 Buffer(idxData) = CLng(DataOut(idxData)) Next bCmdFound = True End If End If Case Else bCmdFound = False End Select DP5_CMD_Data = bCmdFound End Function Public Function POUT_Buffer(POUT As Packet_Out, ByRef Buffer() As Byte) As Boolean Dim idxBuffer As Integer Dim CS As Long On Error GoTo POUT_BufferErr If (UBound(Buffer) < POUT.LEN + 7) Then ReDim Buffer(POUT.LEN + 7) Buffer(0) = SYNC1_ Buffer(1) = SYNC2_ Buffer(2) = POUT.PID1 Buffer(3) = POUT.PID2 Buffer(4) = (POUT.LEN And &HFF00) \ 256 Buffer(5) = POUT.LEN And &HFF CS = SYNC1_ + SYNC2_ + POUT.PID1 + POUT.PID2 + (POUT.LEN And &HFF00) \ 256 + (POUT.LEN And &HFF) If POUT.LEN > 0 Then For idxBuffer = 0 To POUT.LEN - 1 Buffer(idxBuffer + 6) = POUT.DATA(idxBuffer) CS = CS + POUT.DATA(idxBuffer) Next idxBuffer End If CS = (CS Xor &HFFFF&) + 1 Buffer(POUT.LEN + 6) = (CS And &HFF00) \ 256 Buffer(POUT.LEN + 7) = CS And &HFF POUT_Buffer = True Exit Function POUT_BufferErr: POUT_Buffer = False End Function