LED bus driver on any GPIO pin for addressable RGB LEDs (like NeoPixels or other WS2812 based LEDs)

LEDBus.h

Committer:
koengroener
Date:
2016-05-10
Revision:
0:1e68c70236a4
Child:
2:735bb1b9cfc2

File content as of revision 0:1e68c70236a4:

#ifndef _LED_BUS_H_
#define _LED_BUS_H_

#include "mbed.h"

#define MICRO_SECOND 1000000.f

/**
    RGB Color
*/
struct Color {
    
    /**
        Constructor with rgb initializing
    
        @param r - the red byte
        @param g - the green byte
        @param b - the blue byte
    */
    Color(uint8_t r, uint8_t g, uint8_t b) {
        red = r;
        green = g;
        blue = b;
    }

    /**
        Default constructor
    */
    Color() {
    }

    /**
        Red byte
    */
    uint8_t red;

    /**
        Green byte
    */
    uint8_t green;

    /**
        Blue byte
    */
    uint8_t blue;
};

/**
    Callback method, supplying a Color struct to edit and the led index
*/
typedef void (*ColorGenerator)(Color* out, uint32_t index);

/**
    Order of r, g and b bytes
*/
enum ByteOrder {
    RGB,
    RBG,
    GRB,
    GBR,
    BRG,
    BGR,
};

/**
    LEDBus
*/
class LEDBus
{

private:
    DigitalOut _wire;
    ByteOrder _byteOrder;

    unsigned int _delayT1H, _delayT0H, _delayT1L, _delayT0L, _delayReset;

    void write(uint8_t byte);
    void delay(unsigned int ticks);
protected:

public:


    /**
    *   Initializes the addressable led bus
    *
    *   @param wirePin - The output pin on wich the addressable leds are connected
    *   @param byteOrder - The order in wich the r, g and b bytes are expected
    *   @param t0h_us - T0H as found in the addressable led datasheet. The duration, in microseconds, the pin will stay high for sending a 0 bit
    *   @param t0l_us - T0L as found in the addressable led datasheet. The duration, in microseconds, the pin will stay low for sending a 0 bit
    *   @param t1h_us - T1H as found in the addressable led datasheet. The duration, in microseconds, the pin will stay high for sending a 1 bit
    *   @param t1l_us - T1L as found in the addressable led datasheet. The duration, in microseconds, the pin will stay low for sending a 1 bit
    *   @param tReset_us - TReset as found in the addressable led datasheet. The duration, in microsecond, the pin will stay low for sending a reset command,
    */
    LEDBus(PinName wirePin, ByteOrder byteOrder, float t0h_us, float t0l_us, float t1h_us, float t1l_us, float tReset_us);

    ~LEDBus();

    /**
    *  Writes the byte buffer directly to the addressable leds
    */
    void write(uint8_t* buffer, unsigned int size);

    /**
    *  Writes the color buffer translated to bytes directly to the addressable leds
    * @code
    * // The led bus control class.
    * LEDBus ledBus(p9, RGB, 0.5f, 2.0f, 1.25f, 1.25f, 50.0f);
    *
    * Color* red = new Color(255,0,0);
    * Color* green = new Color(0,255,0);
    * Color* blue = new Color(0,0,255);
    *
    * Color* buffer[] = { red, green, blue };
    *
    * ledBus.write(buffer, 3);
    * @endcode
    */
    void write(Color** buffer, unsigned int size);

    /**
    *  Updates the leds by using a color generator callback method to generate a color for each led
        * @code
        *    int offset = 0;
        *
        *    // Sample generator:
        *    void generate(Color* color, uint32_t index)
        *    {
        *        switch((index+offset)%3) {
        *            case 0:
        *                color->red = 255;
        *                break;
        *            case 1:
        *                color->green = 255;
        *                break;
        *            case 2:
        *                color->blue = 255;
        *                break;
        *        }
        *    }
        *
        *    int main()
        *    {
        *        // The led bus control class.
        *        LEDBus ledBus(p9, RGB, 0.35f, 1.36f, 1.36f, 0.35f, 50.0f);
        *
        *        while (1) {
        *            ledBus.update(generate, 3);
        *            offset++;
        *            wait_ms(250);
        *        }
        *    }
        * @endcode
    */
    void update(ColorGenerator generator, unsigned int numberOfLEDs);

};

#endif