A conversion of the excellent Adafruit WS2801 library for Arduino to work on mbed
Diff: Adafruit_WS2801.cpp
- Revision:
- 1:6ff477690983
- Parent:
- 0:582e1b9c1cc1
- Child:
- 2:2fdaa13896a4
--- a/Adafruit_WS2801.cpp Fri Mar 08 08:49:04 2013 +0000 +++ b/Adafruit_WS2801.cpp Fri Mar 08 13:25:50 2013 +0000 @@ -1,5 +1,4 @@ #include "mbed.h" - #include "Adafruit_WS2801.h" // Example to control WS2801-based RGB LED Modules in a strand or strip @@ -7,12 +6,12 @@ /*****************************************************************************/ // Constructor for use with hardware SPI (specific clock/data pins): -Adafruit_WS2801::Adafruit_WS2801(uint16_t n, uint8_t order): clkpin(PTD4), datapin(PTA12) -{ - rgb_order = order; - alloc(n); - updatePins(); -} +//Adafruit_WS2801::Adafruit_WS2801(uint16_t n, uint8_t order): clkpin(PTD4), datapin(PTA12) +//{ +// rgb_order = order; +// alloc(n); +// updatePins(); +//} // Constructor for use with arbitrary clock/data pins: Adafruit_WS2801::Adafruit_WS2801(uint16_t n, PinName dpin, PinName cpin, uint8_t order) : clkpin(cpin), datapin(dpin) @@ -56,14 +55,14 @@ // command. If using this constructor, MUST follow up with updateLength() // and updatePins() to establish the strand length and output pins! // Also, updateOrder() to change RGB vs GRB order (RGB is default). -Adafruit_WS2801::Adafruit_WS2801(void) : clkpin(PTD4), datapin(PTA12) -{ - begun = false; - numLEDs = 0; - pixels = NULL; - rgb_order = WS2801_RGB; - updatePins(); // Must assume hardware SPI until pins are set -} +//Adafruit_WS2801::Adafruit_WS2801(void) : clkpin(PTD4), datapin(PTA12) +//{ +// begun = false; +// numLEDs = 0; +// pixels = NULL; +// rgb_order = WS2801_RGB; +// updatePins(); // Must assume hardware SPI until pins are set +//} // Release memory (as needed): Adafruit_WS2801::~Adafruit_WS2801(void) @@ -77,62 +76,30 @@ void Adafruit_WS2801::begin(void) { - if(hardwareSPI == true) { - startSPI(); - } else { -// pinMode(datapin, OUTPUT); -// pinMode(clkpin , OUTPUT); - } + datapin = 0; + clkpin = 0; begun = true; } // Change pin assignments post-constructor, switching to hardware SPI: +/* void Adafruit_WS2801::updatePins(void) { hardwareSPI = true; datapin = 0; clkpin = 0; - - // If begin() was previously invoked, init the SPI hardware now: - if(begun == true) startSPI(); - // Otherwise, SPI is NOT initted until begin() is explicitly called. - - // Note: any prior clock/data pin directions are left as-is and are - // NOT restored as inputs! } +*/ // Change pin assignments post-constructor, using arbitrary pins: -void Adafruit_WS2801::updatePins(PinName dpin, PinName cpin) -{ - - if(begun == true) { // If begin() was previously invoked... - // If previously using hardware SPI, turn that off: -// if(hardwareSPI == true) SPI.end(); - // Regardless, now enable output on 'soft' SPI pins: -// pinMode(dpin, OUTPUT); -// pinMode(cpin, OUTPUT); - } // Otherwise, pins are not set to outputs until begin() is called. - +//void Adafruit_WS2801::updatePins(PinName dpin, PinName cpin) +//{ // Note: any prior clock/data pin directions are left as-is and are // NOT restored as inputs! - hardwareSPI = false; - datapin = dpin; - clkpin = cpin; -// clkport = portOutputRegister(digitalPinToPort(cpin)); -// clkpinmask = digitalPinToBitMask(cpin); -// dataport = portOutputRegister(digitalPinToPort(dpin)); -// datapinmask = digitalPinToBitMask(dpin); -} - -// Enable SPI hardware and set up protocol details: -void Adafruit_WS2801::startSPI(void) -{ -// SPI.begin(); -// SPI.setBitOrder(MSBFIRST); -// SPI.setDataMode(SPI_MODE0); -// SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 MHz max, else flicker -} +// datapin = DigitalOut(dpin); +// clkpin = DigitalOut(cpin); +//} uint16_t Adafruit_WS2801::numPixels(void) { @@ -162,33 +129,6 @@ uint8_t bit; // Write 24 bits per pixel: -// if(hardwareSPI) { -// for(i=0; i<nl3; i++) { -// SPDR = pixels[i]; -// while(!(SPSR & (1<<SPIF))); -// } -// } else { - -/* - for(int LED_number = 0 ; LED_number < _STRIP_LENGTH ; LED_number++) { - if(_level != 100) { - int R = ((strip_colors[LED_number] & 0x00ff0000) >> 16)*_level/100; - int G = ((strip_colors[LED_number] & 0x0000ff00) >> 8)*_level/100; - int B = (strip_colors[LED_number] & 0x000000ff)*_level/100; - strip_colors_leveled[LED_number] = (R << 16)|(G << 8)|B; - } else strip_colors_leveled[LED_number] = strip_colors[LED_number]; - int this_led_color = strip_colors_leveled[LED_number]; //24 bits of color data - for(char color_bit = 23 ; color_bit != 255 ; color_bit--) { - _CKI = 0; - mask = 1 << color_bit; - if(this_led_color & mask)_SDI = 1; - else _SDI = 0; - _CKI = 1; //Data is latched when clock goes high - } - } - _CKI = 0; - wait_us(_reset_delay); //Wait for 1ms to go into reset -*/ for(i=0; i<nl3; i++ ) { for(bit=0x80; bit; bit >>= 1) { clkpin = 0; @@ -197,9 +137,10 @@ clkpin = 1; } } -// } + clkpin = 0; wait_ms(1); // Data is latched by holding clock pin low for 1 millisecond + clkpin = 1; } // Set pixel color from separate 8-bit R, G, B components: