;+
;  json_reader
;  This object works with the common block files to decommutate data from Keysight power supplies
; $LastChangedBy: davin-mac $
; $LastChangedDate: 2023-11-13 07:46:41 -0800 (Mon, 13 Nov 2023) $
; $LastChangedRevision: 32242 $
; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_6_1/projects/SWFO/STIS/json_reader__define.pro $
;-

COMPILE_OPT IDL2


function json_reader::translate,buf,source_dict=source_dict

  if (~KEYWORD_SET(dbg)) then begin
    ;ON_ERROR, 2
    ; Catch errors from our method and fake the call stack.
    CATCH, iErr
    if (iErr ne 0) then begin
      CATCH, /CANCEL
      ;MESSAGE, !ERROR_STATE.msg, /cont
      ;dprint,verbose=self.verbose,dlevel=3,"'"+string(buf)+"'"
      dprint,verbose=self.verbose,dlevel=3,"'"+result+"'"     
      dprint,verbose=self.verbose,dlevel=3,!error_state.msg
      return,!null
    endif
  endif
  ;hexprint,buf

  if isa(buf,'byte') then result = string(buf) else result=buf

  ;result = str_sub(result,',',',"')   ;  CLUGE  - Inserting missing quotes. - Delete line after Tony fixes ion gun code
  result = str_sub(result,':+',': ')    ; cluge - remove when the + sign gets removed.
  ;pos = strpos(result,'}{')
  ;if pos gt 0 then result = strmid(result,0,pos+1)
  ;  result = str_sub(result,'}{','},{')
  if debug(3,self.verbose,msg='test') then begin
    print,string(buf)
    print,result
  endif
  result = json_parse(string(result),/fold_case,/debug)
  if self.convert_to_float then begin
    keys = result.keys()
    foreach val,result,k do begin
      if strupcase(k) eq 'TIME' then continue
      if isa(val,'double') then result[k] = float(val)
    endforeach
  endif
  if result.haskey('TIME') && isa(result['TIME'],/string) then result['TIME'] = time_double(result['TIME'])
  ;printdat,source_dict
  add_DTIME = 1
  if keyword_set(add_DTIME) && isa(source_dict,'dictionary') && source_dict.haskey('CMBHDR')  then begin
    result['DTIME'] = 0.d  ; float(source_dict.cmbhdr.time - result['TIME'])

  endif

  if self.convert_to_struct then result = result.tostruct()
  return,result
end



pro json_reader::read,source,source_dict=source_dict

  nb = n_elements(source)
  nbytes = 0ul
  npkts = 0ul
    
  while isa( (buf = self.read_line(source,pos=nbytes) )   ) do begin
    dprint,verbose=self.verbose,dlevel=4,nbytes,string(buf)
    if debug(4,self.verbose,msg='Hex: '+strtrim(n_elements(buf))) then begin
      hexprint,buf      
    endif
    if self.run_proc then begin
      result = self.translate(buf,source_dict=source_dict)
      if debug(4,self.verbose,MSG='test: ') then printdat,result
      if isa(self.dyndata,'dynamicarray') then self.dyndata.append, result      
    endif
    nbytes += n_elements(buf)
    npkts += 1
  endwhile
  self.npkts += npkts
  self.nbytes += nbytes
  if self.isasocket then begin
    self.msg = time_string(systime(1),tformat='hh:mm:ss ')+strtrim(nbytes,2)+' bytes'
  endif

end


function json_reader::init,_extra=ex  
  ;dprint,'hello'
  void = self.socket_reader::init(_extra=ex)
  if ~isa(tplot_tagnames,'string') then tplot_tagnames='*'
  self.convert_to_struct = 1
  self.convert_to_float = 1
  if self.eol lt 0 then self.eol=byte(10)
  return,1

end




PRO json_reader__define
  void = {json_reader, $
    inherits socket_reader, $    ; superclass
    ;ddata: obj_new(),  $
    ;powersupply_num:0    $           ; not actually used
    tplot_tagnames: '', $
    convert_to_struct:0,  $
    convert_to_float:0  $
  }
END