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@1:e56bc0a8c273, 2015-07-15 (annotated)
- 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?
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 | 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 | } |