This is a simple controller for the ws2801 that I got working on my stm32f401re board, but it should generalize. It's meant to take a line of digits over serial to represent the state of the strip.
Dependencies: mbed-rtos mbed ws2801
main.cpp@2:032f1776f8bd, 2015-01-26 (annotated)
- Committer:
- AlanRager
- Date:
- Mon Jan 26 03:46:49 2015 +0000
- Revision:
- 2:032f1776f8bd
- Parent:
- 1:0634ad3920b7
tweaking scaling
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AlanRager | 0:114c35218e65 | 1 | #include "mbed.h" |
AlanRager | 0:114c35218e65 | 2 | #include "ws2801.h" |
AlanRager | 1:0634ad3920b7 | 3 | #include "rtos.h" |
AlanRager | 0:114c35218e65 | 4 | |
AlanRager | 0:114c35218e65 | 5 | #define STRIP_LEN 32 |
AlanRager | 1:0634ad3920b7 | 6 | #define SERIAL_RATE 2000000 |
AlanRager | 0:114c35218e65 | 7 | |
AlanRager | 0:114c35218e65 | 8 | RawSerial pc(SERIAL_TX, SERIAL_RX); |
AlanRager | 0:114c35218e65 | 9 | |
AlanRager | 0:114c35218e65 | 10 | ws2801 led(PA_5, PA_7, STRIP_LEN); |
AlanRager | 0:114c35218e65 | 11 | |
AlanRager | 0:114c35218e65 | 12 | //input cursor |
AlanRager | 0:114c35218e65 | 13 | int c_len = 0; |
AlanRager | 1:0634ad3920b7 | 14 | //led buffer |
AlanRager | 0:114c35218e65 | 15 | int led_buffer[STRIP_LEN]; |
AlanRager | 1:0634ad3920b7 | 16 | bool reading = false; |
AlanRager | 1:0634ad3920b7 | 17 | bool buffer_ready = false; |
AlanRager | 0:114c35218e65 | 18 | |
AlanRager | 0:114c35218e65 | 19 | void repeat() { |
AlanRager | 0:114c35218e65 | 20 | char in = pc.getc(); |
AlanRager | 1:0634ad3920b7 | 21 | |
AlanRager | 1:0634ad3920b7 | 22 | if (in != '\n' && in != '\r') { |
AlanRager | 1:0634ad3920b7 | 23 | reading = true; |
AlanRager | 1:0634ad3920b7 | 24 | if ( (c_len % 3) == 0 ) { |
AlanRager | 2:032f1776f8bd | 25 | led_buffer[ c_len / 3 ] = (in - 48) * 0x240000; |
AlanRager | 1:0634ad3920b7 | 26 | } |
AlanRager | 1:0634ad3920b7 | 27 | else { |
AlanRager | 2:032f1776f8bd | 28 | led_buffer[ c_len / 3 ] += (in - 48) * (0x240000 >> (8 * (c_len % 3))); |
AlanRager | 1:0634ad3920b7 | 29 | } |
AlanRager | 1:0634ad3920b7 | 30 | |
AlanRager | 1:0634ad3920b7 | 31 | c_len++; |
AlanRager | 0:114c35218e65 | 32 | } |
AlanRager | 1:0634ad3920b7 | 33 | else { |
AlanRager | 1:0634ad3920b7 | 34 | buffer_ready = 1; |
AlanRager | 0:114c35218e65 | 35 | } |
AlanRager | 0:114c35218e65 | 36 | } |
AlanRager | 0:114c35218e65 | 37 | |
AlanRager | 0:114c35218e65 | 38 | int main() { |
AlanRager | 1:0634ad3920b7 | 39 | pc.baud(SERIAL_RATE); |
AlanRager | 0:114c35218e65 | 40 | |
AlanRager | 1:0634ad3920b7 | 41 | pc.attach( |
AlanRager | 1:0634ad3920b7 | 42 | repeat, |
AlanRager | 1:0634ad3920b7 | 43 | Serial::RxIrq |
AlanRager | 1:0634ad3920b7 | 44 | ); |
AlanRager | 0:114c35218e65 | 45 | |
AlanRager | 1:0634ad3920b7 | 46 | buffer_ready = 0; |
AlanRager | 1:0634ad3920b7 | 47 | |
AlanRager | 1:0634ad3920b7 | 48 | while (1) { |
AlanRager | 1:0634ad3920b7 | 49 | if (buffer_ready) { |
AlanRager | 1:0634ad3920b7 | 50 | led.post(led_buffer); |
AlanRager | 1:0634ad3920b7 | 51 | reading = false; |
AlanRager | 1:0634ad3920b7 | 52 | c_len = 0; |
AlanRager | 1:0634ad3920b7 | 53 | buffer_ready = 0; |
AlanRager | 1:0634ad3920b7 | 54 | } |
AlanRager | 1:0634ad3920b7 | 55 | Thread::wait(1); |
AlanRager | 0:114c35218e65 | 56 | } |
AlanRager | 0:114c35218e65 | 57 | } |