;+
;  $Id: unpack_img_jill.pro,v 1.4 2008/01/10 17:15:16 jredfern Exp $
;
;  $Source: /usr/lib/cvsroot/twins-idl/lib/util/unpack_img_jill.pro,v $
;  $Revision: 1.4 $
;  $Date: 2008/01/10 17:15:16 $
;

PRO unpack_img_jill, datafile,bdata,ftype_i,img, cal=cal

;
; PURPOSE:
;       unpack housekeeping data from binary data file and generate
;       idl saveset
;
;
;  Example:
;   unpack_img, '2002031',1,datarray,ftypearray
;  Notes:
;  See Also:
;
;  Author:  Dorothea DeLapp LANL 2007
;  Modification $Author: jredfern $
;-

  
;
; determine max number of direct events
;
   tsmode=where(img.telem eq 5,tscount)
   tdmode=where(img.telem eq 6,tdcount)
   if tdcount gt 0 then begin
        maxde=6265/5
   endif else begin
        maxde=4784/5
   endelse
;
; determine number of messages
;
   if not cal then begin
   num_msgs=n_elements(uniq(img.c_pt+ (img.f_pt_sh/1000.0d)))
   endif else begin
   num=where(img.group_flag eq 1,num_msgs)
   endelse
;
;
; define test message
;
  imgmsg=replicate(create_struct(name='imaging_'+strtrim(string(maxde),2),$
; Wrapper
'c_pt' , long64(0),$
'c_gr' , long64(0),$
'fr_sz' , 0L,$
'f_gr' , 0L,$
;
;primaryheader
;
'versionid' , 0,$
'typeid' , 0,$
'header_flag' , 0,$
'istid' , 0,$
'pktid' , 0,$
'pkt_len' , 0,$
;
;secondaryheader
'c_pt_sh' , long64(0),$
'f_pt_sh' , 0L,$
'telem' , 0,$
;
;instrumentstatus
;
'ISECTORPOS' , 0.0D,$
'ISECTORPOS333' , 0.0D,$
'ISECTORPOS666' , 0.0D,$
'ISECTORPOS999' , 0.0D,$
'ISECTORTIMELAPSE' , 0l,$
'ISECTORNUMBER' , 0,$
'ISCANSTATE' , 0,$
'ISECTORVELOCITY' , 0.0D,$
'ILADCNT1OFFSET0' , 0,$
'ILADCNT2OFFSET0' , 0,$
'ILADCNT1OFFSET2' , 0,$
'ILADCNT2OFFSET2' , 0,$
'IFEETOTALVALIDS' , 0,$
;
;singlesdata
;
'ISTARTCNT1' , 0l,$
'ISTOPCNT1' , 0l,$
'IVALIDCNT1' , 0l,$
'ISTARTCNT2' , 0l,$
'ISTOPCNT2' , 0l,$
'IVALIDCNT2' , 0l,$
'ISTARTNOSTOPCNT1' , 0l,$
'ITOFUNDRFLWCNT1' , 0l,$
'ISTARTSTARTCNT1' , 0l,$
'ISTARTHGHTOVRLD1' , 0l,$
'ISTOPHGHTOVRLD1' , 0l,$
'ISTARTPOSUNDRFLW1' , 0l,$
'ISTARTPOSOVRFLW1' , 0l,$
'ISTOPPOSUNDRFLW1' , 0l,$
'ISTOPPOSOVRFLW1' , 0l,$
'IEVENTBUFOVRFLW1' , 0l,$
'ISTARTNOSTOPCNT2' , 0l,$
'ITOFUNDRFLWCNT2' , 0l,$
'ISTARTSTARTCNT2' , 0l,$
'ISTARTHGHTOVRLD2' , 0l,$
'ISTOPHGHTOVRLD2' , 0l,$
'ISTARTPOSUNDRFLW2' , 0l,$
'ISTARTPOSOVRFLW2' , 0l,$
'ISTOPPOSUNDRFLW2' , 0l,$
'ISTOPPOSOVRFLW2' , 0l,$
'IEVENTBUFOVRFLW2' , 0l,$
;
;onboardNeutralAtom
;
'onboard' , intarr(3072),$
;
;directevents
;
'TOF' , intarr(maxde),$
'STARTHT' , intarr(maxde),$
'STARTPOS' , intarr(maxde),$
'STOPHT' , intarr(maxde),$
'STOPPOS' , intarr(maxde),$
'slice' , intarr(maxde),$
'DEID' , intarr(maxde),$
;
'DataFileID' , 0),num_msgs)

lun=9
close, lun
file=datafile+'_time.txt'
openw, lun, file
for i=0L,long(n_elements(ftype_i))-1L do begin
printf, lun, img[i].c_pt
endfor
close, lun

i=0L
j=-1L
lasttime=0
decounter=0
for i=0L,long(n_elements(ftype_i))-1L do begin
; check to see if first or new time (new message)
;
;    if lasttime ne img[i].c_pt then begin
    if ((cal and img[i].group_flag eq 1) or (not cal and lasttime ne (img[i].c_pt + (img[i].f_pt_sh/1000.0d)))) then begin

;
; in order to use last time of ground receipt time. reset ground receipt time
;
       if j ge 0 then begin
          imgmsg[j].c_gr = img[i-1].c_gr
          imgmsg[j].f_gr = img[i-1].f_gr
       endif

       j=j+1L
       lasttime=img[i].c_pt+ (img[i].f_pt_sh/1000.0d)
       decounter=0
       nacounter=0
;
;   fill wrapper primary and secondary header
;
; Wrapper
       imgmsg[j].c_pt = img[i].c_pt
       imgmsg[j].c_gr = img[i].c_gr
       imgmsg[j].fr_sz = img[i].fr_sz
       imgmsg[j].f_gr = img[i].f_gr
;
; primary header
;
       imgmsg[j].versionid  = img[i].versionid
       imgmsg[j].typeid  = img[i].typeid
       imgmsg[j].header_flag  = img[i].header_flag
       imgmsg[j].istid  = img[i].istid
       imgmsg[j].pktid  = img[i].pktid
       imgmsg[j].pkt_len  = img[i].pkt_len
;
; secondary header
       imgmsg[j].c_pt_sh  = img[i].c_pt_sh
       imgmsg[j].f_pt_sh  = img[i].f_pt_sh
       imgmsg[j].telem  = img[i].telem

   endif
