def test_route_optimize():
    
    from fplan.config.environment import load_environment
    from fplan.model import meta
    from fplan.model import Waypoint,Route,Trip,User,Aircraft
    import sqlalchemy as sa

    from pylons import config
     
    # meta.Session.query(User).filter(User.user==u'testuser')
    
    u=User(u'testuser',u'password')
    meta.Session.add(u)
    meta.Session.flush();
    ac=Aircraft(u'testuser',u'eurocub')
    ac.adv_cruise_speed=    (75,75,75,76,76, 75,74,73,72,71)
    ac.adv_climb_speed=     (60,60,60,60,61, 61,61,62,63,64)
    ac.adv_descent_speed=   (80,80,81,81,82, 82,83,84,85,86)
    ac.adv_climb_rate=      (750,700,650,600,550,  500,450,300,200,000)
    ac.adv_descent_rate=    (500,500,500,500,525,  525,550,550,575,600)
    ac.adv_cruise_burn=     (16,16,16,16,15.5, 15.25,15.0,14.75,14.5,14.0)
    ac.adv_climb_burn=      (20,20,20,20,19, 19,18,17,15,14.0)
    ac.adv_descent_burn=    (14,14,14,14,14, 14,14,14,14,13.5)
    ac.advanced_model=True
    
    meta.Session.add(ac)
    meta.Session.flush();
    trip=Trip(u"testuser",u"mytrip",u'eurocub')
    meta.Session.add(trip)
    meta.Session.flush();
    wp1=Waypoint(u'testuser',u'mytrip','56,14',0,100,u'bromma')
    wp2=Waypoint(u'testuser',u'mytrip','58,14',1,101,u'arlanda')
    wp3=Waypoint(u'testuser',u'mytrip','59,14',2,102,u'gävle')
    wp4=Waypoint(u'testuser',u'mytrip','60,14',3,103,u'norr')
    wp5=Waypoint(u'testuser',u'mytrip','60.01,14',4,104,u'norr2')
    meta.Session.add(wp1)
    meta.Session.add(wp2)
    meta.Session.add(wp3)
    meta.Session.add(wp4)
    meta.Session.add(wp5)
    meta.Session.flush();
    rt1=Route(u'testuser',u'mytrip',0,1)
    rt1.altitude="0"
    rt2=Route(u'testuser',u'mytrip',1,2)
    rt2.altitude="0"
    rt3=Route(u'testuser',u'mytrip',2,3)
    rt3.altitude="0"
    rt4=Route(u'testuser',u'mytrip',3,4)
    rt4.altitude="0"
    for s in [wp1,wp2,wp3,wp4,rt1,rt2,rt3,rt4]:
        meta.Session.add(s)
    meta.Session.flush()    
    tripobj=meta.Session.query(Trip).filter(sa.and_(
            Trip.user==u'testuser',Trip.trip==u'mytrip')).one()
    print "Got tripobj",tripobj
    class Temp(object): pass
    res,routes=calc.get_optimized(u'testuser',u'mytrip','fuel')
    print [r.altitude for r in routes]
Esempio n. 2
0
    def upload_track(self):
        print "In upload", request.params.get("gpstrack", None)
        if 'asplan' in request.params:
            t = request.params.get("gpstrack", None)
            orderint = 0
            curid = 100
            tripsharing.cancel()
            tripname, waypoints = parse_gpx_fplan(t.value)
            tripname = self.get_free_tripname(tripname)
            trip = Trip(tripuser(), tripname)
            meta.Session.add(trip)
            meta.Session.flush()
            out = []
            for waypoint in waypoints:
                name = waypoint['name']
                pos = waypoint['pos']
                alt = waypoint['alt']
                waypoint = Waypoint(tripuser(), trip.trip, pos, curid,
                                    orderint, name, alt)
                meta.Session.add(waypoint)
                out.append(waypoint)
                orderint += 1
                curid += 1
            for w1, w2 in zip(out, out[1:]):
                r = Route(tripuser(),
                          trip.trip,
                          w1.id,
                          w2.id,
                          altitude=str(w2.altitude))
                meta.Session.add(r)
            acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.user == tripuser())).all()
            if len(acs):
                trip.aircraft = acs[0].aircraft

            session['current_trip'] = tripname
            session.save()
            meta.Session.commit()
            redirect(
                h.url_for(controller='mapview', action="zoom", zoom='auto'))
            return
        t = request.params.get("gpstrack", None)
        if t != None:
            if len(t.value) > 30000000:
                redirect(
                    h.url_for(controller='error',
                              action="document",
                              message="GPX file is too large."))
            session['showtrack'] = parse_gpx(t.value,
                                             request.params.get('start'),
                                             request.params.get('end'))
            session['showarea'] = ''
            session['showarea_id'] = ''
            session.save()
        redirect(h.url_for(controller='mapview', action="zoom", zoom='auto'))
