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.
Dependents: KL25Z_HSI2RGBW_PWM KL25Z_HSI2RGBW_PWM_local KL25Z_FFT_Demo FFT_BUENA ... more
Diff: hsi2rgbw_pwm.cpp
- Revision:
- 4:a16b9c09561e
- Parent:
- 3:dda6914d713f
--- a/hsi2rgbw_pwm.cpp Mon Dec 30 11:22:53 2013 +0000 +++ b/hsi2rgbw_pwm.cpp Sun Feb 02 14:41:29 2014 +0000 @@ -28,11 +28,23 @@ #define PI 3.14159265 -hsi2rgbw_pwm::hsi2rgbw_pwm(PinName red, PinName green, PinName blue, PinName white) : _red(red), _green(green), _blue(blue), _white(white) +PwmOut *_red; +PwmOut *_green; +PwmOut *_blue; +PwmOut *_white; + +hsi2rgbw_pwm::hsi2rgbw_pwm(PinName pred, PinName pgreen, PinName pblue, PinName pwhite) { parabol = 1; + use_invpwm = 0; use_rgbw = RGBW; - if(_red == NC && _green == NC && _blue == NC) + if(pred != NC) _red = new PwmOut (pred); + if(pgreen != NC) _green = new PwmOut (pgreen); + if(pblue != NC) _blue = new PwmOut (pblue); + if(pwhite != NC) _white = new PwmOut (pwhite); + if((pred != NC) && (pgreen != NC) && (pblue != NC) && (pwhite == NC)) + use_rgbw = RGB; + if((pred == NC) && (pgreen == NC) && (pblue == NC) && (pwhite == NC)) { use_pwm = 0; } @@ -40,18 +52,18 @@ { use_pwm = 1; //Setup PWM channels - default period = 4 ms (250Hz) - _red.period_ms(4); - _green.period_ms(4); - _blue.period_ms(4); - if(_white != NC) - _white.period_ms(4); + _red->period_ms(4); + _green->period_ms(4); + _blue->period_ms(4); + if(pwhite != NC) + _white->period_ms(4); // Initial RGB values. - _red = 0.0f; - _green = 0.0f; - _blue = 0.0f; - if(_white != NC) - _white = 0.0f; + _red->write(0.0f); + _green->write(0.0f); + _blue->write(0.0f); + if(pwhite != NC) + _white->write(0.0f); } } @@ -64,7 +76,7 @@ H = PI*H/(float)180; // Convert to radians. S = S>0?(S<1?S:1):0; // clamp S and I to interval [0,1] I = I>0?(I<1?I:1):0; - if(use_rgbw) + if(use_rgbw == RGBW) Srgb = 1; else { @@ -88,7 +100,7 @@ cos_h = cos(H) / cos(1.047196667-H); rgbw[0] = S*I/3*(1+Srgb*cos_h); rgbw[1] = S*I/3*(1+Srgb*(1-cos_h)); - if(use_rgbw) + if(use_rgbw == RGBW) { rgbw[2] = 0; rgbw[3] = (1-S)*I; @@ -100,7 +112,7 @@ cos_h = cos(H) / cos(1.047196667-H); rgbw[1] = S*I/3*(1+Srgb*cos_h); rgbw[2] = S*I/3*(1+Srgb*(1-cos_h)); - if(use_rgbw) + if(use_rgbw == RGBW) { rgbw[0] = 0; rgbw[3] = (1-S)*I; @@ -112,7 +124,7 @@ cos_h = cos(H) / cos(1.047196667-H); rgbw[2] = S*I/3*(1+Srgb*cos_h); rgbw[0] = S*I/3*(1+Srgb*(1-cos_h)); - if(use_rgbw) + if(use_rgbw == RGBW) { rgbw[1] = 0; rgbw[3] = (1-S)*I; @@ -120,22 +132,32 @@ else rgbw[1] = I/3*(1-Srgb); } - + + if(use_invpwm) + { + rgbw[0] = (1.0f - rgbw[0]); + rgbw[1] = (1.0f - rgbw[1]); + rgbw[2] = (1.0f - rgbw[2]); + if(use_rgbw == RGBW) + rgbw[3] = (1.0f - rgbw[3]); + } + // parabolic mapping. if(parabol) { rgbw[0] *= rgbw[0]; // RED rgbw[1] *= rgbw[1]; // GREEN rgbw[2] *= rgbw[2]; // BLUE - if(use_rgbw) + if(use_rgbw == RGBW) rgbw[3] *= rgbw[3]; // WHITE } + if(use_pwm) { - _red = rgbw[0]; - _green = rgbw[1]; - _blue = rgbw[2]; - if(_white != NC) - _white = rgbw[3]; + _red->write(rgbw[0]); + _green->write(rgbw[1]); + _blue->write(rgbw[2]); + if(use_rgbw == RGBW) + _white->write(rgbw[3]); } } @@ -143,11 +165,11 @@ { if(use_pwm) { - _red.period_us(per); - _green.period_us(per); - _blue.period_us(per); - if(_white != NC) - _white.period_us(per); + _red->period_us(per); + _green->period_us(per); + _blue->period_us(per); + if(use_rgbw == RGBW) + _white->period_us(per); } } @@ -155,11 +177,22 @@ { if(use_pwm) { - _red = rgbw[0]; - _green = rgbw[1]; - _blue = rgbw[2]; - if(_white != NC) - _white = rgbw[3]; + if(!use_invpwm) + { + _red->write(rgbw[0]); + _green->write(rgbw[1]); + _blue->write(rgbw[2]); + if(use_rgbw == RGBW) + _white->write(rgbw[3]); + } + else + { + _red->write(1.0f - rgbw[0]); + _green->write(1.0f - rgbw[1]); + _blue->write(1.0f - rgbw[2]); + if(use_rgbw == RGBW) + _white->write(1.0f - rgbw[3]); + } } } @@ -173,3 +206,7 @@ use_rgbw = como; } +void hsi2rgbw_pwm::invertpwm(bool invpwm) +{ + use_invpwm = invpwm; +}