;print, j
if (j eq -1) then continue
    CASE img[i].group_flag OF
      ; first packet in message
      1 : BEGIN
          imgmsg[j].ISECTORPOS = double(ishft(long(bdata[img[i].dataidx]),8)+ishft(long(bdata[img[i].dataidx+1]),0))/17.7832D - 2035.D /17.7832D
          imgmsg[j].ISECTORPOS333  = double(ishft(long(bdata[img[i].dataidx+2]),8)+ishft(long(bdata[img[i].dataidx+3]),0))/17.7832D - 2035.D /17.7832D
          imgmsg[j].ISECTORPOS666  = double(ishft(long(bdata[img[i].dataidx+4]),8)+ishft(long(bdata[img[i].dataidx+5]),0))/17.7832D - 2035.D /17.7832D
          imgmsg[j].ISECTORPOS999     = double(ishft(long(bdata[img[i].dataidx+6]),8)+ishft(long(bdata[img[i].dataidx+7]),0))/17.7832D - 2035.D /17.7832D
          imgmsg[j].ISECTORTIMELAPSE = ishft(long(bdata[img[i].dataidx+8]),8)+ishft(long(bdata[img[i].dataidx+9]),0)
          imgmsg[j].ISECTORNUMBER   = ishft(long(bdata[img[i].dataidx+10]),0)
          imgmsg[j].ISCANSTATE     = ishft(long(bdata[img[i].dataidx+11]),0)
          imgmsg[j].ISECTORVELOCITY  = (double(ishft(long(bdata[img[i].dataidx+12]),8)+ishft(long(bdata[img[i].dataidx+13]),0))-2035.D)/314.725D
          imgmsg[j].ILADCNT1OFFSET0 = ishft(long(bdata[img[i].dataidx+14]),8)+ishft(long(bdata[img[i].dataidx+15]),0)
          imgmsg[j].ILADCNT2OFFSET0 = ishft(long(bdata[img[i].dataidx+16]),8)+ishft(long(bdata[img[i].dataidx+17]),0)
          imgmsg[j].ILADCNT1OFFSET2 = ishft(long(bdata[img[i].dataidx+18]),8)+ishft(long(bdata[img[i].dataidx+19]),0)
          imgmsg[j].ILADCNT2OFFSET2 = ishft(long(bdata[img[i].dataidx+20]),8)+ishft(long(bdata[img[i].dataidx+21]),0)
          imgmsg[j].IFEETOTALVALIDS = ishft(long(bdata[img[i].dataidx+22]),8)+ishft(long(bdata[img[i].dataidx+23]),0)
          imgmsg[j].ISTARTCNT1  = ishft(long(bdata[img[i].dataidx+32]),8)+ishft(long(bdata[img[i].dataidx+33]),0)
          imgmsg[j].ISTOPCNT1  = ishft(long(bdata[img[i].dataidx+34]),8)+ishft(long(bdata[img[i].dataidx+35]),0)
          imgmsg[j].IVALIDCNT1  = ishft(long(bdata[img[i].dataidx+36]),8)+ishft(long(bdata[img[i].dataidx+37]),0)
          imgmsg[j].ISTARTCNT2  = ishft(long(bdata[img[i].dataidx+38]),8)+ishft(long(bdata[img[i].dataidx+39]),0)
          imgmsg[j].ISTOPCNT2   = ishft(long(bdata[img[i].dataidx+40]),8)+ishft(long(bdata[img[i].dataidx+41]),0)
          imgmsg[j].IVALIDCNT2  = ishft(long(bdata[img[i].dataidx+42]),8)+ishft(long(bdata[img[i].dataidx+43]),0)
          imgmsg[j].ISTARTNOSTOPCNT1  = ishft(long(bdata[img[i].dataidx+44]),8)+ishft(long(bdata[img[i].dataidx+45]),0)
          imgmsg[j].ITOFUNDRFLWCNT1   = ishft(long(bdata[img[i].dataidx+46]),8)+ishft(long(bdata[img[i].dataidx+47]),0)
          imgmsg[j].ISTARTSTARTCNT1   = ishft(long(bdata[img[i].dataidx+48]),8)+ishft(long(bdata[img[i].dataidx+49]),0)
          imgmsg[j].ISTARTHGHTOVRLD1  = ishft(long(bdata[img[i].dataidx+50]),8)+ishft(long(bdata[img[i].dataidx+51]),0)
          imgmsg[j].ISTOPHGHTOVRLD1   = ishft(long(bdata[img[i].dataidx+52]),8)+ishft(long(bdata[img[i].dataidx+53]),0)
          imgmsg[j].ISTARTPOSUNDRFLW1  = ishft(long(bdata[img[i].dataidx+54]),8)+ishft(long(bdata[img[i].dataidx+55]),0)
          imgmsg[j].ISTARTPOSOVRFLW1 = ishft(long(bdata[img[i].dataidx+56]),8)+ishft(long(bdata[img[i].dataidx+57]),0)
          imgmsg[j].ISTOPPOSUNDRFLW1 = ishft(long(bdata[img[i].dataidx+58]),8)+ishft(long(bdata[img[i].dataidx+59]),0)
          imgmsg[j].ISTOPPOSOVRFLW1  = ishft(long(bdata[img[i].dataidx+60]),8)+ishft(long(bdata[img[i].dataidx+61]),0)
          imgmsg[j].IEVENTBUFOVRFLW1     = ishft(long(bdata[img[i].dataidx+62]),8)+ishft(long(bdata[img[i].dataidx+63]),0)
          imgmsg[j].ISTARTNOSTOPCNT2     = ishft(long(bdata[img[i].dataidx+64]),8)+ishft(long(bdata[img[i].dataidx+65]),0)
          imgmsg[j].ITOFUNDRFLWCNT2      = ishft(long(bdata[img[i].dataidx+66]),8)+ishft(long(bdata[img[i].dataidx+67]),0)
          imgmsg[j].ISTARTSTARTCNT2      = ishft(long(bdata[img[i].dataidx+68]),8)+ishft(long(bdata[img[i].dataidx+69]),0)
          imgmsg[j].ISTARTHGHTOVRLD2     = ishft(long(bdata[img[i].dataidx+70]),8)+ishft(long(bdata[img[i].dataidx+71]),0)
          imgmsg[j].ISTOPHGHTOVRLD2      = ishft(long(bdata[img[i].dataidx+72]),8)+ishft(long(bdata[img[i].dataidx+73]),0)
          imgmsg[j].ISTARTPOSUNDRFLW2    = ishft(long(bdata[img[i].dataidx+74]),8)+ishft(long(bdata[img[i].dataidx+75]),0)
          imgmsg[j].ISTARTPOSOVRFLW2     = ishft(long(bdata[img[i].dataidx+76]),8)+ishft(long(bdata[img[i].dataidx+77]),0)
          imgmsg[j].ISTOPPOSUNDRFLW2     = ishft(long(bdata[img[i].dataidx+78]),8)+ishft(long(bdata[img[i].dataidx+79]),0)
          imgmsg[j].ISTOPPOSOVRFLW2      = ishft(long(bdata[img[i].dataidx+80]),8)+ishft(long(bdata[img[i].dataidx+81]),0)
          imgmsg[j].IEVENTBUFOVRFLW2     = ishft(long(bdata[img[i].dataidx+82]),8)+ishft(long(bdata[img[i].dataidx+83]),0)
