34
aerofiles Documentation Release 0.1.0 Tobias Bieniek Dec 17, 2018

Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles DocumentationRelease 0.1.0

Tobias Bieniek

Dec 17, 2018

Page 2: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information
Page 3: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

Contents

1 User’s Guide 31.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 How to write an IGC file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 API Reference 72.1 API Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3 Additional Notes 253.1 Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.2 License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Python Module Index 27

i

Page 4: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

ii

Page 5: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

Welcome to the aerofiles documentation. This documentation is divided into different parts. You should start withInstallation and then head over to the API Reference.

Contents 1

Page 6: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

2 Contents

Page 7: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

CHAPTER 1

User’s Guide

This part of the documentation, which is mostly prose, begins with some background information about Flask, thenfocuses on step-by-step instructions for web development with Flask.

1.1 Installation

Given that you have a working python environment aerofiles is just one single command away:

$ pip install aerofiles

A few seconds later and you are good to go.

1.2 How to write an IGC file

aerofiles has the aerofiles.igc.Writer class for writing IGC files. The first thing you need to do is instantiateit by passing an file-like object into its constructor:

with open('sample.igc', 'w') as fp:writer = aerofiles.igc.Writer(fp)

1.2.1 Headers

After that you can use the writer object to write the necessary file headers:

writer.write_headers({'manufacturer_code': 'XCS','logger_id': 'TBX','date': datetime.date(1987, 2, 24),'fix_accuracy': 50,

(continues on next page)

3

Page 8: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

(continued from previous page)

'pilot': 'Tobias Bieniek','copilot': 'John Doe','glider_type': 'Duo Discus','glider_id': 'D-KKHH','firmware_version': '2.2','hardware_version': '2','logger_type': 'LXNAVIGATION,LX8000F','gps_receiver': 'uBLOX LEA-4S-2,16,max9000m','pressure_sensor': 'INTERSEMA,MS5534A,max10000m','competition_id': '2H','competition_class': 'Doubleseater',

})

Note that the write_headers() method will take care of writing the headers in the right order and it will alert youif you failed to pass a mandatory header. Those mandatory headers that are allowed to be blank will be written withoutvalue if you don’t specify any values.

The result of the call above is the following lines being written to the sample.igc file:

AXCSTBXHFDTE870224HFFXA050HFPLTPILOTINCHARGE:Tobias BieniekHFCM2CREW2:John DoeHFGTYGLIDERTYPE:Duo DiscusHFGIDGLIDERID:D-KKHHHFDTM100GPSDATUM:WGS-1984HFRFWFIRMWAREVERSION:2.2HFRHWHARDWAREVERSION:2HFFTYFRTYPE:LXNAVIGATION,LX8000FHFGPSuBLOX LEA-4S-2,16,max9000mHFPRSPRESSALTSENSOR:INTERSEMA,MS5534A,max10000mHFCIDCOMPETITIONID:2HHFCCLCOMPETITIONCLASS:Doubleseater

Next you might want to define what extensions your GPS fix records will use. Make sure that you specify at leastthe highly recommended FXA extension as specified in the official IGC file specification. You can add the extensionsdescription by using the write_fix_extensions() method:

writer.write_fix_extensions([('FXA', 3), ('SIU', 2), ('ENL', 3)])

This will result in the following line being written:

I033638FXA3940SIU4143ENL

There is also a write_k_record_extensions() method if you are planning to use K records with extensions.

1.2.2 Task

Following the headers should be the task declaration. There are two main methods for writing that:write_task_metadata() and write_task_points(). The first method writes the task declaration meta-data like date and time of declaration, the intended date of the flight, the task id and the number of turnpoints in thedeclared task. The second method is used to write the task points in the specified order:

4 Chapter 1. User’s Guide

Page 9: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

writer.write_task_metadata(datetime.datetime(2014, 4, 13, 12, 53, 02),task_number=42,turnpoints=3,

)

writer.write_task_points([(None, None, 'TAKEOFF'),(51.40375, 6.41275, 'START'),(50.38210, 8.82105, 'TURN 1'),(50.59045, 7.03555, 'TURN 2', 0, 32.5, 0, 180),(51.40375, 6.41275, 'FINISH'),(None, None, 'LANDING'),

])

These calls will write the following lines to the sample.igc file:

C140413125302000000004203C0000000N00000000ETAKEOFFC5124225N00624765ESTARTC5022926N00849263ETURN 1C5035427N00702133E00000000032500000000180000TURN 2C5124225N00624765EFINISHC0000000N00000000ELANDING

1.2.3 GPS Fixes

Writing GPS fixes is accomplished through the write_fix() method:

writer.write_fix(datetime.time(12, 34, 56),latitude=51.40375,longitude=6.41275,valid=True,pressure_alt=1234,gps_alt=1432,extensions=[50, 0, 12],

)

All parameters essentially optional and will be filled with sensible defaults. The time parameter will use the currentUTC time, while the other parameters will be set to invalid values.

If the write_fix_extensions() method was used before, the extensions parameter becomes mandatory andhas to contain a list of values for the declared fix extensions. The above call would result in the following fix record:

B1234565124225N00624765EA012340143205000012

1.2.4 Security Signature

The IGC file specification is using a security signature for authenticity verification. This signature is generated by theflight recorder and should be verifiable be an external tool. If you are able to generate such a signature according tothe specification then you can use the write_security() method to append it to the file:

1.2. How to write an IGC file 5

Page 10: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

writer.write_security('ABCDEFGHIJKLMNOPQRSTUVWXYZ')

will write

GABCDEFGHIJKLMNOPQRSTUVWXYZ

while using multiple lines for the security signature if it is longer than 75 bytes.

6 Chapter 1. User’s Guide

Page 11: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

CHAPTER 2

API Reference

If you are looking for information on a specific function, class or method, this part of the documentation is for you.

2.1 API Reference

This part of the documentation covers all the public APIs of aerofiles.

2.1.1 aerofiles.flarmcfg

class aerofiles.flarmcfg.Writer(fp=None)A writer for the Flarm configuration file format:

with open('flarmcfg.txt', 'w') as fp:writer = Writer(fp)

see FTD-14 FLARM Configuration Specification and annotated example flarmcfg.txt

write_competition_class(competition_class)Write the competition class configuration:

writer.write_competition_class('Club')# -> $PFLAC,S,COMPCLASS,Club

Parameters competition_class – competition class of the glider

write_competition_id(competition_id)Write the competition id configuration:

writer.write_competition_id('TH')# -> $PFLAC,S,COMPID,TH

7

Page 12: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

Parameters competition_id – competition id of the glider

write_copilot(copilot)Write the copilot name configuration:

writer.write_copilot('John Doe')# -> $PFLAC,S,COPIL,John Doe

Parameters copilot – name of the copilot

write_glider_id(glider_id)Write the glider registration configuration:

writer.write_glider_id('D-4449')# -> $PFLAC,S,GLIDERID,D-4449

Parameters glider_id – the registration of the glider

write_glider_type(glider_type)Write the glider type configuration:

writer.write_glider_type('Hornet')# -> $PFLAC,S,GLIDERTYPE,Hornet

Parameters glider_type – the type of glider

write_logger_interval(interval)Write the logger interval configuration:

writer.write_logger_interval(4)# -> $PFLAC,S,LOGINT,4

Parameters interval – competition class of the glider

write_pilot(pilot)Write the pilot name configuration:

writer.write_pilot('Tobias Bieniek')# -> $PFLAC,S,PILOT,Tobias Bieniek

Parameters pilot – name of the pilot

write_task_declaration(description=None)Start a new task declaration. Any old task declaration will be cleared by this command:

writer.write_task_declaration('My Task')# -> $PFLAC,S,NEWTASK,My Task

Parameters description – optional text description of task, e.g. “500km triangle”; can bean empty string; will be trimmed to 50 characters

8 Chapter 2. API Reference

Page 13: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

write_waypoint(latitude=None, longitude=None, description=None)Adds a waypoint to the current task declaration. The first and the last waypoint added will be treated astakeoff and landing location, respectively.

writer.write_waypoint(latitude=(51 + 7.345 / 60.),longitude=(6 + 24.765 / 60.),text='Meiersberg',

)# -> $PFLAC,S,ADDWP,5107345N,00624765E,Meiersberg

If no latitude or longitude is passed, the fields will be filled with zeros (i.e. unknown coordinates).This however should only be used for takeoff and landing points.

Parameters

• latitude – latitude of the point (between -90 and 90 degrees)

• longitude – longitude of the point (between -180 and 180 degrees)

• description – arbitrary text description of waypoint

write_waypoints(points)Write multiple task declaration points with one call:

writer.write_waypoints([(None, None, 'TAKEOFF'),(51.40375, 6.41275, 'START'),(50.38210, 8.82105, 'TURN 1'),(50.59045, 7.03555, 'TURN 2'),(51.40375, 6.41275, 'FINISH'),(None, None, 'LANDING'),

])# -> $PFLAC,S,ADDWP,0000000N,00000000E,TAKEOFF# -> $PFLAC,S,ADDWP,5124225N,00624765E,START# -> $PFLAC,S,ADDWP,5022926N,00849263E,TURN 1# -> $PFLAC,S,ADDWP,5035427N,00702133E,TURN 2# -> $PFLAC,S,ADDWP,5124225N,00624765E,FINISH# -> $PFLAC,S,ADDWP,0000000N,00000000E,LANDING

see the write_waypoint() method for more information.

Parameters points – a list of (latitude, longitude, text) tuples.

2.1.2 aerofiles.igc

class aerofiles.igc.Writer(fp=None)A writer for the IGC flight log file format.

see http://www.fai.org/gnss-recording-devices/igc-approved-flight-recorders or http://carrier.csi.cam.ac.uk/forsterlewis/soaring/igc_file_format/igc_format_2008.html

write_club(club)Write the optional club declaration header:

writer.write_club('LV Aachen')# -> HFCLBCLUB:LV Aachen

Parameters club – club or organisation for which this flight should be scored

2.1. API Reference 9

Page 14: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

write_comment(code, text)Write a comment record:

writer.write_comment('PLT', 'Arrived at the first turnpoint')# -> LPLTArrived at the first turnpoint

Parameters

• code – a three-letter-code describing the source of the comment (e.g. PLT for pilot)

• text – the text that should be added to the comment

write_competition_class(competition_class)Write the optional competition class declaration header:

writer.write_competition_class('Club')# -> HFCCLCOMPETITIONCLASS:Club

Parameters competition_class – competition class of the glider

