Thomas Lew / Mbed 2 deprecated FreeFlyerROS

Dependencies:   mbed ros_lib_kinetic

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers RGBA_LED.cpp Source File

RGBA_LED.cpp

00001 
00002 #include "RGBA_LED.h"
00003 
00004 RGBA_LED::RGBA_LED(I2C *i2c, DigitalOut *inv_out_en, int addr, bool amber_enabled)
00005 : step_time_(RGB_LED_PERIOD), def_color_fade_time_(DEF_CLR_FADE_T), def_alpha_fade_time_(DEF_ALP_FADE_T)
00006 {
00007     
00008     led_driver_ = new PCA9634(i2c, inv_out_en, addr);
00009     
00010     strip_leds_[0] = RGBA<ledID>(LED_STR0_R, LED_STR0_G, LED_STR0_B, LED_STR0_A);
00011     strip_leds_[1] = RGBA<ledID>(LED_STR1_R, LED_STR1_G, LED_STR1_B, LED_STR1_A);
00012     
00013     setColor(RGBA<float>(0,0,0,0));
00014     setBrightness(1.0);
00015     
00016     // TODO: Replace with setColorProgram, setBrightnessProgram
00017     for (int i = 0; i < 2; i++) {
00018         count_color_[i] = 0;
00019         count_alpha_[i] = 0;
00020     }
00021     
00022     if (amber_enabled)
00023         enableAmber();
00024     else
00025         disableAmber();
00026 }
00027 
00028 void RGBA_LED::disableAmber() {
00029     disableAmber(0);
00030     disableAmber(1);
00031 }
00032 void RGBA_LED::disableAmber(int stripID) {
00033     led_driver_->disableLED(strip_leds_[stripID].a);
00034 }
00035 
00036 void RGBA_LED::enableAmber() {
00037     enableAmber(0);
00038     enableAmber(1);
00039 }
00040 void RGBA_LED::enableAmber(int stripID) {
00041     led_driver_->enableLED(strip_leds_[stripID].a);
00042 }
00043 
00044 
00045 void RGBA_LED::setColor(RGBA<float> color) {
00046     setColor(color, 0);
00047     setColor(color, 1);
00048 }
00049 
00050 void RGBA_LED::setColor(RGBA<float> color, int stripID) {
00051     cur_color_[stripID] = color;
00052     updatePWMs(stripID);
00053 }
00054 
00055 void RGBA_LED::setBrightness(float alpha) {
00056     setBrightness(alpha, 0);
00057     setBrightness(alpha, 1);
00058 }
00059 
00060 void RGBA_LED::setBrightness(float alpha, int stripID) {
00061     cur_alpha_[stripID] = alpha;
00062     updatePWMs(stripID);
00063 }
00064 
00065 
00066 void RGBA_LED::setDefaultColorFadeTime(int def_color_fade_time) {
00067     def_color_fade_time_ = def_color_fade_time;
00068 }
00069     
00070 void RGBA_LED::setDefaultBrightnessFadeTime(int def_alpha_fade_time) {
00071     def_alpha_fade_time_ = def_alpha_fade_time;
00072 }
00073 
00074 int RGBA_LED::getStepTime() {
00075     return step_time_;
00076 }
00077 
00078 void RGBA_LED::step() {
00079     bool update = false;
00080     
00081     for (int i = 0; i < 2; i++) {
00082         if (count_color_[i] > 0) {
00083             count_color_[i]--;
00084             // Transition to next color in program
00085             if (count_color_[i] == 0) {                
00086                 int i_curr = (ind_color_program_[i] + 1) % color_program_[i].size();
00087                 int i_next = (ind_color_program_[i] + 2) % color_program_[i].size();
00088                 ind_color_program_[i] = i_curr;
00089                 cur_color_[i] = color_program_[i][i_curr];
00090                 count_color_[i] = ceil(color_time_program_[i][i_curr]/step_time_);
00091                 dcolor_[i] = (color_program_[i][i_next] - color_program_[i][i_curr]) / count_color_[i];
00092             } else
00093                 cur_color_[i] += dcolor_[i];
00094             update = true;
00095         }
00096         if (count_alpha_[i] > 0) {
00097             count_alpha_[i]--;
00098             // Transition to next alpha in program
00099             if (count_alpha_[i] == 0) {                
00100                 int i_curr = (ind_alpha_program_[i] + 1) % alpha_program_[i].size();
00101                 int i_next = (ind_alpha_program_[i] + 2) % alpha_program_[i].size();
00102                 ind_alpha_program_[i] = i_curr;
00103                 cur_alpha_[i] = alpha_program_[i][i_curr];
00104                 count_alpha_[i] = ceil(alpha_time_program_[i][i_curr]/step_time_);
00105                 dalpha_[i] = (alpha_program_[i][i_next] - alpha_program_[i][i_curr]) / count_alpha_[i];
00106             } else
00107                 cur_alpha_[i] += dalpha_[i];
00108             update = true;
00109         }
00110         if (update) {
00111             updatePWMs(i);
00112             update = false;
00113         }
00114     }        
00115         
00116 }
00117 
00118 void RGBA_LED::setColorProgram(vector<RGBA<float> > color_program,
00119     vector<float> time_program, bool fadeInto = false) {
00120     setColorProgram(color_program, time_program, 0, fadeInto);
00121     setColorProgram(color_program, time_program, 1, fadeInto);
00122 }
00123 
00124 void RGBA_LED::setColorProgram(vector<RGBA<float> > color_program,
00125     vector<float> time_program, int stripID, bool fadeInto = false) {
00126     color_program_[stripID] = color_program;
00127     color_time_program_[stripID] = time_program;
00128     
00129     // Begin transition to the first color, using default color fade time
00130     if (fadeInto) {     
00131         ind_color_program_[stripID] = color_program.size()-1;
00132         count_color_[stripID] = ceil(def_color_fade_time_/step_time_);
00133         dcolor_[stripID] = (color_program[0] - cur_color_[stripID]) / count_color_[stripID];
00134         
00135     // Switch to first color, and let step() begin transition to next color
00136     } else {    
00137         ind_color_program_[stripID] = 0;
00138         count_color_[stripID] = 1;
00139         cur_color_[stripID] = color_program[0];
00140         updatePWMs();
00141     }
00142 }
00143 
00144 RGBA<float> RGBA_LED::getPresetColor(char colorID) {
00145     switch (colorID) {
00146         case 'w': return RGBA<float>(255, 255, 255,   0);   // White
00147         case 'r': return RGBA<float>(255,   0,   0,   0);   // Red
00148         case 'g': return RGBA<float>(  0, 255,   0,   0);   // Green
00149         case 'b': return RGBA<float>(  0,   0, 255,   0);   // Blue
00150         case 'y': return RGBA<float>(255, 255,   0,   0);   // Yellow
00151         case 'c': return RGBA<float>(  0, 255, 255,   0);   // Cyan
00152         case 'm': return RGBA<float>(255,   0, 255,   0);   // Magenta
00153         default: return RGBA<float>(0, 0, 0, 0);
00154         // TODO: Add orange, purple
00155     }
00156 }
00157 
00158 vector<RGBA<float> > RGBA_LED::getPresetColorProgram(int programID) {
00159     /*switch (colorID) {
00160         case 0: return RGBA<vector<float> >(getPresetColor('r'), getPresetColor('g'), getPresetColor('b')); 
00161         default: return RGBA<vector<float> >(getPresetColor('w'));
00162     }*/
00163 }
00164 
00165 
00166 void RGBA_LED::updatePWMs() {
00167     updatePWMs(0);
00168     updatePWMs(1);
00169 }
00170 
00171 void RGBA_LED::updatePWMs(int stripID) {
00172     for (int i = 0; i < 4; i++)
00173         led_driver_->commandLEDBrightness(strip_leds_[stripID][i], (int) (cur_color_[stripID][i]*cur_alpha_[stripID]));
00174 }