def parse_passed_event(header_fields, body_fields):
    """Parses a "PassedEvent" and extracts relevant fields.
    Header: date | 2 (?), event_type, event_id, status (Normal/Warning/Error), 2793946901 (ref event_id?) 
        Body: 
        0: vehicle
        1: junk
        2: gid (vehicle_id)
        3: vehicle_id
        4: gps (lat, lon)
        5: gid (linje)
        6: gps (inte repeat?!)
        7: int (?)
        8: gid@int (node)
        9: name
        10: gps (stop1?)
        11: int (?)
        12: gps (stop2? repeat av gps#6?)
        13: time (arrived?)
        14: time (departed)
        15: Passed (?)
        16: time (?)
        17: time (?)
        18: Passed (?)
    """
    #print(header_fields, body_fields)
    return {
        "date": dateutil.parser.parse(header_fields[0]),
        "event.type": header_fields[2],
        "event.id": int(header_fields[3]),
        "ref.id": int(header_fields[5]),
        "vehicle.type": body_fields[0],
        "gid": int(body_fields[2]),
        "vehicle.id": int(body_fields[3]),
        "gps": str_gps_to_tuple(body_fields[4]),
        "line": int(body_fields[5][7:11]),
        "line.id": int(body_fields[5][11:]),
        "gps2": str_gps_to_tuple(body_fields[6]),
        "stop.int1": float(body_fields[7]),
        "stop.id": int(body_fields[8][11:14]),
        "stop.mode": int(body_fields[8][14:-2]),
        "stop.name": body_fields[9],
        "stop.gps1": str_gps_to_tuple(body_fields[10]),
        "stop.int2": float(body_fields[11]),
        "stop.gps2": str_gps_to_tuple(body_fields[12]),
        "time1": body_fields[13],
        "time2": body_fields[14],
        "time3": body_fields[16],
        "time4": body_fields[17]
    }
def parse_invalidpos_event(header_fields, body_fields):
    """Parses an "ObservedPositionEvent" and extracts relevant fields.
    Header: date | 2 (?) | event_type | event_id | status (Normal/Warning/Error) | ref id (?)
    Body: vehicle (Bus/Train) | junk | gid | vehicle_id | gps (lat, lon)
    """
    return {
        "date": dateutil.parser.parse(header_fields[0]),
        "event.type": header_fields[2],
        "event.id": int(header_fields[3]),
        "vehicle.type": body_fields[0],
        "gid": int(body_fields[2]),
        "vehicle.id": int(body_fields[3]),
        "gps": str_gps_to_tuple(body_fields[4])
    }
def parse_startstop_event(header_fields, body_fields):
    """Parses a "StartedEvent" or a "StoppedEvent" and extracts relevant fields.
    Header: date | 2 (?), event_type, event_id, status (Normal/Warning/Error), 2793946901 (ref event_id?) 
    Body: vehicle | junk | gid | vehicle_id | gps (lat, lon)
    """
    return {
        "date": dateutil.parser.parse(header_fields[0]),
        "event.type": header_fields[2],
        "event.id": int(header_fields[3]),
        "ref.id": int(header_fields[5]),
        "vehicle.type": body_fields[0],
        "gid": int(body_fields[2]),
        "vehicle.id": int(body_fields[3]),
        "gps": str_gps_to_tuple(body_fields[4])
    }
def parse_obspos_event(header_fields, body_fields):
    """Parses an "ObservedPositionEvent" and extracts relevant fields.
    Header: date | 2 (?) | event_type | event_id | status (Normal/Warning/Error)
    Body: 0.0 (?)| vehicle (Bus/Train) | junk | gid | vehicle_id | gps (lat, lon) | gps repeat | dir | speed | 3061889 (?)
    """
    return {
        "date": dateutil.parser.parse(header_fields[0]),
        "event.type": header_fields[2],
        "event.id": int(header_fields[3]),
        "vehicle.type": body_fields[1],
        "gid": int(body_fields[3]),
        "vehicle.id": int(body_fields[4]),
        "gps": str_gps_to_tuple(body_fields[5]),
        "dir": float(body_fields[7]),
        "speed": float(body_fields[8])
    }