Forked PololuLedStrip and modified it to work with the KL25Z. Renamed it to Adafruit_NeoPixel.

Dependents:   idd_hw3 idd_fa15_hw3_lauren_bill_tomas idd_fa15_hw3_lauren_bill_tomas Raiden ... more

Fork of PololuLedStrip by David Grayson

PololuLedStrip.cpp

Committer:
DavidEGrayson
Date:
2013-03-01
Revision:
6:9d0530b7dae2
Parent:
4:d3b60bd43811
Child:
7:9a088f042ee0

File content as of revision 6:9d0530b7dae2:

#include "PololuLedStrip.h"

bool PololuLedStrip::interruptFriendly = false;

// TODO: read clock frequency from SystemCoreClock and use that to make this work on different boards.
// calculate the three delays needed and pass them to the assembly.  The assembly can implement them with computed jumps.

uint8_t led_strip_write_delays[3];

PololuLedStrip::PololuLedStrip(PinName pinName)
{
    gpio_init(&gpio, pinName, PIN_OUTPUT);
}

void PololuLedStrip::write(rgb_color * colors, unsigned int count)
{
    __disable_irq();   // Disable interrupts temporarily because we don't want our pulse timing to be messed up.
    
    int f = SystemCoreClock/1000000;
    led_strip_write_delays[0] = 700*f/1000 - 10;
    led_strip_write_delays[1] = 600*f/1000 - 10;
    led_strip_write_delays[2] = 1200*f/1000 - 10;
    led_strip_write_delays[0] = 59;
    
    while(count--)
    {
        led_strip_write_color(colors++, gpio.reg_set, gpio.reg_clr, gpio.mask);
     
        if (interruptFriendly)
        {
            __enable_irq();
            __nop();
            __nop();
            __nop();
            __disable_irq();
        }
    }
        
    __enable_irq();   // Re-enable interrupts now that we are done.
    wait_us(24);      // Hold the line low for 24 microseconds to send the reset signal.
}