;+
; Project     :	SOLAR-B - EIS
;
; Name        :	EIS_CPT_COMPOSE_INTEL_HEX_FILE
;
; Purpose     :	Converts data into Intel Hex format.
;
; Explanation :	This routine converts the input data into Intel hex format.
;               The Intel format data is returned as a BYTE array.
;               The byte data is stored continuously from start_address.
;
; Use         :	< hex_record = eis_cpt_compose_intel_hex_file(data) >
;
; Inputs      :	data : BYTARR[] raw data.
;
; Opt. Inputs : None.
;
; Outputs     : hex_record : BYTARR[] intel hex format values.
;
; Opt. Outputs:	None.
;
; Keywords    : HEADER        : STRING header string for file.
;               ULBA          : UINT extended linear address : upper 16 bits of 32 bit address.
;                               NB will not get added if zero
;               START_ADDRESS : UINT start address : lower 16 bits of 32 bit address.
;               NOENDOFFILE   : FLAG indicating not to output end of file record.
;
; Calls       : None.
;
; Common      :	None.
;
; Restrictions:	None.
;
; Side effects:	None.
;
; Category    :	EIS_CPT.
;
; Prev. Hist. :	None.
;
; Written     :	Martin Carter RAL 22/10/04
;
; Modified    :	Version 0.1, 02/11/04, MKC
;                 Added HEADER keyword.
;                 Added ULBA keyword.
;               Version 0.2, 29/04/05, MKC
;                 Added keyword START_ADDRESS.
;               Version 0.3, 12/05/05, MKC
;                 Added keyword NOENDOFFILE.
;               Version 0.4, 05/07/05, MKC
;                 Used eis cpt get intel hex record length.
;               Version 0.5, 22/05/06, MKC
;                 Removed initialization of dummy.
;
; Version     :	0.5, 22/05/06
;-
;**********************************************************

FUNCTION eis_cpt_compose_intel_hex_file, data, HEADER=header, ULBA=ulba, START_ADDRESS=start_address, NOENDOFFILE=noendoffile

  ; set up record length to be used

  nominal_length = 32

  ndata = N_ELEMENTS(data)

  ; add header

  IF KEYWORD_SET(header) THEN eis_cpt_add_intel_hex_record, dummy, dummy, hex_record, HEADER=header

  ; add ulba
  ; NB will not get added if zero

  IF KEYWORD_SET(ulba) THEN eis_cpt_add_intel_hex_record, dummy, dummy, hex_record, ULBA=ulba

  ; set up start address

  IF KEYWORD_SET(start_address) THEN BEGIN

    load_address = UINT(start_address)

  ENDIF ELSE BEGIN

    load_address = 0U

  ENDELSE

  ; set up pos in data array

  pos = 0

  ; loop through data

  WHILE pos LT ndata DO BEGIN

    ; get record_length taking into account last odd record

    ; record_length = ((pos+nominal_length)<ndata) - pos

    record_length = eis_cpt_get_intel_hex_record_length(load_address)

    ; add record

    eis_cpt_add_intel_hex_record, load_address, data[pos:pos+record_length-1], hex_record

    ; increment load address and position within data

    load_address = load_address + record_length

    pos = pos + record_length

  ENDWHILE

  ; add end of file record

  IF NOT KEYWORD_SET(noendoffile) THEN eis_cpt_add_intel_hex_record, dummy, dummy, hex_record, /ENDOFFILE

  ; return hex byte data

  RETURN, hex_record

END