Esempio n. 3
0
def get_user_trips(user):
    users = meta.Session.query(User).filter(User.user == user).all()
    if len(users) == 0:
        return []
    user, = users

    trips = meta.Session.query(Trip).filter(
        sa.and_(Trip.user == user.user)).order_by(Trip.trip).all()
    out = []
    for trip in trips:
        meta.Session.flush()
        try:
            #print "Processing trip",trip.trip
            tripobj = dict()
            tripobj['name'] = trip.trip
            tripobj['aircraft'] = trip.aircraft

            actypes = list(
                meta.Session.query(Aircraft).filter(
                    Aircraft.aircraft == trip.aircraft).all())
            if len(actypes) == 0:
                tripobj['atsradiotype'] = '?'
            else:
                tripobj['atsradiotype'] = actypes[0].atsradiotype

            waypoints = []

            def eitherf(x, fallback):
                try:
                    if x == None: return fallback
                    return float(x)
                except Exception:
                    return 0.0

            def da(x):
                try:
                    if x == None: return datetime(1970, 1, 1)
                    if type(x) == datetime: return x
                    return datetime(1970, 1, 1)
                except Exception:
                    return datetime(1970, 1, 1)

            def f(x):
                try:
                    if x == None: return 0.0
                    return float(x)
                except Exception:
                    return 0.0

            def i(x):
                try:
                    if x == None: return 0
                    return int(x)
                except Exception:
                    return 0

            def s(x):
                try:
                    if x == None: return ""
                    if type(x) == unicode: return x
                    return unicode(x, 'utf8')
                except Exception:
                    return ""

            def add_wp(name, pos, startalt, endalt, winddir, windvel, gs, what,
                       legpart, lastsub, d, tas, land_at_end, endfuel,
                       fuelburn, depart_dt, arrive_dt, altitude):
                assert depart_dt == None or type(depart_dt) == datetime
                assert type(pos[0]) in [float, int]
                assert type(pos[1]) in [float, int]
                d = dict(lat=pos[0],
                         lon=pos[1],
                         name=name,
                         startalt=f(startalt),
                         endalt=f(endalt),
                         winddir=f(winddir),
                         windvel=f(windvel),
                         gs=eitherf(gs, 75),
                         what=s(what),
                         legpart=s(legpart),
                         lastsub=i(lastsub),
                         d=f(d),
                         tas=eitherf(tas, 75),
                         land_at_end=i(land_at_end),
                         endfuel=f(endfuel),
                         fuelburn=f(fuelburn),
                         depart_dt=da(depart_dt),
                         arrive_dt=da(arrive_dt),
                         altitude=s(altitude))
                waypoints.append(d)

            try:

                rts, dummy = calc_route_info.get_route(user.user, trip.trip)
            except Exception:
                print traceback.format_exc()
                wpy = list(
                    meta.Session.query(Waypoint).filter(
                        sa.and_(Waypoint.user == user.user,
                                Waypoint.trip == trip.trip)).order_by(
                                    Waypoint.ordering).all())

                rts = []
                for wp1, wp2 in zip(wpy, wpy[1:]):
                    trts = meta.Session.query(Route).filter(
                        sa.and_(Route.user == user.user,
                                Route.trip == trip.trip,
                                Route.waypoint1 == wp1.id,
                                Route.waypoint2 == wp2.id)).all()
                    dummy, d = mapper.bearing_and_distance(wp1.pos, wp2.pos)
                    if len(trts) == 0:
                        rts.append(
                            Route(user=user.user,
                                  trip=trip.trip,
                                  waypoint1=wp1.id,
                                  waypoint2=wp2.id,
                                  winddir=None,
                                  windvel=None,
                                  tas=None,
                                  variation=None,
                                  altitude="1500"))
                    else:
                        rts.append(trts[0])

                if len(rts):
                    rt0 = rts[0]
                    add_wp(rt0.a.waypoint, mapper.from_str(rt0.a.pos), 1500,
                           1500, rt0.winddir, rt0.windvel, 0, "start", "start",
                           1, 0, rt0.tas, False, 0, 0, None, None,
                           rt0.altitude)
                    del rt0
                    for rt in rts:
                        land_at_end = not not (rt.b.stay)
                        #print "Land at end of leg:",rt.b.waypoint,":",land_at_end
                        dummy, d = mapper.bearing_and_distance(
                            rt.a.pos, rt.b.pos)
                        add_wp(rt.a.waypoint, mapper.from_str(rt.a.pos), 1500,
                               1500, rt.winddir, rt.windvel, 0, "cruise",
                               "mid", 1, d, rt.tas, land_at_end, 0, 0, None,
                               None, rt.altitude)

            else:
                if len(rts):
                    rt0 = rts[0]
                    try:
                        startfuel = rt0.accum_fuel_left + rt0.fuel_burn
                    except Exception:
                        startfuel = None
                    print "Startfuel:", startfuel
                    add_wp(rt0.a.waypoint, rt0.startpos, rt0.startalt,
                           rt0.endalt, rt0.winddir, rt0.windvel, rt0.gs,
                           "start", "start", 1, 0, rt0.tas, False, startfuel,
                           0, rt0.depart_dt, rt0.depart_dt, rt0.altitude)
                    del rt0
                    for rt in rts:
                        land_at_end = not not (rt.b.stay and rt.lastsub)
                        #print "Land at end of leg:",rt.b.waypoint,":",land_at_end
                        add_wp(rt.b.waypoint, rt.endpos, rt.startalt,
                               rt.endalt, rt.winddir, rt.windvel, rt.gs,
                               rt.what, rt.legpart, rt.lastsub, rt.d, rt.tas,
                               land_at_end, rt.accum_fuel_left, rt.fuel_burn,
                               rt.depart_dt, rt.arrive_dt, rt.altitude)

            tripobj['waypoints'] = waypoints
        except Exception:
            print "While processing trip", trip.trip, ":", traceback.format_exc(
            )
            continue
        out.append(tripobj)
    return out
