function gseos_cmnblk_decom_byte_pkt,buffer
if buffer[1] eq '90'x then return,gseos_cmnblk_decom_byte_pkt([byte(['EB'x,'92'x, 0b, 0b]),buffer[2:25],[0b,0b],buffer[28:*]])
dbuff = uint(buffer,0,16)
byteorder,dbuff,/swap_if_little_endian
data_size= dbuff[14] * 2UL^16 + dbuff[15]
if data_size gt n_elements(buffer)+32 then begin
dprint,'CMNBLK Size error! - SEQ_CNTR=',dbuff[3]
endif
data_size = data_size < (n_elements(buffer)-32)
if data_size eq 0 then begin
dprint,dlevel=3,'CMNBLK with NO DATA - SEQ_CNTR=',dbuff[3]
data=0
endif else data = buffer[32:32+data_size-1]
pkt = { time:0d, $
valid : 1, $
sync: dbuff[0], $
length : dbuff[1] *2UL^16 + dbuff[2], $
seq_cntr: dbuff[3], $
cc1 : dbuff[4], $
cc2 : dbuff[5], $
cc3 : dbuff[6], $
clk_sec : dbuff[7] *2UL^16 + dbuff[8], $
clk_sub : dbuff[9], $
mid1 : byte(ishft(dbuff[10],-8)) , $
mid2 : byte(dbuff[10]), $
mid3 : byte(ishft(dbuff[11],-8)), $
mid4 : byte(dbuff[11]), $
user1 : dbuff[12], $
data_byteorder: byte(ishft(dbuff[13],-8)), $
data_type: byte(dbuff[13]) , $
data_size: data_size, $
buffer:data }
epoch = 978307200d
epoch = 946771200d
pkt.time = pkt.clk_sec + pkt.clk_sub/2d^16 + epoch
return,pkt
end
PRO mvn_cmnblk_readu,fileunit,count=count,eofile=eofile, trange=trange,$
decom=decom, outputfp=outputfp, display_widget=display_widget,_extra=ex
eofile =0
count=0L
localtime=1
treceived = systime(1)
if keyword_set(display_widget) then begin
msg = time_string(treceived,tformat='hh:mm:ss - ',local=localtime)
widget_control,display_widget,set_value=msg
endif
sync = bytarr(2)
lenbuff = bytarr(4)
while file_poll_input(fileunit,timeout=0) do begin
if eof(fileunit) then begin
eofile = 1
break
endif
fs = fstat(fileunit)
remaining = fs.size - fs.cur_ptr
if remaining lt 16 then begin
dprint,'Incomplete header at end of file - quitting ',remaining,' bytes left',dlevel=1
break
endif
dprint,dwait=10.,float(fs.cur_ptr)/float(fs.size),fs.cur_ptr,fs.size
readu,fileunit,sync
if (sync[0] eq 'EB'x) && (sync[1] eq '92'x) then begin
readu,fileunit,lenbuff
len = (((lenbuff[0]*256L)+lenbuff[1]*256L)+lenbuff[2])*256L+lenbuff[3]
len = len*2
if len gt 2L^21 then message,'Error: size is too big'
buff2 = bytarr(len-6)
fs = fstat(fileunit)
remaining = fs.size - fs.cur_ptr
if remaining lt (len-6) then begin
dprint,'Incomplete packet at end of file - quitting ',remaining,' bytes left',dlevel=1
break
endif
readu,fileunit,buff2
pkbuff = [sync,lenbuff,buff2]
count += len
if keyword_set(outputfp) then begin
writeu,outputfp, pkbuff
flush,outputfp
endif
sz = len
if sz ne 0 then msg1 = string(/print,sz,pkbuff[0:(sz < 128)-1],format='(i ," bytes: ", 128(" ",Z02))') $
else msg1 = 'No data available'
if keyword_set(display_widget) then widget_control,display_widget,set_value=msg+msg1
if keyword_set(decom) then begin
cmnpkt = gseos_cmnblk_decom_byte_pkt(pkbuff)
if ~((n_elements(trange) ge 1) && cmnpkt.time lt trange[0]) then $
mvn_gse_cmnblk_pkt_handler,cmnpkt
endif
endif else begin
dprint, format="('CMNBLK sync error: ',2Z02)",sync
endelse
endwhile
if keyword_set(time) then begin
dprint,dlevel=4,time_string(time),' ',n_elements(buffer),' bytes'
if n_elements(last_time) ne 0 then begin
store_data,'RAW_DATA_RATE',time,count/(time-last_time),/append
endif
last_time = time
endif
return
end