#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # $Id: FormatNotes,v 1.11 2006/01/30 17:43:05 swift Exp $ #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # RCS Log: # # $Log: FormatNotes,v $ # Revision 1.11 2006/01/30 17:43:05 swift # Eliminate "dbars" and "C" from the ParkPt entries. # # Revision 1.10 2006/01/28 17:11:41 swift # Integrated the Aanderaa optode into iridium firmware. # # Revision 1.9 2006/01/06 23:25:41 swift # Minor syntax fixes. # # Revision 1.8 2005/10/25 17:02:46 swift # Change message extension from 'prf' to 'msg'. # # Revision 1.7 2005/09/05 16:04:16 swift # Fleshed out formatting documentation for iridium messages. # # Revision 1.6 2005/03/30 21:11:09 swift # Description of the encoding of data. # # Revision 1.5 2004/12/29 23:12:17 swift # Deleted format notes that pertained only to ARGOS firmware. # # Revision 1.4 2004/04/10 18:38:27 swift # Format description for use with 28-bit Argos ids. # # Revision 1.3 2004/04/10 18:36:54 swift # Format description for use with 20-bit Argos ids. # # Revision 1.2 2003/11/21 02:46:23 swift # Added documentation for the SBE41 status buts. # # Revision 1.1 2003/11/12 23:05:54 swift # Initial revision # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Format specification for APF9i firmware revision. ================================================= Iridium message files end with a ".msg" extension. Each iridium message file consists of blocks of similar data presented in the order that they were collected during the profile cycle. This firmware revision includes six blocks of data: 1) Park-phase PT samples: These are hourly low-power PT samples collected during the park phase of the profile cycle. 2) Low resolution PTSO samples: The deep parts of the profile can be represented using low-resolution spot samples collected at predetermined pressures. Low resolution spot sampling in the deep water was implemented as an energy savings measure. 3) Low resolution PO samples: This firmware was designed for iridium floats with an Aanderaa optode oxygen sensor. Optode samples are collected at predetermined pressures. Low resolution PO samples continue to be collected even when high resolution PTS data are being collected. 4) High resolution PTS samples: The shallower parts of the profile can be represented with high resolution (ie., 2 decibar) bin-averaged PTS samples. In continuous profiling mode, the CTD samples at 1Hz and stores the data for later binning and averaging. 5) GPS fixes: After the profile is executed and the float reaches the surface, the location of the profile is determined via GPS. 6) Biographical & engineering data: Various kinds of biographical and engineering data are collected at various times during the profile cycle. Usually, only one telemetry cycle is required to upload the data to the remote host computer. However, sometimes the iridium connection is broken or the quality of the connection is so poor that the float will abort the telemetry attempt, wait a few minutes, and then try again. Data blocks 4 and 5 will be repeated for each telemetry cycle of a given profile. A description of the format for each of these blocks of data follows. 1) Park-phase PT sample format. ------------------------------- Hourly low-power PT samples are collected during the park phase of the profile cycle. The park phase is also when active ballasting is done. Each sample includes the date & time of the sample, the unix epoch (ie., the number of seconds since 00:00:00 on Jan 1, 1970), the mission time (ie., the number of seconds since the start of the current profile cycle), the pressure (decibars), and the temperature (C). For example: |------- date -----| UnixEpoch MTime P T ParkPt: Aug 27 2005 13:28:01 1125149281 21615 999.8 4.1024 ParkPt: Aug 27 2005 14:27:57 1125152877 25212 1006.8 4.1554 ParkPt: Aug 27 2005 15:27:57 1125156477 28812 1004.6 4.1710 ParkPt: Aug 27 2005 16:27:57 1125160077 32412 1004.0 4.1775 ParkPt: Aug 27 2005 17:27:57 1125163677 36012 1000.2 4.1525 ParkPt: Aug 27 2005 18:27:57 1125167277 39612 1001.0 4.1381 ParkPt: Aug 27 2005 19:27:57 1125170877 43212 998.6 4.1030 2) Low resolution PTSO sample format. ------------------------------------- The SBE41CP that is used on iridium floats has features that enable subsampling of the water column (similar to the SBE41) as well as the ability to bin-average a continuous sampling of the water column. For subsampled data, the values of pressure, temperature, and salinity are not encoded but are given in conventional units (decibars, C, PSU). The Aanderaa optode does not report the actual oxygen concentration. Instead, it reports various quantities that require additional processing. In this case, the BPhase and optode temperature (C) are reported. The oxygen concentration is obtained by applying the calibration equations to the BPhase and optode temperature. The calibration equations are expressed in terms of calibration coefficients that are specific to individual optodes. For example: $ Discrete samples: 69 $ p t s bphase Topt 1015.38 3.8639 34.4641 28.57 21.11 (Park Sample) 1849.46 2.2639 34.5840 28.76 20.42 1797.59 2.3309 34.5788 28.76 20.41 1747.55 2.3958 34.5738 28.77 20.40 1697.98 2.4837 34.5659 28.77 20.39 1648.63 2.5462 34.5609 28.78 20.38 1598.20 2.6280 34.5548 28.78 20.37 3) Low resolution PO sample format. ----------------------------------- While the PTS data can transition from low resolution to high resolution, the optode data are strictly low resolution. When the CTD is in continuous profiling (CP) mode, optode samples will continue to be collected at predetermined pressures. However, the Sbe41cp does not provide subsampled TS data while in CP-mode and therefore the TS fields will have a value of "nan". The low resolution PO data have to be integrated into the high resolution STP data by shore-based data processors. For example: $ p t s bphase Topt 1015.38 3.8639 34.4641 28.57 21.11 (Park Sample) 998.30 3.9361 34.4538 28.86 20.17 950.58 nan nan 28.86 20.16 900.98 nan nan 28.87 20.16 850.73 nan nan 28.87 20.15 800.39 nan nan 28.88 20.14 750.73 nan nan 28.89 20.13 4) High resolution PTS sample format. ------------------------------------- For continuously sampled data, 2-decibar bins are used for bin-averaging. These data are encoded as three 20-bit hex integers (PTS) followed by a 16-bit integer that represents the number of samples in the bin: # Mar 30 2005 09:10:05 Sbe41cpSerNo[0747] NSample[9344] NBin[1501] 0000000000000000000[278] 0D962068124DBD9008F 0D9F8068124DBD10012 0DAC0068124DBC60008 0DB88068124DBBD0005 0DC50068124DBB20004 0DD18068134DBA80003 0DDE0068124DB9F0003 0DEA8068134DB940003 0DF70068134DB890002 0E038068124DB800003 0E100068124DB760003 0E1C8068114DB6C0002 [snippage...] The first 5-bytes of the encoded sample represents the pressure in millibars. The second 5-bytes represents the temperature in tenths of millidegrees. The third 5-bytes represent the salinity in parts per ten million. The final 4-bytes represent the number of samples collected in the 2dbar pressure bin. For example, the encoding: 0D962068124DBD9008F represents a bin with (0x008F=) 143 samples where the mean pressure was 556.50dbars, the mean temperature was 26.642C, and the mean salinity was 31.8425PSU. The PTS values were encoded as 20-bit hex integers according to the functions below. Integers in square brackets '[]' indicate replicates of the same encoded line. For example, a line that looks like this: 0000000000000000000[278] indicates that there were 278 lines with the same encoding....all zeros in this case. /*------------------------------------------------------------------------*/ /* function to encode oxygen as a 2-byte unsigned integer */ /*------------------------------------------------------------------------*/ /** This function implements the hex-encoding of IEEE-formattted floating point oxygen data into 16-bit unsigned integers with 2's-complement representation. The encoding formula accounts for the full range of 32-bit IEEE floating point values but only values in the open range: -4095=61439) O2=0xefff; else if (o2<=-4095) O2=0xf001; /* encode the oxygen frequency (rounded) */ else O2 = (unsigned int)(o2 + ((o2<0) ? -0.5 : 0.5)); } return O2; } /*------------------------------------------------------------------------*/ /* function to encode pressure as a 5-nibble unsigned integer */ /*------------------------------------------------------------------------*/ /** This function implements the hex-encoding of IEEE-formattted floating point pressure data into 5-nibbble unsigned integers with 2's complement representation. The encoding formula accounts for the full range of 32-bit IEEE floating point values but only values in the open range: -5242.87=3); if (finite(p)) { /* assign out-of-range values to sentinel values */ if (p>=5242.87) P=0x7ffffL; else if (p<=-5242.87) P=0x80001L; /* encode the pressure as the number of millibars (rounded) */ else P = (long int)(100*(p + ((p<0) ? -0.005 : 0.005))); /* express in 20-bit 2's-complement form */ if (P<0) P+=0x100000L; } return P; } /*------------------------------------------------------------------------*/ /* function to encode salinity as a 5-nibble unsigned long integer */ /*------------------------------------------------------------------------*/ /** This function implements the hex-encoding of IEEE-formattted floating point salinity data into 20-bit unsigned integers with 2's complement representation. The encoding formula accounts for the full range of 32-bit IEEE floating point values but only values in the open range: -6.5535=3); if (finite(s)) { /* assign out-of-range values to sentinel values */ if (s>=98.3039) S=0xeffffL; else if (s<=-6.5535) S=0xf0001L; /* encode the salinity as the number of parts-per-ten-million (rounded) */ else S = (long int)(10000*(s + ((s<0) ? -0.00005 : 0.00005))); /* express in 20-bit 2's-complement form */ if (S<0) S+=0x100000L; } return S; } /*------------------------------------------------------------------------*/ /* function to encode temperature as a 5-nibble unsigned long integer */ /*------------------------------------------------------------------------*/ /** This function implements the hex-encoding of IEEE-formattted floating point temperature data into 20-bit unsigned integers with 2's complement representation. The encoding formula accounts for the full range of 32-bit IEEE floating point values but only values in the open range: -6.5535=3); if (finite(t)) { /* assign out-of-range values to sentinel values */ if (t>=98.3039) T=0xeffffL; else if (t<=-6.5535) T=0xf0001L; /* encode the temperature as the number of tenths of millidegrees (rounded) */ else T = (long int)(10000*(t + ((t<0) ? -0.00005 : 0.00005))); /* express in 20-bit 2's-complement form */ if (T<0) T+=0x100000L; } return T; } 5) GPS fix format. ------------------ Each telemetry cycle begins with the float attempting to acquire a GPS fix. The fix includes the amount of time required to acquire the fix, the longitude and latitude (degrees), the date & time of the fix, and the number of satellites used to determine the fix. For example: # GPS fix obtained in 98 seconds. # lon lat mm/dd/yyyy hhmmss nsat Fix: -152.945 22.544 09/01/2005 104710 8 Positive values of longitude, latitude represent east, north hemispheres, respectively. Negative values of longitude, latitude represent west, south hemispheres, respectively. The date is given in month-day-year format and the time is given in hours-minutes-seconds format. If no fix was acquired then the following note is entered into the iridium message: # Attempt to get GPS fix failed after 600 seconds. 6) Biographical & engineering data. ----------------------------------- These data have the format, "key"="value", as shown in the following examples: ActiveBallastAdjustments=5 AirBladderPressure=119 AirPumpAmps=91 AirPumpVolts=192 BuoyancyPumpOnTime=1539 Interpretation of these data requires detailed knowledge of firmware implementations.