write_competition_id(competition_id)Write the optional competition id declaration header:

writer.write_competition_id('TH')# -> HFCIDCOMPETITIONID:TH

Parameters competition_id – competition id of the glider

write_copilot(copilot)Write the copilot declaration header:

writer.write_copilot('John Doe')# -> HFCM2CREW2:John Doe

Parameters copilot – name of the copilot

write_date(date)Write the date header:

writer.write_date(datetime.date(2014, 5, 2))# -> HFDTE140502

Parameters date – a datetime.date instance

write_event(*args)Write an event record:

writer.write_event(datetime.time(12, 34, 56), 'PEV')# -> B123456PEV

writer.write_event(datetime.time(12, 34, 56), 'PEV', 'Some Text')# -> B123456PEVSome Text

writer.write_event('PEV') # uses utcnow()# -> B121503PEV

10 Chapter 2. API Reference

Page 15: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

Parameters

• time – UTC time of the fix record (default: utcnow())

• code – event type as three-letter-code

• text – additional text describing the event (optional)

write_firmware_version(firmware_version)Write the firmware version header:

writer.write_firmware_version('6.4')# -> HFRFWFIRMWAREVERSION:6.4

Parameters firmware_version – the firmware version of the flight recorder

write_fix(time=None, latitude=None, longitude=None, valid=False, pressure_alt=None,gps_alt=None, extensions=None)

Write a fix record:

writer.write_fix(datetime.time(12, 34, 56),latitude=51.40375,longitude=6.41275,valid=True,pressure_alt=1234,gps_alt=1432,

)# -> B1234565124225N00624765EA0123401432

Parameters

• time – UTC time of the fix record (default: utcnow())

• latitude – longitude of the last GPS fix

• longitude – latitude of the last GPS fix

• valid – True if the current GPS fix is 3D

• pressure_alt – altitude to the ICAO ISA above the 1013.25 hPa sea level datum

• gps_alt – altitude above the WGS84 ellipsoid

• extensions – a list of extension values according to previous declaration throughwrite_fix_extensions()

write_fix_accuracy(accuracy=None)Write the GPS fix accuracy header:

writer.write_fix_accuracy()# -> HFFXA500

writer.write_fix_accuracy(25)# -> HFFXA025

Parameters accuracy – the estimated GPS fix accuracy in meters (optional)

write_fix_extensions(extensions)Write the fix extensions description header:

2.1. API Reference 11

Page 16: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

writer.write_fix_extensions([('FXA', 3), ('SIU', 2), ('ENL', 3)])# -> I033638FXA3940SIU4143ENL

Parameters extensions – a list of (extension, length) tuples

write_glider_id(glider_id)Write the glider id declaration header:

writer.write_glider_id('D-4449')# -> HFGIDGLIDERID:D-4449

The glider id is usually the official registration number of the airplane. For example:D-4449 or N116EL.

Parameters glider_id – the glider registration number

write_glider_type(glider_type)Write the glider type declaration header:

writer.write_glider_type('Hornet')# -> HFGTYGLIDERTYPE:Hornet

Parameters glider_type – the glider type (e.g. Hornet)

write_gps_datum(code=None, gps_datum=None)Write the mandatory GPS datum header:

writer.write_gps_datum()# -> HFDTM100GPSDATUM:WGS-1984

writer.write_gps_datum(33, 'Guam-1963')# -> HFDTM033GPSDATUM:Guam-1963

Note that the default GPS datum is WGS-1984 and you should use that unless you have very good reasonsagainst it.

Parameters

• code – the GPS datum code as defined in the IGC file specification, section A8

• gps_datum – the GPS datum in written form

write_gps_receiver(gps_receiver)Write the GPS receiver header:

writer.write_gps_receiver('uBLOX LEA-4S-2,16,max9000m')# -> HFGPSuBLOX LEA-4S-2,16,max9000m

Parameters gps_receiver – the GPS receiver information

write_hardware_version(hardware_version)Write the hardware version header:

writer.write_hardware_version('1.2')# -> HFRHWHARDWAREVERSION:1.2

Parameters hardware_version – the hardware version of the flight recorder

12 Chapter 2. API Reference

Page 17: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

write_headers(headers)Write all the necessary headers in the correct order:

writer.write_headers({'manufacturer_code': 'XCS','logger_id': 'TBX','date': datetime.date(1987, 2, 24),'fix_accuracy': 50,'pilot': 'Tobias Bieniek','copilot': 'John Doe','glider_type': 'Duo Discus','glider_id': 'D-KKHH','firmware_version': '2.2','hardware_version': '2','logger_type': 'LXNAVIGATION,LX8000F','gps_receiver': 'uBLOX LEA-4S-2,16,max9000m','pressure_sensor': 'INTERSEMA,MS5534A,max10000m','competition_id': '2H','competition_class': 'Doubleseater',

})

# -> AXCSTBX# -> HFDTE870224# -> HFFXA050# -> HFPLTPILOTINCHARGE:Tobias Bieniek# -> HFCM2CREW2:John Doe# -> HFGTYGLIDERTYPE:Duo Discus# -> HFGIDGLIDERID:D-KKHH# -> HFDTM100GPSDATUM:WGS-1984# -> HFRFWFIRMWAREVERSION:2.2# -> HFRHWHARDWAREVERSION:2# -> HFFTYFRTYPE:LXNAVIGATION,LX8000F# -> HFGPSuBLOX LEA-4S-2,16,max9000m# -> HFPRSPRESSALTSENSOR:INTERSEMA,MS5534A,max10000m# -> HFCIDCOMPETITIONID:2H# -> HFCCLCOMPETITIONCLASS:Doubleseater

