rs_ws281x 0.4.2

Wrapper for ws281x library using bindgen to track upstream
Documentation
[![crates.io](http://meritbadge.herokuapp.com/rs_ws281x)](https://crates.io/crates/rs_ws281x)
[![docs.rs](https://docs.rs/rs_ws281x/badge.svg)](https://docs.rs/rs_ws281x)
# Welcome to the Rust Bindings for rpi_ws281x
This project is going through major overhauls, so expect breaking
changes on most version changes.

## API Design - Help Wanted
Please take a look at the `feature-new-api` branch and issue #1 and give
some feedback!

## Usage
Currently in major flux, more details when I finish the "Stage 1" overhaul.
The current version on crates.io is pretty close to a bare bindgen wrap of
the C library.  The next version will look a lot more like typical Rust,
inspired by the efforts of @Meh who wrote manual bindings to this libray
a while back.

## Contributing
Code is licensed under the MIT license, so as long as you are cool with
that, feel free to open an issue, talk about proposed changes, then open
a PR!  I would love a helping hand, just have to make sure things don't
get too messy either.

## Compiling on Raspbian
- Install Rust from https://rustup.rs/ 
- Run `rustup target add arm-unknown-linux-gnueabihf`
- Install `sudo apt install libclang-dev`

## Cross-compiling on Windows

- Make sure Git is installed. This is used to clone the latest rpi-ws2811 lib.
- Download and install libclang from [LLVM]; [32-bit for Windows][1]
- Download and install [GCC][2] for the [Raspberry Pi][3].
- Using rustup, install the 32-bit GCC Rust toolchain and set as default:
    - `rustup default stable-i686-pc-windows-gnu`
- Add the Raspberry Pi architecture target to the GCC toolchain:
    - For all Raspberry Pi versions:
    - `rustup target add arm-unknown-linux-gnueabihf`
    - For an optimized Raspberry Pi 3 target (the ARMv7 architecture):
    - `rustup target add armv7-unknown-linux-gnueabihf`
- At the root of your Rust project, create a new directory and name it `.cargo`.
  Inside that directory, create a file and paste the contents:
    - ```
      [build]
      target = "arm-unknown-linux-gnueabihf"

      [target.arm-unknown-linux-gnueabihf]
      linker = "C:/SysGCC/raspberry/bin/arm-linux-gnueabihf-gcc.exe"
      ```
    - This informs Rust/Cargo to always use the arm-unknown-linux-gnueabihf target
      (so that --target doesn't always have to be passed to cargo) and so that the
      GCC linker for the given architecture is used.
    - Be sure to change the linker path or the target architecture if you installed
      the GCC ARM toolset in a different directory or are using the ARMv7 target
      instead.
- It is suggested to create a build script so that the necessary environment variables
  can be set. This library needs to know where to find the GCC toolset in order to
  cross compile the rpi-ws2811 C library for the Raspberry Pi.

An example build script might look like this (using Git for Windows Bash):

```
#!/usr/bin/env bash

# inform rpi-ws2811-rust where the GCC sysroot is
export RPI_WS281X_SYSROOT=C:/SysGCC/raspberry/arm-linux-gnueabihf/sysroot
# point to the GCC ARM compiler/linker.
export CC_arm_unknown_linux_gnueabihf=C:/SysGCC/raspberry/bin/arm-linux-gnueabihf-gcc.exe
# point to the GCC ARM archiver
export AR_arm_unknown_linux_gnueabihf=C:/SysGCC/raspberry/bin/arm-linux-gnueabihf-ar.exe

# run the build command
cargo build $@
```

[LLVM]: http://releases.llvm.org/download.html
[1]: http://releases.llvm.org/6.0.1/LLVM-6.0.1-win32.exe
[2]: http://gnutoolchains.com/raspberry/
[3]: http://sysprogs.com/files/gnutoolchains/raspberry/raspberry-gcc6.3.0-r3.exe