Python library used to communicate with PTP devices like Parrot Sequoia
Python Makefile

README.md

Introduction

Pure Python implementation of the PTP standard as specified in ISO15740:2013(E).

This implementation is transport agnostic and can be used along with USB, serial or IP layers to communicate with PTP compliant cameras.

The entire codebase, tools and examples are compatible with both Python 3 and Python 2.

Basic Usage

PTPy accomodates both the low-level developers wishing to test their PTP implementation as well as users of the cameras in the market.

By default, PTPy will automatically detect which extension the camera supports and load it so that the interaction is seamless.

The most basic usage of PTPy with a camera connected is:

from ptpy import PTPy

camera = PTPy()
print camera.get_device_info()

with camera.session():
    camera.initiate_capture()

Developers might want to disable the extra functionality, or impose an extension to use. E.g. when the PTP Extension ID has not been assigned.

It is possible to get bare PTP functionality with:

from ptpy import PTPy

camera = PTPy(raw=True)
print camera.get_device_info()

with camera.session():
    # Do basic things here.

A developer might want to test the case where the extension is incorrectly identified. This is possible by imposing an arbitrary extension.

Impose MTP (Microsoft PTP Extension) to any camera:

from ptpy import PTPy
from ptpy.extensions.microsoft import PTPDevice as mtp

camera = PTPy(extension=mtp)
with camera.session():
    # Do bizarre things here.

Sessions are managed automatically with context managers. All sessions under a top session with share the top session.

To inspect the current session and transaction use the corresponding properties:

from ptpy import PTPy

camera = PTPy()
with camera.session():
    camera.get_device_info()

    print('Top level session:')
    print(camera.session_id)
    print('Transaction ID:')
    print(camera.transaction_id)

    with camera.session():

        camera.get_device_info()

        print('Shared session:')
        print(camera.session_id)

        print('Transaction ID increases:')
        print(camera.transaction_id)

with camera.session():
    camera.get_device_info()

    print('First session:')
    print(camera.session_id)

    print('Transaction ID:')
    print(camera.transaction_id)

with camera.session():
    camera.get_device_info()

    print('Second session:')
    print(camera.session_id)

    print('Transaction ID:')
    print(camera.transaction_id)

Transport

A proof-of-concept USB implementation is provided using PyUSB. Though it might not work with all USB controllers in cameras today. In some operating systems, it might be necessary to be root in order to access USB devices directly.

For the USB transport, the _shutdown method is provided to explicitly release the USB interface. At the end of the Python interpreter session this will happen automatically.

Extensions

State of the art

Full support for the Parrot Drone SAS extension is provided. Extensions are meant to provice vendor-specific sets of operations, events and properties.

Partial support for Canon and Microsoft (MTP) extensions is provided. Full support is expected eventually.

Extensions are managed automatically for users or can be imposed by developers.

Framework

A developer can take any of the sample extensions as a model for others.

In general extensions do not need to overwrite any base PTP operations, events or properties. Indeed most extensions will add some extra commands.

Installing

To install issue pip install . or pip install -e . for developer mode. The command python setup.py install should also work.

Development

Requirements

A requirements.txt file is provided for ease of development. For developing tests, a separate tests/requirements.txt is provided.

Tests

Vendors might want to test their devices against the hardware tests. These become immediately accessible when a camera is connected.

To launch tests issue python setup.py test.

A convenience Makefile is provided so the command becomes make test.

All tests are implemented using py.test, which can also be called directly: py.test ./tests

TODO

  • Implement extension mapped codes from PTP1.1