Esempio n. 4
0
    def trip_actions(self):
        #print "trip actions:",request.params

        if request.params.get('addtripname', None):
            tripsharing.cancel()
            tripname = self.get_free_tripname(request.params['addtripname'])
            trip = Trip(tripuser(), tripname)
            acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.user == tripuser())).all()
            if len(acs):
                trip.aircraft = acs[0].aircraft

            print "Adding trip:", trip
            meta.Session.add(trip)
            session['current_trip'] = tripname
            session.save()
        if request.params.get('opentripname', None):
            tripsharing.cancel()
            tripname = request.params['opentripname']
            if meta.Session.query(Trip).filter(
                    sa.and_(Trip.user == tripuser(),
                            Trip.trip == tripname)).count():
                session['current_trip'] = tripname
                session.save()
        if request.params.get('reversetripname', None):
            tripsharing.cancel()
            username = tripuser()
            print "Reversing"
            tripname = request.params['reversetripname']
            wps = list(
                meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == username,
                            Waypoint.trip == tripname)).order_by(
                                Waypoint.ordering).all())
            if len(wps):
                maxord = max([wp.ordering for wp in wps])
                for wp in wps:
                    wp.ordering = maxord + 1 - wp.ordering
                    print "Reversed order of", wp.waypoint, " = ", wp.ordering
                    meta.Session.add(wp)
                firststays = meta.Session.query(Stay).filter(
                    sa.and_(Stay.user == username, Stay.trip == tripname,
                            Stay.waypoint_id == wps[0].id)).all()
                if len(firststays) == 1:
                    stay, = firststays
                    stay.waypoint_id = wps[-1].id

        if request.params.get('copytripname', None):
            tripsharing.cancel()
            tripobj = meta.Session.query(Trip).filter(
                sa.and_(Trip.user == tripuser(),
                        Trip.trip == request.params['copytripname'])).first()
            newtripname = self.get_free_tripname(tripobj.trip + "(copy)")
            trip = Trip(tripuser(), newtripname)
            meta.Session.add(trip)
            acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.user == tripuser(),
                        Aircraft.aircraft == tripobj.aircraft)).all()
            if len(acs):
                trip.aircraft = acs[0].aircraft

            for origwp in meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == tripuser(),
                            Waypoint.trip == tripobj.trip)).all():
                wp = Waypoint(user=origwp.user,
                              trip=newtripname,
                              pos=origwp.pos,
                              id_=origwp.id,
                              ordering=origwp.ordering,
                              waypoint=origwp.waypoint,
                              altitude=origwp.altitude)
                meta.Session.add(wp)
            for origrt in meta.Session.query(Route).filter(
                    sa.and_(Route.user == tripuser(),
                            Route.trip == tripobj.trip)).all():
                rt = Route(user=origrt.user,
                           trip=newtripname,
                           waypoint1=origrt.waypoint1,
                           waypoint2=origrt.waypoint2,
                           tas=origrt.tas,
                           winddir=origrt.winddir,
                           windvel=origrt.windvel,
                           variation=origrt.variation)
                meta.Session.add(rt)
            for origstay in meta.Session.query(Stay).filter(
                    sa.and_(Stay.user == tripuser(),
                            Stay.trip == tripobj.trip)).all():
                stay = Stay(user=origstay.user,
                            trip=newtripname,
                            waypoint_id=origstay.waypoint_id,
                            fuel=origstay.fuel,
                            date_of_flight=origstay.date_of_flight,
                            departure_time=origstay.departure_time,
                            nr_persons=origstay.nr_persons,
                            fueladjust=origstay.fueladjust)
                meta.Session.add(stay)
            print "Adding trip:", trip
            session['current_trip'] = newtripname
            session.save()

        if request.params.get('deletetripname',
                              None) and not tripsharing.sharing_active():
            meta.Session.query(Trip).filter(
                sa.and_(
                    Trip.user == tripuser(),
                    Trip.trip == request.params['deletetripname'])).delete()
            del session['current_trip']
            session.save()

        meta.Session.flush()
        meta.Session.commit()
        redirect(h.url_for(controller='mapview', action="index"))
