Files
RGBController/rgbled.cpp
2018-11-27 18:48:34 +01:00

197 lines
4.5 KiB
C++

#include "rgbled.h"
RgbLed::RgbLed( Pwm8b* pwmA, Pwm8b* pwmB ): _pwmA(pwmA), _pwmB(pwmB) {}
void RgbLed::setSolidColor( const uint8_t r, const uint8_t g, const uint8_t b)
{
_pattern=0;
_targetR = r;
_targetG = g;
_targetB = b;
}
void RgbLed::setPreset( const uint8_t preset)
{
switch (preset)
{
//whites
case 1:
setSolidColor( 160,255,80 ); //neutral white
break;
case 2:
setSolidColor( 200,255,20 ); //Warm white
break;
case 3:
setSolidColor( 180,255,140 ); //cold white
break;
//reds
case 4:
setSolidColor( 255,0,0 ); //red
break;
case 5:
setSolidColor( 255,60,10 ); //ruby
break;
case 6:
setSolidColor( 255,30,30 ); //pink
break;
case 7:
setSolidColor( 255,155,0 ); //orange
break;
//greens
case 8:
setSolidColor( 0,255,0 ); //green
break;
case 9:
setSolidColor( 55,255,10 ); //poison
break;
case 10:
setSolidColor( 0,255,0 ); //green
break;
case 11:
setSolidColor( 8,80,7 ); //mint
break;
//blues
case 12:
setSolidColor( 0,0,255 ); //blue
break;
case 13:
setSolidColor( 50,255,255 ); //sky
break;
case 14:
setSolidColor( 10,80,150 ); //ocean
break;
case 15:
setSolidColor( 0,255,220 ); //turqouse
break;
//strange yellow color color
case 16:
setSolidColor( 200,255,0 );
break;
default:
setSolidColor( 255,055,20 );
}
}
void RgbLed::setPattern(const uint8_t id)
{
_pattern=id;
if( id != 0 )
{
_pwmA->setDutyB(0);
_pwmA->setDutyA(0);
_pwmB->setDutyB(0);
on();
_stroke = false;
_counter = 0;
}
}
void RgbLed::on()
{
_powerd = true;
_pwmA->on();
_pwmB->on();
}
void RgbLed::off()
{
_powerd = false;
_pwmA->off();
_pwmB->off();
}
void RgbLed::setFade(bool fade)
{
_fade=fade;
}
void RgbLed::patternStep()
{
if(_pattern == 1)
{
if(!_stroke)_counter++;
else _counter --;
if(_counter == 255) _stroke = true;
else if(_counter == 0) _stroke = false;
_pwmA->setDutyB(_counter);
_pwmA->setDutyA(255-_counter);
_pwmB->setDutyB(_counter-64);
}
else if(_pattern == 2) //Alarm!
{
if(!_stroke)_counter++;
else _counter --;
if(_counter == 255 << 1) _stroke = true;
else if(_counter == 0) _stroke = false;
_pwmA->setDutyB(_counter >> 1);
_pwmA->setDutyA(0);
_pwmB->setDutyB(0);
}
else if(_pattern == 3)
{
if(!_stroke)_counter++;
else _counter --;
if(_counter == (uint8_t) 255 << 8) _stroke = true;
else if(_counter == 0) _stroke = false;
_pwmA->setDutyB(_counter >> 6);
_pwmA->setDutyA(_counter >> 8);
_pwmB->setDutyB(_counter >> 3);
}
else if(_pattern == 4)
{
( _counter < 8192 ) ? _pwmA->setDutyB(_counter >> 6) : _pwmA->setDutyB( 128 + (_counter >> 11));
if( _counter > 1024 ) ( 8192 < _counter && _counter < 16384 ) ? _pwmA->setDutyA((_counter-8192) >> 6) : _pwmA->setDutyA( 128 + (_counter >> 9 ));
if( _counter > 8192 ) _pwmB->setDutyB(_counter >> 9);
if(_counter<65530) _counter++;
else _pwmB->setDutyB(140);
_delay_ms(18);
}
}
void RgbLed::logic()
{
patternStep();
if(_pattern == 0 && _fade)
{
_counter++;
if( uint8_t(_counter << _fadeSpeed) == 0)
{
if( getR() != _targetR)
{
_pwmA->setDutyB(getR() - sgn(getR() - _targetR));
}
if( getG() != _targetG)
{
_pwmA->setDutyA(getG() - sgn(getG() - _targetG));
}
if( getB() != _targetB)
{
_pwmB->setDutyB(getB() - sgn(getB() - _targetB));
}
}
}
else if(_pattern == 0)
{
_pwmA->setDutyA(_targetG);
_pwmA->setDutyB(_targetR);
_pwmB->setDutyB(_targetB);
}
}
uint8_t RgbLed::getR()
{
return _pwmA->getValueB();
}
uint8_t RgbLed::getB()
{
return _pwmB->getValueB();
}
uint8_t RgbLed::getG()
{
return _pwmA->getValueA();
}