;+
; NAME: eis_ccsds_interface__define.pro
;
; PURPOSE: Definition of the EIS ccsds packet structure
;      
; CATEGORY: Science
;
; CALLING SEQUENCE: None
;
; INPUTS: None
;
; KEYWORD PARAMETERS: None
;
; OUTPUTS: None
;
; CALLS: None
;
; COMMON BLOCKS:None.
;
; PROCEDURE:
;
; RESTRICTIONS: Uses SolarSoft
;
; MODIFICATION HISTORY:
;	23/11/05 mcrw	wrote
;       14/08/06 mcrw	added documentation
;
;-

; Open a file for reading. No error checking yet.
pro eis_ccsds_interface::open_for_reading, fname, success
    success = 1
    list = findfile(fname)
    if n_elements(list) eq 0 then begin
        success = 0
        return
    endif else if list eq '' then begin
        success = 0
        return
    endif
    openr, file_unit, fname, /get_lun
    self.in_file_unit = file_unit
    self.file_name = fname
;    return, 1	; for now
end

function eis_ccsds_interface::file_name
    return, self.file_name
end

pro eis_ccsds_interface::close_input
    lu = self.in_file_unit
    close, lu
    free_lun, lu
end

pro eis_ccsds_interface::close_output
    lu = self.out_file_unit
    close, lu
    free_lun, lu
end

function eis_ccsds_interface::read_ccsds_header
    on_ioerror, bad_hdr_rd
    lu = self.in_file_unit
    hdr = self.ccsds_header
    readu, lu, hdr
    self.ccsds_header = hdr
;    if self->verifyCcsdsHeader() then return,1
    return, 1
    bad_hdr_rd:
    return, 0
end

function eis_ccsds_interface::is_end_packet_of_sequence
    seq_flag = ishft(ulong(self.ccsds_header[2]), -6)
    return, (seq_flag eq 3) or (seq_flag eq 2)
end

function eis_ccsds_interface::get_compression_method
    return, ulong(ishft(ulong(self.md_header[38]), 8) or ulong(self.md_header[39]))
    ; case compression of
    ;    0x3B28 : return, 'dpcmtopnm'
    ; etc
end

; Return true (1) if comp NE 0
function eis_ccsds_interface::is_compressed
    comp = self->get_compression_method()
;    return, comp eq 0
    return, comp ne 0
;    return, self->get_compression_method() ne 0
end

function eis_ccsds_interface::get_user_data_length
    return, (ishft(ulong(self.ccsds_header[4]), 8) or ulong(self.ccsds_header[5]))
end

function eis_ccsds_interface::read_user_data
    on_ioerror, bad_data_rd
    lu = self.in_file_unit
    data_length = self->get_user_data_length() - 3
    buffer = bytarr(data_length)
    readu, lu, buffer
    return, buffer
    bad_data_rd:
    return, 0
end

function eis_ccsds_interface::read_md_header_packet
    on_ioerror, bad_md_hdr_rd
    if self->read_ccsds_header() then begin
        self.first_ccsds_header = self.ccsds_header	; Keep a copy of the first one
        lu = self.in_file_unit
        hdr = self.md_header
        readu, lu, hdr
;        print, 'Got header packet'
        self.md_header = hdr
        return, 1
    endif
    bad_md_hdr_rd:
;    print, 'Bad ccsds header read'
    return, 0
end

function eis_ccsds_interface::first_ccsds_header
    return, self.first_ccsds_header
end

function eis_ccsds_interface::md_header
    return, self.md_header
end

pro eis_ccsds_interface::print_ccsds_header
    print, 'Ccsds Header: ', self.ccsds_header
end

pro eis_ccsds_interface::print_md_header
    self->print_ccsds_header
    print, 'Md    Header: ', self.md_header
end

function eis_ccsds_interface::main_sequence_flag
    return, ishft(self.md_header[18], -6)
end

function eis_ccsds_interface::sub_sequence_flag
    return, ishft(self.md_header[24], -6)
end

function eis_ccsds_interface::get_md_sequence_flags
    msf = uint(self->main_sequence_flag())
    ssf = uint(self->sub_sequence_flag())
    return, strtrim(string(msf), 2) + strtrim(string(ssf), 2)
end

;function eis_ccsdsInterface::process33
;    return,1
;end

pro eis_ccsds_interface__define

    struct={eis_ccsds_interface,			$
            ccsds_header : bytarr(10),		$
            first_ccsds_header : bytarr(10),	$
            md_header : bytarr(264),		$
            file_name : ' ',			$
            output_filename_base : ' ',		$
            out_file_unit : 98,			$
            in_file_unit : 99}
end