This method will throw a ValueError if a mandatory header is missing and will fill others up withempty strings if no value was given. The optional headers are only written if they are part of the specifieddict.

Note

The use of this method is encouraged compared to calling all the other header-writing methods manually!

Parameters headers – a dict of all the headers that should be written.

write_k_record(*args)Write a K record:

writer.write_k_record_extensions([('FXA', 3), ('SIU', 2), ('ENL', 3),

])

writer.write_k_record(datetime.time(2, 3, 4), ['023', 13, 2])

(continues on next page)

2.1. API Reference 13

Page 18: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

(continued from previous page)

# -> J030810FXA1112SIU1315ENL# -> K02030402313002

Parameters

• time – UTC time of the k record (default: utcnow())

• extensions – a list of extension values according to previous declaration throughwrite_k_record_extensions()

write_k_record_extensions(extensions)Write the K record extensions description header:

writer.write_k_record_extensions([('HDT', 5)])# -> J010812HDT

Use write_k_record() to write the associated records.

Parameters extensions – a list of (extension, length) tuples

write_logger_id(manufacturer, logger_id, extension=None, validate=True)Write the manufacturer and logger id header line:

writer.write_logger_id('XXX', 'ABC', extension='FLIGHT:1')# -> AXXXABCFLIGHT:1

Some older loggers have decimal logger ids which can be written like this:

writer.write_logger_id('FIL', '13961', validate=False)# -> AFIL13961

Parameters

• manufacturer – the three-letter-code of the manufacturer

• logger_id – the logger id as three-letter-code

• extension – anything else that should be appended to this header (e.g. FLIGHT:1)

• validate – whether to validate the manufacturer and logger_id three-letter-codes

write_logger_type(logger_type)Write the extended logger type header:

writer.write_logger_type('Flarm-IGC')# -> HFFTYFRTYPE:Flarm-IGC

Parameters logger_type – the extended type information of the flight recorder

write_pilot(pilot)Write the pilot declaration header:

writer.write_pilot('Tobias Bieniek')# -> HFPLTPILOTINCHARGE:Tobias Bieniek

Parameters pilot – name of the pilot

14 Chapter 2. API Reference

Page 19: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

write_pressure_sensor(pressure_sensor)Write the pressure sensor header:

writer.write_pressure_sensor('Intersema MS5534B,8191')# -> HFPRSPRESSALTSENSOR:Intersema MS5534B,8191

Parameters pressure_sensor – the pressure sensor information

write_satellites(*args)Write a satellite constellation record:

writer.write_satellites(datetime.time(12, 34, 56), [1, 2, 5, 22])# -> F12345601020522

Parameters

• time – UTC time of the satellite constellation record (default: utcnow())

• satellites – a list of satellite IDs as either two-character strings or integers below 100

write_security(security, bytes_per_line=75)Write the security signature:

writer.write_security('ABCDEF')# -> GABCDEF

If a signature of more than 75 bytes is used the G record will be broken into multiple lines according to theIGC file specification. This rule can be configured with the bytes_per_line parameter if necessary.

Parameters

• security – the security signature

• bytes_per_line – the maximum number of bytes per line (default: 75)

write_task_metadata(declaration_datetime=None, flight_date=None, task_number=None, turn-points=None, text=None)

Write the task declaration metadata record:

writer.write_task_metadata(datetime.datetime(2014, 4, 13, 12, 53, 02),task_number=42,turnpoints=3,

)# -> C140413125302000000004203

There are sensible defaults in place for all parameters except for the turnpoints parameter. If you don’tpass that parameter the method will raise a ValueError. The other parameter defaults are mentioned inthe list below.

Parameters

• declaration_datetime – a datetime.datetime instance of the UTC date andtime at the time of declaration (default: current date and time)

• flight_date – a datetime.date instance of the intended date of the flight (default:000000, which means “use declaration date”)

• task_number – task number for the flight date or an integer-based identifier (default:0001)

2.1. API Reference 15

Page 20: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

• turnpoints – the number of turnpoints in the task (not counting start and finish points!)

• text – optional text to append to the metadata record

write_task_point(latitude=None, longitude=None, text=”, distance_min=None, dis-tance_max=None, bearing1=None, bearing2=None)

Write a task declaration point:

writer.write_task_point(latitude=(51 + 7.345 / 60.),longitude=(6 + 24.765 / 60.),text='Meiersberg',

)# -> C5107345N00624765EMeiersberg

If no latitude or longitude is passed, the fields will be filled with zeros (i.e. unknown coordinates).This however should only be used for TAKEOFF and LANDING points.

For area tasks there are some additional parameters that can be used to specify the relevant areas:

writer.write_task_point(-(12 + 32.112 / 60.),-(178 + .001 / 60.),'TURN AREA',distance_min=12.0,distance_max=32.0,bearing1=122.0,bearing2=182.0,

)# -> C1232112S17800001W00120000032000122000182000TURN AREA

Parameters

• latitude – latitude of the point (between -90 and 90 degrees)

• longitude – longitude of the point (between -180 and 180 degrees)

