kopia lustrzana https://github.com/cyoung/stratux
				
				
				
			
		
			
				
	
	
		
			193 wiersze
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			193 wiersze
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
| // Part of dump978, a UAT decoder.
 | |
| //
 | |
| // Copyright 2015, Oliver Jowett <oliver@mutability.co.uk>
 | |
| //
 | |
| // This file is free software: you may copy, redistribute and/or modify it  
 | |
| // under the terms of the GNU General Public License as published by the
 | |
| // Free Software Foundation, either version 2 of the License, or (at your  
 | |
| // option) any later version.  
 | |
| //
 | |
| // This file is distributed in the hope that it will be useful, but  
 | |
| // WITHOUT ANY WARRANTY; without even the implied warranty of  
 | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  
 | |
| // General Public License for more details.
 | |
| //
 | |
| // You should have received a copy of the GNU General Public License  
 | |
| // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
| #ifndef UAT_DECODE_H
 | |
| #define UAT_DECODE_H
 | |
| 
 | |
| #include <stdint.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #include "uat.h"
 | |
| 
 | |
| //
 | |
| // Datatypes
 | |
| //
 | |
| 
 | |
| typedef enum { AQ_ADSB_ICAO=0, AQ_NATIONAL=1, AQ_TISB_ICAO=2, AQ_TISB_OTHER=3, AQ_VEHICLE=4,
 | |
|                AQ_FIXED_BEACON=5, AQ_RESERVED_6=6, AQ_RESERVED_7=7 } address_qualifier_t;
 | |
| typedef enum { ALT_INVALID=0, ALT_BARO, ALT_GEO } altitude_type_t;
 | |
| typedef enum { AG_SUBSONIC=0, AG_SUPERSONIC=1, AG_GROUND=2, AG_RESERVED=3 } airground_state_t;
 | |
| typedef enum { TT_INVALID=0, TT_TRACK, TT_MAG_HEADING, TT_TRUE_HEADING } track_type_t;
 | |
| typedef enum { HT_INVALID=0, HT_MAGNETIC, HT_TRUE } heading_type_t;
 | |
| typedef enum { CS_INVALID=0, CS_CALLSIGN, CS_SQUAWK } callsign_type_t;
 | |
| 
 | |
| struct uat_adsb_mdb {
 | |
|     // presence bits
 | |
|     int has_sv : 1;
 | |
|     int has_ms : 1;
 | |
|     int has_auxsv : 1;
 | |
| 
 | |
|     int position_valid : 1;
 | |
|     int ns_vel_valid : 1;
 | |
|     int ew_vel_valid : 1;
 | |
|     int speed_valid : 1;
 | |
|     int dimensions_valid : 1;
 | |
| 
 | |
|     //
 | |
|     // HDR
 | |
|     //
 | |
|     uint8_t mdb_type;
 | |
|     address_qualifier_t address_qualifier;
 | |
|     uint32_t address;
 | |
| 
 | |
|     //
 | |
|     // SV
 | |
|     //
 | |
| 
 | |
|     // if position_valid:
 | |
|     double lat;
 | |
|     double lon;
 | |
| 
 | |
|     altitude_type_t altitude_type;
 | |
|     int32_t altitude; // in feet
 | |
|     
 | |
|     uint8_t nic;
 | |
| 
 | |
|     airground_state_t airground_state;
 | |
| 
 | |
|     // if ns_vel_valid:
 | |
|     int16_t ns_vel; // in kts
 | |
|     // if ew_vel_valid:
 | |
|     int16_t ew_vel; // in kts
 | |
|     
 | |
|     track_type_t track_type;
 | |
|     uint16_t track;
 | |
| 
 | |
|     // if speed_valid:
 | |
|     uint16_t speed; // in kts
 | |
| 
 | |
|     altitude_type_t vert_rate_source;
 | |
|     int16_t vert_rate; // in ft/min
 | |
| 
 | |
|     // if lengthwidth_valid:
 | |
|     double length; // in meters (just to be different)
 | |
|     double width;  // in meters (just to be different)
 | |
|     int position_offset : 1;  // true if Position Offset Applied
 | |
| 
 | |
|     int utc_coupled : 1;      // true if UTC Coupled flag is set (ADS-B)
 | |
|     uint8_t tisb_site_id;     // TIS-B site ID, or zero in ADS-B messages
 | |
|     
 | |
|     //
 | |
|     // MS
 | |
|     //
 | |
| 
 | |
|     uint8_t emitter_category;
 | |
|     callsign_type_t callsign_type;
 | |
|     char callsign[9];
 | |
|     uint8_t emergency_status;
 | |
|     uint8_t uat_version;
 | |
|     uint8_t sil;
 | |
|     uint8_t transmit_mso;
 | |
|     uint8_t nac_p;
 | |
|     uint8_t nac_v;
 | |
|     uint8_t nic_baro;
 | |
|   
 | |
|     // capabilities:
 | |
|     int has_cdti : 1;
 | |
|     int has_acas : 1;    
 | |
|     // operational modes:
 | |
|     int acas_ra_active : 1;
 | |
|     int ident_active : 1;
 | |
|     int atc_services : 1;
 | |
| 
 | |
|     heading_type_t heading_type;
 | |
| 
 | |
|     //
 | |
|     // AUXSV
 | |
| 
 | |
|     altitude_type_t sec_altitude_type;
 | |
|     int32_t sec_altitude; // in feet
 | |
| };
 | |
