Driver for the GE Color Effects LED lights. Currently it is blocking, but it could be made to be nonblocking.

Dependents:   GEColorEffects_Example GEColorEffects_Example

This library's code is based on Clark Jarvis's program here: http://developer.mbed.org/users/clarkjarvis/code/FRDM_GE_ColorEffects/

Committer:
bridadan
Date:
Mon Feb 16 20:27:53 2015 +0000
Revision:
0:3f51641c4e69
Child:
1:e56bc0a8c273
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bridadan 0:3f51641c4e69 1 #include "GEColorEffects.h"
bridadan 0:3f51641c4e69 2
bridadan 0:3f51641c4e69 3 GEColorEffects::GEColorEffects(PinName pin, int size) : size(size), gpo(pin) {
bridadan 0:3f51641c4e69 4
bridadan 0:3f51641c4e69 5 }
bridadan 0:3f51641c4e69 6
bridadan 0:3f51641c4e69 7
bridadan 0:3f51641c4e69 8 void GEColorEffects::write(int buf[], bool eightBit) {
bridadan 0:3f51641c4e69 9 int l, r, g, b;
bridadan 0:3f51641c4e69 10 for (int i = 0; i < size; i++) {
bridadan 0:3f51641c4e69 11 l = (buf[i] >> 24) & 0xFF;
bridadan 0:3f51641c4e69 12 r = (buf[i] >> 16) & 0xFF;
bridadan 0:3f51641c4e69 13 g = (buf[i] >> 8) & 0xFF;
bridadan 0:3f51641c4e69 14 b = buf[i] & 0xFF;
bridadan 0:3f51641c4e69 15
bridadan 0:3f51641c4e69 16 if (eightBit) {
bridadan 0:3f51641c4e69 17 sendFrame(i, l, r >> 4, g >> 4, b >> 4);
bridadan 0:3f51641c4e69 18 } else {
bridadan 0:3f51641c4e69 19 sendFrame(i, l, r, g, b);
bridadan 0:3f51641c4e69 20 }
bridadan 0:3f51641c4e69 21 }
bridadan 0:3f51641c4e69 22 }
bridadan 0:3f51641c4e69 23
bridadan 0:3f51641c4e69 24 // GPIO output to send a logical 0
bridadan 0:3f51641c4e69 25 void GEColorEffects::sendZero() {
bridadan 0:3f51641c4e69 26 gpo = 0;
bridadan 0:3f51641c4e69 27 wait_us(10);
bridadan 0:3f51641c4e69 28 gpo = 1;
bridadan 0:3f51641c4e69 29 wait_us(20);
bridadan 0:3f51641c4e69 30 }
bridadan 0:3f51641c4e69 31
bridadan 0:3f51641c4e69 32 // GPIO output to send a logical 1
bridadan 0:3f51641c4e69 33 void GEColorEffects::sendOne() {
bridadan 0:3f51641c4e69 34 gpo = 0;
bridadan 0:3f51641c4e69 35 wait_us(20);
bridadan 0:3f51641c4e69 36 gpo = 1;
bridadan 0:3f51641c4e69 37 wait_us(10);
bridadan 0:3f51641c4e69 38 }
bridadan 0:3f51641c4e69 39
bridadan 0:3f51641c4e69 40 // Parse data value to serial process 0/1's
bridadan 0:3f51641c4e69 41 void GEColorEffects::sendData(unsigned char data, int length) {
bridadan 0:3f51641c4e69 42 unsigned int data_bit;
bridadan 0:3f51641c4e69 43
bridadan 0:3f51641c4e69 44 for (int i = (length - 1); i >= 0; i--) {
bridadan 0:3f51641c4e69 45 data_bit = (data >> i) & 0x01;
bridadan 0:3f51641c4e69 46 if (data_bit == 0) {
bridadan 0:3f51641c4e69 47 sendZero();
bridadan 0:3f51641c4e69 48 } else {
bridadan 0:3f51641c4e69 49 sendOne();
bridadan 0:3f51641c4e69 50 }
bridadan 0:3f51641c4e69 51 }
bridadan 0:3f51641c4e69 52 }
bridadan 0:3f51641c4e69 53
bridadan 0:3f51641c4e69 54 // Send frame of data to control a single pixel
bridadan 0:3f51641c4e69 55 void GEColorEffects::sendFrame(unsigned char address, unsigned char lumm, unsigned char R, unsigned char G, unsigned char B) {
bridadan 0:3f51641c4e69 56 // Send "1" value to start Frame
bridadan 0:3f51641c4e69 57 sendOne();
bridadan 0:3f51641c4e69 58 // Send Address
bridadan 0:3f51641c4e69 59 sendData(address,6);
bridadan 0:3f51641c4e69 60 // Send Luminosity
bridadan 0:3f51641c4e69 61 sendData(lumm,8);
bridadan 0:3f51641c4e69 62 // Send Blue 4-bits
bridadan 0:3f51641c4e69 63 sendData(B,4);
bridadan 0:3f51641c4e69 64 // Send Green 4-bits
bridadan 0:3f51641c4e69 65 sendData(G,4);
bridadan 0:3f51641c4e69 66 // Send Red 4-bits
bridadan 0:3f51641c4e69 67 sendData(R,4);
bridadan 0:3f51641c4e69 68 // Send End of Frame Marker
bridadan 0:3f51641c4e69 69 endFrame();
bridadan 0:3f51641c4e69 70 }
bridadan 0:3f51641c4e69 71
bridadan 0:3f51641c4e69 72 void GEColorEffects::endFrame() {
bridadan 0:3f51641c4e69 73 gpo = 0;
bridadan 0:3f51641c4e69 74 wait_us(30);
bridadan 0:3f51641c4e69 75 }