Esempio n. 5
0
    def save(self):
        try:
            if 'pos' in request.params and 'zoomlevel' in request.params:
                save_merc_x, save_merc_y = [
                    int(x) for x in request.params['pos'].split(",")
                ]
                save_zoom = int(request.params['zoomlevel'])
                pos = mapper.merc2latlon((save_merc_x, save_merc_y), save_zoom)
                self.set_pos_zoom(pos, save_zoom)

            wps = self.get_waypoints(request.params)

            oldname = request.params.get('oldtripname', '')
            tripname = request.params.get('tripname', '')
            if tripsharing.sharing_active():
                #Can't rename trips while tripsharing is active!
                tripname = session['current_trip']
                if oldname != session['current_trip']:
                    #In some strange way a non-tripsharing oldname appeared in the post. This
                    #means that something has gone awry. Don't save!
                    print "Bad trip oldname while tripsharing active!"
                    return "notok"

            if 'showarea' in request.params and request.params['showarea']:
                sha = request.params['showarea']
                if (sha == '.'):
                    session['showarea'] = ''
                    session['showarea_id'] = ''
                    session['showtrack'] = None
                else:
                    session['showarea'] = sha
                    session['showarea_id'] = md5(
                        sha.encode('utf8')).hexdigest()
                    session['showtrack'] = None

            session['mapvariant'] = request.params.get('mapvariant',
                                                       'airspace')

            #print "Req:",request.params
            oldtrip = None
            if not oldname.strip():
                oldname = tripname
            oldtrips = meta.Session.query(Trip).filter(
                sa.and_(Trip.user == tripuser(), Trip.trip == oldname)).all()
            if len(oldtrips) == 1:
                oldtrip = oldtrips[0]
            if oldtrip:
                trip = oldtrip
                if trip.trip != tripname:
                    if tripsharing.sharing_active():
                        #attempt to rename someone elses trip! Can't be allowed! set tripname to old name
                        print "Attempt to rename trip while viewing shared trip (tripsharing)"
                        return "notok"
                    else:
                        trip.trip = self.get_free_tripname(tripname)
                if session[
                        'current_trip'] != trip.trip and tripsharing.sharing_active(
                        ):
                    #internal error if we get here - the earlier test for current_trip not changing failed.
                    print "Unexpected tripsharing error #2"
                    return "notok"

                session['current_trip'] = trip.trip
            else:
                if tripsharing.sharing_active():
                    #we use sharing, but the shared trip can't be found!
                    print "Tripsharing active, but named trip didn't exist (deleted, probably)"
                    return "notok"
                tripname = self.get_free_tripname(tripname)
                trip = Trip(tripuser(), tripname)
                acs = meta.Session.query(Aircraft).filter(
                    sa.and_(Aircraft.user == tripuser())).all()
                if len(acs):
                    trip.aircraft = acs[0].aircraft

                meta.Session.add(trip)
                session['current_trip'] = tripname

            oldwps = set([(wp.id)
                          for wp in meta.Session.query(Waypoint).filter(
                              sa.and_(Waypoint.user == tripuser(),
                                      Waypoint.trip == trip.trip)).all()])

            newwps = set(wps.keys())
            #print "NEW WPS",wps
            removed = oldwps.difference(newwps)
            added = newwps.difference(oldwps)
            updated = newwps.intersection(oldwps)

            print "Removed: ", removed

            addedwps = added
            removedwps = removed
            updatedwps = updated
            ordering2wpid = dict()
            for remord in removed:
                meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == tripuser(),
                            Waypoint.trip == trip.trip,
                            Waypoint.id == remord)).delete()
                #print "\n\n====DELETING!=====\n%s\n\n"%(rem,)
            resultant_by_order = dict()
            resultant_id2order = dict()
            waypointlink = dict()
            for add in added:
                wp = wps[add]
                waypoint = Waypoint(tripuser(), trip.trip, wp['pos'],
                                    int(wp['id']), int(wp['ordering']),
                                    wp['name'], wp['altitude'])
                resultant_by_order[int(wp['ordering'])] = waypoint
                resultant_id2order[int(wp['id'])] = wp['ordering']
                #print "\n\n====ADDING!=====\n%s %s %s\n\n"%(waypoint.id,waypoint.pos,waypoint.waypoint)
                meta.Session.add(waypoint)
            for upd in updated:
                wp = wps[upd]
                us = meta.Session.query(Waypoint).filter(
                    sa.and_(Waypoint.user == tripuser(),
                            Waypoint.trip == trip.trip,
                            Waypoint.id == upd)).all()
                if len(us) > 0:
                    u = us[0]
                    prevpos = mapper.from_str(u.pos)
                    newpos = mapper.from_str(wp['pos'])
                    approxdist = (prevpos[0] - newpos[0])**2 + (prevpos[1] -
                                                                newpos[1])**2
                    if approxdist > (
                            1.0 / 36000.0
                    )**2:  #if moved more than 0.1 arc-second, otherwise leave be.
                        u.pos = wp['pos']
                        print "Waypoint %d moved! (%f deg)" % (
                            u.id, math.sqrt(approxdist))
                    else:
                        print "Waypoint %d has only moved a little (%f deg)" % (
                            u.id, math.sqrt(approxdist))

                    u.waypoint = wp['name']
                    assert u.id == int(wp['id'])
                    u.ordering = wp['ordering']
                    u.altitude = wp['altitude']
                    resultant_by_order[int(wp['ordering'])] = u
                    resultant_id2order[int(wp['id'])] = wp['ordering']
                    #print "\n\n====UPDATING!=====\n%s %s %s\n\n"%(u.id,u.pos,u.waypoint)

            #print "Resultant by ordering: %s"%(resultant_by_order,)
            seq = list(sorted(resultant_by_order.items()))
            newroutes = set()
            for (ord1, waypoint1), (ord2, waypoint2) in zip(seq[:-1], seq[1:]):
                if not int(ord1) + 1 == int(ord2):
                    print "Waypoints %s and %s not consecutive (#%d, #%d)" % (
                        waypoint1, waypoint2, int(ord1), int(ord2))
                assert int(ord1) + 1 == int(ord2)
                newroutes.add((waypoint1.id, waypoint2.id))

            oldrouteobjs = list(
                meta.Session.query(Route).filter(
                    sa.and_(Route.user == tripuser(),
                            Route.trip == trip.trip)).all())
            oldroutes = set([(route.waypoint1, route.waypoint2)
                             for route in oldrouteobjs])
            prevalts = dict()
            for rt in oldrouteobjs:
                prevalts[(rt.a.id, +1)] = rt.altitude
                prevalts[(rt.b.id, -1)] = rt.altitude

            #Routes:
            removed = oldroutes.difference(newroutes)
            added = newroutes.difference(oldroutes)
            updated = newroutes.intersection(oldroutes)
            print "Removed routes:", removed
            print "Added routes:", added
            print "Kept routes: ", updated
            for rem1, rem2 in removed:
                meta.Session.query(Route).filter(
                    sa.and_(Route.user == tripuser(), Route.trip == trip.trip,
                            Route.waypoint1 == rem1,
                            Route.waypoint2 == rem2)).delete()
            sel_acs = meta.Session.query(Aircraft).filter(
                sa.and_(Aircraft.aircraft == trip.aircraft,
                        Aircraft.user == tripuser())).all()
            if len(sel_acs):
                tas = sel_acs[0].cruise_speed
            else:
                tas = 75
            for a1, a2 in added:
                cruisealt = ""
                a = None
                if a1 in addedwps:
                    startord = resultant_id2order.get(int(a1), 0)
                elif a2 in addedwps:
                    startord = resultant_id2order.get(int(a2), 0)
                else:
                    startord = resultant_id2order.get(int(a1), 0)

                print "Ordering of new wp: %d is %d" % (a1, startord)
                num_waypoints = len(resultant_by_order)

                def searchpattern(begin, num):
                    assert begin >= 0 and begin < num
                    down = begin - 1
                    up = begin + 1
                    while True:
                        work = False
                        if down >= 0:
                            yield down
                            down -= 1
                            work = True
                        if up < num:
                            yield up
                            up += 1
                            work = True
                        if not work: break

                for wpord in searchpattern(startord, num_waypoints):
                    wp = resultant_by_order.get(wpord, None)
                    print "Searchpattern visiting order: %d" % (wpord, )
                    if wp:
                        if wpord < startord:
                            cruisealt = prevalts.get((wp.id, +1), '')
                            print "Looking for alt previously after wp %d, got: %s" % (
                                wp.id, cruisealt)
                        else:
                            cruisealt = prevalts.get((wp.id, -1), '')
                            print "Looking for alt previously before wp %d, got: %s" % (
                                wp.id, cruisealt)
                        if cruisealt != "": break
                if cruisealt == "":
                    cruisealt = "1500"
                r = Route(tripuser(), trip.trip, a1, a2, 0, 0, tas, None,
                          cruisealt)
                meta.Session.add(r)

            session.save()

            meta.Session.flush()
            meta.Session.commit()

            ret = json.dumps([tripname])
            print "mapview returning json:", ret
            return ret
        except Exception, cause:
            #print line number and stuff as well
            print cause
            #TODO: ONLY FOR TESTING!!!!
            raise
            return "notok"
