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

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?

UserRevisionLine numberNew 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 }