;
; first packet contains 407 bytes of Neutral Atom data 
;
; unpack onboard
;
       imgmsg[j].onboard[0:406] = ishft(bdata[img[i].dataidx+84+8:img[i].dataidx+84+8+406],0)
        nacounter=407


          ENDCASE
      ; middle packet in message
      0 : BEGIN
;
; set byte index to start of direct events
         if img[i].sub_ctr le 5 then begin
; then just na pixels
             imgmsg[j].onboard[nacounter:nacounter+498]=ishft(bdata[img[i].dataidx:img[i].dataidx+498],0)
             nacounter=nacounter+499
         endif else if img[i].sub_ctr eq 6 then begin
; then just na pixels
             imgmsg[j].onboard[nacounter:nacounter+169]=ishft(bdata[img[i].dataidx:img[i].dataidx+169],0)
             deindex=img[i].dataidx+170
         k=0
         for k=0,64 do begin
            imgmsg[j].TOF[decounter] = ishft(bdata[deindex+k*5],0)
            imgmsg[j].STARTHT[decounter]= ishft(bdata[deindex+1+k*5],0)
            imgmsg[j].STARTPOS[decounter]= ishft(bdata[deindex+2+k*5] AND 252,-2)
            imgmsg[j].STOPHT[decounter]= ishft(bdata[deindex+3+k*5] AND 254,-1)
            imgmsg[j].STOPPOS[decounter]= ishft(bdata[deindex+4+k*5],0)
            imgmsg[j].SLICE[decounter]= ishft(bdata[deindex+2+k*5] AND 2,0) + $
                          ishft(bdata[deindex+3+k*5] AND 1,0)
            imgmsg[j].DEID[decounter]= ishft(bdata[deindex+2+k*5] AND 1,0)
            decounter=decounter+1 

         endfor
; then na pixels first then de 
         endif else begin 
          
;
         deindex=img[i].dataidx
         k=0
         for k=0, 98 do begin
            imgmsg[j].TOF[decounter] = ishft(bdata[deindex+k*5],0)
            imgmsg[j].STARTHT[decounter]= ishft(bdata[deindex+1+k*5],0)
            imgmsg[j].STARTPOS[decounter]= ishft(bdata[deindex+2+k*5] AND 252,-2)
            imgmsg[j].STOPHT[decounter]= ishft(bdata[deindex+3+k*5] AND 254,-1)
            imgmsg[j].STOPPOS[decounter]= ishft(bdata[deindex+4+k*5],0)
            imgmsg[j].SLICE[decounter]= ishft(bdata[deindex+2+k*5] AND 2,0) + $
                          ishft(bdata[deindex+3+k*5] AND 1,0)
            imgmsg[j].DEID[decounter]= ishft(bdata[deindex+2+k*5] AND 1,0)
            decounter=decounter+1 

         endfor
         endelse


          ENDCASE
      ; last packet in message
      2 : BEGIN
;
; set byte index to start of direct events
;
         deindex=img[i].dataidx
         k=0
         for k=0, 98 do begin
            imgmsg[j].TOF[decounter] = ishft(bdata[deindex+k*5],0)
            imgmsg[j].STARTHT[decounter]= ishft(bdata[deindex+1+k*5],0)
            imgmsg[j].STARTPOS[decounter]= ishft(bdata[deindex+2+k*5] AND 252,-2)
            imgmsg[j].STOPHT[decounter]= ishft(bdata[deindex+3+k*5] AND 254,-1)
            imgmsg[j].STOPPOS[decounter]= ishft(bdata[deindex+4+k*5],0)
            imgmsg[j].SLICE[decounter]= ishft(bdata[deindex+2+k*5] AND 2,0) + $
                          ishft(bdata[deindex+3+k*5] AND 1,0)
            imgmsg[j].DEID[decounter]= ishft(bdata[deindex+2+k*5] AND 1,0)
            decounter=decounter+1 

         endfor
          ENDCASE
      ENDCASE

endfor



; save test
; 
 tfilename=strcompress(datafile+'_img.idl',/remove_all)
 save,imgmsg, filename=tfilename

END
