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:
Wed Jul 15 20:04:49 2015 +0000
Revision:
1:e56bc0a8c273
Parent:
0:3f51641c4e69
Disabling irq around time sensitive parts. Added setBrightness function.

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