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/
GEColorEffects.cpp@0:3f51641c4e69, 2015-02-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |