def mavflightview_mav(mlog, options=None, flightmode_selections=[]):
    '''create a map for a log file'''
    wp = mavwp.MAVWPLoader()
    if options.mission is not None:
        wp.load(options.mission)
    fen = mavwp.MAVFenceLoader()
    if options.fence is not None:
        fen.load(options.fence)
    all_false = True
    for s in flightmode_selections:
        if s:
            all_false = False
    idx = 0
    path = [[]]
    instances = {}
    ekf_counter = 0
    nkf_counter = 0
    types = ['MISSION_ITEM','CMD']
    if options.types is not None:
        types.extend(options.types.split(','))
    else:
        types.extend(['GPS','GLOBAL_POSITION_INT'])
        if options.rawgps or options.dualgps:
            types.extend(['GPS', 'GPS_RAW_INT'])
        if options.rawgps2 or options.dualgps:
            types.extend(['GPS2_RAW','GPS2'])
        if options.ekf:
            types.extend(['EKF1', 'GPS'])
        if options.nkf:
            types.extend(['NKF1', 'GPS'])
        if options.ahr2:
            types.extend(['AHR2', 'AHRS2', 'GPS'])
    print("Looking for types %s" % str(types))

    last_timestamps = {}
    used_flightmodes = {}

    while True:
        try:
            m = mlog.recv_match(type=types)
            if m is None:
                break
        except Exception:
            break

        type = m.get_type()

        if type == 'MISSION_ITEM':
            try:
                while m.seq > wp.count():
                    print("Adding dummy WP %u" % wp.count())
                    wp.set(m, wp.count())
                wp.set(m, m.seq)
            except Exception:
                pass
            continue
        if type == 'CMD':
            m = mavutil.mavlink.MAVLink_mission_item_message(0,
                                                             0,
                                                             m.CNum,
                                                             mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT,
                                                             m.CId,
                                                             0, 1,
                                                             m.Prm1, m.Prm2, m.Prm3, m.Prm4,
                                                             m.Lat, m.Lng, m.Alt)
            try:
                while m.seq > wp.count():
                    print("Adding dummy WP %u" % wp.count())
                    wp.set(m, wp.count())
                wp.set(m, m.seq)
            except Exception:
                pass
            continue
        if not mlog.check_condition(options.condition):
            continue
        if options.mode is not None and mlog.flightmode.lower() != options.mode.lower():
            continue

        if not all_false and len(flightmode_selections) > 0 and idx < len(options._flightmodes) and m._timestamp >= options._flightmodes[idx][2]:
            idx += 1
        elif (idx < len(flightmode_selections) and flightmode_selections[idx]) or all_false or len(flightmode_selections) == 0:
            used_flightmodes[mlog.flightmode] = 1
            if type in ['GPS','GPS2']:
                status = getattr(m, 'Status', None)
                if status is None:
                    status = getattr(m, 'FixType', None)
                    if status is None:
                        print("Can't find status on GPS message")
                        print(m)
                        break
                if status < 2:
                    continue
                # flash log
                lat = m.Lat
                lng = getattr(m, 'Lng', None)
                if lng is None:
                    lng = getattr(m, 'Lon', None)
                    if lng is None:
                        print("Can't find longitude on GPS message")
                        print(m)
                        break
            elif type in ['EKF1', 'ANU1']:
                pos = mavextra.ekf1_pos(m)
                if pos is None:
                    continue
                ekf_counter += 1
                if ekf_counter % options.ekf_sample != 0:
                    continue
                (lat, lng) = pos
            elif type in ['NKF1']:
                pos = mavextra.ekf1_pos(m)
                if pos is None:
                    continue
                nkf_counter += 1
                if nkf_counter % options.nkf_sample != 0:
                    continue
                (lat, lng) = pos
            elif type in ['ANU5']:
                (lat, lng) = (m.Alat*1.0e-7, m.Alng*1.0e-7)
            elif type in ['AHR2', 'POS', 'CHEK']:
                (lat, lng) = (m.Lat, m.Lng)
            elif type == 'AHRS2':
                (lat, lng) = (m.lat*1.0e-7, m.lng*1.0e-7)
            elif type == 'ORGN':
                (lat, lng) = (m.Lat, m.Lng)
            else:
                lat = m.lat * 1.0e-7
                lng = m.lon * 1.0e-7

            # automatically add new types to instances
            if type not in instances:
                instances[type] = len(instances)
                while len(instances) >= len(path):
                    path.append([])
            instance = instances[type]

            if abs(lat)>0.01 or abs(lng)>0.01:
                colour = colour_for_point(mlog, (lat, lng), instance, options)
                point = (lat, lng, colour)

                if options.rate == 0 or not type in last_timestamps or m._timestamp - last_timestamps[type] > 1.0/options.rate:
                    last_timestamps[type] = m._timestamp
                    path[instance].append(point)
    if len(path[0]) == 0:
        print("No points to plot")
        return None

    return [path, wp, fen, used_flightmodes, getattr(mlog, 'mav_type',None)]
