Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed ros_lib_kinetic
RGBA_LED.cpp@1:40bdbe1a93b7, 2018-06-22 (annotated)
- Committer:
- Knillinux
- Date:
- Fri Jun 22 02:09:50 2018 +0000
- Revision:
- 1:40bdbe1a93b7
- Child:
- 2:984eb2c5e8ee
Updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Knillinux | 1:40bdbe1a93b7 | 1 | |
Knillinux | 1:40bdbe1a93b7 | 2 | #include "RGBA_LED.h" |
Knillinux | 1:40bdbe1a93b7 | 3 | |
Knillinux | 1:40bdbe1a93b7 | 4 | RGBA_LED::RGBA_LED(I2C *i2c, DigitalOut *inv_out_en, int addr, bool amber_enabled) |
Knillinux | 1:40bdbe1a93b7 | 5 | : step_time_(RGB_LED_PERIOD), def_color_fade_time_(DEF_CLR_FADE_T), def_alpha_fade_time_(DEF_ALP_FADE_T) |
Knillinux | 1:40bdbe1a93b7 | 6 | { |
Knillinux | 1:40bdbe1a93b7 | 7 | |
Knillinux | 1:40bdbe1a93b7 | 8 | led_driver_ = new PCA9634(i2c, inv_out_en, addr); |
Knillinux | 1:40bdbe1a93b7 | 9 | |
Knillinux | 1:40bdbe1a93b7 | 10 | strip_leds_[0] = RGBA<ledID>(LED_STR0_R, LED_STR0_G, LED_STR0_B, LED_STR0_A); |
Knillinux | 1:40bdbe1a93b7 | 11 | strip_leds_[1] = RGBA<ledID>(LED_STR1_R, LED_STR1_G, LED_STR1_B, LED_STR1_A); |
Knillinux | 1:40bdbe1a93b7 | 12 | |
Knillinux | 1:40bdbe1a93b7 | 13 | setColor(RGBA<float>(0,0,0,0)); |
Knillinux | 1:40bdbe1a93b7 | 14 | setBrightness(1.0); |
Knillinux | 1:40bdbe1a93b7 | 15 | |
Knillinux | 1:40bdbe1a93b7 | 16 | // TODO: Replace with setColorProgram, setBrightnessProgram |
Knillinux | 1:40bdbe1a93b7 | 17 | for (int i = 0; i < 2; i++) { |
Knillinux | 1:40bdbe1a93b7 | 18 | count_color_[i] = 0; |
Knillinux | 1:40bdbe1a93b7 | 19 | count_alpha_[i] = 0; |
Knillinux | 1:40bdbe1a93b7 | 20 | } |
Knillinux | 1:40bdbe1a93b7 | 21 | |
Knillinux | 1:40bdbe1a93b7 | 22 | if (amber_enabled) |
Knillinux | 1:40bdbe1a93b7 | 23 | enableAmber(); |
Knillinux | 1:40bdbe1a93b7 | 24 | else |
Knillinux | 1:40bdbe1a93b7 | 25 | disableAmber(); |
Knillinux | 1:40bdbe1a93b7 | 26 | } |
Knillinux | 1:40bdbe1a93b7 | 27 | |
Knillinux | 1:40bdbe1a93b7 | 28 | void RGBA_LED::disableAmber() { |
Knillinux | 1:40bdbe1a93b7 | 29 | disableAmber(0); |
Knillinux | 1:40bdbe1a93b7 | 30 | disableAmber(1); |
Knillinux | 1:40bdbe1a93b7 | 31 | } |
Knillinux | 1:40bdbe1a93b7 | 32 | void RGBA_LED::disableAmber(int stripID) { |
Knillinux | 1:40bdbe1a93b7 | 33 | led_driver_->disableLED(strip_leds_[stripID].a); |
Knillinux | 1:40bdbe1a93b7 | 34 | } |
Knillinux | 1:40bdbe1a93b7 | 35 | |
Knillinux | 1:40bdbe1a93b7 | 36 | void RGBA_LED::enableAmber() { |
Knillinux | 1:40bdbe1a93b7 | 37 | enableAmber(0); |
Knillinux | 1:40bdbe1a93b7 | 38 | enableAmber(1); |
Knillinux | 1:40bdbe1a93b7 | 39 | } |
Knillinux | 1:40bdbe1a93b7 | 40 | void RGBA_LED::enableAmber(int stripID) { |
Knillinux | 1:40bdbe1a93b7 | 41 | led_driver_->enableLED(strip_leds_[stripID].a); |
Knillinux | 1:40bdbe1a93b7 | 42 | } |
Knillinux | 1:40bdbe1a93b7 | 43 | |
Knillinux | 1:40bdbe1a93b7 | 44 | |
Knillinux | 1:40bdbe1a93b7 | 45 | void RGBA_LED::setColor(RGBA<float> color) { |
Knillinux | 1:40bdbe1a93b7 | 46 | setColor(color, 0); |
Knillinux | 1:40bdbe1a93b7 | 47 | setColor(color, 1); |
Knillinux | 1:40bdbe1a93b7 | 48 | } |
Knillinux | 1:40bdbe1a93b7 | 49 | |
Knillinux | 1:40bdbe1a93b7 | 50 | void RGBA_LED::setColor(RGBA<float> color, int stripID) { |
Knillinux | 1:40bdbe1a93b7 | 51 | cur_color_[stripID] = color; |
Knillinux | 1:40bdbe1a93b7 | 52 | updatePWMs(stripID); |
Knillinux | 1:40bdbe1a93b7 | 53 | } |
Knillinux | 1:40bdbe1a93b7 | 54 | |
Knillinux | 1:40bdbe1a93b7 | 55 | void RGBA_LED::setBrightness(float alpha) { |
Knillinux | 1:40bdbe1a93b7 | 56 | setBrightness(alpha, 0); |
Knillinux | 1:40bdbe1a93b7 | 57 | setBrightness(alpha, 1); |
Knillinux | 1:40bdbe1a93b7 | 58 | } |
Knillinux | 1:40bdbe1a93b7 | 59 | |
Knillinux | 1:40bdbe1a93b7 | 60 | void RGBA_LED::setBrightness(float alpha, int stripID) { |
Knillinux | 1:40bdbe1a93b7 | 61 | cur_alpha_[stripID] = alpha; |
Knillinux | 1:40bdbe1a93b7 | 62 | updatePWMs(stripID); |
Knillinux | 1:40bdbe1a93b7 | 63 | } |
Knillinux | 1:40bdbe1a93b7 | 64 | |
Knillinux | 1:40bdbe1a93b7 | 65 | |
Knillinux | 1:40bdbe1a93b7 | 66 | void RGBA_LED::setDefaultColorFadeTime(int def_color_fade_time) { |
Knillinux | 1:40bdbe1a93b7 | 67 | def_color_fade_time_ = def_color_fade_time; |
Knillinux | 1:40bdbe1a93b7 | 68 | } |
Knillinux | 1:40bdbe1a93b7 | 69 | |
Knillinux | 1:40bdbe1a93b7 | 70 | void RGBA_LED::setDefaultBrightnessFadeTime(int def_alpha_fade_time) { |
Knillinux | 1:40bdbe1a93b7 | 71 | def_alpha_fade_time_ = def_alpha_fade_time; |
Knillinux | 1:40bdbe1a93b7 | 72 | } |
Knillinux | 1:40bdbe1a93b7 | 73 | |
Knillinux | 1:40bdbe1a93b7 | 74 | int RGBA_LED::getStepTime() { |
Knillinux | 1:40bdbe1a93b7 | 75 | return step_time_; |
Knillinux | 1:40bdbe1a93b7 | 76 | } |
Knillinux | 1:40bdbe1a93b7 | 77 | |
Knillinux | 1:40bdbe1a93b7 | 78 | void RGBA_LED::step() { |
Knillinux | 1:40bdbe1a93b7 | 79 | bool update = false; |
Knillinux | 1:40bdbe1a93b7 | 80 | |
Knillinux | 1:40bdbe1a93b7 | 81 | for (int i = 0; i < 2; i++) { |
Knillinux | 1:40bdbe1a93b7 | 82 | if (count_color_[i] > 0) { |
Knillinux | 1:40bdbe1a93b7 | 83 | count_color_[i]--; |
Knillinux | 1:40bdbe1a93b7 | 84 | // Transition to next color in program |
Knillinux | 1:40bdbe1a93b7 | 85 | if (count_color_[i] == 0) { |
Knillinux | 1:40bdbe1a93b7 | 86 | int i_curr = (ind_color_program_[i] + 1) % color_program_[i].size(); |
Knillinux | 1:40bdbe1a93b7 | 87 | int i_next = (ind_color_program_[i] + 2) % color_program_[i].size(); |
Knillinux | 1:40bdbe1a93b7 | 88 | ind_color_program_[i] = i_curr; |
Knillinux | 1:40bdbe1a93b7 | 89 | cur_color_[i] = color_program_[i][i_curr]; |
Knillinux | 1:40bdbe1a93b7 | 90 | count_color_[i] = ceil(color_time_program_[i][i_curr]/step_time_); |
Knillinux | 1:40bdbe1a93b7 | 91 | dcolor_[i] = (color_program_[i][i_next] - color_program_[i][i_curr]) / count_color_[i]; |
Knillinux | 1:40bdbe1a93b7 | 92 | } else |
Knillinux | 1:40bdbe1a93b7 | 93 | cur_color_[i] += dcolor_[i]; |
Knillinux | 1:40bdbe1a93b7 | 94 | update = true; |
Knillinux | 1:40bdbe1a93b7 | 95 | } |
Knillinux | 1:40bdbe1a93b7 | 96 | if (count_alpha_[i] > 0) { |
Knillinux | 1:40bdbe1a93b7 | 97 | count_alpha_[i]--; |
Knillinux | 1:40bdbe1a93b7 | 98 | // Transition to next alpha in program |
Knillinux | 1:40bdbe1a93b7 | 99 | if (count_alpha_[i] == 0) { |
Knillinux | 1:40bdbe1a93b7 | 100 | int i_curr = (ind_alpha_program_[i] + 1) % alpha_program_[i].size(); |
Knillinux | 1:40bdbe1a93b7 | 101 | int i_next = (ind_alpha_program_[i] + 2) % alpha_program_[i].size(); |
Knillinux | 1:40bdbe1a93b7 | 102 | ind_alpha_program_[i] = i_curr; |
Knillinux | 1:40bdbe1a93b7 | 103 | cur_alpha_[i] = alpha_program_[i][i_curr]; |
Knillinux | 1:40bdbe1a93b7 | 104 | count_alpha_[i] = ceil(alpha_time_program_[i][i_curr]/step_time_); |
Knillinux | 1:40bdbe1a93b7 | 105 | dalpha_[i] = (alpha_program_[i][i_next] - alpha_program_[i][i_curr]) / count_alpha_[i]; |
Knillinux | 1:40bdbe1a93b7 | 106 | } else |
Knillinux | 1:40bdbe1a93b7 | 107 | cur_alpha_[i] += dalpha_[i]; |
Knillinux | 1:40bdbe1a93b7 | 108 | update = true; |
Knillinux | 1:40bdbe1a93b7 | 109 | } |
Knillinux | 1:40bdbe1a93b7 | 110 | if (update) { |
Knillinux | 1:40bdbe1a93b7 | 111 | updatePWMs(i); |
Knillinux | 1:40bdbe1a93b7 | 112 | update = false; |
Knillinux | 1:40bdbe1a93b7 | 113 | } |
Knillinux | 1:40bdbe1a93b7 | 114 | } |
Knillinux | 1:40bdbe1a93b7 | 115 | |
Knillinux | 1:40bdbe1a93b7 | 116 | } |
Knillinux | 1:40bdbe1a93b7 | 117 | |
Knillinux | 1:40bdbe1a93b7 | 118 | void RGBA_LED::setColorProgram(vector<RGBA<float> > color_program, |
Knillinux | 1:40bdbe1a93b7 | 119 | vector<float> time_program, bool fadeInto = false) { |
Knillinux | 1:40bdbe1a93b7 | 120 | setColorProgram(color_program, time_program, 0, fadeInto); |
Knillinux | 1:40bdbe1a93b7 | 121 | setColorProgram(color_program, time_program, 1, fadeInto); |
Knillinux | 1:40bdbe1a93b7 | 122 | } |
Knillinux | 1:40bdbe1a93b7 | 123 | |
Knillinux | 1:40bdbe1a93b7 | 124 | void RGBA_LED::setColorProgram(vector<RGBA<float> > color_program, |
Knillinux | 1:40bdbe1a93b7 | 125 | vector<float> time_program, int stripID, bool fadeInto = false) { |
Knillinux | 1:40bdbe1a93b7 | 126 | color_program_[stripID] = color_program; |
Knillinux | 1:40bdbe1a93b7 | 127 | color_time_program_[stripID] = time_program; |
Knillinux | 1:40bdbe1a93b7 | 128 | |
Knillinux | 1:40bdbe1a93b7 | 129 | // Begin transition to the first color, using default color fade time |
Knillinux | 1:40bdbe1a93b7 | 130 | if (fadeInto) { |
Knillinux | 1:40bdbe1a93b7 | 131 | ind_color_program_[stripID] = color_program.size()-1; |
Knillinux | 1:40bdbe1a93b7 | 132 | count_color_[stripID] = ceil(def_color_fade_time_/step_time_); |
Knillinux | 1:40bdbe1a93b7 | 133 | dcolor_[stripID] = (color_program[0] - cur_color_[stripID]) / count_color_[stripID]; |
Knillinux | 1:40bdbe1a93b7 | 134 | |
Knillinux | 1:40bdbe1a93b7 | 135 | // Switch to first color, and let step() begin transition to next color |
Knillinux | 1:40bdbe1a93b7 | 136 | } else { |
Knillinux | 1:40bdbe1a93b7 | 137 | ind_color_program_[stripID] = 0; |
Knillinux | 1:40bdbe1a93b7 | 138 | count_color_[stripID] = 1; |
Knillinux | 1:40bdbe1a93b7 | 139 | cur_color_[stripID] = color_program[0]; |
Knillinux | 1:40bdbe1a93b7 | 140 | updatePWMs(); |
Knillinux | 1:40bdbe1a93b7 | 141 | } |
Knillinux | 1:40bdbe1a93b7 | 142 | } |
Knillinux | 1:40bdbe1a93b7 | 143 | |
Knillinux | 1:40bdbe1a93b7 | 144 | RGBA<float> RGBA_LED::getPresetColor(char colorID) { |
Knillinux | 1:40bdbe1a93b7 | 145 | switch (colorID) { |
Knillinux | 1:40bdbe1a93b7 | 146 | case 'w': return RGBA<float>(255, 255, 255, 0); // White |
Knillinux | 1:40bdbe1a93b7 | 147 | case 'r': return RGBA<float>(255, 0, 0, 0); // Red |
Knillinux | 1:40bdbe1a93b7 | 148 | case 'g': return RGBA<float>( 0, 255, 0, 0); // Green |
Knillinux | 1:40bdbe1a93b7 | 149 | case 'b': return RGBA<float>( 0, 0, 255, 0); // Blue |
Knillinux | 1:40bdbe1a93b7 | 150 | case 'y': return RGBA<float>(255, 255, 0, 0); // Yellow |
Knillinux | 1:40bdbe1a93b7 | 151 | case 'c': return RGBA<float>( 0, 255, 255, 0); // Cyan |
Knillinux | 1:40bdbe1a93b7 | 152 | case 'm': return RGBA<float>(255, 0, 255, 0); // Magenta |
Knillinux | 1:40bdbe1a93b7 | 153 | case default: return RGBA<float>(0, 0, 0, 0); |
Knillinux | 1:40bdbe1a93b7 | 154 | // TODO: Add orange, purple |
Knillinux | 1:40bdbe1a93b7 | 155 | } |
Knillinux | 1:40bdbe1a93b7 | 156 | } |
Knillinux | 1:40bdbe1a93b7 | 157 | |
Knillinux | 1:40bdbe1a93b7 | 158 | vector<RGBA<float> > RGBA_LED::getPresetColorProgram(int programID) { |
Knillinux | 1:40bdbe1a93b7 | 159 | switch (colorID) { |
Knillinux | 1:40bdbe1a93b7 | 160 | case 0: return RGBA<vector<float> >(getPresetColor('r'), getPresetColor('g'), getPresetColor('b')); |
Knillinux | 1:40bdbe1a93b7 | 161 | default: return RGBA<vector<float> >(getPresetColor('w')); |
Knillinux | 1:40bdbe1a93b7 | 162 | } |
Knillinux | 1:40bdbe1a93b7 | 163 | } |
Knillinux | 1:40bdbe1a93b7 | 164 | |
Knillinux | 1:40bdbe1a93b7 | 165 | |
Knillinux | 1:40bdbe1a93b7 | 166 | void RGBA_LED::updatePWMs() { |
Knillinux | 1:40bdbe1a93b7 | 167 | updatePWMs(0); |
Knillinux | 1:40bdbe1a93b7 | 168 | updatePWMs(1); |
Knillinux | 1:40bdbe1a93b7 | 169 | } |
Knillinux | 1:40bdbe1a93b7 | 170 | |
Knillinux | 1:40bdbe1a93b7 | 171 | void RGBA_LED::updatePWMs(int stripID) { |
Knillinux | 1:40bdbe1a93b7 | 172 | for (int i = 0; i < 4; i++) |
Knillinux | 1:40bdbe1a93b7 | 173 | led_driver_->commandLEDBrightness(strip_leds_[stripID][i], (int) (cur_color_[stripID][i]*cur_alpha_[stripID])); |
Knillinux | 1:40bdbe1a93b7 | 174 | } |