;+
;  $Id: unpack_img.pro,v 1.9 2007/05/09 15:38:04 jredfern Exp $
;
;  $Source: /usr/lib/cvsroot/twins-idl/lib/util/unpack_img.pro,v $
;  $Revision: 1.9 $
;  $Date: 2007/05/09 15:38:04 $
;

PRO unpack_img_jill2, 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({ $
; Wrapper
c_pt :long64(0), $
c_gr:long64(0), $
fr_sz:0L, $
f_gr:0L, $
;
; primary header
;
versionid :0, $
typeid :0, $
header_flag :0, $
istid :0, $
pktid :0, $
pkt_len :0, $
;
; secondary header
c_pt_sh :long64(0), $
f_pt_sh :0L, $
telem :0, $
;
; instrument status
;
 ISECTORPOS : 0.0D, $
 ISECTORPOS333 : 0.0D, $
 ISECTORPOS666 : 0.0D, $
 ISECTORPOS999    : 0.0D, $
 ISECTORTIMELAPSE : 0, $
 ISECTORNUMBER   : 0, $
 ISCANSTATE     : 0, $
 ISECTORVELOCITY : 0.0D, $
 ILADCNT1OFFSET0 : 0, $
 ILADCNT2OFFSET0 : 0, $
 ILADCNT1OFFSET2 : 0, $
 ILADCNT2OFFSET2 : 0, $
 IFEETOTALVALIDS : 0, $
;
; singles data
;
 ISTARTCNT1      :0, $ 
 ISTOPCNT1        :0, $
 IVALIDCNT1       :0, $
 ISTARTCNT2       :0, $
 ISTOPCNT2        :0, $
 IVALIDCNT2       :0, $
 ISTARTNOSTOPCNT1 :0, $
 ITOFUNDRFLWCNT1  :0, $
 ISTARTSTARTCNT1  :0, $
 ISTARTHGHTOVRLD1 :0, $
 ISTOPHGHTOVRLD1  :0, $
 ISTARTPOSUNDRFLW1 :0, $
 ISTARTPOSOVRFLW1:0, $
 ISTOPPOSUNDRFLW1:0, $
 ISTOPPOSOVRFLW1 :0, $
 IEVENTBUFOVRFLW1    :0, $
 ISTARTNOSTOPCNT2    :0, $
 ITOFUNDRFLWCNT2     :0, $
 ISTARTSTARTCNT2     :0, $
 ISTARTHGHTOVRLD2    :0, $
 ISTOPHGHTOVRLD2     :0, $
 ISTARTPOSUNDRFLW2   :0, $
 ISTARTPOSOVRFLW2    :0, $
 ISTOPPOSUNDRFLW2    :0, $
 ISTOPPOSOVRFLW2     :0, $
 IEVENTBUFOVRFLW2    :0, $
;
; onboard Neutral Atom 
;
 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)
  
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 ;uncommented by Jillian on 5/27/2008
       imgmsg[j].fr_sz = img[i].fr_sz
       imgmsg[j].f_gr = img[i].f_gr ;uncommented by Jillian on 5/27/2008
;
; 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 else if (img[i].group_flag eq 1) then print, i
    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
