This is an example program for the PololuLedStrip library. It generates a simple moving gradient pattern.
Dependencies: PololuLedStrip mbed LedStripGradient
Dependents: LedStripGradient led_phare_crf
For more information, see the PololuLedStrip library.
main.cpp@7:242f14ed9055, 2013-02-26 (annotated)
- Committer:
- DavidEGrayson
- Date:
- Tue Feb 26 02:54:44 2013 +0000
- Revision:
- 7:242f14ed9055
- Parent:
- 6:59f1db26a9ff
- Child:
- 8:a179aad4fa2e
Good progress.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DavidEGrayson | 1:ac1550d65296 | 1 | #include "mbed.h" |
DavidEGrayson | 1:ac1550d65296 | 2 | #include "gpio_api.h" |
DavidEGrayson | 1:ac1550d65296 | 3 | |
DavidEGrayson | 1:ac1550d65296 | 4 | namespace Pololu |
DavidEGrayson | 1:ac1550d65296 | 5 | { |
DavidEGrayson | 1:ac1550d65296 | 6 | #ifndef _POLOLU_RGB_COLOR |
DavidEGrayson | 1:ac1550d65296 | 7 | #define _POLOLU_RGB_COLOR |
DavidEGrayson | 1:ac1550d65296 | 8 | typedef struct rgb_color |
DavidEGrayson | 1:ac1550d65296 | 9 | { |
DavidEGrayson | 1:ac1550d65296 | 10 | uint8_t red, green, blue; |
DavidEGrayson | 1:ac1550d65296 | 11 | } rgb_color; |
DavidEGrayson | 1:ac1550d65296 | 12 | #endif |
DavidEGrayson | 1:ac1550d65296 | 13 | |
DavidEGrayson | 5:8b685ba2f16b | 14 | extern "C" int led_strip_write_color(rgb_color *, volatile uint32_t * set, volatile uint32_t * clear, uint32_t mask); |
DavidEGrayson | 3:f566eea13f49 | 15 | |
DavidEGrayson | 1:ac1550d65296 | 16 | class PololuLedStrip |
DavidEGrayson | 1:ac1550d65296 | 17 | { |
DavidEGrayson | 1:ac1550d65296 | 18 | static bool interruptFriendly; |
DavidEGrayson | 1:ac1550d65296 | 19 | public: |
DavidEGrayson | 1:ac1550d65296 | 20 | gpio_t gpio; |
DavidEGrayson | 1:ac1550d65296 | 21 | PololuLedStrip(PinName pin); |
DavidEGrayson | 3:f566eea13f49 | 22 | void write(rgb_color * colors, unsigned int count); |
DavidEGrayson | 1:ac1550d65296 | 23 | }; |
DavidEGrayson | 1:ac1550d65296 | 24 | |
DavidEGrayson | 1:ac1550d65296 | 25 | bool PololuLedStrip::interruptFriendly; |
DavidEGrayson | 1:ac1550d65296 | 26 | |
DavidEGrayson | 1:ac1550d65296 | 27 | PololuLedStrip::PololuLedStrip(PinName pinName) |
DavidEGrayson | 1:ac1550d65296 | 28 | { |
DavidEGrayson | 1:ac1550d65296 | 29 | gpio_init(&gpio, pinName, PIN_OUTPUT); |
DavidEGrayson | 1:ac1550d65296 | 30 | } |
DavidEGrayson | 1:ac1550d65296 | 31 | |
DavidEGrayson | 1:ac1550d65296 | 32 | void PololuLedStrip::write(rgb_color * colors, unsigned int count) |
DavidEGrayson | 1:ac1550d65296 | 33 | { |
DavidEGrayson | 1:ac1550d65296 | 34 | uint32_t pinValue = gpio.pin & 0x1F; // Mimicing mbed/libraries/mbed/vendor/NXP/capi/gpio_api.c |
DavidEGrayson | 1:ac1550d65296 | 35 | |
DavidEGrayson | 1:ac1550d65296 | 36 | __disable_irq(); // Disable interrupts temporarily because we don't want our pulse timing to be messed up. |
DavidEGrayson | 1:ac1550d65296 | 37 | |
DavidEGrayson | 1:ac1550d65296 | 38 | while(count--) |
DavidEGrayson | 1:ac1550d65296 | 39 | { |
DavidEGrayson | 7:242f14ed9055 | 40 | led_strip_write_color(colors++, gpio.reg_set, gpio.reg_clr, gpio.mask); |
DavidEGrayson | 1:ac1550d65296 | 41 | |
DavidEGrayson | 1:ac1550d65296 | 42 | if (interruptFriendly) |
DavidEGrayson | 1:ac1550d65296 | 43 | { |
DavidEGrayson | 1:ac1550d65296 | 44 | __enable_irq(); |
DavidEGrayson | 1:ac1550d65296 | 45 | //asm volatile("nop\n"); |
DavidEGrayson | 1:ac1550d65296 | 46 | __disable_irq(); |
DavidEGrayson | 1:ac1550d65296 | 47 | } |
DavidEGrayson | 1:ac1550d65296 | 48 | } |
DavidEGrayson | 7:242f14ed9055 | 49 | __enable_irq(); // Re-enable interrupts now that we are done. |
DavidEGrayson | 7:242f14ed9055 | 50 | wait_us(24); // Hold the line low for 24 microseconds to send the reset signal. |
DavidEGrayson | 1:ac1550d65296 | 51 | } |
DavidEGrayson | 1:ac1550d65296 | 52 | |
DavidEGrayson | 1:ac1550d65296 | 53 | } |
DavidEGrayson | 1:ac1550d65296 | 54 | |
DavidEGrayson | 1:ac1550d65296 | 55 | using namespace Pololu; |
DavidEGrayson | 1:ac1550d65296 | 56 | |
DavidEGrayson | 1:ac1550d65296 | 57 | DigitalOut myled(LED1); |
DavidEGrayson | 7:242f14ed9055 | 58 | PololuLedStrip ledStrip(p8); |
DavidEGrayson | 1:ac1550d65296 | 59 | |
DavidEGrayson | 4:27b5c9cafe92 | 60 | DigitalOut myled2(LED2); |
DavidEGrayson | 1:ac1550d65296 | 61 | |
DavidEGrayson | 5:8b685ba2f16b | 62 | #define LED_COUNT 60 |
DavidEGrayson | 5:8b685ba2f16b | 63 | rgb_color colors[LED_COUNT]; |
DavidEGrayson | 5:8b685ba2f16b | 64 | |
DavidEGrayson | 1:ac1550d65296 | 65 | int main() { |
DavidEGrayson | 1:ac1550d65296 | 66 | gpio_t gpio; |
DavidEGrayson | 5:8b685ba2f16b | 67 | gpio_init(&gpio, p8, PIN_OUTPUT); |
DavidEGrayson | 1:ac1550d65296 | 68 | |
DavidEGrayson | 1:ac1550d65296 | 69 | while(1) { |
DavidEGrayson | 6:59f1db26a9ff | 70 | myled2 = !myled2.read(); |
DavidEGrayson | 7:242f14ed9055 | 71 | ledStrip.write(colors, LED_COUNT); |
DavidEGrayson | 7:242f14ed9055 | 72 | wait_ms(200); |
DavidEGrayson | 1:ac1550d65296 | 73 | } |
DavidEGrayson | 1:ac1550d65296 | 74 | } |