; $Id$ ; Author: Glenn Hamell, Andrew Davis ; NAME: read_xdr.pro ; ; PURPOSE: ; Reads each record (set) of a SAMPEX XDR file, and outputs some info. ; This program is designed as a simple example to inform ; IDL users how to read SAMPEX XDR files. ; ; INPUT: ; On IDL Command line: Full path to input file ; example: IDL> read_xdr, '/home/sdc/NGDF/examples/SAMPEX_92200_H00.xdr' ; ; OUTPUT: The ID of each record (set) found, and a subset of the contents ; ; RETURN: N/A ; ; MODIFICATION HISTORY: ; ===================== ; 2006Oct05-Glenn Hamell Created, from Andrew Davis's NGDR read program ; ;################################################; ; = = = = = = = rd_2bytestr = = = = = = = = = = = FUNCTION rd_2bytestr, fin, s1 s1 = '' READU, fin, s1 RETURN, 0 END ;- - - - - - - - end rd_2bytestr - - - - - - - - - - - ; ********************************************************************** ;+ ; NAME: Setup_GDF_rcds ; ; PURPOSE: ; Define the structure for all record sets as sub-structures. ; ; MODIFICATION HISTORY: ; Created: Glenn R. Hamell, 09 August 2000. ; 2000 Aug 10 - GRHamell - Added an alignment byte to EM struct definition. ; 2000-12-01 - ALabrador - EP struct - Changed ADC from intarr to uintarr (unsigned) ; 2000-12-04 - ALabrador - EP struct - Changed ADC back to intarr, added alignment ; byte, as per Rick Leske's recommendation. ; 2006-08-28 - ADavis - added HS, SB, SP, ST sets. ; 2006-09-27 - ADavis - added alignment byte at end of EL struct, and two spare ; bytes at end of EH and MF structs. ;- ; ****************************************************************************** FUNCTION Setup_GDF_rcds tmp = { $ rsset : {rssetstruct,STIME:0l,SUBCOM_RS:0,HILT_HE1:0,HILT_HE2:0, $ HILT_HZ1:0,HILT_HZ2:0,HILT_MUX1:0,HILT_MUX2:0,HILT_IDL1:0, $ HILT_IDL2:0,LICA_L4:0,LICA_L3:0,LICA_L2:0,LICA_L1:0,LICA_TRPL:0, $ LICA_DOBL:0,LICA_STOP:0,LICA_STRT:0,LICA_IFC:0,LICA_PRTN:0, $ LICA_LOWP:0,LICA_HIP:0,MAST_Z1SEC:0,MAST_ADC:0,MAST_LIVE:0, $ MAST_PEN:0,MAST_Z1:0,MAST_Z2:0,MAST_HIZR0:0,MAST_HIZR1:0, $ MAST_HIZR2:0, MAST_HIZR3:0,MAST_HIZR4:0,MAST_HIZR5:0,MAST_HIZR6:0, $ MAST_RAT17:0,MAST_RAT16:0,MAST_RAT18:0,MAST_Z1RX:0,MAST_Z2RX:0, $ PET_PHI:0,PET_EHI:0,PET_PLO:0,PET_ELO:0,PET_EWG:0,PET_LIVE:0, $ PET_PEN:0,PET_RNG:0,PET_MUX1:0,PET_MUX2:0} $ ,r6set : {r6setstruct,STIME:0l,PITCH:0.,ZENITH:0.,AZIMUTH:0.,Q_SCND:0.} $ ,r7set : {r7setstruct,STIME:0l,LICA_1SEC:intarr(6,6)} $ ,psset : {pssetstruct,STIME:0l,ORBIT:0l,MVERS:0,dum:0,GEO_POS:fltarr(3), $ GEI_POS:fltarr(3),GEI_VEL:fltarr(3),ECD_POS:fltarr(3), $ DIR_COS:fltarr(9),ALTITUDE:0.,IDOT:0.,ECD_LOCTIM:0.,LSHEL:0., $ BMAG:0.,MLT:0.,INVLAT:0.,PITCH:0.,LOSCON1:0.,LOSCON2:0., $ B_CART:fltarr(3),B_SPHE:fltarr(3),DIPOL1:fltarr(3),DIPOL2:fltarr(3), $ DECLIN:0.,DIP:0.,MAGRAD:0.,MAGLAT:0.,G_MIRROR:fltarr(3), $ BEQU:fltarr(4),BN100:fltarr(4),BS100:fltarr(4),CUTOFF:0.,SAAF:0., $ ZENITH:0.,AZIMUTH:0.,ACS:0.} $ ,rpset : {rpsetstruct,STIME:0l,PET_HIRES:bytarr(480)} $ ,epset : {epsetstruct,STIME:0l,SEQ_NO:0l,OFFSET_TIME:0b,spare:0b, $ ADC:intarr(4),MODE_FLAG:0b,DISC_FLAG:0b} $ ,rhset : {rhsetstruct,STIME:0l,SSD1:bytarr(60),SSD2:bytarr(60), $ SSD3:bytarr(60),SSD4:bytarr(60),PCRE:bytarr(60),IK:bytarr(60)} $ ,ehset : {ehsetstruct,STIME:0l,HILT_EVT:bytarr(14), spare1:0b, spare2:0b} $ ,elset : {elsetstruct,STIME:0l,LICA_EVT:bytarr(15), spare:0b} $ ,emset : {emsetstruct,STIME:0l,SEQ_NO:0l,OFFSET_TIME:0b,DET_FLAG:0b, $ EVT_FLAG:0b,Alignment:0b,MAST_EVT:intarr(14)} $ ,asset : {assetstruct,STIME:0l,QUATER_X:0.,QUATER_Y:0.,QUATER_Z:0.,QUATER_S:0.} $ ,mfset : {mfsetstruct,STIME:0l,COUNT_X:0,COUNT_Y:0,COUNT_Z:0,spare1:0b, spare2:0b} $ ,dsset : {dssetstruct,STIME:0l,HILT_XILNX:0,VALVE_HV:0,SEC_QUOTA:0, $ HILT_EVTQ:0,LICA_EVTQ:0,MAST_EVTQ:0,PET_EVTQ:0,HILT_HRSQ:0, $ PET_HRSQ:0,DPU_COMCNT:0,DPU_CERCNT:0,DPU_TIMCNT:0,DPU_TERCNT:0, $ PROM_CHKSM:0,HILT_DSTAT:0b,HILT_ISTAT:0b,HILT_PGCNT:0b,HILT_PAGE1:0b, $ HILT_PAGE2:0b,HILT_PAGE3:0b,HILT_PAGE4:0b,HILT_PAGE5:0b, $ HILT_PAGE6:0b,HILT_PAGE7:0b,WDOG_ERCNT:0b,XILN_ERCNT:0b, $ XINT_PLCNT:0b,XPWR_PLCNT:0b,LICA_STAT1:0b,LICA_STAT2:0b, $ FIX_VAL:0b,CAL_BIT6:0b,MAST_STAT:0b,PET_STAT:0b,LVPS_STAT:0b, $ DPU_STAT:0b,DPU_VERSION:0b,DPU_RAM_PGCNT:0b,DPU_RAM_PAGE1:0b, $ DPU_RAM_PAGE2:0b,DPU_RAM_PAGE3:0b,DPU_RAM_PAGE4:0b,DPU_RAM_PAGE5:0b, $ DPU_RAM_PAGE6:0b,DPU_RAM_PAGE7:0b,ANALOG_OSC:0b,MAST_COM1:bytarr(5), $ MAST_COM2:bytarr(5),MAST_COM3:bytarr(5),MAST_COM4:bytarr(5), $ MAST_COM5:bytarr(5),MAST_COM6:bytarr(5),PET_COM1:bytarr(5), $ PET_COM2:bytarr(5),PET_COM3:bytarr(5),CONFIG:0b} $ ,hsset : {hssetstruct,STIME:0l,HILT:bytarr(26),LEICA:bytarr(16), $ MAST_PET:bytarr(16),GAME5:bytarr(22)} $ ,sbset : {sbsetstruct,STIME:0l,CHARGE_STATE:0b,UNDER_VOLTAGE:0b,SAFE_HOLD:0b, $ SPARE:0b,BATT_CURR_MON:0,SHNT_CURR_MON:0,BUSN_CURR_MON:0, $ SLRA_CURR_MON:0,BATT_VOLT_MON:0,BATT_TOP_TEMP_MON:0, $ BATT_BASE_TEMP_MON:0,MNBS_VOLT_MON:0} $ ,spset : {spsetstruct,STIME:0l,HILT_APWR:0b,LEICA_APWR:0b,HILT_PPWR:0b, $ LEICA_PPWR:0b,MAST_PET_BPWR:0b,OPHTR_PWR:0b,SRHTR_PWR:0b,SPARE:0b, $ PD_PCU_REF:0,SPAREW:0} $ ,stset : {stsetstruct,STIME:0l,TP_STAT:0b,SPARE:0b,LO_SCTEMP:0,HI_SCTEMP:0, $ INST_BUS_TEMP:0,HILT:intarr(6),LEICA:intarr(2),MAST_PET:intarr(4), $ DPU:intarr(2)} $ } RETURN, tmp END ;============================================== ; MAIN READ_XDR PROGRAM PRO read_xdr, filein dbug=1 dbug=0 ; Production mode IF( dbug ) THEN filein='SAMPEX_1992200_H00.xdr' ; OPEN INPUT FILE OPENR, fin, filein, /GET_LUN, /XDR s1 = "" ; Prepare for detecting set-ID (2-byte string) ;s2 = 0B ; Establish NGDF data set structures gdf = Setup_GDF_rcds() rsset = gdf.rsset r6set = gdf.r6set r7set = gdf.r7set psset = gdf.psset rpset = gdf.rpset epset = gdf.epset rhset = gdf.rhset elset = gdf.elset emset = gdf.emset ehset = gdf.ehset asset = gdf.asset mfset = gdf.mfset dsset = gdf.dsset hsset = gdf.hsset sbset = gdf.sbset spset = gdf.spset stset = gdf.stset nps = 0 nunknown = 0 ; PROCESS EACH RECORD WHILE( NOT EOF( fin ) ) DO BEGIN ; Read data set ID of next record s1='' rtn=rd_2bytestr( fin, s1 ) ; next string should be a 2byte data set ID sname=s1 ; READ SET, and maybe do something useful... CASE STRUPCASE( sname ) OF 'PS': BEGIN readu, fin, psset IF (dbug) THEN print, psset.(1), psset.(N_TAGS(psset)-1) nps = nps + 1 END 'RS': BEGIN readu, fin, rsset IF (dbug) THEN print, rsset.(1), rsset.(N_TAGS(rsset)-1) END 'R6': BEGIN readu, fin, r6set IF (dbug) THEN print, r6set.(1), r6set.(N_TAGS(r6set)-1) END 'R7': BEGIN readu, fin, r7set IF (dbug) THEN print, r7set.(1), r7set.(N_TAGS(r7set)-1) END 'RH': BEGIN readu, fin, rhset IF (dbug) THEN print, rhset.(1), rhset.(N_TAGS(rhset)-1) END 'EP': BEGIN readu, fin, epset IF (dbug) THEN print, epset.(1), epset.(N_TAGS(epset)-1) END 'RP': BEGIN readu, fin, rpset IF (dbug) THEN print, rpset.(1), rpset.(N_TAGS(rpset)-1) END 'EH': BEGIN readu, fin, ehset IF (dbug) THEN print, ehset.(1), ehset.(N_TAGS(ehset)-1) END 'EL': BEGIN readu, fin, elset IF (dbug) THEN print, elset.(1), elset.(N_TAGS(elset)-1) END 'EM': BEGIN readu, fin, emset IF (dbug) THEN print, emset.(1), emset.(N_TAGS(emset)-1) END 'AS': BEGIN readu, fin, asset print, asset.STIME, asset.QUATER_S IF (dbug) THEN print, asset.(0), asset.(N_TAGS(asset)-1) END 'MF': BEGIN readu, fin, mfset IF (dbug) THEN print, mfset.(1), mfset.(N_TAGS(mfset)-1) END 'DS': BEGIN readu, fin, dsset IF (dbug) THEN print, dsset.(1), dsset.(N_TAGS(dsset)-1) END 'HS': BEGIN readu, fin, hsset IF (dbug) THEN print, hsset.(1), hsset.(N_TAGS(hsset)-1) END 'SB': BEGIN readu, fin, sbset IF (dbug) THEN print, sbset.(1), sbset.(N_TAGS(sbset)-1) END 'SP': BEGIN readu, fin, spset IF (dbug) THEN print, spset.(1), spset.(N_TAGS(spset)-1) END 'ST': BEGIN readu, fin, stset IF (dbug) THEN print, stset.(1), stset.(N_TAGS(stset)-1) END ELSE: BEGIN nunknown = nunknown + 1 END ENDCASE ENDWHILE ; end loop (PROCESSING NEXT RCRD TILL EOF) print, "Number of PS sets found:", nps print, "Number of unknown sets found:", nunknown CLOSE, /ALL EXIT END ;------ end main -------------------------;