Esempio n. 6
0
def test_adv_route_info():

    from fplan.config.environment import load_environment
    from fplan.model import meta
    from fplan.model import Waypoint, Route, Trip, User, Aircraft
    import sqlalchemy as sa

    from pylons import config

    # meta.Session.query(User).filter(User.user==u'testuser')

    u = User(u'testuser', u'password')
    meta.Session.add(u)
    meta.Session.flush()
    ac = Aircraft(u'testuser', u'eurocub')
    ac.adv_cruise_speed = (75, 75, 75, 76, 76, 75, 74, 73, 72, 71)
    ac.adv_climb_speed = (60, 60, 60, 60, 61, 61, 61, 62, 63, 64)
    ac.adv_descent_speed = (80, 80, 81, 81, 82, 82, 83, 84, 85, 86)
    ac.adv_climb_rate = (750, 700, 650, 600, 550, 500, 450, 300, 200, 000)
    ac.adv_descent_rate = (500, 500, 500, 500, 525, 525, 550, 550, 575, 600)
    ac.adv_cruise_burn = (16, 16, 16, 16, 15.5, 15.25, 15.0, 14.75, 14.5, 14.0)
    ac.adv_climb_burn = (20, 20, 20, 20, 19, 19, 18, 17, 15, 14.0)
    ac.adv_descent_burn = (14, 14, 14, 14, 14, 14, 14, 14, 14, 13.5)
    ac.advanced_model = True

    meta.Session.add(ac)
    meta.Session.flush()
    trip = Trip(u"testuser", u"mytrip", u'eurocub')
    meta.Session.add(trip)
    meta.Session.flush()
    wp1 = Waypoint(u'testuser', u'mytrip', '59,18', 0, 100, u'bromma')
    wp2 = Waypoint(u'testuser', u'mytrip', '60,18', 1, 101, u'arlanda')
    wp3 = Waypoint(u'testuser', u'mytrip', '61,18', 2, 102, u'gävle')
    wp4 = Waypoint(u'testuser', u'mytrip', '61.01,18', 3, 103, u'gävleclose')
    meta.Session.add(wp1)
    meta.Session.add(wp2)
    meta.Session.add(wp3)
    meta.Session.add(wp4)
    meta.Session.flush()
    rt1 = Route(u'testuser', u'mytrip', 0, 1)
    rt1.altitude = "1000"
    rt2 = Route(u'testuser', u'mytrip', 1, 2)
    rt2.altitude = "10000"
    rt2.windvel = 25
    rt2.winddir = 0
    rt3 = Route(u'testuser', u'mytrip', 2, 3)
    rt3.altitude = "0"
    for s in [wp1, wp2, wp3, rt1, rt2, rt3]:
        meta.Session.add(s)
    meta.Session.flush()
    tripobj = meta.Session.query(Trip).filter(
        sa.and_(Trip.user == u'testuser', Trip.trip == u'mytrip')).one()
    print "Got tripobj", tripobj

    class Temp(object):
        pass

    dummy, route = calc.get_route(u'testuser', u'mytrip')
    D = 60.153204103671705
    assert abs(route[0].d - D) < 1e-5
    #print route[0].__dict__
    ch = route[0].ch
    assert abs(ch - 355) < 2  #This changes as earths magnetic field does
    #print "Climbtime: %f, Cruisetime: %f, expected tot: %f, calculated tot time: %f"%(climbtime,cruisetime,climbtime+cruisetime,route[0].time_hours)
    t = route[0].time_hours
    assert abs(t - 0.806) < 0.1
    m = route[0].mid_alt
    print "m:", m
    assert m == 1000
    m = route[1].mid_alt
    print "m:", m
    assert m == 9000
    #print route[1].wca

    m = route[2].subs[0].startalt
    print "last startalt", m
    #assert m==9000
    print "Last time", route[2].accum_time_hours
    assert abs(route[2].accum_time_hours - 2.1281958051) < 1e-9