• text – type and/or name of the waypoint (e.g. TAKEOFF, START, TURN 1, TURN 2,FINISH or LANDING)

write_task_points(points)Write multiple task declaration points with one call:

writer.write_task_points([(None, None, 'TAKEOFF'),(51.40375, 6.41275, 'START'),(50.38210, 8.82105, 'TURN 1'),(50.59045, 7.03555, 'TURN 2', 0, 32.5, 0, 180),(51.40375, 6.41275, 'FINISH'),(None, None, 'LANDING'),

])# -> C0000000N00000000ETAKEOFF# -> C5124225N00624765ESTART# -> C5022926N00849263ETURN 1# -> C5035427N00702133E00000000032500000000180000TURN 2# -> C5124225N00624765EFINISH# -> C0000000N00000000ELANDING

see the write_task_point() method for more information.

16 Chapter 2. API Reference

Page 21: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

Parameters points – a list of (latitude, longitude, text) tuples. use(latitude, longitude, text, distance_min, distance_max,bearing1, bearing2) tuples for area task points.

2.1.3 aerofiles.openair

class aerofiles.openair.Reader(fp)A higher-level reader for the OpenAir airspace file format:

with open('airspace.txt') as fp:reader = Reader(fp)

see OpenAir file format specification

This class should be used as a generator and will return (record, error) tuples for each airspace or terrainrecord:

for record, error in reader:if error:

raise error # or handle it otherwise

# handle record

If there is a parsing error while reading a record the whole record is skipped and the parsing error will be returnedfrom the generator. It is up to the calling code whether that parsing error should be handled as fatal or not.

Airspace records have the following structure:

{"type": "airspace","class": "C","name": "Sacramento","floor": "500ft","ceiling": "UNLIM","labels": [

[39.61333, -119.76833],],"elements": [

...],

}

Terrain records have the following structure:

{"type": "terrain","open": False,"name": "Lake Michigan","fill": [200, 200, 255],"outline": [0, 1, 0, 0, 255],"zoom": 30.0,"elements": [

...],

}

Possible elements in both record types:

2.1. API Reference 17

Page 22: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

# DP elements{

"type": "point","location": [39.61333, -119.76833],

}

# DA elements{

"type": "arc","center": [39.61333, -119.76833],"clockwise": True,"radius": 30.0,"start": 70.0,"end": 180.0,

}

# DB elements{

"type": "arc","center": [39.61333, -119.76833],"clockwise": False,"start": [39.61333, -119.76833],"end": [39.61333, -119.76833],

}

# DC elements{

"type": "circle","center": [39.61333, -119.76833],"radius": 15.0,

}

# DY elements{

"type": "airway","location": [39.61333, -119.76833],

}

class aerofiles.openair.LowLevelReader(fp)A low-level reader for the OpenAir airspace file format:

with open('airspace.txt') as fp:reader = LowLevelReader(fp)

see OpenAir file format specification

Instances of this class read OpenAir files line by line and extract the information in each line as a dic-tionary. A line like AN Sacramento for example is converted to {"type": "AN", "value":"Sacramento"}.

The reader should be used as a generator and will return a (result, error) tuple for each line that is notempty or a comment:

for result, error in reader:if error:

raise error # or handle it otherwise

# handle result

18 Chapter 2. API Reference

Page 23: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

Most lines are just parsed into type and value strings. The following examples should show the lines that areparsed differently:

# AT 39:36.8 N 119:46.1W{"type": "AT", "value": [39.61333, -119.76833]}

# DA 10,320,200{"type": "DA", "radius": 10, "start": 320, "end": 200}

# DC 1.5{"type": "DC", "value": 1.5}

# DP 39:35:00 N 118:59:20 W{"type": "DP", "value": [39.58333, -118.98888]}

# SB 200,200,255{"type": "SB", "value": [200, 200, 255]}

# SP 0,1,0,0,255{"type": "SP", "value": [0, 1, 0, 0, 255]}

# V D=-{"type": "V", "name": "D", "value": False}

# V X=39:29.7 N 119:46.5 W{"type": "V", "name": "X", "value": [39.495, -119.775]}

# V Z=100{"type": "V", "name": "Z", "value": 100}

2.1.4 aerofiles.seeyou

class aerofiles.seeyou.Reader(fp=None)A reader for the SeeYou CUP waypoint file format.

see http://www.keepitsoaring.com/LKSC/Downloads/cup_format.pdf

class aerofiles.seeyou.Writer(fp, encoding=’utf-8’)A writer for SeeYou CUP files. Supports waypoints and tasks:

with open('competition.cup', 'wb') as fp:writer = Writer(fp)

write_observation_zone(num, **kw)Write observation zone information for a taskpoint:

writer.write_task_options(start_time=time(12, 34, 56),task_time=timedelta(hours=1, minutes=45, seconds=12),waypoint_distance=False,distance_tolerance=(0.7, 'km'),altitude_tolerance=300.0,

)# -> Options,NoStart=12:34:56,TaskTime=01:45:12,WpDis=False,NearDis=0.7km,→˓NearAlt=300.0m

Parameters

2.1. API Reference 19

Page 24: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

• num – consecutive number of a waypoint (0: Start)

