from sqlalchemy.sql import func from .beacon import Beacon from ogn_python import db class AircraftBeacon(Beacon): __tablename__ = "aircraft_beacons" # Flarm specific data address_type = db.Column(db.SmallInteger) aircraft_type = db.Column(db.SmallInteger) stealth = db.Column(db.Boolean) address = db.Column(db.String) climb_rate = db.Column(db.Float(precision=2)) turn_rate = db.Column(db.Float(precision=2)) signal_quality = db.Column(db.Float(precision=2)) error_count = db.Column(db.SmallInteger) frequency_offset = db.Column(db.Float(precision=2)) gps_quality_horizontal = db.Column(db.SmallInteger) gps_quality_vertical = db.Column(db.SmallInteger) software_version = db.Column(db.Float(precision=2)) hardware_version = db.Column(db.SmallInteger) real_address = db.Column(db.String(6)) signal_power = db.Column(db.Float(precision=2)) proximity = None # Calculated values distance = db.Column(db.Float(precision=2)) radial = db.Column(db.SmallInteger) quality = db.Column(db.Float(precision=2)) # signal quality normalized to 10km location_mgrs = db.Column(db.String(15)) # full mgrs (15 chars) location_mgrs_short = db.Column(db.String(9)) # reduced mgrs (9 chars), e.g. used for melissas range tool agl = db.Column(db.Float(precision=2)) # Relations receiver_id = db.Column(db.Integer, db.ForeignKey('receivers.id', ondelete='SET NULL')) receiver = db.relationship('Receiver', foreign_keys=[receiver_id], backref='aircraft_beacons') device_id = db.Column(db.Integer, db.ForeignKey('devices.id', ondelete='SET NULL')) device = db.relationship('Device', foreign_keys=[device_id], backref='aircraft_beacons') # Multi-column indices db.Index('ix_aircraft_beacons_receiver_id_distance', 'receiver_id', 'distance') db.Index('ix_aircraft_beacons_device_id_timestamp', 'device_id', 'timestamp') def __repr__(self): return "" % ( self.address_type, self.aircraft_type, self.stealth, self.address, self.climb_rate, self.turn_rate, self.signal_quality, self.error_count, self.frequency_offset, self.gps_quality_horizontal, self.gps_quality_vertical, self.software_version, self.hardware_version, self.real_address, self.signal_power, self.distance, self.radial, self.quality, self.location_mgrs, self.location_mgrs_short) @classmethod def get_columns(self): return ['location', 'altitude', 'name', 'dstcall', 'relay', 'receiver_name', 'timestamp', 'track', 'ground_speed', #'raw_message', #'reference_timestamp', 'address_type', 'aircraft_type', 'stealth', 'address', 'climb_rate', 'turn_rate', 'signal_quality', 'error_count', 'frequency_offset', 'gps_quality_horizontal', 'gps_quality_vertical', 'software_version', 'hardware_version', 'real_address', 'signal_power', 'distance', 'radial', 'quality', 'location_mgrs', 'location_mgrs_short'] def get_values(self): return [ self.location_wkt, int(self.altitude) if self.altitude else None, self.name, self.dstcall, self.relay, self.receiver_name, self.timestamp, self.track, self.ground_speed, #self.raw_message, #self.reference_timestamp, self.address_type, self.aircraft_type, self.stealth, self.address, self.climb_rate, self.turn_rate, self.signal_quality, self.error_count, self.frequency_offset, self.gps_quality_horizontal, self.gps_quality_vertical, self.software_version, self.hardware_version, self.real_address, self.signal_power, self.distance, self.radial, self.quality, self.location_mgrs, self.location_mgrs_short] db.Index('ix_aircraft_beacons_date_device_id_address', func.date(AircraftBeacon.timestamp), AircraftBeacon.device_id, AircraftBeacon.address) db.Index('ix_aircraft_beacons_date_receiver_id_distance', func.date(AircraftBeacon.timestamp), AircraftBeacon.receiver_id, AircraftBeacon.distance)