pro read_pkt_file_406, $ pfile=pfile, pkt_info=pkt_info, $ pkt_struct=pkt_struct, pkt_data=pkt_data, $ verbose=verbose, no_pctr=no_pctr, $ frac=frac,daytime=daytime expected_apid = pkt_info.expected_apid apid_name = pkt_info.apid_name pkt_size = pkt_info.pkt_size ; bytes. hdr_size = pkt_info.hdr_size ; bytes. data_size = pkt_size - hdr_size ; bytes. openu, lun, pfile, /get_lun ; get size of file, and determine number of packet contained within. fs = fstat( lun) file_size = fs.size npkts = floor( file_size/pkt_size) if keyword_set( verbose) then $ message, /info, string( file_size, npkts, format='("file size:",I9,",",X,"npkts:",I9,".")') ; here we use POINT_LUN and the PKT_SIZE variable to move to the N-th packet in the file, ; and read M packets, starting with that N-th packet. ; NOT YET IMPLEMENTED. pkt_buff = assoc( lun, bytarr( pkt_size)) ul64_256 = ulong64( 256) ; elapsed seconds between 1 Jan 1900 and 1 Jan 1970; ; does not include UTC leap seconds. dt_epoch = ulong64( 3600L*24L)*ulong64(julday( 1, 1, 1970, 0, 0, 0) - julday( 1, 1, 1900, 0, 0, 0)) ; s. ; elapsed seconds between first sample of packet and assigned header time stamp. dt_packet = 0.d pkt_struct = { clock:ulon64arr( npkts), $ subsec:ulonarr( npkts), $ t_hdr:dblarr( npkts), $ selection:bytarr( npkts), $ speed:bytarr( npkts), $ samp_rate:uintarr( npkts), $ n_sel_chan:intarr( npkts), $ apid:ulonarr( npkts), $ pseq_ctrl:bytarr( npkts), $ apid_ctr:bytarr( npkts), $ pkt_num:ulonarr( npkts) $ } pkt_data = { $ iefi_bias:uintarr( npkts, 6), $ iefi_usher:bytarr( npkts, 6), $ iefi_guard:bytarr( npkts, 6), $ iefi_braid:bytarr( npkts), $ iefi_temp:bytarr( npkts, 3), $ iesa_imcp:bytarr( npkts), iesa_emcp:bytarr( npkts), $ iesa_iswp:bytarr( npkts), iesa_eswp:bytarr( npkts), $ iesa_egain:bytarr( npkts),iesa_igain:bytarr( npkts), $ iesa_enables:bytarr( npkts), $ iesa_pulser:bytarr( npkts), $ iesa_eswpv:bytarr( npkts), iesa_ehvi:bytarr( npkts), $ iesa_emcpi:bytarr( npkts), iesa_emcpv:bytarr( npkts), $ iesa_iswpv:bytarr( npkts), iesa_ihvi:bytarr( npkts), $ iesa_imcpi:bytarr( npkts), iesa_imcpv:bytarr( npkts), $ ietc_config:bytarr( npkts), ietc_table:bytarr( npkts), $ ietc_scpot:intarr( npkts), $ ietc_covers:bytarr( npkts), $ isst1_temp:bytarr( npkts), isst2_temp:bytarr( npkts), $ isst_bias:bytarr( npkts), $ isst_25vref:bytarr( npkts), $ isst_d1:bytarr( npkts), $ isst_d2:bytarr( npkts), $ isst_d3:bytarr( npkts), $ isst_d4:bytarr( npkts), $ ifgm_config:bytarr( npkts), $ ifgm_message:bytarr( npkts), $ ifgm_control:uintarr( npkts), ifgm_phase:uintarr( npkts), $ ifgm_sampling:bytarr( npkts), $ ifgm_xy:bytarr( npkts), ifgm_zr:bytarr( npkts), $ iefi_config:bytarr( npkts), $ ifbanksel:bytarr( npkts), ifilter1:bytarr( npkts), ifilter2:bytarr( npkts), $ ideppair:bytarr( npkts), idepstat:bytarr( npkts), iboombits:bytarr( npkts), $ idlena:bytarr( npkts), idlenb:bytarr( npkts), ideplimit:bytarr( npkts), $ ifitmode:bytarr( npkts), $ icmp_spare:bytarr( npkts, 8), $ isci_status:bytarr( npkts, 8), $ ispare:bytarr( npkts, 12), $ bau_status:bytarr( npkts), $ ilvps_sctemp:bytarr( npkts), $ idpu_sctemp:bytarr( npkts), $ ispb_sctemp:bytarr( npkts), $ isst_sctemp:bytarr( npkts), $ idpu_28i:bytarr( npkts), $ iact_28i:bytarr( npkts), $ prmy_htri:bytarr( npkts), $ sncd_htri:bytarr( npkts) $ } p = 0L b0 = bytarr( pkt_size) ; this algorithm for random access to the last frac's worth of the packets ; in the file won't work with variable-length packets, ; so turn it off for now. if keyword_set( frac) then begin message, /info, 'FRAC keyword ignored because of variable-length packets.' ; i0 = floor( (1.0-frac)*(npkts - 1L)) > 0L ; i1 = npkts -1L endif else begin i0 = 0L i1 = npkts-1L endelse if keyword_set( verbose) then $ message, /info, string( npkts, i0, i1, format='("npkts, i0, i1:",I5.5,",",X,I5.5,",",X,I5.5)') point_lun, lun, i0*pkt_size for i=i0,i1 do begin ; b0 = pkt_buff[ i] readu, lun, b0 pkt_struct.clock[ i] = ulong64( b0[ 9] + $ ul64_256*( b0[ 8] + $ ul64_256*( b0[ 7] + $ ul64_256*( b0[ 6])))) pkt_struct.subsec[ i] = ulong( b0[ 11] + 256UL*b0[ 10]) pkt_struct.apid[ i] = b0[ 1] + 256UL*(b0[ 0] mod 8) pkt_struct.pseq_ctrl[ i] = b0[ 2] pkt_struct.apid_ctr[ i] = b0[ 3] ; translate pseq_ctrl and apid_ctr bytes to APID number. pkt_struct.pkt_num[ i] = pkt_struct.apid_ctr[ i] + 256UL*( pkt_struct.pseq_ctrl[ i] mod 64) if keyword_set( verbose) or ( not keyword_set( no_pctr) and (i mod 100 eq 1)) then $ message, /info, string( i, npkts, pkt_struct.apid[ i], pkt_struct.pseq_ctrl[ i], pkt_struct.apid_ctr[ i], pkt_struct.pkt_num[ i], $ pkt_struct.clock[ i], pkt_struct.subsec[ i], $ format='("pnum:",I5.5,X,"of",X,I5.5,X,"APID:",Z4.4,X,"pseq_ctrl:",Z2.2,X,"apid_ctr:",Z2.2,X,"pkt_num:",Z4.4,X,"clock, subsec:",I15.15,X,I7.7)') if pkt_struct.apid[ i] ne expected_apid then begin message, /info, $ string( pkt_struct.apid[i], expected_apid, format='("apid (current, expected):","(",Z4.4,X,Z4.4,")")') stop endif t_hdr = double( pkt_struct.clock[i] - dt_epoch) + double( pkt_struct.subsec[i])/(65536.0) ; s. if keyword_set(daytime) then dt=0. else dt=3600. ;Daylight Saving Time pkt_struct.t_hdr[ i] = t_hdr - 7*3600. - dt ;West Time Zone ; unpack data into the arrays in the pkt_data structure. for j=0L,5L do begin $ pkt_data.iefi_bias[ i, j] = b0[ 12+2*j] + 256UL*b0[ 13+2*j] pkt_data.iefi_usher[ i, j] = b0[ 24+j] pkt_data.iefi_guard[ i, j] = b0[ 30+j] endfor pkt_data.iefi_braid[ i] = b0[ 36] for j=0L,2L do $ pkt_data.iefi_temp[ i, j] = b0[ 37 + j] pkt_data.iesa_imcp[ i] = b0[ 40] pkt_data.iesa_emcp[ i] = b0[ 41] pkt_data.iesa_iswp[ i] = b0[ 42] pkt_data.iesa_eswp[ i] = b0[ 43] pkt_data.iesa_egain[ i] = b0[ 44] pkt_data.iesa_igain[ i] = b0[ 45] pkt_data.iesa_enables[ i] = b0[ 46] pkt_data.iesa_pulser[ i] = b0[ 47] pkt_data.iesa_eswpv[ i] = b0[ 48] pkt_data.iesa_ehvi[ i] = b0[ 49] pkt_data.iesa_emcpi[ i] = b0[ 50] pkt_data.iesa_emcpv[ i] = b0[ 51] pkt_data.iesa_iswpv[ i] = b0[ 52] pkt_data.iesa_ihvi[ i] = b0[ 53] pkt_data.iesa_imcpi[ i] = b0[ 54] pkt_data.iesa_imcpv[ i] = b0[ 55] pkt_data.ietc_config[ i] = b0[ 56] pkt_data.ietc_table[ i] = b0[ 57] pkt_data.ietc_scpot[ i] = b0[ 58] + 256*b0[ 59] ; NOTE: SIGNED, rather than UNSIGNED! pkt_data.ietc_covers[ i] = b0[ 60] pkt_data.isst1_temp[ i] = b0[ 61] pkt_data.isst2_temp[ i] = b0[ 62] pkt_data.isst_bias[ i] = b0[ 63] pkt_data.isst_25vref[ i] = b0[ 64] pkt_data.isst_d1[ i] = b0[ 65] pkt_data.isst_d2[ i] = b0[ 66] pkt_data.isst_d3[ i] = b0[ 67] pkt_data.isst_d4[ i] = b0[ 68] pkt_data.ifgm_config[ i] = b0[ 71] pkt_data.ifgm_message[ i] = b0[ 72] pkt_data.ifgm_control[ i] = b0[ 73] + 256UL*b0[ 74] pkt_data.ifgm_phase[ i] = b0[ 75] + 256UL*b0[ 76] pkt_data.ifgm_sampling[ i] = b0[ 77] pkt_data.ifgm_xy[ i] = b0[ 78] pkt_data.ifgm_zr[ i] = b0[ 79] pkt_data.iefi_config[ i] = b0[ 80] pkt_data.ifbanksel[ i] = b0[ 81] pkt_data.ifilter1[ i] = b0[ 82] pkt_data.ifilter2[ i] = b0[ 83] pkt_data.ideppair[ i] = b0[ 84] pkt_data.idepstat[ i] = b0[ 85] pkt_data.iboombits[ i] = b0[ 86] pkt_data.idlena[ i] = b0[ 87] pkt_data.idlenb[ i] = b0[ 88] pkt_data.ideplimit[ i] = b0[ 89] pkt_data.ifitmode[ i] = b0[ 90] for j=0L,7L do $ pkt_data.icmp_spare[ i, j] = b0[ 91 + j] for j=0L,7L do $ pkt_data.isci_status[ i, j] = b0[ 99 + j] for j=0L,11L do $ pkt_data.ispare[ i, j] = b0[ 107 + j] pkt_data.bau_status[ i] = b0[ 119] pkt_data.ilvps_sctemp[ i] = b0[ 120] pkt_data.idpu_sctemp[ i] = b0[ 121] pkt_data.ispb_sctemp[ i] = b0[ 122] pkt_data.isst_sctemp[ i] = b0[ 123] pkt_data.idpu_28i[ i] = b0[ 124] pkt_data.iact_28i[ i] = b0[ 125] pkt_data.prmy_htri[ i] = b0[ 126] pkt_data.sncd_htri[ i] = b0[ 127] endfor ; for i=... loop over packets in file. free_lun, lun return end