; This routine serves the dual purpose of decomutating MISG messages and PFDPU packets
function mav_sep_hkp_pfdpu_decom,pkt,last_hkp=last_hkp,memstate=memstate
if pkt.valid eq 0 then return, fill_nan(last_hkp)
time = pkt.time
dtime = 0d ; msg.time - last_hkp.time
seq_dcntr = 0 ;
if keyword_set(last_hkp) then begin
dtime = pkt.time - last_hkp.time
seq_dcntr = fix( pkt.seq_cntr - last_hkp.seq_cntr)
endif
data = pkt.data
if size(/type,data) eq 1 then begin ; convert to uint if necessary (used for ccsds packets)
; dprint,'debug:'
; printdat,pkt
seq_cntr = pkt.seq_cntr
data = uint( pkt.data,0,n_elements(pkt.data)/2)
byteorder,data,/swap_if_little_endian
endif else begin ;
last_dacs = keyword_set(memstate) ? memstate.dacs : replicate (0u,12)
data = [data,replicate(0u,8),last_dacs]
endelse
amonitor = fix(data[0:7])
mapid = byte( ishft( data[8],-8 ) )
fpga_rev = byte( data[8] and 'ff'x )
vcmd_cntr = byte( ishft( data[9],-8) ) ; valid command counter
vcmd_rate= 0b
icmd_cntr = byte( data[9] and 'ff'x )
icmd_rate = 0b
cmd_dcntr = byte( keyword_set(memstate) ? (memstate.ncmds mod 256) - vcmd_cntr : 0 )
mode_flags = data[10]
noise_flags = data[11]
noise_res = byte( ishft(data[11],-8) and '111'b )
noise_per = byte(data[11] and 'ff'x)
mem_addr = data[12]
mem_checksum = byte( ishft( data[13] ,-8) )
pps_cntr = byte( data[13] and 'ff'x )
event_cntr = data[14]
rate_cntr = data[15:20]
cntr1 = byte( ishft( data[21],-12 ) and 'f'x )
cntr2 = byte( ishft( data[21],-8 ) and 'f'x )
cntr3 = byte( ishft( data[21],-4 ) and 'f'x )
cntr4 = byte( ishft( data[21],0 ) and 'f'x )
timeout_cntrs = [cntr1,cntr2,cntr3,cntr4]
det_timeout = byte(ishft(data[22],-8) )
nopeak_cntr = byte( data[22] and 'ff'x )
nopeak_rate = 0b
reserved = data[23]
if (n_elements(data) ne 45) then begin
dprint,'HKP pkt error ',n_elements(data),' ne 45'
data = [data,replicate(0,20)]
endif
; enhanced version from PFDPU
TableVER = byte(ishft(data [24], -8)) ; SEP table version
Compcode = byte(data[24]) ; "Options [ xxxxNNCC ]: CC=Compression Type for SCI data; NN=Compression Type for NOI data."
RTAVG = byte(ishft(data[25], -8)) ;SEP RT Spectra Avg Interval 2^N, N=[0..5]
ARCAVG = byte(data[25]) ;SEP Arc Spectra Avg Interval 2^N, N=[0..5]
LUTADR=byte(ishft(data[26], -8)) ;Lookup Table Directory Index
LUTCSM=byte(data [26]) ;Lookup Table Checksum Expected
CSMLMT=byte(ishft(data[27], -8)) ;CSM Failure Limit
CSMCTR= byte(data[27]) ;CSM Failure Count
RSTLMT=byte(ishft(data[28], -8)) ;Reset if No Messages in Seconds
RSTSEC=byte(data[28]) ;Reset Seconds Since Last Message
BINMAX=byte(ishft(data[29], -8)) ; Spectra Bins Maximum
ATTPER= byte(data[29]) ; Attenuator Movement Period =2^N
ATTIN= data[30] ;Attenuator In Threshold
ATTOUT= data [31] ;Attenuator Out Threshold
BIASLIM= data [32] ;Bias lim threshold
DACS = data[33:44]
; SEP1T1ODT: data [32], $ ;Telescope 1, O Detector Threshold
; SEP1T1TDT: data [33], $ ;Telescope 1, T Detector Threshold
; SEP1T1FDT: data [34], $ ;Telescope 1, F Detector Threshold
; SEP1T1AUX: data [35], $ ;telescope 1 auxiliary
; SEP1T2ODT: data [36], $ ;Telescope 2, O Detector Threshold
; SEP1T2TDT: data [37], $ ;Telescope 2, T Detector Threshold
; SEP1T2FDT: data [38], $ ;Telescope 2, F Detector Thresholdv
; SEP1T2AUX: data [39], $ ;Telescope 2 auxiliary
; SEP1TPH0: data [40], $ ;pulse height O
; SEP1TPHT: data [41], $ ;pulse height T
; SEP1TPHF: data [42], $ ;pulse height F
; SEP1BIAS: data [43] $ ;Bias voltage
; else dprint,'SEP HKP error.', n_elemt
par_dap = mav_sep_therm_temp2()
par_dap.r1 = 51000.
par_dap.rv = 1e9
par_dap.xmax = 2.5
par_s1 = par_dap
par_s2 = par_s1
sephkp = {time : time, $
dtime : dtime, $
seq_cntr: seq_cntr, $
seq_dcntr: seq_dcntr, $
amonitor: amonitor, $
Amon_Bias_voltage: amonitor[0] * (38.57*2.5/2L^15), $
Amon_Bias_current: amonitor[1] * 2.5/ 2L^15, $
Amon_TEMP_DAP: func(par=par_dap,amonitor[2] * 2.5/ 2L^15), $
Amon_P5VD: amonitor[3] * 2.5/ 2L^15 * 5/2., $
Amon_P5VA: amonitor[4] * 2.5/ 2L^15 * 5/2., $
Amon_M5VA: amonitor[5] * 2.5/ 2L^15 * 5/2., $
Amon_TEMP_S1: func(par=par_s1,amonitor[6] * 2.5/ 2L^15), $
Amon_TEMP_S2: func(par=par_s2,amonitor[7] * 2.5/ 2L^15), $
mapid: mapid, $
fpga_rev: fpga_rev, $
vcmd_cntr : vcmd_cntr , $
vcmd_rate : vcmd_rate , $
icmd_cntr : icmd_cntr, $
icmd_rate : icmd_rate, $
cmd_dcntr : cmd_dcntr, $
mode_flags : mode_flags , $
noise_flags : noise_flags , $
noise_res : noise_res , $
noise_per : noise_per , $
mem_addr : mem_addr , $
mem_checksum: mem_checksum, $
pps_cntr: pps_cntr, $
event_cntr: event_cntr, $
rate_cntr: rate_cntr, $
timeout_cntrs: timeout_cntrs, $
det_timeout: det_timeout, $
nopeak_cntr: nopeak_cntr, $
nopeak_rate: nopeak_rate, $
reserved: reserved, $ ; always 0x1234
TableVER : byte(ishft(data [24], -8)), $ ; SEP table version
Compcode : byte(data[24]) , $ ; "Options [ xxxxNNCC ]: CC=Compression Type for SCI data; NN=Compression Type for NOI data."
RTAVG : byte(ishft(data[25], -8)), $ ;SEP RT Spectra Avg Interval 2^N, N=[0..5]
ARCAVG : byte(data[25]), $ ;SEP Arc Spectra Avg Interval 2^N, N=[0..5]
LUTADR : byte(ishft(data[26], -8)), $ ;Lookup Table Directory Index
LUTCSM : byte(data [26]), $ ;Lookup Table Checksum Expected
CSMLMT : byte(ishft(data[27], -8)), $ ;CSM Failure Limit
CSMCTR : byte(data[27]),$ ;CSM Failure Count
RSTLMT : byte(ishft(data[28], -8)),$ ;Reset if No Messages in Seconds
RSTSEC : byte(data[28]),$ ;Reset Seconds Since Last Message
BINMAX : byte(ishft(data[29], -8)),$ ; Spectra Bins Maximum
ATTPER : byte(data[29]),$ ; Attenuator Movement Period =2^N
ATTIN : data[30] ,$ ;Attenuator In Threshold
ATTOUT : data [31] ,$ ;Attenuator Out Threshold
BIASLIM: data [32] ,$ ;Bias lim threshold
DACS : data[33:44] }
;dprint,sephkp.pps_cntr,dlevel=2
;printdat,/valu,sephkp,out=sss
;display_text,44,exec_text=sss
if keyword_set(last_hkp) then begin
sephkp.dtime = sephkp.time - last_hkp.time
sephkp.nopeak_rate = sephkp.nopeak_cntr - last_hkp.nopeak_cntr
sephkp.vcmd_rate = sephkp.vcmd_cntr - last_hkp.vcmd_cntr
sephkp.icmd_rate = sephkp.icmd_cntr - last_hkp.icmd_cntr
endif
return,sephkp
end