Frank Vannieuwkerke / HSI2RGBW_PWM

Dependents:   KL25Z_HSI2RGBW_PWM KL25Z_HSI2RGBW_PWM_local KL25Z_FFT_Demo FFT_BUENA ... more

Revision:
4:a16b9c09561e
Parent:
3:dda6914d713f
diff -r dda6914d713f -r a16b9c09561e hsi2rgbw_pwm.cpp
--- 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;
+}