kopia lustrzana https://github.com/glidernet/ogn-python
commit
ce692e4194
16
README.md
16
README.md
|
@ -55,12 +55,14 @@ available commands:
|
|||
|
||||
[db]
|
||||
init Initialize the database.
|
||||
updateddb Update the ddb data.
|
||||
update_ddb_file Update devices with data from local file.
|
||||
update_ddb_ogn Update devices with data from ogn.
|
||||
|
||||
[gateway]
|
||||
run Run the aprs client.
|
||||
|
||||
[logbook]
|
||||
compute Compute takeoffs and landings.
|
||||
show Show a logbook for <airport_name> located at given position.
|
||||
|
||||
[show.receiver]
|
||||
|
@ -78,17 +80,17 @@ The task server must be running for `db.updateddb`.
|
|||
- [x] Document/Improve cli commands
|
||||
- [ ] Separate settings from module (currently at ogn/command/dbutils.py)
|
||||
- [ ] Enable granular data acquisition (eg. store receiver beacons only)
|
||||
- [ ] Future Database-Migrations: Use Alembic?
|
||||
- [ ] Rename 'Flarm' to 'Device'?
|
||||
- [ ] Rename self.heared\_aircraft\_IDs (lowercase) in aircraft\_beacon
|
||||
- [ ] Rename self.heared\_aircraft\_IDs
|
||||
- [ ] Fix command/logbook.py (@Meisterschueler?)
|
||||
- [x] Future Database-Migrations: Use Alembic?
|
||||
- [x] Rename 'Flarm' to 'Device'?
|
||||
- [x] Rename self.heared\_aircraft\_IDs (lowercase) in aircraft\_beacon
|
||||
- [x] Rename self.heared\_aircraft\_IDs
|
||||
- [x] Fix command/logbook.py (@Meisterschueler?)
|
||||
- [ ] Introduce scheduled tasks with 'celery beat' (eg. updateddb)
|
||||
|
||||
### Scheduled tasks
|
||||
- ogn.collect.fetchddb (generate Flarm table)
|
||||
- ogn.collect.receiver (generate Receiver table)
|
||||
- ogn.collect.logbook (generate TaoffLanding table)
|
||||
- ogn.collect.logbook (generate TakeoffLanding table)
|
||||
|
||||
## How to use virtualenv
|
||||
```
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
"""logbook changes
|
||||
|
||||
Revision ID: 2c7144443d8
|
||||
Revises: 104107d119d
|
||||
Create Date: 2015-11-27 22:05:31.417449
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '2c7144443d8'
|
||||
down_revision = '104107d119d'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.alter_column('aircraft_beacon', 'real_id', new_column_name='real_address')
|
||||
op.add_column('aircraft_beacon', sa.Column('flight_state', sa.SmallInteger))
|
||||
op.create_index('ix_aircraft_beacon_flight_state', 'aircraft_beacon', ['flight_state'])
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.alter_column('aircraft_beacon', 'real_address', new_column_name='real_id')
|
||||
op.drop_column('aircraft_beacon', 'flight_state')
|
||||
op.drop_index('ix_aircraft_beacon_flight_state', 'aircraft_beacon')
|
|
@ -3,9 +3,8 @@ from __future__ import absolute_import
|
|||
from celery.utils.log import get_task_logger
|
||||
from ogn.collect.celery import app
|
||||
|
||||
from ogn.model import Device
|
||||
from ogn.model import AddressOrigin, Device
|
||||
from ogn.utils import get_ddb
|
||||
from ogn.model.address_origin import AddressOrigin
|
||||
|
||||
logger = get_task_logger(__name__)
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ class AircraftBeacon(Beacon):
|
|||
|
||||
software_version = Column(Float)
|
||||
hardware_version = Column(SmallInteger)
|
||||
real_id = Column(String(6))
|
||||
real_address = Column(String(6))
|
||||
|
||||
flightlevel = Column(Float)
|
||||
|
||||
|
@ -33,6 +33,8 @@ class AircraftBeacon(Beacon):
|
|||
theta = Column(Float)
|
||||
phi = Column(Float)
|
||||
|
||||
flight_state = Column(SmallInteger)
|
||||
|
||||
# Pattern
|
||||
address_pattern = re.compile(r"id(\S{2})(\S{6})")
|
||||
climb_rate_pattern = re.compile(r"([\+\-]\d+)fpm")
|
||||
|
@ -40,18 +42,18 @@ class AircraftBeacon(Beacon):
|
|||
signal_strength_pattern = re.compile(r"(\d+\.\d+)dB")
|
||||
error_count_pattern = re.compile(r"(\d+)e")
|
||||
coordinates_extension_pattern = re.compile(r"\!W(.)(.)!")
|
||||
hear_ID_pattern = re.compile(r"hear(\w{4})")
|
||||
hear_address_pattern = re.compile(r"hear(\w{4})")
|
||||
frequency_offset_pattern = re.compile(r"([\+\-]\d+\.\d+)kHz")
|
||||
gps_status_pattern = re.compile(r"gps(\d+x\d+)")
|
||||
|
||||
software_version_pattern = re.compile(r"s(\d+\.\d+)")
|
||||
hardware_version_pattern = re.compile(r"h(\d+)")
|
||||
real_id_pattern = re.compile(r"r(\w{6})")
|
||||
real_address_pattern = re.compile(r"r(\w{6})")
|
||||
|
||||
flightlevel_pattern = re.compile(r"FL(\d{3}\.\d{2})")
|
||||
|
||||
def __init__(self, beacon=None):
|
||||
self.heared_aircraft_IDs = list()
|
||||
self.heared_aircraft_addresses = list()
|
||||
|
||||
if beacon is not None:
|
||||
self.name = beacon.name
|
||||
|
@ -77,13 +79,13 @@ class AircraftBeacon(Beacon):
|
|||
signal_strength_match = self.signal_strength_pattern.match(part)
|
||||
error_count_match = self.error_count_pattern.match(part)
|
||||
coordinates_extension_match = self.coordinates_extension_pattern.match(part)
|
||||
hear_ID_match = self.hear_ID_pattern.match(part)
|
||||
hear_address_match = self.hear_address_pattern.match(part)
|
||||
frequency_offset_match = self.frequency_offset_pattern.match(part)
|
||||
gps_status_match = self.gps_status_pattern.match(part)
|
||||
|
||||
software_version_match = self.software_version_pattern.match(part)
|
||||
hardware_version_match = self.hardware_version_pattern.match(part)
|
||||
real_id_match = self.real_id_pattern.match(part)
|
||||
real_address_match = self.real_address_pattern.match(part)
|
||||
|
||||
flightlevel_match = self.flightlevel_pattern.match(part)
|
||||
|
||||
|
@ -111,8 +113,8 @@ class AircraftBeacon(Beacon):
|
|||
|
||||
self.latitude = self.latitude + dlat
|
||||
self.longitude = self.longitude + dlon
|
||||
elif hear_ID_match is not None:
|
||||
self.heared_aircraft_IDs.append(hear_ID_match.group(1))
|
||||
elif hear_address_match is not None:
|
||||
self.heared_aircraft_addresses.append(hear_address_match.group(1))
|
||||
elif frequency_offset_match is not None:
|
||||
self.frequency_offset = float(frequency_offset_match.group(1))
|
||||
elif gps_status_match is not None:
|
||||
|
@ -122,8 +124,8 @@ class AircraftBeacon(Beacon):
|
|||
self.software_version = float(software_version_match.group(1))
|
||||
elif hardware_version_match is not None:
|
||||
self.hardware_version = int(hardware_version_match.group(1))
|
||||
elif real_id_match is not None:
|
||||
self.real_id = real_id_match.group(1)
|
||||
elif real_address_match is not None:
|
||||
self.real_address = real_address_match.group(1)
|
||||
|
||||
elif flightlevel_match is not None:
|
||||
self.flightlevel = float(flightlevel_match.group(1))
|
||||
|
|
|
@ -24,10 +24,10 @@ class TestStringMethods(unittest.TestCase):
|
|||
self.assertEqual(aircraft_beacon.frequency_offset, 51.2)
|
||||
self.assertEqual(aircraft_beacon.gps_status, '4x5')
|
||||
|
||||
self.assertEqual(len(aircraft_beacon.heared_aircraft_IDs), 3)
|
||||
self.assertEqual(aircraft_beacon.heared_aircraft_IDs[0], '1084')
|
||||
self.assertEqual(aircraft_beacon.heared_aircraft_IDs[1], 'B597')
|
||||
self.assertEqual(aircraft_beacon.heared_aircraft_IDs[2], 'B598')
|
||||
self.assertEqual(len(aircraft_beacon.heared_aircraft_addresses), 3)
|
||||
self.assertEqual(aircraft_beacon.heared_aircraft_addresses[0], '1084')
|
||||
self.assertEqual(aircraft_beacon.heared_aircraft_addresses[1], 'B597')
|
||||
self.assertEqual(aircraft_beacon.heared_aircraft_addresses[2], 'B598')
|
||||
|
||||
def test_stealth(self):
|
||||
aircraft_beacon = AircraftBeacon()
|
||||
|
@ -45,7 +45,7 @@ class TestStringMethods(unittest.TestCase):
|
|||
self.assertEqual(aircraft_beacon.longitude, 6 / 1000 / 60)
|
||||
self.assertEqual(aircraft_beacon.software_version, 6.02)
|
||||
self.assertEqual(aircraft_beacon.hardware_version, 44)
|
||||
self.assertEqual(aircraft_beacon.real_id, "DF0C56")
|
||||
self.assertEqual(aircraft_beacon.real_address, "DF0C56")
|
||||
|
||||
def test_v024_ogn_tracker(self):
|
||||
aircraft_beacon = AircraftBeacon()
|
||||
|
|
Ładowanie…
Reference in New Issue