Esempio n. 7
0
def test_route_optimize():

    from fplan.config.environment import load_environment
    from fplan.model import meta
    from fplan.model import Waypoint, Route, Trip, User, Aircraft
    import sqlalchemy as sa

    from pylons import config

    # meta.Session.query(User).filter(User.user==u'testuser')

    u = User(u'testuser', u'password')
    meta.Session.add(u)
    meta.Session.flush()
    ac = Aircraft(u'testuser', u'eurocub')
    ac.adv_cruise_speed = (75, 75, 75, 76, 76, 75, 74, 73, 72, 71)
    ac.adv_climb_speed = (60, 60, 60, 60, 61, 61, 61, 62, 63, 64)
    ac.adv_descent_speed = (80, 80, 81, 81, 82, 82, 83, 84, 85, 86)
    ac.adv_climb_rate = (750, 700, 650, 600, 550, 500, 450, 300, 200, 000)
    ac.adv_descent_rate = (500, 500, 500, 500, 525, 525, 550, 550, 575, 600)
    ac.adv_cruise_burn = (16, 16, 16, 16, 15.5, 15.25, 15.0, 14.75, 14.5, 14.0)
    ac.adv_climb_burn = (20, 20, 20, 20, 19, 19, 18, 17, 15, 14.0)
    ac.adv_descent_burn = (14, 14, 14, 14, 14, 14, 14, 14, 14, 13.5)
    ac.advanced_model = True

    meta.Session.add(ac)
    meta.Session.flush()
    trip = Trip(u"testuser", u"mytrip", u'eurocub')
    meta.Session.add(trip)
    meta.Session.flush()
    wp1 = Waypoint(u'testuser', u'mytrip', '56,14', 0, 100, u'bromma')
    wp2 = Waypoint(u'testuser', u'mytrip', '58,14', 1, 101, u'arlanda')
    wp3 = Waypoint(u'testuser', u'mytrip', '59,14', 2, 102, u'gävle')
    wp4 = Waypoint(u'testuser', u'mytrip', '60,14', 3, 103, u'norr')
    wp5 = Waypoint(u'testuser', u'mytrip', '60.01,14', 4, 104, u'norr2')
    meta.Session.add(wp1)
    meta.Session.add(wp2)
    meta.Session.add(wp3)
    meta.Session.add(wp4)
    meta.Session.add(wp5)
    meta.Session.flush()
    rt1 = Route(u'testuser', u'mytrip', 0, 1)
    rt1.altitude = "0"
    rt2 = Route(u'testuser', u'mytrip', 1, 2)
    rt2.altitude = "0"
    rt3 = Route(u'testuser', u'mytrip', 2, 3)
    rt3.altitude = "0"
    rt4 = Route(u'testuser', u'mytrip', 3, 4)
    rt4.altitude = "0"
    for s in [wp1, wp2, wp3, wp4, rt1, rt2, rt3, rt4]:
        meta.Session.add(s)
    meta.Session.flush()
    tripobj = meta.Session.query(Trip).filter(
        sa.and_(Trip.user == u'testuser', Trip.trip == u'mytrip')).one()
    print "Got tripobj", tripobj

    class Temp(object):
        pass

    res, routes = calc.get_optimized(u'testuser', u'mytrip', 'fuel')
    print[r.altitude for r in routes]
