;+
; NAME: eis_ccsdsInterface__read.pro
;
; PURPOSE: Definition of the EIS ccsds mission data packet reading
;      
; 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_ccsdsInterface::openForReading, fname
    openr, fileUnit, fname, /get_lun
    self.inFileUnit = fileUnit
    self.fileName = fname
;    return, 1	; for now
end

function eis_ccsdsInterface::fileName
    return, self.fileName
end

pro eis_ccsdsInterface::closeInput
    lu = self.inFileUnit
    close, lu
    free_lun, lu
end

pro eis_ccsdsInterface::closeOutput
    lu = self.outFileUnit
    close, lu
    free_lun, lu
end

function eis_ccsdsInterface::readCcsdsHeader
    on_ioerror, badHdrRd
    lu = self.inFileUnit
    hdr = self.ccsdsHeader
    readu, lu, hdr
    self.ccsdsHeader = hdr
;    if self->verifyCcsdsHeader() then return,1
    return, 1
    badHdrRd:
    return, 0
end

function eis_ccsdsInterface::isEndPacketOfSequence
    seqFlag = ishft(ulong(self.ccsdsHeader[2]), -6)
    return, (seqFlag eq 3) or (seqFlag eq 2)
end

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

; Return true (1) if comp NE 0
function eis_ccsdsInterface::isCompressed
    comp = self->eis_getCompressionMethod()
;    return, comp eq 0
    return, comp ne 0
;    return, self->getCompressionMethod() ne 0
end

function eis_ccsdsInterface::getUserDataLength
    return, (ishft(ulong(self.ccsdsHeader[4]), 8) or ulong(self.ccsdsHeader[5]))
end

function eis_ccsdsInterface::readUserData
    lu = self.inFileUnit
    dataLength = self->eis_getUserDataLength() - 3
    buffer = bytarr(dataLength)
    readu, lu, buffer
    return, buffer
end

function eis_ccsdsInterface::readMdHeaderPacket
    on_ioerror, badHdrRd
    if self->eis_readCcsdsHeader() then begin
        self.firstCcsdsHeader = self.ccsdsHeader	; Keep a copy of the first one
        lu = self.inFileUnit
        hdr = self.mdHeader
        readu, lu, hdr
;        print, 'Got header packet'
        self.mdHeader = hdr
        return, 1
    endif
    badHdrRd:
;    print, 'Bad ccsds header read'
    return, 0
end

function eis_ccsdsInterface::firstCcsdsHeader
    return, self.firstCcsdsHeader
end

function eis_ccsdsInterface::mdHeader
    return, self.mdHeader
end

pro eis_ccsdsInterface::printCcsdsHeader
    print, 'Ccsds Header: ', self.ccsdsHeader
end

pro eis_ccsdsInterface::printMdHeader
    self->eis_printCcsdsHeader
    print, 'Md    Header: ', self.mdHeader
end

function eis_ccsdsInterface::mainSequenceFlag
    return, ishft(self.mdHeader[18], -6)
end

function eis_ccsdsInterface::subSequenceFlag
    return, ishft(self.mdHeader[24], -6)
end

function eis_ccsdsInterface::getMdSequenceFlags
    msf = uint(self->eis_mainSequenceFlag())
    ssf = uint(self->eis_subSequenceFlag())
    return, strtrim(string(msf), 2) + strtrim(string(ssf), 2)
end

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