A conversion of the excellent Adafruit WS2801 library for Arduino to work on mbed

Dependents:   SSS_Ble

Adafruit_WS2801.h

Committer:
kris@kris-X682X
Date:
2019-06-14
Revision:
6:a7cf522f7ec8
Parent:
3:dfffbd9f8ac6

File content as of revision 6:a7cf522f7ec8:

#include "mbed.h"


// Not all LED pixels are RGB order; 36mm type expects GRB data.
// Optional flag to constructors indicates data order (default if
// unspecified is RGB).  As long as setPixelColor/getPixelColor are
// used, other code can always treat 'packed' colors as RGB; the
// library will handle any required translation internally.
#define WS2801_RGB 0
#define WS2801_GRB 1

#define ws_swap(a, b) { int16_t t = a; a = b; b = t; }

class Adafruit_WS2801
{

public:

    // Configurable pins:
    Adafruit_WS2801(int16_t n, PinName dpin, PinName cpin, uint8_t order=WS2801_RGB);
    Adafruit_WS2801(int16_t x, int16_t y, PinName dpin, PinName cpin, uint8_t order=WS2801_RGB);
    // Use SPI hardware; specific pins only:
    Adafruit_WS2801(uint16_t n, uint8_t order=WS2801_RGB);
// Adafruit_WS2801(uint16_t x, uint16_t y, uint8_t order=WS2801_RGB);
    // Empty constructor; init pins/strand length/data order later:
//  Adafruit_WS2801();
    // Release memory (as needed):
    ~Adafruit_WS2801();

    void begin(void);
    void show(void);
    void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b);
    void setPixelColor(uint16_t n, uint32_t c);
    void setPixelColor(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b);
    void setPixelColor(int16_t x, int16_t y, uint32_t c);
    void updatePins(PinName dpin, PinName cpin); // Change pins, configurable
    void updatePins(void); // Change pins, hardware SPI
    void updateLength(uint16_t n); // Change strand length
    void updateOrder(uint8_t order); // Change data order

    // Basic drawing functions, line and circle. These are only useful when pixels arranged in a matrix
    void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint32_t color);
    void drawFastVLine(int16_t x, int16_t y, int16_t h, uint32_t color);
    void drawFastHLine(int16_t x, int16_t y, int16_t w, uint32_t color);
    void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint32_t color);
    void drawCircle(int16_t x0, int16_t y0, int16_t r, uint32_t color);
//    void fillCircle(int16_t x0, int16_t y0, int16_t r, uint32_t color);
//    void fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint32_t color);

    uint16_t numPixels(void);
    uint32_t getPixelColor(uint16_t n);

private:

    uint16_t
    numLEDs,
    width,     // used with matrix mode
    height;    // used with matrix mode
    uint8_t
    *pixels,   // Holds color values for each LED (3 bytes each)
    rgb_order // Color order; RGB vs GRB (or others, if needed in future)
    ;
    DigitalOut  clkpin;
    DigitalOut  datapin;     // Clock & data pin numbers
    void    alloc(uint16_t n);
//    startSPI(void);
    bool hardwareSPI; // If 'true', using hardware SPI
    bool  begun;       // If 'true', begin() method was previously invoked
};