def mavflightview_mav ( mlog , options = None , flightmode_selections = [ ] ) : wp = mavwp . MAVWPLoader ( ) if options . mission is not None : wp . load ( options . mission ) fen = mavwp . MAVFenceLoader ( ) if options . fence is not None : fen . load ( options . fence ) all_false = True for s in flightmode_selections : if s : all_false = False idx = 0 path = [ [ ] ] instances = { } ekf_counter = 0 nkf_counter = 0 types = [ 'MISSION_ITEM' , 'CMD' ] if options . types is not None : types . extend ( options . types . split ( ',' ) ) else : types . extend ( [ 'GPS' , 'GLOBAL_POSITION_INT' ] ) if options . rawgps or options . dualgps : types . extend ( [ 'GPS' , 'GPS_RAW_INT' ] ) if options . rawgps2 or options . dualgps : types . extend ( [ 'GPS2_RAW' , 'GPS2' ] ) if options . ekf : types . extend ( [ 'EKF1' , 'GPS' ] ) if options . nkf : types . extend ( [ 'NKF1' , 'GPS' ] ) if options . ahr2 : types . extend ( [ 'AHR2' , 'AHRS2' , 'GPS' ] ) print ( "Looking for types %s" % str ( types ) ) last_timestamps = { } used_flightmodes = { } while True : try : m = mlog . recv_match ( type = types ) if m is None : break except Exception : break type = m . get_type ( ) if type == 'MISSION_ITEM' : try : while m . seq > wp . count ( ) : print ( "Adding dummy WP %u" % wp . count ( ) ) wp . set ( m , wp . count ( ) ) wp . set ( m , m . seq ) except Exception : pass continue if type == 'CMD' : m = mavutil . mavlink . MAVLink_mission_item_message ( 0 , 0 , m . CNum , mavutil . mavlink . MAV_FRAME_GLOBAL_RELATIVE_ALT , m . CId , 0 , 1 , m . Prm1 , m . Prm2 , m . Prm3 , m . Prm4 , m . Lat , m . Lng , m . Alt ) try : while m . seq > wp . count ( ) : print ( "Adding dummy WP %u" % wp . count ( ) ) wp . set ( m , wp . count ( ) ) wp . set ( m , m . seq ) except Exception : pass continue if not mlog . check_condition ( options . condition ) : continue if options . mode is not None and mlog . flightmode . lower ( ) != options . mode . lower ( ) : continue if not all_false and len ( flightmode_selections ) > 0 and idx < len ( options . _flightmodes ) and m . _timestamp >= options . _flightmodes [ idx ] [ 2 ] : idx += 1 elif ( idx < len ( flightmode_selections ) and flightmode_selections [ idx ] ) or all_false or len ( flightmode_selections ) == 0 : used_flightmodes [ mlog . flightmode ] = 1 if type in [ 'GPS' , 'GPS2' ] : status = getattr ( m , 'Status' , None ) if status is None : status = getattr ( m , 'FixType' , None ) if status is None : print ( "Can't find status on GPS message" ) print ( m ) break if status < 2 : continue lat = m . Lat lng = getattr ( m , 'Lng' , None ) if lng is None : lng = getattr ( m , 'Lon' , None ) if lng is None : print ( "Can't find longitude on GPS message" ) print ( m ) break elif type in [ 'EKF1' , 'ANU1' ] : pos = mavextra . ekf1_pos ( m ) if pos is None : continue ekf_counter += 1 if ekf_counter % options . ekf_sample != 0 : continue ( lat , lng ) = pos elif type in [ 'NKF1' ] : pos = mavextra . ekf1_pos ( m ) if pos is None : continue nkf_counter += 1 if nkf_counter % options . nkf_sample != 0 : continue ( lat , lng ) = pos elif type in [ 'ANU5' ] : ( lat , lng ) = ( m . Alat * 1.0e-7 , m . Alng * 1.0e-7 ) elif type in [ 'AHR2' , 'POS' , 'CHEK' ] : ( lat , lng ) = ( m . Lat , m . Lng ) elif type == 'AHRS2' : ( lat , lng ) = ( m . lat * 1.0e-7 , m . lng * 1.0e-7 ) elif type == 'ORGN' : ( lat , lng ) = ( m . Lat , m . Lng ) else : lat = m . lat * 1.0e-7 lng = m . lon * 1.0e-7 if type not in instances : instances [ type ] = len ( instances ) while len ( instances ) >= len ( path ) : path . append ( [ ] ) instance = instances [ type ] if abs ( lat ) > 0.01 or abs ( lng ) > 0.01 : colour = colour_for_point ( mlog , ( lat , lng ) , instance , options ) point = ( lat , lng , colour ) if options . rate == 0 or not type in last_timestamps or m . _timestamp - last_timestamps [ type ] > 1.0 / options . rate : last_timestamps [ type ] = m . _timestamp path [ instance ] . append ( point ) if len ( path [ 0 ] ) == 0 : print ( "No points to plot" ) return None return [ path , wp , fen , used_flightmodes , getattr ( mlog , 'mav_type' , None ) ]
create a map for a log file