file: lwrcflash.html
8 Aug 2007

CompactFLASH CARD STORAGE FORMAT - LWR

The following describes the data storage and record format of CompactFLASH memory cards used in ASIMET instrumentation with Ver4.xx and later firmware.

CompactFLASH card sectors of interest:

Description of LWR data file area beginning at Sector 322

The CFLASH data file (yourname.DAT) consumes most of the CompactFLASH card. Each record is 612 bytes long, containing the date and time written, 60 minutes of packed dome temperature data, 60 minutes of packed body temperature data, 60 minutes of IEEE single-precision thermopile voltage data, 60 minutes of packed longwave flux data, a flag which is set to 0xA5A5 when the record is written, and a 2 byte CRC of the previous 610 bytes. The actual C language struct is reproduced here to show the format of the stored image.

   /* this is the LWR data record structure, 612 bytes */
   struct LWR_record
      {
      struct time_type time1;   /* 8 bytes of time */
      unsigned short temp_dome[60];      /* 60 minutes of packed dome temp data */
      unsigned short temp_body[60];      /* 60 minutes of packed body temp data */
      float volts_pile[60];     /* 60 minutes of thermopile voltage data */
      unsigned short lw_flux[60];      /* 60 minutes of packed LW_flux data */
      unsigned short used;     /* set to 0xA5A5 upon record write */
      unsigned short lwr_CRC;  /* CRC of previous 610 bytes */
      };


struct time_type { unsigned char hour; unsigned char min; unsigned char sec; unsigned char day; unsigned char dow; /* day of week - NOT USED */ unsigned char mon; unsigned int year; };

Note that time structure is NOT ANSI-compatible.


Data packing - this is the packing code from the LWR instrument

     /* every minute, from 0 to 59, store the records */
     LWR_data.temp_dome[t_time.min] = (unsigned short)(temp_dome * 100.0);
     LWR_data.temp_body[t_time.min] = (unsigned short)(temp_body * 100.0);
     LWR_data.volts_pile[t_time.min] = volts_pile;
     LWR_data.lw_flux[t_time.min] = (unsigned short)(LW_flux * 10.0);

Data is written to the FLASH card immediately following the acquisition of data at the rollover to the 59th minute of each hour. This is reflected in the time stamp on each record, typically 1 second into minute 59.


*** IMPORTANT NOTE ***

The byte order of the some numeric values stored by the VOSLWR53 firmware is reversed relative to Intel-based PC's. That is, a long integer (4 bytes) or short integer (2 bytes) stored by a PC will be LS byte first in memory, and floats with mantissa first. The VOSLWR53 firmware stores shorts and longs with MS byte first in memory. Also, single precision IEEE float values are big-endian. This must be accounted for when processing the data. See the float storage format below.


The "used" flag value is used to simplify finding the end of valid records the .DAT file; as each record is written, the "used" flag is set to A5A5h to provide a distinct pattern to search on for good records.

The CRC is NOT IMPLEMENTED.


"float" 4 byte values are IEEE-754 single-precision float.

Storage format for these float values is as follows:

      byte addr      +0         +1           +2         +3
      contents     SEEEEEEE   EMMMMMMM    MMMMMMMM   MMMMMMMM

            where S => Sign bit;  1 = negative,  0 = positive
                  E => Exponent (2's comp) with offset 127 (decimal)
                  M => 23-bit normal mantissa (highest bit always 1 and
                           therefore not stored)