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