• style – direction (0: Fixed value, 1: Symmetrical, 2: To next point, 3: To previouspoint, 4: To start point

• radius – radius 1 in meter or as (radius, unit) tuple

• angle – angle 1 in degrees

• radius2 – radius 2 in meter or as (radius, unit) tuple

• 2 (angle) – angle 2 in degrees

• angle12 – angle 12 in degress

• line – should be True if start or finish line

write_task(description, waypoints)Write a task definition:

writer.write_task('500 km FAI', ['MEIER','BRILO','AILER','MEIER',

])# -> "500 km FAI","MEIER","BRILO","AILER","MEIER"

Make sure that the referenced waypoints have been written with write_waypoint() before writingthe task. The task section divider will be written to automatically when write_task() is called the firsttime. After the first task is written write_waypoint() must not be called anymore.

Parameters

• description – description of the task (may be blank)

• waypoints – list of waypoints in the task (names must match the long names of previ-ously written waypoints)

write_task_options(**kw)Write an options line for a task definition:

writer.write_task_options(start_time=time(12, 34, 56),task_time=timedelta(hours=1, minutes=45, seconds=12),waypoint_distance=False,distance_tolerance=(0.7, 'km'),altitude_tolerance=300.0,

)# -> Options,NoStart=12:34:56,TaskTime=01:45:12,WpDis=False,NearDis=0.7km,→˓NearAlt=300.0m

Parameters

• start_time – opening time of the start line as datetime.time or string

• task_time – designated time for the task as datetime.timedelta or string

• waypoint_distance – task distance calculation (False: use fixes, True: use way-points)

• distance_tolerance – distance tolerance in meters or as (distance, unit)tuple

20 Chapter 2. API Reference

Page 25: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

• altitude_tolerance – altitude tolerance in meters or as (distance, unit)tuple

• min_distance – “uncompleted leg (False: calculate maximum distance from lastobservation zone)”

• random_order – if True, then Random order of waypoints is checked

• max_points – maximum number of points

• before_points – number of mandatory waypoints at the beginning. 1 means start lineonly, 2 means start line plus first point in task sequence (Task line).

• after_points – number of mandatory waypoints at the end. 1 means finish line only,2 means finish line and one point before finish in task sequence (Task line).

• bonus – bonus for crossing the finish line

write_waypoint(name, shortname, country, latitude, longitude, elevation=u”, style=1, run-way_direction=u”, runway_length=u”, frequency=u”, description=u”)

Write a waypoint:

writer.write_waypoint('Meiersberg','MEIER','DE',(51 + 7.345 / 60.),(6 + 24.765 / 60.),

)# -> "Meiersberg","MEIER",DE,5107.345N,00624.765E,,1,,,,

Parameters

• name – name of the waypoint (must not be empty)

• shortname – short name for depending GPS devices

• country – IANA top level domain country code (see http://www.iana.org/cctld/cctld-whois.htm)

• latitude – latitude of the point (between -90 and 90 degrees)

• longitude – longitude of the point (between -180 and 180 degrees)

• elevation – elevation of the waypoint in meters or as (elevation, unit) tuple

• style – the waypoint type (see official specification for the list of valid styles, defaultsto “Normal”)

• runway_direction – heading of the runway in degrees if the waypoint is landable

• runway_length – length of the runway in meters or as (length, unit) tuple ifthe waypoint is landable

• frequency – radio frequency of the airport

• description – optional description of the waypoint (no length limit)

2.1.5 aerofiles.welt2000

class aerofiles.welt2000.Reader(fp=None)A reader for the WELT2000 waypoint file format.

2.1. API Reference 21

Page 26: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

see http://www.segelflug.de/vereine/welt2000/download/WELT2000-SPEC.TXT

2.1.6 aerofiles.xcsoar

class aerofiles.xcsoar.Writer(fp, encoding=’utf-8’)A writer class for the XCSoar task file format:

with open('task.tsk', 'w') as fp:writer = Writer(fp)

This task file format contains one task per file. Writing more than one task will cause an exception. A task canbe written by using the write_task() method.

write_observation_zone(**kw)Write an observation zone declaration to the file:

writer.write_observation_zone(type=ObservationZoneType.CYLINDER,radius=30000,

)

# <ObservationZone type="Cylinder" radius="30000"/>

The required parameters depend on the type parameter. Different observation zone types require differentparameters.

Parameters

• type – observation zone type (one of the constants in ObservationZoneType)

• length – length of the line (only used with type LINE)

• radius – (outer) radius of the observation zone (used with types CYLINDER, SECTOR,SYMMETRIC_QUADRANT and CUSTOM_KEYHOLE)

• inner_radius – inner radius of the observation zone (only used with typeCUSTOM_KEYHOLE)

• angle – angle of the observation zone (only used with type CUSTOM_KEYHOLE)

• start_radial – start radial of the observation zone (only used with type SECTOR)

• end_radial – end radial of the observation zone (only used with type SECTOR)

write_point(**kw)Write a task point to the file:

with writer.write_point(type=PointType.TURN):writer.write_waypoint(...)writer.write_observation_zone(...)

# <Point type="Turn"> ... </Point>

Inside the with clause the write_waypoint() and write_observation_zone() methods mustbe used to write the details of the task point.

Parameters type – type of the task point (one of the constants in PointType)

write_task(**kw)Write the main task to the file:

22 Chapter 2. API Reference

Page 27: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

with writer.write_task(type=TaskType.RACING):...

# <Task type="RT"> ... </Task>

Inside the with clause the write_point() method should be used to write the individual task points.All parameters are optional.

Parameters

• type – type of the task (one of the constants in TaskType)

• start_requires_arm – True: start has to be armed manually, False: task will bestarted automatically

• start_max_height – maximum altitude when the task is started (in m)

• start_max_height_ref – altitude reference of start_max_height (one of theconstants in AltitudeReference)

• start_max_speed – maximum speed when the task is started (in m/s)

• start_open_time – time that the start line opens as datetime.time

• start_close_time – time that the start line is closing as datetime.time

• aat_min_time – AAT time as datetime.timedelta

• finish_min_height – minimum altitude when the task is finished (in m)

• finish_min_height_ref – altitude reference of finish_min_height (one ofthe constants in AltitudeReference)

• fai_finish – True: FAI finish rules apply

write_waypoint(**kw)Write a waypoint to the file:

writer.write_waypoint(name='Meiersberg',latitude=51.4,longitude=7.1

)

# <Waypoint name="Meiersberg"># <Location latitude="51.4" longitude="7.1"/># </Waypoint>

Parameters

• name – name of the waypoint

• latitude – latitude of the waypoint (in WGS84)

• longitude – longitude of the waypoint (in WGS84)

• altitude – altitude of the waypoint (in m, optional)

• id – internal id of the waypoint (optional)

• comment – extended description of the waypoint (optional)

class aerofiles.xcsoar.constants.AltitudeReference

2.1. API Reference 23

Page 28: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

AGL = 'AGL'

MSL = 'MSL'

class aerofiles.xcsoar.constants.ObservationZoneType

BGA_ENHANCED = 'BGAEnhancedOption'

BGA_FIXED = 'BGAFixedCourse'

BGA_START = 'BGAStartSector'

CUSTOM_KEYHOLE = 'CustomKeyhole'

CYLINDER = 'Cylinder'

FAI_SECTOR = 'FAISector'

KEYHOLE = 'Keyhole'

LINE = 'Line'

MAT_CYLINDER = 'MatCylinder'

SECTOR = 'Sector'

SYMMETRIC_QUADRANT = 'SymmetricQuadrant'

class aerofiles.xcsoar.constants.PointType

AREA = 'Area'

FINISH = 'Finish'

OPTIONAL_START = 'OptionalStart'

START = 'Start'

TURN = 'Turn'

class aerofiles.xcsoar.constants.TaskType

AAT = 'AAT'

FAI_GENERAL = 'FAIGeneral'

FAI_GOAL = 'FAIGoal'

FAI_OUT_AND_RETURN = 'FAIOR'

FAI_TRIANGLE = 'FAITriangle'

MAT = 'MAT'

MIXED = 'Mixed'

RACING = 'RT'

TOURING = 'Touring'

24 Chapter 2. API Reference

Page 29: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

CHAPTER 3

Additional Notes

Legal information and changelog are here for the interested.

3.1 Changelog

Here you can see the full list of changes between each aerofiles release.

3.1.1 [Unreleased]

3.1.2 aerofiles v1.0.0

• fix decode_date bug in igc.reader

• remove python2.6 and python3.3 support

3.1.3 aerofiles v0.4.1

• fix extensions in IGC file fix record

• remove igc line limit

3.1.4 aerofiles v0.4

• IGC file reader

• Expanded SeeYou reader with task reading

25

Page 30: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

3.1.5 aerofiles v0.3

• OpenAir airspace file reader

• Fixed encoding issues in SeeYou/XCSoar file writers

3.1.6 aerofiles v0.2

• SeeYou CUP file writer

• XCSoar task file writer

• Flarm configuration file writer

3.1.7 aerofiles v0.1.1

• Fixed missing README.rst in source distribution

3.1.8 aerofiles v0.1

First public preview release

• SeeYou CUP file reader

• WELT2000 file reader

• IGC file writer

3.2 License

aerofiles is licensed under the MIT License. The full license text can be found below.

3.2.1 aerofiles License

The MIT License (MIT)

Copyright (c) 2013 Tobias Bieniek

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documen-tation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use,copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whomthe Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of theSoftware.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PAR-TICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHTHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTIONOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFT-WARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

26 Chapter 3. Additional Notes

Page 31: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

Python Module Index

aaerofiles.xcsoar.constants, 23

27

Page 32: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

28 Python Module Index

Page 33: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

Index

AAAT (aerofiles.xcsoar.constants.TaskType attribute), 24aerofiles.xcsoar.constants (module), 23AGL (aerofiles.xcsoar.constants.AltitudeReference

attribute), 23AltitudeReference (class in aerofiles.xcsoar.constants), 23AREA (aerofiles.xcsoar.constants.PointType attribute),

24

BBGA_ENHANCED (aero-

files.xcsoar.constants.ObservationZoneTypeattribute), 24

BGA_FIXED (aerofiles.xcsoar.constants.ObservationZoneTypeattribute), 24

BGA_START (aerofiles.xcsoar.constants.ObservationZoneTypeattribute), 24

CCUSTOM_KEYHOLE (aero-

files.xcsoar.constants.ObservationZoneTypeattribute), 24

CYLINDER (aerofiles.xcsoar.constants.ObservationZoneTypeattribute), 24

FFAI_GENERAL (aerofiles.xcsoar.constants.TaskType at-

tribute), 24FAI_GOAL (aerofiles.xcsoar.constants.TaskType at-

tribute), 24FAI_OUT_AND_RETURN (aero-

files.xcsoar.constants.TaskType attribute),24

FAI_SECTOR (aerofiles.xcsoar.constants.ObservationZoneTypeattribute), 24

FAI_TRIANGLE (aerofiles.xcsoar.constants.TaskTypeattribute), 24

FINISH (aerofiles.xcsoar.constants.PointType attribute),24

KKEYHOLE (aerofiles.xcsoar.constants.ObservationZoneType

attribute), 24

LLINE (aerofiles.xcsoar.constants.ObservationZoneType

attribute), 24LowLevelReader (class in aerofiles.openair), 18

MMAT (aerofiles.xcsoar.constants.TaskType attribute), 24MAT_CYLINDER (aero-

files.xcsoar.constants.ObservationZoneTypeattribute), 24

MIXED (aerofiles.xcsoar.constants.TaskType attribute),24

MSL (aerofiles.xcsoar.constants.AltitudeReference at-tribute), 24

OObservationZoneType (class in aero-

files.xcsoar.constants), 24OPTIONAL_START (aero-

files.xcsoar.constants.PointType attribute),24

PPointType (class in aerofiles.xcsoar.constants), 24

RRACING (aerofiles.xcsoar.constants.TaskType attribute),

24Reader (class in aerofiles.openair), 17Reader (class in aerofiles.seeyou), 19Reader (class in aerofiles.welt2000), 21

SSECTOR (aerofiles.xcsoar.constants.ObservationZoneType

attribute), 24

29

Page 34: Release 0.1.0 Tobias Bieniek - Read the Docs · 2019-04-02 · CHAPTER 1 User’s Guide This part of the documentation, which is mostly prose, begins with some background information

aerofiles Documentation, Release 0.1.0

START (aerofiles.xcsoar.constants.PointType attribute),24

SYMMETRIC_QUADRANT (aero-files.xcsoar.constants.ObservationZoneTypeattribute), 24

TTaskType (class in aerofiles.xcsoar.constants), 24TOURING (aerofiles.xcsoar.constants.TaskType at-

tribute), 24TURN (aerofiles.xcsoar.constants.PointType attribute),

24

Wwrite_club() (aerofiles.igc.Writer method), 9write_comment() (aerofiles.igc.Writer method), 10write_competition_class() (aerofiles.flarmcfg.Writer

method), 7write_competition_class() (aerofiles.igc.Writer method),

10write_competition_id() (aerofiles.flarmcfg.Writer

method), 7write_competition_id() (aerofiles.igc.Writer method), 10write_copilot() (aerofiles.flarmcfg.Writer method), 8write_copilot() (aerofiles.igc.Writer method), 10write_date() (aerofiles.igc.Writer method), 10write_event() (aerofiles.igc.Writer method), 10write_firmware_version() (aerofiles.igc.Writer method),

11write_fix() (aerofiles.igc.Writer method), 11write_fix_accuracy() (aerofiles.igc.Writer method), 11write_fix_extensions() (aerofiles.igc.Writer method), 11write_glider_id() (aerofiles.flarmcfg.Writer method), 8write_glider_id() (aerofiles.igc.Writer method), 12write_glider_type() (aerofiles.flarmcfg.Writer method), 8write_glider_type() (aerofiles.igc.Writer method), 12write_gps_datum() (aerofiles.igc.Writer method), 12write_gps_receiver() (aerofiles.igc.Writer method), 12write_hardware_version() (aerofiles.igc.Writer method),

12write_headers() (aerofiles.igc.Writer method), 12write_k_record() (aerofiles.igc.Writer method), 13write_k_record_extensions() (aerofiles.igc.Writer

method), 14write_logger_id() (aerofiles.igc.Writer method), 14write_logger_interval() (aerofiles.flarmcfg.Writer

method), 8write_logger_type() (aerofiles.igc.Writer method), 14write_observation_zone() (aerofiles.seeyou.Writer

method), 19write_observation_zone() (aerofiles.xcsoar.Writer

method), 22write_pilot() (aerofiles.flarmcfg.Writer method), 8write_pilot() (aerofiles.igc.Writer method), 14

write_point() (aerofiles.xcsoar.Writer method), 22write_pressure_sensor() (aerofiles.igc.Writer method), 14write_satellites() (aerofiles.igc.Writer method), 15write_security() (aerofiles.igc.Writer method), 15write_task() (aerofiles.seeyou.Writer method), 20write_task() (aerofiles.xcsoar.Writer method), 22write_task_declaration() (aerofiles.flarmcfg.Writer

method), 8write_task_metadata() (aerofiles.igc.Writer method), 15write_task_options() (aerofiles.seeyou.Writer method),

20write_task_point() (aerofiles.igc.Writer method), 16write_task_points() (aerofiles.igc.Writer method), 16write_waypoint() (aerofiles.flarmcfg.Writer method), 8write_waypoint() (aerofiles.seeyou.Writer method), 21write_waypoint() (aerofiles.xcsoar.Writer method), 23write_waypoints() (aerofiles.flarmcfg.Writer method), 9Writer (class in aerofiles.flarmcfg), 7Writer (class in aerofiles.igc), 9Writer (class in aerofiles.seeyou), 19Writer (class in aerofiles.xcsoar), 22

30 Index