| 
 | |
| //
 | |
| // Decode/display prototypes
 | |
| //
 | |
| 
 | |
| void uat_decode_adsb_mdb(uint8_t *frame, struct uat_adsb_mdb *mdb);
 | |
| void uat_display_adsb_mdb(const struct uat_adsb_mdb *mdb, FILE *to);
 | |
| 
 | |
| //
 | |
| // UPLINK 
 | |
| //
 | |
| 
 | |
| // assume 6 byte frames: 2 header bytes, 4 byte payload
 | |
| // (TIS-B heartbeat with one address, or empty FIS-B APDU)
 | |
| #define UPLINK_MAX_INFO_FRAMES (424/6)
 | |
| 
 | |
| struct fisb_apdu {
 | |
|     int a_flag : 1;
 | |
|     int g_flag : 1;
 | |
|     int p_flag : 1;
 | |
|     int s_flag : 1;
 | |
|     int monthday_valid : 1;
 | |
|     int seconds_valid : 1;
 | |
| 
 | |
|     uint16_t product_id;
 | |
|     uint8_t month;   // if monthday_valid
 | |
|     uint8_t day;     // if monthday_valid
 | |
|     uint8_t hours;
 | |
|     uint8_t minutes;
 | |
|     uint8_t seconds; // if seconds_valid
 | |
| 
 | |
|     uint16_t length;
 | |
|     uint8_t *data;
 | |
| };
 | |
| 
 | |
| struct uat_uplink_info_frame {
 | |
|     int is_fisb : 1;
 | |
| 
 | |
|     uint16_t length;
 | |
|     uint8_t type;
 | |
|     uint8_t *data; // points within the containing appdata
 | |
| 
 | |
|     // if is_fisb:
 | |
|     struct fisb_apdu fisb;
 | |
| };
 | |
| 
 | |
| struct uat_uplink_mdb {
 | |
|     int position_valid : 1;
 | |
|     int utc_coupled : 1;
 | |
|     int app_data_valid : 1;
 | |
| 
 | |
|     // if position_valid:
 | |
|     double lat;
 | |
|     double lon;
 | |
| 
 | |
|     uint8_t slot_id;
 | |
|     uint8_t tisb_site_id;
 | |
| 
 | |
|     // if app_data_valid:
 | |
|     uint8_t app_data[424];
 | |
|     unsigned num_info_frames;
 | |
|     struct uat_uplink_info_frame info_frames[UPLINK_MAX_INFO_FRAMES];    
 | |
| };
 | |
| 
 | |
| void uat_decode_uplink_mdb(uint8_t *frame, struct uat_uplink_mdb *mdb);
 | |
| void uat_display_uplink_mdb(const struct uat_uplink_mdb *mdb, FILE *to);
 | |
| 
 | |
| #endif
 |