;+ ; $Id: unpack_hsk_jill.pro,v 1.2 2008/01/10 17:15:16 jredfern Exp $ ; ; $Source: /usr/lib/cvsroot/twins-idl/lib/util/unpack_hsk_jill.pro,v $ ; $Revision: 1.2 $ ; $Date: 2008/01/10 17:15:16 $ ; PRO unpack_hsk_jill, datafile,bdata,ftype_h,hsk, fm1cal=fm1cal, offset=offset ; ; PURPOSE: ; unpack housekeeping data from binary data file and generate ; idl saveset ; ; Example: ; unpack_hsk, '2002031',1,dataarray,ftypearray ; Notes: ; See Also: ; ; Author: Dorothea DeLapp LANL 2007 ; Modification $Author: jredfern $ ;- hskmsg=replicate(create_struct(name='house', $ ; ; use those values as index to unpack the rest of the wrapper variables ; ; Wrapper ;'offset', 0.0D, $ 'c_pt' ,long64(0), $ 'c_gr',long64(0), $ 'f_gr',0L, $ 'versionid' ,0, $ 'c_pt_sh' ,long64(0), $ 'f_pt_sh' ,0L, $ 'telem' ,0, $ 'HkRefVolt' , 0.0D,$ 'LvpsP15AuxVolt' , 0.0D,$ 'LvpsN15AuxVolt' , 0.0D,$ 'LvpsP5AnalogVolt' , 0.0D,$ 'LvpsN5AnalogVolt' , 0.0D,$ 'LvpsP12AnalogVolt' , 0.0D,$ 'LvpsN12AnalogVolt' , 0.0D,$ 'LvpsP20ActuatorVolt' , 0.0D,$ 'SensorHead1Temp' , 0.0D,$ 'Fee1Temp' , 0.0D,$ 'FeeHv1P4KvMonitor' , 0.0D,$ 'FeeHv1P1KvMonitor',0.0D,$ 'FeeHv1P10KvMonitor',0.0D,$ 'FeeControlTemp',0.0D,$ 'LadP5DigitalVolt',0.0D,$ 'EboxMotherboardTemp',0.0D,$ 'LadHvMonitor',0.0D,$ 'LadTemp',0.0D,$ 'SensorHead2Temp',0.0D,$ 'Fee2Temp',0.0D,$ 'FeeHv2P4KvMonitor',0.0D,$ 'FeeHv2P1KvMonitor',0.0D,$ 'FeeHv2P10KvMonitor',0.0D,$ 'TwaPositionMonitor',0.0D,$ 'TwaVelocityMonitor',0.0D,$ 'TwaConvAMonitor',0.0D,$ 'TwaConvBMonitor',0.0D,$ 'TwaStatorTemp',0.0D,$ 'TwaRotorTemp',0.0D,$ 'Twa5DigitalVolt',0.0D,$ 'Twa20MotorVolt',0.0D,$ 'LvpsP5DigitalVolt',0.0D,$ 'LvpsP5AnalogCurrent',0.0D,$ 'LvpsP15AnalogCurrent',0.0D,$ 'LvpsP5DigitalCurrent',0.0D,$ 'LvpsP12AnalogCurrent',0.0D,$ 'Lvps5AnalogConvTemp',0.0D,$ 'Lvps15AuxConvTemp',0.0D,$ 'Lvps5DigitalConvTemp',0.0D,$ 'Lvps12AnalogConvTemp',0.0D,$ 'Ground',0.0D,$ 'Lad1Overrun',0,$ 'Lad2Overrun',0,$ 'FeeSide1Overrun',0,$ 'FeeSide2Overrun',0,$ 'LadHvReduced',0,$ 'McpAHvReduced',0,$ 'McpBHvReduced',0,$ 'UnitParameterError',0,$ 'VersionNumber',0,$ 'DpuStatus',0,$ 'DpuBootStatus',0,$ 'DpuWatchdogStatus',0,$ 'DpuEepromStatus',0,$ 'DpuLastActionTimeout',0,$ 'DpuActuatorTempFault',0,$ 'DpuLadHvOvervolt',0,$ 'DpuMcpAOvervolt',0,$ 'DpuMcpBOvervolt',0,$ 'CommandCounter',0,$ 'CommandErrorCounter',0,$ 'MemoryLoadCounter',0,$ 'LastCommandReceived1',0,$ 'LastCommandReceived2',0,$ 'LastCommandReceived3',0,$ 'LastCommandReceived4',0,$ 'FeePowerEnableStatus',0,$ 'Fee1RelayStatus',0,$ 'Fee2RelayStatus',0,$ 'FeeBoostClockEnable',0,$ 'FeeSensorHv1Status',0,$ 'FeeSensorHv2Status',0,$ 'FeeHvAllowStatus',0,$ 'FeeNearFullIndicator',0,$ 'FeeInterruptEnableStatus',0,$ 'FeeInterruptPendingFlag',0,$ 'FeeSensor1OverrunStatus',0,$ 'FeeSensor2OverrunStatus',0,$ 'FeeRunPauseIndicator',0,$ 'FeeBufferControl',0,$ 'FeeCounterStatus',0,$ 'FeeTestPulserStatus',0,$ 'FeeSensor1Servicing',0,$ 'FeeSensor2Servicing',0,$ 'FeeHvMainStatus',0,$ 'FeeHvSafeArmStatus',0,$ 'FeeSensor1McpHvLevel',0.0D,$ 'FeeSensor2McpHvLevel',0.0D,$ 'FeeSensor1ColHvLevel',0.0D,$ 'FeeSensor2ColHvLevel',0.0D,$ 'FeeTofThreshold1',0.0D,$ 'FeeTofThreshold2',0.0D,$ 'FeeTestPulser',0,$ 'FeeBoostClockFreq',0,$ 'LadHvEnableStatus',0,$ 'LadHvSafeStatus',0,$ 'LadTestPulserStatus',0,$ 'Lad5Status',0,$ 'Lad15Status',0,$ 'LadHvLevel',0,$ 'LadEventCounter1',0,$ 'LadEventCounter2',0,$ 'Marker',0,$ 'DeploymentArmStatus',0,$ 'Door2DimpleStatus',0,$ 'Door1DimpleStatus',0,$ 'MclampPowerStatusB',0,$ 'MclampPowerStatusA',0,$ 'LatchLimitB',0,$ 'LatchLimitA',0,$ 'TwaClampControlAStatus',0,$ 'TwaClampControlBStatus',0,$ 'Twa5EnableStatus',0,$ 'Twa20EnableStatus',0,$ 'Twa50EnableStatus',0,$ 'TwaScanLimitSwitch1',0,$ 'TwaScanLimitSwitch2',0,$ 'TwaSpeedSelection',0,$ 'TwaParkPosition',0,$ 'MemPageErrorCount',0),n_elements(ftype_h)) ; ; loop through all hsk ; for i=0L,n_elements(ftype_h)-1L do begin ; hskmsg[i].offset = offset ; ; fill wrapper primary and secondary header ; ; Wrapper hskmsg[i].c_pt = hsk[i].c_pt hskmsg[i].c_gr = hsk[i].c_gr hskmsg[i].f_gr = hsk[i].f_gr ; ; primary header ; hskmsg[i].versionid = hsk[i].versionid hskmsg[i].c_pt_sh = hsk[i].c_pt_sh hskmsg[i].f_pt_sh = hsk[i].f_pt_sh hskmsg[i].telem = hsk[i].telem ; ; ; housekeeping ; hskmsg[i].HkRefVolt = double(bdata[ftype_h[i]+20]) * 1.25D * 5.D / 256.D hskmsg[i].LvpsP15AuxVolt = double(bdata[ftype_h[i]+21]) * 6.01D * 5.D / 256.D hskmsg[i].LvpsN15AuxVolt = (double(bdata[ftype_h[i]+22]) * 5.D / 256.D - 4.374D) / .1253D hskmsg[i].LvpsP5AnalogVolt = double(bdata[ftype_h[i]+23]) * 1.25D * 5.D / 256.D hskmsg[i].LvpsN5AnalogVolt = (double(bdata[ftype_h[i]+24]) * 5.D / 256.D - 3.753D) / .2494D hskmsg[i].LvpsP12AnalogVolt = double(bdata[ftype_h[i]+25]) * 4.8D * 5.D / 256.D hskmsg[i].LvpsN12AnalogVolt = (double(bdata[ftype_h[i]+26]) * 5.D / 256.D - 4.267D) / .1467D hskmsg[i].LvpsP20ActuatorVolt = double(bdata[ftype_h[i]+27]) * 1.25D * 20.D / 256.D hskmsg[i].SensorHead1Temp = (((double(bdata[ftype_h[i]+28]) * .000000025799D - .0000011159D) * double(bdata[ftype_h[i]+28]) - .0019363D) * double(bdata[ftype_h[i]+28]) + .62712D) * double(bdata[ftype_h[i]+28]) - 47.901D hskmsg[i].Fee1Temp = (((double(bdata[ftype_h[i]+29]) * .000000025799D - .0000011159D) * double(bdata[ftype_h[i]+29]) - .0019363D) * double(bdata[ftype_h[i]+29]) + .62712D) * double(bdata[ftype_h[i]+29]) - 47.901D hskmsg[i].FeeHv1P4KvMonitor = double(bdata[ftype_h[i]+30]) * 18.8679D hskmsg[i].FeeHv1P1KvMonitor = double(bdata[ftype_h[i]+31]) * 7.5096D hskmsg[i].FeeHv1P10KvMonitor = double(bdata[ftype_h[i]+32]) * 47.1698D hskmsg[i].FeeControlTemp = double(bdata[ftype_h[i]+33]) * 5.D / 256.D / .0147D - 273.D hskmsg[i].LadP5DigitalVolt = double(bdata[ftype_h[i]+34]) * 5.D / 256.D hskmsg[i].EboxMotherboardTemp = double(bdata[ftype_h[i]+35]) * 5.D / 256.D / .0147D - 273.D hskmsg[i].LadHvMonitor = double(bdata[ftype_h[i]+36]) * 19.531D hskmsg[i].LadTemp = double(bdata[ftype_h[i]+37]) * 5.D / 256.D / .0147D - 273.D hskmsg[i].SensorHead2Temp = (((double(bdata[ftype_h[i]+38]) * .000000025799D - .0000011159D) * double(bdata[ftype_h[i]+38]) - .0019363D) * double(bdata[ftype_h[i]+38]) + .62712D) * double(bdata[ftype_h[i]+38]) - 47.901D hskmsg[i].Fee2Temp = (((double(bdata[ftype_h[i]+39]) * .000000025799D - .0000011159D) * double(bdata[ftype_h[i]+39]) - .0019363D) * double(bdata[ftype_h[i]+39]) + .62712D) * double(bdata[ftype_h[i]+39]) - 47.901D hskmsg[i].FeeHv2P4KvMonitor = double(bdata[ftype_h[i]+40]) * 18.8679D hskmsg[i].FeeHv2P1KvMonitor = double(bdata[ftype_h[i]+41]) * 7.5096D hskmsg[i].FeeHv2P10KvMonitor = double(bdata[ftype_h[i]+42]) * 47.1698D hskmsg[i].TwaPositionMonitor = double(ishft(long(bdata[ftype_h[i]+43]),8)+ $ ishft(long(bdata[ftype_h[i]+44]),0))/17.7832D - 2035.D /17.7832D hskmsg[i].TwaVelocityMonitor = (double(ishft(long(bdata[ftype_h[i]+45]),8)+ $ ishft(long(bdata[ftype_h[i]+46]),0)) -2035.D)/314.725D hskmsg[i].TwaConvAMonitor = double(bdata[ftype_h[i]+47]) * 1.25D * 5.D / 256.D hskmsg[i].TwaConvBMonitor = double(bdata[ftype_h[i]+48]) * 1.25D * 5.D / 256.D hskmsg[i].TwaStatorTemp = double(bdata[ftype_h[i]+49]) * 5.D / 256.D / .0147D - 273.D hskmsg[i].TwaRotorTemp = double(bdata[ftype_h[i]+50]) * 5.D / 256.D / .0147D - 273.D hskmsg[i].Twa5DigitalVolt = double(bdata[ftype_h[i]+51]) * 1.25D * 5.D / 256.D hskmsg[i].Twa20MotorVolt = double(bdata[ftype_h[i]+52]) * 1.25D * 20.D / 256.D hskmsg[i].LvpsP5DigitalVolt = double(bdata[ftype_h[i]+53]) * 5.D / 256.D hskmsg[i].LvpsP5AnalogCurrent = double(bdata[ftype_h[i]+54]) * 5.D / 256.D / .005D hskmsg[i].LvpsP15AnalogCurrent = double(bdata[ftype_h[i]+55]) * 5.D / 256.D / .005D hskmsg[i].LvpsP5DigitalCurrent = double(bdata[ftype_h[i]+56]) * 5.D / 256.D / .005D hskmsg[i].LvpsP12AnalogCurrent = double(bdata[ftype_h[i]+57]) * 5. / 256. / .005 hskmsg[i].Lvps5AnalogConvTemp = ((double(bdata[ftype_h[i]+58]) * 5.D / 256.D + 28.6D) * 10D - 273.D ) hskmsg[i].Lvps15AuxConvTemp = ((double(bdata[ftype_h[i]+59]) * 5.D / 256.D + 28.6D) * 10D - 273.D ) hskmsg[i].Lvps5DigitalConvTemp = ((double(bdata[ftype_h[i]+60]) * 5.D / 256.D + 28.6D) * 10D - 273.D ) hskmsg[i].Lvps12AnalogConvTemp = ((double(bdata[ftype_h[i]+61]) * 5.D / 256.D + 28.6D) * 10D - 273.D ) hskmsg[i].Ground = double(bdata[ftype_h[i]+62]) * 1.D hskmsg[i].Lad1Overrun = ishft(bdata[ftype_h[i]+63] , 0) AND 1 hskmsg[i].Lad2Overrun = ishft(bdata[ftype_h[i]+63] , -1) AND 1 hskmsg[i].FeeSide1Overrun = ishft(bdata[ftype_h[i]+63] , -2) AND 1 hskmsg[i].FeeSide2Overrun = ishft(bdata[ftype_h[i]+63] , -3) AND 1 hskmsg[i].LadHvReduced = ishft(bdata[ftype_h[i]+63] , -4) AND 1 hskmsg[i].McpAHvReduced = ishft(bdata[ftype_h[i]+63] , -5) AND 1 hskmsg[i].McpBHvReduced = ishft(bdata[ftype_h[i]+63] , -6) AND 1 hskmsg[i].UnitParameterError = ishft(bdata[ftype_h[i]+63] , -7) AND 1 hskmsg[i].VersionNumber = ishft(bdata[ftype_h[i]+65],0) hskmsg[i].DpuStatus = ishft(bdata[ftype_h[i]+66] ,0) AND 7 hskmsg[i].DpuBootStatus = ishft(bdata[ftype_h[i]+67] , 0) AND 1 hskmsg[i].DpuWatchdogStatus = ishft(bdata[ftype_h[i]+67] , -1) AND 1 hskmsg[i].DpuEepromStatus = ishft(bdata[ftype_h[i]+67] , -2) AND 1 hskmsg[i].DpuLastActionTimeout = ishft(bdata[ftype_h[i]+67] , -3) AND 1 hskmsg[i].DpuActuatorTempFault = ishft(bdata[ftype_h[i]+67] , -4) AND 1 hskmsg[i].DpuLadHvOvervolt = ishft(bdata[ftype_h[i]+67] , -5) AND 1 hskmsg[i].DpuMcpAOvervolt = ishft(bdata[ftype_h[i]+67] , -6) AND 1 hskmsg[i].DpuMcpBOvervolt = ishft(bdata[ftype_h[i]+67] , -7) AND 1 hskmsg[i].CommandCounter = (ishft(long(bdata[ftype_h[i]+68]),8)+ $ ishft(long(bdata[ftype_h[i]+69]),0)) hskmsg[i].CommandErrorCounter = (ishft(long(bdata[ftype_h[i]+70]),8)+ $ ishft(long(bdata[ftype_h[i]+71]),0)) hskmsg[i].MemoryLoadCounter = (ishft(long(bdata[ftype_h[i]+72]),8)+ $ ishft(long(bdata[ftype_h[i]+73]),0)) hskmsg[i].LastCommandReceived1 = bdata[ftype_h[i]+74] hskmsg[i].LastCommandReceived2 = bdata[ftype_h[i]+75] hskmsg[i].LastCommandReceived3 = bdata[ftype_h[i]+76] hskmsg[i].LastCommandReceived4 = bdata[ftype_h[i]+77] hskmsg[i].FeePowerEnableStatus = ishft(bdata[ftype_h[i]+78] , 0) AND 1 hskmsg[i].Fee1RelayStatus = ishft(bdata[ftype_h[i]+78] , -1) AND 1 hskmsg[i].Fee2RelayStatus = ishft(bdata[ftype_h[i]+78] , -2) AND 1 hskmsg[i].FeeBoostClockEnable = ishft(bdata[ftype_h[i]+78] , -3) AND 1 hskmsg[i].FeeSensorHv1Status = ishft(bdata[ftype_h[i]+79] , 0) AND 1 hskmsg[i].FeeSensorHv2Status = ishft(bdata[ftype_h[i]+79] , -1) AND 1 hskmsg[i].FeeHvAllowStatus = ishft(bdata[ftype_h[i]+79] , -2) AND 1 hskmsg[i].FeeNearFullIndicator = ishft(bdata[ftype_h[i]+79] , -3) AND 1 hskmsg[i].FeeInterruptEnableStatus =ishft(bdata[ftype_h[i]+79] , -4) AND 1 hskmsg[i].FeeInterruptPendingFlag = ishft(bdata[ftype_h[i]+79] , -5) AND 1 hskmsg[i].FeeSensor1OverrunStatus = ishft(bdata[ftype_h[i]+79] , -6) AND 1 hskmsg[i].FeeSensor2OverrunStatus = ishft(bdata[ftype_h[i]+79] , -7) AND 1 hskmsg[i].FeeRunPauseIndicator = ishft(bdata[ftype_h[i]+80] , 0) AND 1 hskmsg[i].FeeBufferControl = ishft(bdata[ftype_h[i]+80] , -1) AND 1 hskmsg[i].FeeCounterStatus = ishft(bdata[ftype_h[i]+80] , -2) AND 1 hskmsg[i].FeeTestPulserStatus = ishft(bdata[ftype_h[i]+80] , -3) AND 1 hskmsg[i].FeeSensor1Servicing = ishft(bdata[ftype_h[i]+80] , -4) AND 1 hskmsg[i].FeeSensor2Servicing = ishft(bdata[ftype_h[i]+80] , -5) AND 1 hskmsg[i].FeeHvMainStatus = ishft(bdata[ftype_h[i]+80] , -6) AND 1 hskmsg[i].FeeHvSafeArmStatus = ishft(bdata[ftype_h[i]+80] , -7) AND 1 hskmsg[i].FeeSensor1McpHvLevel = double(bdata[ftype_h[i]+81]) * 1.D hskmsg[i].FeeSensor2McpHvLevel = double(bdata[ftype_h[i]+82]) * 1.D hskmsg[i].FeeSensor1ColHvLevel = double(bdata[ftype_h[i]+83]) * 1.D hskmsg[i].FeeSensor2ColHvLevel = double(bdata[ftype_h[i]+84]) * 1.D hskmsg[i].FeeTofThreshold1 = double(bdata[ftype_h[i]+85]) * 1.D hskmsg[i].FeeTofThreshold2 = double(bdata[ftype_h[i]+86]) * 1.D hskmsg[i].FeeTestPulser = (ishft(long(bdata[ftype_h[i]+87]),8)+ $ ishft(long(bdata[ftype_h[i]+88]),0)) hskmsg[i].FeeBoostClockFreq = bdata[ftype_h[i]+89] hskmsg[i].LadHvEnableStatus = ishft(bdata[ftype_h[i]+90] , 0) AND 1 hskmsg[i].LadHvSafeStatus = ishft(bdata[ftype_h[i]+90] , -1) AND 1 hskmsg[i].LadTestPulserStatus = ishft(bdata[ftype_h[i]+90] , -3) AND 1 hskmsg[i].Lad5Status = ishft(bdata[ftype_h[i]+90] , -4) AND 1 hskmsg[i].Lad15Status = ishft(bdata[ftype_h[i]+90] , -5) AND 1 hskmsg[i].LadHvLevel = bdata[ftype_h[i]+91] hskmsg[i].LadEventCounter1 = (ishft(long(bdata[ftype_h[i]+92]),8)+ $ ishft(long(bdata[ftype_h[i]+93]),0)) hskmsg[i].LadEventCounter2 = (ishft(long(bdata[ftype_h[i]+94]),8)+ $ ishft(long(bdata[ftype_h[i]+95]),0)) hskmsg[i].Marker = ishft(bdata[ftype_h[i]+96] , 0) AND 1 hskmsg[i].DeploymentArmStatus = ishft(bdata[ftype_h[i]+96] , -1) AND 1 hskmsg[i].Door2DimpleStatus = ishft(bdata[ftype_h[i]+96] , -2) AND 1 hskmsg[i].Door1DimpleStatus = ishft(bdata[ftype_h[i]+96] , -3) AND 1 hskmsg[i].MclampPowerStatusB = ishft(bdata[ftype_h[i]+96] , -4) AND 1 hskmsg[i].MclampPowerStatusA = ishft(bdata[ftype_h[i]+96] , -5) AND 1 hskmsg[i].LatchLimitB = ishft(bdata[ftype_h[i]+96] , -6) AND 1 hskmsg[i].LatchLimitA = ishft(bdata[ftype_h[i]+96] , -7) AND 1 hskmsg[i].TwaClampControlAStatus = ishft(bdata[ftype_h[i]+97] , 0) AND 1 hskmsg[i].TwaClampControlBStatus = ishft(bdata[ftype_h[i]+97] , -1) AND 1 hskmsg[i].Twa5EnableStatus = ishft(bdata[ftype_h[i]+97] , -2) AND 1 hskmsg[i].Twa20EnableStatus = ishft(bdata[ftype_h[i]+97] , -3) AND 1 hskmsg[i].Twa50EnableStatus = ishft(bdata[ftype_h[i]+97] , -4) AND 1 hskmsg[i].TwaScanLimitSwitch1 = ishft(bdata[ftype_h[i]+97] , -5) AND 1 hskmsg[i].TwaScanLimitSwitch2 = ishft(bdata[ftype_h[i]+97] , -6) AND 1 hskmsg[i].TwaSpeedSelection = bdata[ftype_h[i]+98] hskmsg[i].TwaParkPosition = bdata[ftype_h[i]+99] if not fm1cal then begin hskmsg[i].MemPageErrorCount = (ishft(long(bdata[ftype_h[i]+100]),8)+ $ ishft(long(bdata[ftype_h[i]+101]),0)) endif else begin hskmsg[i].MemPageErrorCount = 0 endelse endfor ; save housekeeping ; hfilename=strcompress(datafile+'_hsk.idl',/remove_all) save,hskmsg, filename=hfilename END