Thomas Lew / Mbed 2 deprecated FreeFlyerROS

Dependencies:   mbed ros_lib_kinetic

Committer:
Knillinux
Date:
Fri Jun 22 02:09:50 2018 +0000
Revision:
1:40bdbe1a93b7
Child:
2:984eb2c5e8ee
Updates

Who changed what in which revision?

UserRevisionLine numberNew 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 }