Note
~~~~

This is an unofficial port of Gordon's WiringPi library. Please do not
email Gordon if you have issues, he will not be able to help.

For support, comments, questions, etc please join the WiringPi Discord
channel: https://discord.gg/SM4WUVG

WiringPi for Python
===================

WiringPi: An implementation of most of the Arduino Wiring functions for
the Raspberry Pi.

WiringPi implements new functions for managing IO expanders.

Quick Install
=============

.. image:: https://badge.fury.io/py/odroid-wiringpi.svg
    :alt: PyPI version badge
    :target: https://badge.fury.io/py/odroid-wiringpi

The library is packaged on PyPI and can be installed with pip:

``pip install odroid-wiringpi``

Usage
=====

.. code:: python

    import odroid_wiringpi as wiringpi

    # One of the following MUST be called before using IO functions:
    wiringpi.wiringPiSetup()      # For sequential pin numbering
    # OR
    wiringpi.wiringPiSetupSys()   # For /sys/class/gpio with GPIO pin numbering
    # OR
    wiringpi.wiringPiSetupGpio()  # For GPIO pin numbering

**General IO:**

.. code:: python

    wiringpi.pinMode(6, 1)       # Set pin 6 to 1 ( OUTPUT )
    wiringpi.digitalWrite(6, 1)  # Write 1 ( HIGH ) to pin 6
    wiringpi.digitalRead(6)      # Read pin 6

**Setting up a peripheral:**

WiringPi supports expanding your range of available "pins" by setting up
a port expander. The implementation details of your port expander will
be handled transparently, and you can write to the additional pins
(starting from PIN\_OFFSET >= 64) as if they were normal pins on the Pi.

.. code:: python

    wiringpi.mcp23017Setup(PIN_OFFSET, I2C_ADDR)

This example was tested on a quick2wire board with one digital IO
expansion board connected via I2C:

.. code:: python

    wiringpi.mcp23017Setup(65, 0x20)
    wiringpi.pinMode(65, 1)
    wiringpi.digitalWrite(65, 1)

**Soft Tone:**

Hook a speaker up to your Pi and generate music with softTone. Also
useful for generating frequencies for other uses such as modulating A/C.

.. code:: python

    wiringpi.softToneCreate(PIN)
    wiringpi.softToneWrite(PIN, FREQUENCY)

**Bit shifting:**

.. code:: python

    wiringpi.shiftOut(1, 2, 0, 123)  # Shift out 123 (b1110110, byte 0-255) to data pin 1, clock pin 2

**Serial:**

.. code:: python

    serial = wiringpi.serialOpen('/dev/ttyAMA0', 9600)  # Requires device/baud and returns an ID
    wiringpi.serialPuts(serial, "hello")
    wiringpi.serialClose(serial)  # Pass in ID

**SPI:**

The ``wiringPiSPIDataRW()`` function needs to be passed a ``bytes``
object in Python 3. In Python 2, it takes a string. The following should
work in either Python 2 or 3:

.. code:: python

    wiringpi.wiringPiSPISetup(channel, speed)
    buf = bytes([your data here])
    retlen, retdata = wiringpi.wiringPiSPIDataRW(0, buf)

Now, ``retlen`` will contain the number of bytes received/read by the
call. ``retdata`` will contain the data itself, and in Python 3, ``buf``
will have been modified to contain it as well (that won't happen in
Python 2, because then ``buf`` is a string, and strings are immutable).

**Full details of the API at:** http://www.wiringpi.com

Manual Build
============

Get/setup repo
--------------

.. code:: bash

    git clone --recursive https://github.com/WiringPi/WiringPi-Python.git
    cd WiringPi-Python

Don't forget the ``--recursive``; it is required to also pull in the
WiringPi C code from its own repository.

Prerequisites
-------------

To rebuild the bindings you **must** first have installed ``swig``,
``python-dev``, and ``python-setuptools`` (or their ``python3-``
equivalents). WiringPi should also be installed system-wide for access
to the ``gpio`` tool.

.. code:: bash

    sudo apt-get install python-dev python-setuptools swig wiringpi

Build & install with
--------------------

``sudo python setup.py install``

Or Python 3:

``sudo python3 setup.py install``

