Merge branch 'pr/refactoring2' into 'master'

schedule_single_station.py: 2nd refactoring round

See merge request librespacefoundation/satnogs/satnogs-auto-scheduler!56
merge-requests/56/merge
Fabian P. Schmidt 2019-11-05 15:01:31 +00:00
commit 45da60d876
3 changed files with 78 additions and 47 deletions

View File

@ -36,6 +36,17 @@ def overlap(satpass, scheduledpasses, wait_time_seconds):
return overlap
def create_observer(lat, lon, alt, min_riseset=0.0):
'''
Create an observer instance.
'''
observer = ephem.Observer()
observer.lat = str(lat)
observer.lon = str(lon)
observer.elevation = alt
observer.horizon = str(min_riseset)
return observer
def find_passes(satellite,
observer,

View File

@ -1,16 +1,17 @@
#!/usr/bin/env python
from __future__ import division
import requests
import ephem
from datetime import datetime, timedelta
import os
import lxml.html
import argparse
import logging
from utils import read_priorities_transmitters, \
get_priority_passes
from auto_scheduler import Twolineelement, Satellite
from auto_scheduler.pass_predictor import find_passes
from utils import get_priority_passes, \
read_priorities_transmitters, \
satellites_from_transmitters, \
print_scheduledpass_summary
from auto_scheduler.pass_predictor import create_observer, \
find_passes
from auto_scheduler.schedulers import ordered_scheduler, \
report_efficiency
from cache import CacheManager
@ -163,12 +164,6 @@ def main():
settings.MAX_NORAD_CAT_ID)
cache.update()
# Set observer
observer = ephem.Observer()
observer.lon = str(ground_station['lng'])
observer.lat = str(ground_station['lat'])
observer.elevation = ground_station['altitude']
# Set minimum culmination elevation
if args.min_culmination is None:
min_culmination = ground_station['min_horizon']
@ -181,19 +176,25 @@ def main():
min_culmination = args.min_culmination
# Set minimum rise/set elevation
if args.min_riseset is None:
min_riseset = ground_station['min_horizon']
else:
if args.min_riseset < 0.0:
min_riseset = 0.0
elif args.min_riseset > 90.0:
min_riseset = 90.0
else:
min_riseset = args.min_riseset
# Use minimum altitude for computing rise and set times (horizon to horizon otherwise)
if not args.horizon:
observer.horizon = str(min_riseset)
# Use minimum altitude for computing rise and set times (horizon to horizon otherwise)
if args.min_riseset is None:
min_riseset = ground_station['min_horizon']
else:
if args.min_riseset < 0.0:
min_riseset = 0.0
elif args.min_riseset > 90.0:
min_riseset = 90.0
else:
min_riseset = args.min_riseset
else:
min_riseset = 0.0
# Set observer
observer = create_observer(ground_station['lat'],
ground_station['lng'],
ground_station['altitude'],
min_riseset=min_riseset)
# Minimum duration of a pass
min_pass_duration = settings.MIN_PASS_DURATION
@ -204,21 +205,13 @@ def main():
# Read transmitters
transmitters = cache.read_transmitters()
# Extract satellites from receivable transmitters
satellites = []
for transmitter in transmitters:
for tle in tles:
if tle['norad_cat_id'] == transmitter['norad_cat_id']:
satellites.append(Satellite(Twolineelement(*tle['lines']),
transmitter['uuid'],
transmitter['success_rate'],
transmitter['good_count'],
transmitter['data_count'],
transmitter['mode']))
# Extract interesting satellites from receivable transmitters
satellites = satellites_from_transmitters(transmitters, tles)
# Find passes
passes = []
logging.info('Finding all passes for %s satellites:' % len(satellites))
# Loop over satellites
for satellite in tqdm(satellites):
passes.extend(find_passes(satellite,
@ -255,21 +248,10 @@ def main():
# Find unique objects
satids = sorted(set([satpass['id'] for satpass in passes]))
schedule_needed = False
logging.info("GS | Sch | NORAD | Start time | End time | El | " +
"Priority | Transmitter UUID | Mode | Satellite name ")
for satpass in sorted(scheduledpasses, key=lambda satpass: satpass['tr']):
logging.info(
"%3d | %3.d | %05d | %s | %s | %3.0f | %4.6f | %s | %-10s | %s" %
(ground_station_id, satpass['scheduled'], int(
satpass['id']), satpass['tr'].strftime("%Y-%m-%dT%H:%M:%S"),
satpass['ts'].strftime("%Y-%m-%dT%H:%M:%S"), float(satpass['altt']) if satpass['altt']
else 0., satpass['priority'], satpass['uuid'], satpass['mode'], satpass['name'].rstrip()))
if not satpass['scheduled']:
schedule_needed = True
print_scheduledpass_summary(scheduledpasses, ground_station_id, printer=logging.info)
# Login and schedule passes
schedule_needed = any([satpass['scheduled'] for satpass in scheduledpasses])
if schedule and schedule_needed:
loginUrl = '{}/accounts/login/'.format(settings.NETWORK_BASE_URL) # login URL
session = requests.session()

View File

@ -2,6 +2,8 @@ import logging
import settings
import os
from auto_scheduler import Twolineelement, Satellite
def read_priorities_transmitters(filename):
# Priorities and favorite transmitters
@ -55,3 +57,39 @@ def get_priority_passes(passes, priorities, favorite_transmitters, only_priority
if satpass['priority'] >= min_priority:
normal.append(satpass)
return (priority, normal)
def satellites_from_transmitters(transmitters, tles):
'''
Extract interesting satellites from receivable transmitters
'''
satellites = []
for transmitter in transmitters:
for tle in tles:
if tle['norad_cat_id'] == transmitter['norad_cat_id']:
satellites.append(Satellite(Twolineelement(*tle['lines']),
transmitter['uuid'],
transmitter['success_rate'],
transmitter['good_count'],
transmitter['data_count'],
transmitter['mode']))
return satellites
def print_scheduledpass_summary(scheduledpasses, ground_station_id, printer=print):
printer("GS | Sch | NORAD | Start time | End time | El | " +
"Priority | Transmitter UUID | Mode | Satellite name ")
for satpass in sorted(scheduledpasses, key=lambda satpass: satpass['tr']):
printer(
"%3d | %3.d | %05d | %s | %s | %3.0f | %4.6f | %s | %-10s | %s"%(
ground_station_id,
satpass['scheduled'],
int(satpass['id']),
satpass['tr'].strftime("%Y-%m-%dT%H:%M:%S"),
satpass['ts'].strftime("%Y-%m-%dT%H:%M:%S"),
float(satpass['altt']) if satpass['altt'] else 0.,
satpass.get('priority', 0.0),
satpass.get('uuid', ''),
satpass.get('mode', ''),
satpass['name'].rstrip()))