def test_adv_route_info():
    
    from fplan.config.environment import load_environment
    from fplan.model import meta
    from fplan.model import Waypoint,Route,Trip,User,Aircraft
    import sqlalchemy as sa

    from pylons import config
     
    # meta.Session.query(User).filter(User.user==u'testuser')
    
    u=User(u'testuser',u'password')
    meta.Session.add(u)
    meta.Session.flush();
    ac=Aircraft(u'testuser',u'eurocub')
    ac.adv_cruise_speed=    (75,75,75,76,76, 75,74,73,72,71)
    ac.adv_climb_speed=     (60,60,60,60,61, 61,61,62,63,64)
    ac.adv_descent_speed=   (80,80,81,81,82, 82,83,84,85,86)
    ac.adv_climb_rate=      (750,700,650,600,550,  500,450,300,200,000)
    ac.adv_descent_rate=    (500,500,500,500,525,  525,550,550,575,600)
    ac.adv_cruise_burn=     (16,16,16,16,15.5, 15.25,15.0,14.75,14.5,14.0)
    ac.adv_climb_burn=      (20,20,20,20,19, 19,18,17,15,14.0)
    ac.adv_descent_burn=    (14,14,14,14,14, 14,14,14,14,13.5)
    ac.advanced_model=True
    
    meta.Session.add(ac)
    meta.Session.flush();
    trip=Trip(u"testuser",u"mytrip",u'eurocub')
    meta.Session.add(trip)
    meta.Session.flush();
    wp1=Waypoint(u'testuser',u'mytrip','59,18',0,100,u'bromma')
    wp2=Waypoint(u'testuser',u'mytrip','60,18',1,101,u'arlanda')
    wp3=Waypoint(u'testuser',u'mytrip','61,18',2,102,u'gävle')
    wp4=Waypoint(u'testuser',u'mytrip','61.01,18',3,103,u'gävleclose')
    meta.Session.add(wp1)
    meta.Session.add(wp2)
    meta.Session.add(wp3)
    meta.Session.add(wp4)
    meta.Session.flush();
    rt1=Route(u'testuser',u'mytrip',0,1)
    rt1.altitude="1000"
    rt2=Route(u'testuser',u'mytrip',1,2)
    rt2.altitude="10000"
    rt2.windvel=25
    rt2.winddir=0
    rt3=Route(u'testuser',u'mytrip',2,3)
    rt3.altitude="0"
    for s in [wp1,wp2,wp3,rt1,rt2,rt3]:
        meta.Session.add(s)
    meta.Session.flush()    
    tripobj=meta.Session.query(Trip).filter(sa.and_(
            Trip.user==u'testuser',Trip.trip==u'mytrip')).one()
    print "Got tripobj",tripobj
    class Temp(object): pass
    dummy,route=calc.get_route(u'testuser',u'mytrip')
    D=60.153204103671705
    assert abs(route[0].d-D)<1e-5
    #print route[0].__dict__
    ch=route[0].ch
    assert abs(ch-355)<2 #This changes as earths magnetic field does
    #print "Climbtime: %f, Cruisetime: %f, expected tot: %f, calculated tot time: %f"%(climbtime,cruisetime,climbtime+cruisetime,route[0].time_hours)
    t=route[0].time_hours
    assert abs(t-0.806)<0.1
    m=route[0].mid_alt
    print "m:",m
    assert m==1000
    m=route[1].mid_alt
    print "m:",m
    assert m==9000
    #print route[1].wca
    
    m=route[2].subs[0].startalt
    print "last startalt",m
    #assert m==9000
    print "Last time",route[2].accum_time_hours
    assert abs(route[2].accum_time_hours-2.1281958051)<1e-9