#ifndef LEVEL2_H #define LEVEL2_H /* http://www.ncdc.noaa.gov/oa/radar/leveliidoc.html */ typedef struct { /* 24 bytes */ char version[4]; char unknown0[16]; char station[4]; } __attribute__ ((packed)) level2_header_t; typedef struct { /** * Channel Terminal Manager: * * Archive II (the data tape) is a copy of messages or data packets * prepared for transmission from the RDA to the RPG. CTM information * is attached to a message or data packet for checking data integrity * during the transmission process and is of no importance to the base * data (omit or read past these bytes). */ short ctm[6]; // ignore /** * Message Header: * * This information is used to identify either base data or one of * thirteen types of messages that may follow in bytes 28 - 2431. This * header includes the information indicated below: */ // Message size in halfwords measure from this halfword to the end of // record. unsigned short size; // Channel ID: // 0 = Non-Redundant Site // 1 = Redundant Site Channel 1 // 2 = Redundant Site Channel 2 unsigned char id; // Message type, where: // 1 = DIGITAL RADAR DATA (This message may contain a combination of // either reflectivity, aliased velocity, or spectrum width) // 2 = RDA STATUS DATA. // 3 = PERFORMANCE/MAINTENANCE DATA. // 4 = CONSOLE MESSAGE - RDA TO RPG. // 5 = MAINTENANCE LOG DATA. // 6 = RDA CONTROL COMMANDS. // 7 = VOLUME COVERAGE PATTERN. // 8 = CLUTTER CENSOR ZONES. // 9 = REQUEST FOR DATA. // 10 = CONSOLE MESSAGE - RPG TO RDA. // 11 = LOOP BACK TEST - RDA TO RPG. // 12 = LOOP BACK TEST - RPG TO RDA. // 13 = CLUTTER FILTER BYPASS MAP - RDA to RPG. // 14 = EDITED CLUTTER FILTER BYPASS MAP - RPG to RDA. unsigned char type; // I.D. Sequence = 0 to 7FFF, then roll over back to 0. unsigned short seq; // Modified Julian date starting from 1/1/70 unsigned short gen_date; // Generation time of messages in milliseconds of day past midnight // (UTC). This time may be different than time listed in halfwords // 15-16 defined below. unsigned int gen_time; // Number of message segments. Messages larger than message size // (halfword 7 defined above) are segmented and recorded in separate // data packets. unsigned short num_seg; // Message segment number. unsigned short seg; /** * Digital Radar Data Header: * * This information describes the date, time, azimuth, elevation, and * type of base data included in the radial. This header includes the * following information: */ // Collection time for this radial in milliseconds of the day from // midnight (UTC). unsigned int coll_time; // Modified Julian date referenced from 1/1/70. unsigned short coll_date; // Unambiguous range (scaled: Value/10. = KM). unsigned short range; // Azimuth angle (coded: [Value/8.]*[180./4096.] = DEG). An azimuth of // "0 degrees" points to true north while "90 degrees" points east. // Rotation is always clockwise as viewed from above the radar. unsigned short angle; // Radial number within the elevation scan. unsigned short radial; // Radial status where: // 0 = START OF NEW ELEVATION. // 1 = INTERMEDIATE RADIAL. // 2 = END OF ELEVATION. // 3 = BEGINNING OF VOLUME SCAN. // 4 = END OF VOLUME SCAN. unsigned short rad_status; // Elevation angle (coded:[Value/8.]*[180./4096.] = DEG). An elevation // of "0 degree" is parallel to the pedestal base while "90 degrees" is // perpendicular to the pedestal base. unsigned short elev_angle; // RDA elevation number within the volume scan. unsigned short elev_num; // Range to first gate of reflectivity data (METERS). Range may be // negative to account for system delays in transmitter and/or receiver // components. short first_refl; // Range to first gate of Doppler data. Doppler data - velocity and // spectrum width (METERS). Range may be negative to account for // system delays in transmitter and/or receiver components. short first_dopp; // Reflectivity data gate size (METERS). unsigned short refl_size; // Doppler data gate size (METERS). unsigned short dopp_size; // Number of reflectivity gates. unsigned short num_refl_gate; // Number of velocity and/or spectrum width data gates. unsigned short num_dopp_gate; // Sector number within cut. unsigned short sector; // System gain calibration constant (dB biased). float gain; // Reflectivity data pointer (byte # from the start of digital radar // data message header). This pointer locates the beginning of // reflectivity data. unsigned short refl_ptr; // Velocity data pointer (byte # from the start of digital radar data // message header). This pointer locates beginning of velocity data. unsigned short vel_ptr; // Spectrum-width pointer (byte # from the start of digital radar data // message header). This pointer locates beginning of spectrum-width // data. unsigned short spec_ptr; // Doppler velocity resolution. // Value of: 2 = 0.5 m/s // 4 = 1.0 unsigned short dopp_res; // Volume coverage pattern. // Value of: 11 = 16 elev. scans/ 5 mins. // 21 = 11 elev. scans/ 6 mins. // 31 = 8 elev. scans/ 10 mins. // 32 = 7 elev. scans/ 10 mins. unsigned short pattern; // Unused. Reserved for V&V Simulator. short vv_sim[4]; // Reflectivity data pointer for Archive II playback. Archive II // playback pointer used exclusively by RDA. unsigned short refl_ptr_rda; // Velocity data pointer for Archive II playback. Archive II playback // pointer used exclusively by RDA. unsigned short vel_ptr_rda; // Spectrum-width data pointer for Archive II playback. Archive II // playback pointer used exclusively by RDA. unsigned short spec_ptr_rda; // Nyquist velocity (scaled: Value/100. = M/S). unsigned short nyquist; // Atmospheric attenuation factor (scaled: [Value/1000. = dB/KM]). unsigned short atten; // Threshold parameter for minimum difference in echo power between two // resolution volumes for them not to be labeled range ambiguous // (i.e.,overlaid) [Value/10. = Watts]. short thresh; // Unused. short unused0[17]; /** * Base Data: * * This information includes the three base data moments; reflectivity, * velocity and spectrum width. Depending on the collection method, up * to three base data moments may exist in this section of the packet. * (For this example, only reflectivity is present.) Base data is coded * and placed in a single byte and is archived in the following format: */ // A bit confsued by these docs. // Note: Need to check size field to get correct size. unsigned char data[2300]; // Reflectivity data (0 - 460 gates) (coded: [((Value-2)/2.)-32. = // dBZ], for Value of 0 or 1 see note below). //unsigned char refl[460]; // Doppler velocity data (coded: for doppler velocity resolution of 0.5 // M/S, [((Value-2)/2.)-63.5 = M/S]; for doppler resolution of 1.0 M/S, // [(Value-2)-127.] = M/S], for Value of 0 or 1 see note below), (0 - // 92 gates). Starting data location depends on length of the // reflectivity field, stop location depends on length of the velocity // field. Velocity data is range unambiguous out to 230 KM. //unsigned char vel[920]; // Doppler spectrum width (coded: [((Value - 2)/2.)-63.5 = M/S], for // Value of 0 or 1 see note below), (0 - 920 gates). Starting data // location depends on length of the reflectivity and velocity fields, // stop location depends on length of the spectrum width field. // Spectrum width is range unambiguous out to 230 KM. //unsigned char spec[920]; // Four bytes of trailer characters referred to the Frame Check // Sequence (FCS) follow the data. In cases where the three moments are // not all present or the number of gates for each moment have been // reduced, the record is padded out to a constant size of 1216 // halfwords (2432 bytes) following the trailer characters. unsigned int fcs; } __attribute__ ((packed)) level2_packet_t; #endif