; $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  -------------------------;